LLVMFuzzerInitialize:
   94|      4|{
   95|      4|	char const		*lib_dir  	= getenv("FR_LIBRARY_PATH");
   96|      4|	char const		*proto    	= getenv("FR_LIBRARY_FUZZ_PROTOCOL");
   97|      4|	char const		*dict_dir	= getenv("FR_DICTIONARY_DIR");
   98|      4|	char const		*debug_lvl_str	= getenv("FR_DEBUG_LVL");
   99|      4|	char const		*panic_action	= getenv("PANIC_ACTION");
  100|      4|	char const		*p;
  101|      4|#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
  102|      4|	char			*dict_dir_to_free = NULL;
  103|      4|	char			*lib_dir_to_free = NULL;
  104|      4|#endif
  105|       |
  106|      4|	if (!argc || !argv || !*argv) return -1; /* shut up clang scan */
  ------------------
  |  Branch (106:6): [True: 0, False: 4]
  |  Branch (106:15): [True: 0, False: 4]
  |  Branch (106:24): [True: 0, False: 4]
  ------------------
  107|       |
  108|      4|	if (debug_lvl_str) {
  ------------------
  |  Branch (108:6): [True: 0, False: 4]
  ------------------
  109|      0|		fr_debug_lvl = atoi(debug_lvl_str);
  110|       |
  111|      0|		if (fr_debug_lvl) fr_time_start();
  ------------------
  |  Branch (111:7): [True: 0, False: 0]
  ------------------
  112|      0|	}
  113|       |
  114|       |	/*
  115|       |	 *	Setup atexit handlers to free any thread local
  116|       |	 *	memory on exit
  117|       |	 */
  118|      4|	fr_atexit_global_setup();
  119|       |
  120|       |	/*
  121|       |	 *	Initialise the talloc fault handlers.
  122|       |	 */
  123|      4|	fr_talloc_fault_setup();
  124|       |
  125|       |	/*
  126|       |	 *	Initialise the error stack _before_ we run any
  127|       |	 *	tests so there's no chance of the memory
  128|       |	 *	appearing as a leak the first time an error
  129|       |	 *	is generated.
  130|       |	 */
  131|      4|	fr_strerror_const("fuzz"); /* allocate the pools */
  ------------------
  |  |  223|      4|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  132|      4|	fr_strerror_clear(); /* clears the message, leaves the pools */
  133|       |
  134|       |	/*
  135|       |	 *	Setup our own internal atexit handler
  136|       |	 */
  137|      4|	if (atexit(exitHandler)) {
  ------------------
  |  Branch (137:6): [True: 0, False: 4]
  ------------------
  138|      0|		fr_perror("fuzzer: Failed to register exit handler: %s", fr_syserror(errno));
  139|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  140|      0|	}
  141|       |
  142|       |	/*
  143|       |	 *	Get the name from the binary name of fuzzer_foo
  144|       |	 */
  145|      4|	if (!proto) {
  ------------------
  |  Branch (145:6): [True: 4, False: 0]
  ------------------
  146|      4|		proto = strrchr((*argv)[0], '_');
  147|      4|		if (proto) proto++;
  ------------------
  |  Branch (147:7): [True: 4, False: 0]
  ------------------
  148|      4|	}
  149|       |
  150|       |	/*
  151|       |	 *	Look for -D dir
  152|       |	 *
  153|       |	 *	If found, nuke it from the argument list.
  154|       |	 */
  155|      4|	if (!dict_dir) {
  ------------------
  |  Branch (155:6): [True: 2, False: 2]
  ------------------
  156|      2|		int i, j;
  157|       |
  158|     10|		for (i = 0; i < *argc - 1; i++) {
  ------------------
  |  Branch (158:15): [True: 8, False: 2]
  ------------------
  159|      8|			p = (*argv)[i];
  160|       |
  161|      8|			if ((p[0] == '-') && (p[1] == 'D')) {
  ------------------
  |  Branch (161:8): [True: 4, False: 4]
  |  Branch (161:25): [True: 0, False: 4]
  ------------------
  162|      0|				dict_dir = (*argv)[i + 1];
  163|       |
  164|      0|				for (j = i + 2; j < *argc; i++, j++) {
  ------------------
  |  Branch (164:21): [True: 0, False: 0]
  ------------------
  165|      0|					(*argv)[i] = (*argv)[j];
  166|      0|				}
  167|       |
  168|      0|				*argc -= 2;
  169|      0|				break;
  170|      0|			}
  171|      8|		}
  172|      2|	}
  173|       |
  174|      4|#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
  175|       |	/*
  176|       |	 *	oss-fuzz puts the dictionaries, etc. into subdirectories named after the location of the
  177|       |	 *	binary.  So we find the directory of the binary, and append "/dict" or "/lib" to find
  178|       |	 *	dictionaries and libraries.
  179|       |	 */
  180|      4|	p = strrchr((*argv)[0], '/');
  181|      4|	if (p) {
  ------------------
  |  Branch (181:6): [True: 4, False: 0]
  ------------------
  182|      4|		if (!dict_dir) {
  ------------------
  |  Branch (182:7): [True: 2, False: 2]
  ------------------
  183|      2|			dict_dir = dict_dir_to_free = talloc_asprintf(NULL, "%.*s/dict", (int) (p - (*argv)[0]), (*argv)[0]);
  ------------------
  |  |  151|      2|#define talloc_asprintf 	talloc_typed_asprintf
  ------------------
  184|      2|			if (!dict_dir_to_free) fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  |  Branch (184:8): [True: 0, False: 2]
  ------------------
  185|      2|		}
  186|       |
  187|      4|		if (!lib_dir) {
  ------------------
  |  Branch (187:7): [True: 4, False: 0]
  ------------------
  188|      4|			lib_dir = lib_dir_to_free = talloc_asprintf(NULL, "%.*s/lib", (int) (p - (*argv)[0]), (*argv)[0]);
  ------------------
  |  |  151|      4|#define talloc_asprintf 	talloc_typed_asprintf
  ------------------
  189|      4|			if (!lib_dir_to_free) fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  |  Branch (189:8): [True: 0, False: 4]
  ------------------
  190|      4|		}
  191|      4|	}
  192|      4|#endif
  193|       |
  194|      4|	if (!dict_dir) dict_dir = DICTDIR;
  ------------------
  |  |    7|      0|#define DICTDIR		"/usr/local/share/freeradius/dictionary"
  ------------------
  |  Branch (194:6): [True: 0, False: 4]
  ------------------
  195|      4|	if (!lib_dir) lib_dir = LIBDIR;
  ------------------
  |  |    2|      0|#define LIBDIR		"/usr/local/lib"
  ------------------
  |  Branch (195:6): [True: 0, False: 4]
  ------------------
  196|       |
  197|       |	/*
  198|       |	 *	Set the global search path for all dynamic libraries we load.
  199|       |	 */
  200|      4|	if (dl_search_global_path_set(lib_dir) < 0) {
  ------------------
  |  Branch (200:6): [True: 0, False: 4]
  ------------------
  201|      0|		fr_perror("fuzzer: Failed setting library path");
  202|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  203|      0|	}
  204|       |
  205|       |	/*
  206|       |	 *	When jobs=N is specified the fuzzer spawns worker processes via
  207|       |	 *	a shell. We have removed any -D dictdir argument that were
  208|       |	 *	supplied, so we pass it to our children via the environment.
  209|       |	 */
  210|      4|	if (setenv("FR_DICTIONARY_DIR", dict_dir, 1)) {
  ------------------
  |  Branch (210:6): [True: 0, False: 4]
  ------------------
  211|      0|		fprintf(stderr, "Failed to set FR_DICTIONARY_DIR env variable\n");
  212|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  213|      0|	}
  214|       |
  215|      4|	if (!fr_dict_global_ctx_init(NULL, true, dict_dir)) {
  ------------------
  |  Branch (215:6): [True: 0, False: 4]
  ------------------
  216|      0|		fr_perror("dict_global");
  217|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  218|      0|	}
  219|       |
  220|      4|	if (fr_dict_internal_afrom_file(&dict, FR_DICTIONARY_INTERNAL_DIR, __FILE__) < 0) {
  ------------------
  |  |    8|      4|#define FR_DICTIONARY_INTERNAL_DIR	"freeradius"
  ------------------
  |  Branch (220:6): [True: 0, False: 4]
  ------------------
  221|      0|		fr_perror("fuzzer: Failed initializing internal dictionary");
  222|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  223|      0|	}
  224|       |
  225|      4|	if (!proto) {
  ------------------
  |  Branch (225:6): [True: 0, False: 4]
  ------------------
  226|      0|		fr_perror("Failed to find protocol for fuzzer");
  227|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  228|      0|	}
  229|       |
  230|       |	/*
  231|       |	 *	Disable hostname lookups, so we don't produce spurious DNS
  232|       |	 *	queries, and there's no chance of spurious failures if
  233|       |	 *	it takes a long time to get a response.
  234|       |	 */
  235|      4|	fr_hostname_lookups = fr_reverse_lookups = false;
  236|       |
  237|       |	/*
  238|       |	 *	Search in our symbol space first.  We may have been dynamically
  239|       |	 *	or statically linked to the library we're fuzzing...
  240|       |	 */
  241|      4|	dl_proto = fuzzer_dict_init(RTLD_DEFAULT, proto);
  242|       |
  243|      4|	autofree = talloc_autofree_context();
  ------------------
  |  |   55|      4|#define talloc_autofree_context talloc_autofree_context_global
  ------------------
  244|      4|	if (fr_fault_setup(autofree, panic_action, (*argv)[0]) < 0) {
  ------------------
  |  Branch (244:6): [True: 0, False: 4]
  ------------------
  245|      0|		fr_perror("Failed initializing fault handler");
  246|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  247|      0|	}
  248|       |
  249|      4|	init = true;
  250|       |
  251|      4|#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
  252|      4|	talloc_free(dict_dir_to_free);
  253|      4|	talloc_free(lib_dir_to_free);
  254|      4|#endif
  255|       |
  256|      4|	return 1;
  257|      4|}
LLVMFuzzerTestOneInput:
  262|  1.23k|{
  263|  1.23k|	TALLOC_CTX *   ctx = talloc_init_const("fuzzer");
  264|  1.23k|	fr_pair_list_t vps;
  265|  1.23k|	void *decode_ctx = NULL;
  266|  1.23k|	void *encode_ctx = NULL;
  267|  1.23k|	fr_test_point_proto_decode_t *tp_decode = &dhcpv4_tp_decode_proto;
  268|  1.23k|	fr_test_point_proto_encode_t *tp_encode = &dhcpv4_tp_encode_proto;
  269|       |
  270|  1.23k|	fr_pair_list_init(&vps);
  271|  1.23k|	if (!init) LLVMFuzzerInitialize(NULL, NULL);
  ------------------
  |  Branch (271:6): [True: 0, False: 1.23k]
  ------------------
  272|       |
  273|  1.23k|	if (tp_decode->test_ctx && (tp_decode->test_ctx(&decode_ctx, NULL, dict, NULL) < 0)) {
  ------------------
  |  Branch (273:6): [True: 1.23k, False: 0]
  |  Branch (273:29): [True: 0, False: 1.23k]
  ------------------
  274|      0|		fr_perror("fuzzer: Failed initializing test point decode_ctx");
  275|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  276|      0|	}
  277|       |
  278|  1.23k|	if (tp_encode->test_ctx && (tp_encode->test_ctx(&encode_ctx, NULL, dict, NULL) < 0)) {
  ------------------
  |  Branch (278:6): [True: 1.23k, False: 0]
  |  Branch (278:29): [True: 0, False: 1.23k]
  ------------------
  279|      0|		fr_perror("fuzzer: Failed initializing test point encode_ctx");
  280|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
  281|      0|	}
  282|       |
  283|  1.23k|	if (fr_debug_lvl > 3) {
  ------------------
  |  Branch (283:6): [True: 0, False: 1.23k]
  ------------------
  284|      0|		FR_PROTO_TRACE("Fuzzer input");
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  285|       |
  286|      0|		FR_PROTO_HEX_DUMP(buf, len, "");
  ------------------
  |  |   42|      0|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  287|      0|	}
  288|       |
  289|       |	/*
  290|       |	 *	Decode the input, and print the resulting data if we
  291|       |	 *	decoded it successfully.
  292|       |	 *
  293|       |	 *	If we have successfully decoded the data, then encode
  294|       |	 *	it again, too.
  295|       |	 */
  296|  1.23k|	if (tp_decode->func(ctx, &vps, buf, len, decode_ctx) > 0) {
  ------------------
  |  Branch (296:6): [True: 125, False: 1.10k]
  ------------------
  297|    125|		PAIR_LIST_VERIFY_WITH_CTX(ctx, &vps);
  ------------------
  |  |  170|    125|#  define PAIR_LIST_VERIFY_WITH_CTX(_c, _x)	fr_pair_list_verify(__FILE__, __LINE__, _c, _x, true)
  ------------------
  298|       |
  299|    125|		if (fr_debug_lvl > 3) fr_pair_list_debug(stderr, &vps);
  ------------------
  |  Branch (299:7): [True: 0, False: 125]
  ------------------
  300|       |
  301|    125|		if (do_encode) (void) tp_encode->func(ctx, &vps, encoded_data, sizeof(encoded_data), encode_ctx);
  ------------------
  |  Branch (301:7): [True: 0, False: 125]
  ------------------
  302|    125|	}
  303|       |
  304|  1.23k|	talloc_free(decode_ctx);
  305|  1.23k|	talloc_free(encode_ctx);
  306|  1.23k|	talloc_free(ctx);
  307|       |
  308|       |	/*
  309|       |	 *	Clear error messages from the run.  Clearing these
  310|       |	 *	keeps malloc/free balanced, which helps to avoid the
  311|       |	 *	fuzzers leak heuristics from firing.
  312|       |	 */
  313|  1.23k|	fr_strerror_clear();
  314|       |
  315|  1.23k|	return 0;
  316|  1.23k|}
fuzzer_dhcpv4.c:exitHandler:
   56|      4|{
   57|      4|	if (dl_proto && dl_proto->free) dl_proto->free();
  ------------------
  |  Branch (57:6): [True: 2, False: 2]
  |  Branch (57:18): [True: 2, False: 0]
  ------------------
   58|       |
   59|      4|	fr_dict_free(&dict, __FILE__);
   60|       |
   61|      4|	if (dl && dl->handle) {
  ------------------
  |  Branch (61:6): [True: 0, False: 4]
  |  Branch (61:12): [True: 0, False: 0]
  ------------------
   62|      0|		dlclose(dl->handle);
   63|      0|		dl->handle = NULL;
   64|      0|	}
   65|      4|	talloc_free(dl_loader);
   66|       |
   67|      4|	talloc_free(autofree);
   68|       |
   69|       |	/*
   70|       |	 *	Ensure our atexit handlers run before any other
   71|       |	 *	atexit handlers registered by third party libraries.
   72|       |	 */
   73|      4|	fr_atexit_global_trigger_all();
   74|      4|}
fuzzer_dhcpv4.c:fuzzer_dict_init:
   78|      2|{
   79|      2|	char			buffer[256];
   80|      2|	fr_dict_protocol_t	*our_dl_proto;
   81|       |
   82|      2|	snprintf(buffer, sizeof(buffer), "libfreeradius_%s_dict_protocol", proto);
   83|       |
   84|      2|	our_dl_proto = dlsym(dl_handle, buffer);
   85|      2|	if (our_dl_proto && our_dl_proto->init && (our_dl_proto->init() < 0)) {
  ------------------
  |  Branch (85:6): [True: 2, False: 0]
  |  Branch (85:22): [True: 2, False: 0]
  |  Branch (85:44): [True: 0, False: 2]
  ------------------
   86|      0|		fr_perror("fuzzer: Failed initializing library %s", buffer);
   87|      0|		fr_exit_now(EXIT_FAILURE);
  ------------------
  |  |  226|      0|#  define	fr_exit_now(_x) _fr_exit(__FILE__, __LINE__, (_x), true)
  ------------------
   88|      0|	}
   89|       |
   90|      2|	return our_dl_proto;
   91|      2|}

base.c:fr_dhcpv4_attr_flags:
  153|    812|{
  154|    812|	return fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC);
  155|    812|}

dl.c:_fr_atexit_global_once_funcs:
   90|      4|{
   91|      4|	if (init_func) if (init_func(uctx) < 0) return -1;
  ------------------
  |  Branch (91:6): [True: 0, False: 4]
  |  Branch (91:21): [True: 0, False: 0]
  ------------------
   92|      4|	if (free_func) fr_atexit_global(free_func, uctx);
  ------------------
  |  |   58|      4|#define fr_atexit_global(_func, _uctx) _atexit_global(__FILE__, __LINE__, _func, _uctx)
  ------------------
  |  Branch (92:6): [True: 4, False: 0]
  ------------------
   93|       |
   94|      4|	return 0;
   95|      4|}
dl.c:fr_atexit_talloc_free:
  103|      4|{
  104|       |	return talloc_free(to_free);
  105|      4|}

value.c:_fr_dbuff_extend_lowat:
  629|  13.7k|{
  630|  13.7k|	size_t extended = 0;
  631|       |
  632|  13.7k|	if (status && !fr_dbuff_is_extendable(*status)) {
  ------------------
  |  |  618|      0|#define fr_dbuff_is_extendable(_status)		((_status) & FR_DBUFF_FLAG_EXTENDABLE)
  |  |  ------------------
  |  |  |  |  590|      0|#define FR_DBUFF_FLAG_EXTENDABLE		0x01
  |  |  ------------------
  ------------------
  |  Branch (632:6): [True: 0, False: 13.7k]
  |  Branch (632:16): [True: 0, False: 0]
  ------------------
  633|    136|	not_extendable:
  634|    136|		if (status) *status = FR_DBUFF_NOT_EXTENDABLE;
  ------------------
  |  Branch (634:7): [True: 0, False: 136]
  ------------------
  635|    136|		return remaining;
  636|      0|	}
  637|       |
  638|  13.7k|	if (remaining >= lowat) {
  ------------------
  |  Branch (638:6): [True: 13.5k, False: 136]
  ------------------
  639|  13.5k|		if (status) *status = FR_DBUFF_EXTENDABLE;
  ------------------
  |  Branch (639:7): [True: 0, False: 13.5k]
  ------------------
  640|  13.5k|		return remaining;
  641|  13.5k|	}
  642|       |
  643|    136|	if (!in->extend || !(extended = in->extend(in, lowat - remaining))) goto not_extendable;
  ------------------
  |  Branch (643:6): [True: 136, False: 0]
  |  Branch (643:21): [True: 0, False: 0]
  ------------------
  644|       |
  645|      0|	if (status) *status = FR_DBUFF_EXTENDABLE_EXTENDED;
  ------------------
  |  Branch (645:6): [True: 0, False: 0]
  ------------------
  646|       |
  647|      0|	return remaining + extended;
  648|    136|}
value.c:_fr_dbuff_safecpy:
 1285|  3.44k|{
 1286|  3.44k|	ssize_t	diff;
 1287|  3.44k|	size_t	i_len = i_end - i_start;
 1288|       |
 1289|  3.44k|	if (unlikely((o_end < o_start) || (i_end < i_start))) return 0;	/* sanity check */
  ------------------
  |  |  397|  6.88k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 3.44k]
  |  |  |  Branch (397:43): [True: 0, False: 3.44k]
  |  |  |  Branch (397:43): [True: 0, False: 3.44k]
  |  |  ------------------
  ------------------
 1290|       |
 1291|  3.44k|	diff = (o_end - o_start) - (i_len);
 1292|  3.44k|	if (diff < 0) return 0;
  ------------------
  |  Branch (1292:6): [True: 0, False: 3.44k]
  ------------------
 1293|       |
 1294|  3.44k|	if ((i_start > o_end) || (i_end < o_start)) {			/* no-overlap */
  ------------------
  |  Branch (1294:6): [True: 2.86k, False: 575]
  |  Branch (1294:27): [True: 575, False: 0]
  ------------------
 1295|  3.44k|		memcpy(o_start,  i_start, i_len);
 1296|  3.44k|	} else {							/* overlap */
 1297|      0|		memmove(o_start, i_start, i_len);
 1298|      0|	}
 1299|       |
 1300|  3.44k|	return (i_len);
 1301|  3.44k|}
value.c:_fr_dbuff_set:
  985|  26.8k|{
  986|  26.8k|	uint8_t *c;
  987|       |
  988|  26.8k|	if (unlikely(p > dbuff->end)) return -(p - dbuff->end);
  ------------------
  |  |  397|  26.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 26.8k]
  |  |  ------------------
  ------------------
  989|  26.8k|	if (unlikely(p < dbuff->start)) return 0;
  ------------------
  |  |  397|  26.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 26.8k]
  |  |  ------------------
  ------------------
  990|       |
  991|  26.8k|	c = *pos_p;
  992|  26.8k|	if (dbuff->adv_parent && dbuff->parent) _fr_dbuff_set_recurse(dbuff->parent, dbuff->adv_parent, p);
  ------------------
  |  Branch (992:6): [True: 0, False: 26.8k]
  |  Branch (992:27): [True: 0, False: 0]
  ------------------
  993|  26.8k|	*pos_p = UNCONST(uint8_t *, p);
  ------------------
  |  |  186|  26.8k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  994|       |
  995|  26.8k|	return p - c;
  996|  26.8k|}
value.c:_fr_dbuff_out_memcpy:
 1697|  4.47k|{
 1698|  4.47k|	size_t	ext_len, to_copy, remaining;
 1699|       |
 1700|  7.91k|	for (remaining = outlen; remaining > 0; remaining -= to_copy) {
  ------------------
  |  Branch (1700:27): [True: 3.57k, False: 4.34k]
  ------------------
 1701|  3.57k|		to_copy = remaining;
 1702|  3.57k|		ext_len = _fr_dbuff_extend_lowat(NULL, in, fr_dbuff_end(in) - (*pos_p), 1);
  ------------------
  |  |  947|  3.57k|	(_Generic((_dbuff_or_marker), \
  |  |  948|  3.57k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->end), \
  |  |  949|  3.57k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->end), \
  |  |  950|  3.57k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->end), \
  |  |  951|  3.57k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->end) \
  |  |  952|  3.57k|	))
  ------------------
 1703|  3.57k|		if (ext_len == 0) return -remaining;
  ------------------
  |  Branch (1703:7): [True: 136, False: 3.44k]
  ------------------
 1704|  3.44k|		if (ext_len < to_copy) to_copy = ext_len;
  ------------------
  |  Branch (1704:7): [True: 5, False: 3.43k]
  ------------------
 1705|  3.44k|		out += _fr_dbuff_set(pos_p, in,
 1706|  3.44k|				     (*pos_p) + _fr_dbuff_safecpy(out, out + to_copy, (*pos_p), (*pos_p) + to_copy));
 1707|  3.44k|	}
 1708|       |
 1709|  4.34k|	return outlen;
 1710|  4.47k|}

decode.c:fr_dict_attr_unknown_raw_afrom_da:
  632|  3.29k|{
  633|  3.29k|	return fr_dict_attr_unknown_alloc(ctx, da, FR_TYPE_OCTETS);
  634|  3.29k|}
dict_unknown.c:fr_dict_attr_unknown_copy:
  585|      8|{
  586|      8|	fr_assert(da->flags.is_unknown);
  ------------------
  |  |  194|      8|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  587|       |
  588|      8|	return fr_dict_attr_unknown_afrom_da(ctx, da);
  589|      8|}
pair.c:fr_dict_attr_unknown_copy:
  585|  2.72k|{
  586|  2.72k|	fr_assert(da->flags.is_unknown);
  ------------------
  |  |  194|  2.72k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  2.72k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.72k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  587|       |
  588|  2.72k|	return fr_dict_attr_unknown_afrom_da(ctx, da);
  589|  2.72k|}
struct.c:fr_dict_attr_unknown_raw_afrom_num:
  614|      8|{
  615|      8|	return fr_dict_attr_unknown_typed_afrom_num_raw(ctx, parent, attr, FR_TYPE_OCTETS, true);
  616|      8|}
value.c:fr_dict_attr_unknown_raw_afrom_num:
  614|  2.06k|{
  615|  2.06k|	return fr_dict_attr_unknown_typed_afrom_num_raw(ctx, parent, attr, FR_TYPE_OCTETS, true);
  616|  2.06k|}
base.c:dict_flag_dns_label:
  436|     20|static int dict_flag_##_name(fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)\
  437|     20|{ \
  438|     20|	_struct *flags = fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC); \
  439|     20|	flags->_name = 1; \
  440|     20|	return 0; \
  441|     20|}
base.c:dict_flag_exists:
  436|     12|static int dict_flag_##_name(fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)\
  437|     12|{ \
  438|     12|	_struct *flags = fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC); \
  439|     12|	flags->_name = 1; \
  440|     12|	return 0; \
  441|     12|}
decode.c:fr_dict_attr_unknown_raw_afrom_num:
  614|    131|{
  615|    131|	return fr_dict_attr_unknown_typed_afrom_num_raw(ctx, parent, attr, FR_TYPE_OCTETS, true);
  616|    131|}
decode.c:fr_dict_attr_unknown_vendor_afrom_num:
  607|     71|{
  608|     71|	return fr_dict_attr_unknown_typed_afrom_num_raw(ctx, parent, vendor, FR_TYPE_VENDOR, false);
  609|     71|}

dict_fixup.c:fr_dict_attr_ref:
  149|      2|{
  150|      2|	fr_dict_attr_ext_ref_t *ext;
  151|       |
  152|      2|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF);
  153|      2|	if (!ext) return NULL;
  ------------------
  |  Branch (153:6): [True: 2, False: 0]
  ------------------
  154|       |
  155|       |	/*
  156|       |	 *	Unresolve refs aren't valid refs...
  157|       |	 */
  158|      0|	if (fr_dict_attr_ref_is_unresolved(ext->type)) return NULL;
  ------------------
  |  |   71|      0|#define fr_dict_attr_ref_is_unresolved(_type)	((_type) & FR_DICT_ATTR_REF_UNRESOLVED)
  |  |  ------------------
  |  |  |  Branch (71:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  159|       |
  160|       |	/*
  161|       |	 *	Temporary backwards compatibility...
  162|       |	 */
  163|      0|	if (ext->type != FR_DICT_ATTR_REF_ALIAS) return NULL;
  ------------------
  |  Branch (163:6): [True: 0, False: 0]
  ------------------
  164|       |
  165|      0|	return ext->ref;
  166|      0|}
dict_fixup.c:fr_dict_attr_ext:
  122|      4|{
  123|      4|	if (!da->ext[ext]) return NULL;
  ------------------
  |  Branch (123:6): [True: 2, False: 2]
  ------------------
  124|       |
  125|      2|	return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr);
  126|      4|}
dict_tokenize.c:fr_dict_attr_ext:
  122|  1.61k|{
  123|  1.61k|	if (!da->ext[ext]) return NULL;
  ------------------
  |  Branch (123:6): [True: 1.57k, False: 38]
  ------------------
  124|       |
  125|     38|	return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr);
  126|  1.61k|}
dict_unknown.c:fr_dict_attr_ext:
  122|  6.86k|{
  123|  6.86k|	if (!da->ext[ext]) return NULL;
  ------------------
  |  Branch (123:6): [True: 0, False: 6.86k]
  ------------------
  124|       |
  125|  6.86k|	return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr);
  126|  6.86k|}
dict_util.c:fr_dict_attr_ext:
  122|   166k|{
  123|   166k|	if (!da->ext[ext]) return NULL;
  ------------------
  |  Branch (123:6): [True: 78.6k, False: 87.9k]
  ------------------
  124|       |
  125|  87.9k|	return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr);
  126|   166k|}
dict_util.c:fr_dict_attr_has_ext:
  137|  88.6k|{
  138|  88.6k|	return (da->ext[ext] > 0);
  139|  88.6k|}
dict_util.c:fr_dict_attr_ref:
  149|  76.2k|{
  150|  76.2k|	fr_dict_attr_ext_ref_t *ext;
  151|       |
  152|  76.2k|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF);
  153|  76.2k|	if (!ext) return NULL;
  ------------------
  |  Branch (153:6): [True: 76.1k, False: 20]
  ------------------
  154|       |
  155|       |	/*
  156|       |	 *	Unresolve refs aren't valid refs...
  157|       |	 */
  158|     20|	if (fr_dict_attr_ref_is_unresolved(ext->type)) return NULL;
  ------------------
  |  |   71|     20|#define fr_dict_attr_ref_is_unresolved(_type)	((_type) & FR_DICT_ATTR_REF_UNRESOLVED)
  |  |  ------------------
  |  |  |  Branch (71:47): [True: 12, False: 8]
  |  |  ------------------
  ------------------
  159|       |
  160|       |	/*
  161|       |	 *	Temporary backwards compatibility...
  162|       |	 */
  163|      8|	if (ext->type != FR_DICT_ATTR_REF_ALIAS) return NULL;
  ------------------
  |  Branch (163:6): [True: 0, False: 8]
  ------------------
  164|       |
  165|      8|	return ext->ref;
  166|      8|}
dict_util.c:fr_dict_vendor_num_by_da:
  177|  2.28k|{
  178|  2.28k|	fr_dict_attr_ext_vendor_t *ext;
  179|       |
  180|  2.28k|	if (da->type == FR_TYPE_VENDOR) return da->attr;
  ------------------
  |  Branch (180:6): [True: 10, False: 2.27k]
  ------------------
  181|       |
  182|  2.27k|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_VENDOR);
  183|  2.27k|	if (!ext || !ext->vendor) return 0;
  ------------------
  |  Branch (183:6): [True: 2.21k, False: 62]
  |  Branch (183:14): [True: 0, False: 62]
  ------------------
  184|       |
  185|     62|	return ext->vendor->attr;
  186|  2.27k|}
dict_util.c:fr_dict_enum_ext:
  217|      2|{
  218|      2|	if (!enumv->ext[ext]) return NULL;
  ------------------
  |  Branch (218:6): [True: 2, False: 0]
  ------------------
  219|       |
  220|      0|	return fr_ext_ptr(enumv, enumv->ext[ext], fr_dict_enum_ext_def.info[ext].has_hdr);
  221|      2|}
dict_validate.c:fr_dict_attr_ext:
  122|      2|{
  123|      2|	if (!da->ext[ext]) return NULL;
  ------------------
  |  Branch (123:6): [True: 0, False: 2]
  ------------------
  124|       |
  125|      2|	return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr);
  126|      2|}
struct.c:fr_dict_enum_attr_ref:
  231|    102|{
  232|    102|	fr_dict_enum_ext_attr_ref_t const *ref;
  233|       |
  234|    102|	ref = fr_dict_enum_ext(enumv, FR_DICT_ENUM_EXT_ATTR_REF);
  235|    102|	if (!ref) return NULL;
  ------------------
  |  Branch (235:6): [True: 0, False: 102]
  ------------------
  236|       |
  237|    102|	return ref->da;
  238|    102|}
struct.c:fr_dict_enum_ext:
  217|    102|{
  218|    102|	if (!enumv->ext[ext]) return NULL;
  ------------------
  |  Branch (218:6): [True: 0, False: 102]
  ------------------
  219|       |
  220|    102|	return fr_ext_ptr(enumv, enumv->ext[ext], fr_dict_enum_ext_def.info[ext].has_hdr);
  221|    102|}
base.c:fr_dict_attr_ext:
  122|    848|{
  123|    848|	if (!da->ext[ext]) return NULL;
  ------------------
  |  Branch (123:6): [True: 0, False: 848]
  ------------------
  124|       |
  125|    848|	return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr);
  126|    848|}
decode.c:fr_dict_attr_ext:
  122|  2.64k|{
  123|  2.64k|	if (!da->ext[ext]) return NULL;
  ------------------
  |  Branch (123:6): [True: 0, False: 2.64k]
  ------------------
  124|       |
  125|  2.64k|	return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr);
  126|  2.64k|}

dict_fixup.c:dict_attr_children:
  259|      2|{
  260|      2|	fr_dict_attr_ext_children_t *ext;
  261|       |
  262|      2|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_CHILDREN);
  263|      2|	if (unlikely(!ext)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  264|      0|		fr_strerror_printf("Attribute contains no 'children' extension");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  265|      0|		return NULL;
  266|      0|	}
  267|      2|	return ext->children;
  268|      2|}
dict_tokenize.c:dict_attr_ref_aunresolved:
  224|      2|{
  225|      2|	fr_dict_attr_ext_ref_t	*ext;
  226|      2|	fr_dict_attr_t		*da;
  227|       |
  228|      2|	ext = fr_dict_attr_ext((*da_p), FR_DICT_ATTR_EXT_REF);
  229|      2|	if (unlikely(!ext)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  230|      2|		ext = dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_REF);
  231|      2|		if (unlikely(!ext)) return -1;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  232|      2|	}
  233|      2|	da = *da_p;
  234|      2|	if (unlikely(ext->type != 0)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  235|      0|		fr_strerror_printf("Attribute already has a 'ref=...' defined");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  236|      0|		return -1;
  237|      0|	}
  238|      2|	ext->type = type | FR_DICT_ATTR_REF_UNRESOLVED;	/* Always unresolved */
  239|      2|	ext->unresolved = talloc_strdup(da, ref);
  ------------------
  |  |  149|      2|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  240|       |
  241|      2|	return 0;
  242|      2|}
dict_tokenize.c:dict_attr_ext_alloc:
   69|      4|{
   70|      4|	if (!dict_attr_ext_mutable(da_p)) return NULL;
  ------------------
  |  Branch (70:6): [True: 0, False: 4]
  ------------------
   71|       |
   72|      4|	return fr_ext_alloc_size(&fr_dict_attr_ext_def, (void **)da_p, ext, fr_dict_attr_ext_def.info[ext].min);
   73|      4|}
dict_tokenize.c:dict_attr_ext_mutable:
   41|      4|{
   42|      4|	if ((*da_p)->flags.is_ref_target) {
  ------------------
  |  Branch (42:6): [True: 0, False: 4]
  ------------------
   43|      0|		fr_strerror_printf("%s is already the target of a reference, and cannot be changed", (*da_p)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   44|      0|		return false;
   45|      0|	}
   46|       |
   47|      4|	if (!(*da_p)->flags.is_unknown && unlikely((*da_p)->dict && fr_dict_is_read_only((*da_p)->dict))) {
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  Branch (397:43): [True: 4, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  |  Branch (47:6): [True: 4, False: 0]
  ------------------
   48|      0|		fr_strerror_printf("%s dictionary has been marked as read only", fr_dict_root((*da_p)->dict)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   49|      0|		return false;
   50|      0|	}
   51|       |
   52|      4|	return true;
   53|      4|}
dict_unknown.c:dict_attr_ext_copy:
   87|  6.86k|{
   88|  6.86k|	if (!dict_attr_ext_mutable(da_out_p)) return NULL;
  ------------------
  |  Branch (88:6): [True: 0, False: 6.86k]
  ------------------
   89|       |
   90|       |	/*
   91|       |	 *	We might be able to copy things for unknown
   92|       |	 *	attributes.  But if the unknown is of type 'octets',
   93|       |	 *	then we can only copy the protocol-specific things.
   94|       |	 */
   95|  6.86k|#ifndef NDEBUG
   96|  6.86k|	if ((*da_out_p)->flags.is_unknown && ((*da_out_p)->type == FR_TYPE_OCTETS)) {
  ------------------
  |  Branch (96:6): [True: 6.86k, False: 0]
  |  Branch (96:39): [True: 6.85k, False: 13]
  ------------------
   97|  6.85k|		fr_assert((ext == FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC) || (ext == FR_DICT_ATTR_EXT_VENDOR));
  ------------------
  |  |  194|  6.85k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  6.85k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 6.85k]
  |  |  |  |  |  Branch (397:43): [True: 6.85k, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  6.85k|	}
   99|  6.86k|#endif
  100|       |
  101|  6.86k|	return fr_ext_copy(&fr_dict_attr_ext_def, (void **)da_out_p, (void const *)da_in, ext);
  102|  6.86k|}
dict_unknown.c:dict_attr_ext_mutable:
   41|  6.86k|{
   42|  6.86k|	if ((*da_p)->flags.is_ref_target) {
  ------------------
  |  Branch (42:6): [True: 0, False: 6.86k]
  ------------------
   43|      0|		fr_strerror_printf("%s is already the target of a reference, and cannot be changed", (*da_p)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   44|      0|		return false;
   45|      0|	}
   46|       |
   47|  6.86k|	if (!(*da_p)->flags.is_unknown && unlikely((*da_p)->dict && fr_dict_is_read_only((*da_p)->dict))) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (47:6): [True: 0, False: 6.86k]
  ------------------
   48|      0|		fr_strerror_printf("%s dictionary has been marked as read only", fr_dict_root((*da_p)->dict)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   49|      0|		return false;
   50|      0|	}
   51|       |
   52|  6.86k|	return true;
   53|  6.86k|}
dict_util.c:dict_attr_ext_alloc:
   69|  11.1k|{
   70|  11.1k|	if (!dict_attr_ext_mutable(da_p)) return NULL;
  ------------------
  |  Branch (70:6): [True: 0, False: 11.1k]
  ------------------
   71|       |
   72|  11.1k|	return fr_ext_alloc_size(&fr_dict_attr_ext_def, (void **)da_p, ext, fr_dict_attr_ext_def.info[ext].min);
   73|  11.1k|}
dict_util.c:dict_attr_ext_mutable:
   41|  42.7k|{
   42|  42.7k|	if ((*da_p)->flags.is_ref_target) {
  ------------------
  |  Branch (42:6): [True: 0, False: 42.7k]
  ------------------
   43|      0|		fr_strerror_printf("%s is already the target of a reference, and cannot be changed", (*da_p)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   44|      0|		return false;
   45|      0|	}
   46|       |
   47|  42.7k|	if (!(*da_p)->flags.is_unknown && unlikely((*da_p)->dict && fr_dict_is_read_only((*da_p)->dict))) {
  ------------------
  |  |  397|  29.5k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 24.4k]
  |  |  |  Branch (397:43): [True: 5.12k, False: 19.3k]
  |  |  |  Branch (397:43): [True: 0, False: 5.12k]
  |  |  ------------------
  ------------------
  |  Branch (47:6): [True: 24.4k, False: 18.2k]
  ------------------
   48|      0|		fr_strerror_printf("%s dictionary has been marked as read only", fr_dict_root((*da_p)->dict)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   49|      0|		return false;
   50|      0|	}
   51|       |
   52|  42.7k|	return true;
   53|  42.7k|}
dict_util.c:dict_attr_ext_copy:
   87|  10.7k|{
   88|  10.7k|	if (!dict_attr_ext_mutable(da_out_p)) return NULL;
  ------------------
  |  Branch (88:6): [True: 0, False: 10.7k]
  ------------------
   89|       |
   90|       |	/*
   91|       |	 *	We might be able to copy things for unknown
   92|       |	 *	attributes.  But if the unknown is of type 'octets',
   93|       |	 *	then we can only copy the protocol-specific things.
   94|       |	 */
   95|  10.7k|#ifndef NDEBUG
   96|  10.7k|	if ((*da_out_p)->flags.is_unknown && ((*da_out_p)->type == FR_TYPE_OCTETS)) {
  ------------------
  |  Branch (96:6): [True: 9.13k, False: 1.64k]
  |  Branch (96:39): [True: 9.04k, False: 84]
  ------------------
   97|  9.04k|		fr_assert((ext == FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC) || (ext == FR_DICT_ATTR_EXT_VENDOR));
  ------------------
  |  |  194|  9.04k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  18.0k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 9.04k]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 9.04k]
  |  |  |  |  |  Branch (397:43): [True: 9.04k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  9.04k|	}
   99|  10.7k|#endif
  100|       |
  101|  10.7k|	return fr_ext_copy(&fr_dict_attr_ext_def, (void **)da_out_p, (void const *)da_in, ext);
  102|  10.7k|}
dict_util.c:dict_attr_ref_set:
  173|     40|{
  174|     40|	fr_dict_attr_ext_ref_t	*ext;
  175|       |
  176|     40|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF);
  177|     40|	if (unlikely(!ext)) {
  ------------------
  |  |  397|     40|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 40]
  |  |  ------------------
  ------------------
  178|      0|		fr_strerror_printf("Attribute contains no 'ref' extension");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  179|      0|		return -1;
  180|      0|	}
  181|       |
  182|       |	/*
  183|       |	 *	Check that the attribute ref is unresolved.
  184|       |	 */
  185|     40|	if (unlikely((type & FR_DICT_ATTR_REF_UNRESOLVED) != 0)) {
  ------------------
  |  |  397|     40|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 40]
  |  |  ------------------
  ------------------
  186|      0|		fr_strerror_printf("Reference type cannot be unresolved");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  187|      0|		return -1;
  188|      0|	}
  189|       |
  190|     40|	ext->type = type;
  191|     40|	ext->ref = ref;
  192|       |
  193|     40|	UNCONST(fr_dict_attr_t *, ref)->flags.is_ref_target = true;
  ------------------
  |  |  186|     40|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  194|       |
  195|     40|	return 0;
  196|     40|}
dict_util.c:dict_attr_ext_alloc_size:
   59|  20.8k|{
   60|  20.8k|	if (!dict_attr_ext_mutable(da_p)) return NULL;
  ------------------
  |  Branch (60:6): [True: 0, False: 20.8k]
  ------------------
   61|       |
   62|  20.8k|	return fr_ext_alloc_size(&fr_dict_attr_ext_def, (void **)da_p, ext, ext_len);
   63|  20.8k|}
dict_util.c:dict_attr_ext_copy_all:
  108|      4|{
  109|      4|	if (!dict_attr_ext_mutable(da_out_p)) return -1;
  ------------------
  |  Branch (109:6): [True: 0, False: 4]
  ------------------
  110|       |
  111|      4|	return fr_ext_copy_all(&fr_dict_attr_ext_def, (void **)da_out_p, (void const *)da_in);
  112|      4|}
dict_util.c:dict_attr_namespace:
  278|  50.8k|{
  279|  50.8k|	fr_dict_attr_t const		*ref;
  280|  50.8k|	fr_dict_attr_ext_namespace_t	*ext;
  281|       |
  282|  50.8k|	ref = fr_dict_attr_ref(da);
  283|  50.8k|	if (unlikely(ref != NULL)) return NULL;
  ------------------
  |  |  397|  50.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 50.8k]
  |  |  ------------------
  ------------------
  284|       |
  285|  50.8k|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_NAMESPACE);
  286|  50.8k|	if (!ext) return NULL;
  ------------------
  |  Branch (286:6): [True: 0, False: 50.8k]
  ------------------
  287|       |
  288|  50.8k|	return ext->namespace;
  289|  50.8k|}
dict_util.c:dict_attr_children:
  259|  25.2k|{
  260|  25.2k|	fr_dict_attr_ext_children_t *ext;
  261|       |
  262|  25.2k|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_CHILDREN);
  263|  25.2k|	if (unlikely(!ext)) {
  ------------------
  |  |  397|  25.2k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 4, False: 25.2k]
  |  |  ------------------
  ------------------
  264|      4|		fr_strerror_printf("Attribute contains no 'children' extension");
  ------------------
  |  |   65|      4|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  265|      4|		return NULL;
  266|      4|	}
  267|  25.2k|	return ext->children;
  268|  25.2k|}
dict_util.c:dict_attr_children_set:
  245|    104|{
  246|    104|	fr_dict_attr_ext_children_t *ext;
  247|       |
  248|    104|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_CHILDREN);
  249|    104|	if (unlikely(!ext)) {
  ------------------
  |  |  397|    104|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 104]
  |  |  ------------------
  ------------------
  250|      0|		fr_strerror_printf("Attribute contains no 'children' extension");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  251|      0|		return -1;
  252|      0|	}
  253|    104|	ext->children = children;
  254|       |
  255|    104|	return 0;
  256|    104|}
dict_util.c:dict_enum_ext_alloc:
  296|      2|{
  297|      2|	fr_assert(!fr_dict_enum_ext(*enumv_p, ext));
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  298|       |
  299|      2|	return fr_ext_alloc_size(&fr_dict_enum_ext_def, (void **)enumv_p, ext, fr_dict_enum_ext_def.info[ext].min);
  300|      2|}
dict_util.c:dict_attr_ref_null:
  129|      2|{
  130|      2|	fr_dict_attr_ext_ref_t	*ext;
  131|       |
  132|      2|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF);
  133|      2|	if (unlikely(!ext)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  134|      0|		fr_strerror_printf("Contains no 'ref' extension");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  135|      0|		return -1;
  136|      0|	}
  137|       |
  138|      2|	if (unlikely((ext->type & FR_DICT_ATTR_REF_UNRESOLVED) != 0)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  139|      0|		fr_strerror_printf("Contains an resolved 'ref' extension");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  140|      0|		return -1;
  141|      0|	}
  142|       |
  143|      2|	ext->type = 0;
  144|      2|	ext->ref = NULL;
  145|       |
  146|      2|	return 0;
  147|      2|}
dict_util.c:dict_attr_ref_aset:
  150|      6|{
  151|      6|	fr_dict_attr_ext_ref_t	*ext;
  152|       |
  153|      6|	ext = fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_REF);
  154|      6|	if (unlikely(!ext)) {
  ------------------
  |  |  397|      6|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  155|      6|		ext = dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_REF);
  156|      6|	}
  157|       |
  158|       |	/*
  159|       |	 *	Check that the attribute ref is unresolved.
  160|       |	 */
  161|      6|	if (unlikely((type & FR_DICT_ATTR_REF_UNRESOLVED) != 0)) {
  ------------------
  |  |  397|      6|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 6]
  |  |  ------------------
  ------------------
  162|      0|		fr_strerror_printf("Reference type cannot be unresolved");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  163|      0|		return -1;
  164|      0|	}
  165|       |
  166|      6|	ext->type = type;
  167|      6|	ext->ref = ref;
  168|       |
  169|      6|	return 0;
  170|      6|}

atexit.c:_fr_dlist_init:
  264|     12|{
  265|     12|	fr_assert(offset < (1 << 20)); /* list_head->offset is `unsigned int`, and 1G structs are stupid. */
  ------------------
  |  |  194|     12|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     12|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 12]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|       |
  267|     12|	fr_dlist_entry_init(&list_head->entry);
  268|     12|	list_head->offset = offset;
  269|     12|	list_head->type = type;
  270|     12|	list_head->num_elements = 0;
  271|     12|}
atexit.c:fr_dlist_entry_init:
  121|     12|{
  122|     12|	entry->prev = entry->next = entry;
  123|     12|}
atexit.c:fr_dlist_talloc_free:
  893|     12|{
  894|     12|	void *e;
  895|       |
  896|     24|	while ((e = fr_dlist_pop_head(head)) != NULL) {
  ------------------
  |  Branch (896:9): [True: 12, False: 12]
  ------------------
  897|       |		talloc_free(e);
  898|     12|	}
  899|     12|}
atexit.c:fr_dlist_insert_head:
  321|     20|{
  322|     20|	fr_dlist_t *entry;
  323|     20|	fr_dlist_t *head;
  324|       |
  325|     20|	CHECK_ELEMENT_COUNT(list_head, 1);
  ------------------
  |  |  287|     20|	if (unlikely((_head)->num_elements > (UINT_MAX - (_add)))) do { \
  |  |  ------------------
  |  |  |  |  397|     20|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 20]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|		fr_strerror_const("Maximum elements in list"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |  289|      0|		return -1; \
  |  |  290|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (290:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
  326|       |
  327|     20|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  328|     20|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (328:6): [True: 20, False: 0]
  ------------------
  329|     20|#endif
  330|       |
  331|     20|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  332|     20|	head = &(list_head->entry);
  333|       |
  334|     20|	if (!fr_cond_assert(head->next != NULL)) return -1;
  ------------------
  |  |  131|     20|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|     40|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 20, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (334:6): [True: 0, False: 20]
  ------------------
  335|     20|	if (!fr_cond_assert(head->prev != NULL)) return -1;
  ------------------
  |  |  131|     20|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|     40|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 20, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (335:6): [True: 0, False: 20]
  ------------------
  336|       |
  337|     20|	entry->prev = head;
  338|     20|	entry->next = head->next;
  339|     20|	head->next->prev = entry;
  340|     20|	head->next = entry;
  341|       |
  342|     20|	list_head->num_elements++;
  343|       |
  344|     20|	return 0;
  345|     20|}
atexit.c:fr_dlist_item_to_entry:
  105|     46|{
  106|     46|	return (fr_dlist_t *)(((uintptr_t) item) + offset);
  107|     46|}
atexit.c:fr_dlist_entry_in_list:
  146|     38|{
  147|     38|	if (((entry->prev == entry) && (entry->next == entry)) ||
  ------------------
  |  Branch (147:7): [True: 18, False: 20]
  |  Branch (147:33): [True: 18, False: 0]
  ------------------
  148|     20|	    ((entry->prev == NULL) && (entry->next == NULL))) return false;
  ------------------
  |  Branch (148:7): [True: 0, False: 20]
  |  Branch (148:32): [True: 0, False: 0]
  ------------------
  149|       |
  150|     20|	return true;
  151|     38|}
atexit.c:fr_dlist_next:
  538|     22|{
  539|     22|	fr_dlist_t const	*entry;
  540|     22|	fr_dlist_t const	*head;
  541|       |
  542|     22|	if (!ptr) return fr_dlist_head(list_head);
  ------------------
  |  Branch (542:6): [True: 16, False: 6]
  ------------------
  543|       |
  544|      6|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  545|      6|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (545:6): [True: 6, False: 0]
  ------------------
  546|      6|#endif
  547|      6|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  548|      6|	head = &(list_head->entry);
  549|       |
  550|      6|	if (entry->next == head) return NULL;
  ------------------
  |  Branch (550:6): [True: 4, False: 2]
  ------------------
  551|      2|	if (!entry->next) return NULL;
  ------------------
  |  Branch (551:6): [True: 0, False: 2]
  ------------------
  552|      2|	entry = entry->next;
  553|       |
  554|      2|	return fr_dlist_entry_to_item(list_head->offset, entry);
  555|      2|}
atexit.c:fr_dlist_head:
  469|     40|{
  470|     40|	fr_dlist_t const *head = &(list_head->entry);
  471|       |
  472|     40|	if (head->next == head) return NULL;
  ------------------
  |  Branch (472:6): [True: 16, False: 24]
  ------------------
  473|       |
  474|     24|	return fr_dlist_entry_to_item(list_head->offset, head->next);
  475|     40|}
atexit.c:fr_dlist_entry_to_item:
  113|     26|{
  114|     26|	return (void *)(((uintptr_t) entry) - offset);
  115|     26|}
atexit.c:fr_dlist_remove:
  621|     32|{
  622|     32|	fr_dlist_t *entry;
  623|     32|	fr_dlist_t *head;
  624|     32|	fr_dlist_t *prev;
  625|       |
  626|     32|	if (!ptr || fr_dlist_empty(list_head)) return NULL;
  ------------------
  |  Branch (626:6): [True: 12, False: 20]
  |  Branch (626:14): [True: 0, False: 20]
  ------------------
  627|       |
  628|     20|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  629|     20|	if (list_head->type) (void)_talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (629:6): [True: 20, False: 0]
  ------------------
  630|     20|#endif
  631|       |
  632|     20|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  633|     20|	if (!fr_dlist_entry_in_list(entry)) return NULL;
  ------------------
  |  Branch (633:6): [True: 0, False: 20]
  ------------------
  634|       |
  635|     20|	head = &(list_head->entry);
  636|     20|	entry->prev->next = entry->next;
  637|     20|	entry->next->prev = prev = entry->prev;
  638|     20|	entry->prev = entry->next = entry;
  639|       |
  640|     20|	list_head->num_elements--;
  641|       |
  642|     20|	if (prev == head) return NULL;	/* Works with fr_dlist_next so that the next item is the list HEAD */
  ------------------
  |  Branch (642:6): [True: 20, False: 0]
  ------------------
  643|       |
  644|      0|	return fr_dlist_entry_to_item(list_head->offset, prev);
  645|     20|}
atexit.c:fr_dlist_empty:
  484|     20|{
  485|     20|	fr_dlist_t const *head = &(list_head->entry);
  486|     20|	return (head->prev == head);
  487|     20|}
atexit.c:fr_dlist_pop_head:
  655|     24|{
  656|     24|	void *item = fr_dlist_head(list_head);
  657|       |
  658|     24|	(void)fr_dlist_remove(list_head, item);
  659|       |
  660|     24|	return item;	/* fr_dlist_remove returns the previous item */
  661|     24|}
dict_fixup.c:fr_dlist_insert_tail:
  361|      4|{
  362|      4|	fr_dlist_t *entry;
  363|      4|	fr_dlist_t *head;
  364|       |
  365|      4|	CHECK_ELEMENT_COUNT(list_head, 1);
  ------------------
  |  |  287|      4|	if (unlikely((_head)->num_elements > (UINT_MAX - (_add)))) do { \
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|		fr_strerror_const("Maximum elements in list"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |  289|      0|		return -1; \
  |  |  290|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (290:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
  366|       |
  367|      4|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  368|      4|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (368:6): [True: 4, False: 0]
  ------------------
  369|      4|#endif
  370|       |
  371|      4|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  372|      4|	head = &(list_head->entry);
  373|       |
  374|      4|	if (!fr_cond_assert(head->next != NULL)) return -1;
  ------------------
  |  |  131|      4|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|      8|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (374:6): [True: 0, False: 4]
  ------------------
  375|      4|	if (!fr_cond_assert(head->prev != NULL)) return -1;
  ------------------
  |  |  131|      4|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|      8|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (375:6): [True: 0, False: 4]
  ------------------
  376|       |
  377|      4|	entry->next = head;
  378|      4|	entry->prev = head->prev;
  379|      4|	head->prev->next = entry;
  380|      4|	head->prev = entry;
  381|       |
  382|      4|	list_head->num_elements++;
  383|       |
  384|      4|	return 0;
  385|      4|}
dict_fixup.c:fr_dlist_item_to_entry:
  105|      8|{
  106|      8|	return (fr_dlist_t *)(((uintptr_t) item) + offset);
  107|      8|}
dict_fixup.c:_fr_dlist_init:
  264|     24|{
  265|     24|	fr_assert(offset < (1 << 20)); /* list_head->offset is `unsigned int`, and 1G structs are stupid. */
  ------------------
  |  |  194|     24|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     24|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 24]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|       |
  267|     24|	fr_dlist_entry_init(&list_head->entry);
  268|     24|	list_head->offset = offset;
  269|     24|	list_head->type = type;
  270|     24|	list_head->num_elements = 0;
  271|     24|}
dict_fixup.c:fr_dlist_entry_init:
  121|     24|{
  122|     24|	entry->prev = entry->next = entry;
  123|     24|}
dict_fixup.c:fr_dlist_head:
  469|     40|{
  470|     40|	fr_dlist_t const *head = &(list_head->entry);
  471|       |
  472|     40|	if (head->next == head) return NULL;
  ------------------
  |  Branch (472:6): [True: 36, False: 4]
  ------------------
  473|       |
  474|      4|	return fr_dlist_entry_to_item(list_head->offset, head->next);
  475|     40|}
dict_fixup.c:fr_dlist_entry_to_item:
  113|      4|{
  114|      4|	return (void *)(((uintptr_t) entry) - offset);
  115|      4|}
dict_fixup.c:fr_dlist_remove:
  621|      4|{
  622|      4|	fr_dlist_t *entry;
  623|      4|	fr_dlist_t *head;
  624|      4|	fr_dlist_t *prev;
  625|       |
  626|      4|	if (!ptr || fr_dlist_empty(list_head)) return NULL;
  ------------------
  |  Branch (626:6): [True: 0, False: 4]
  |  Branch (626:14): [True: 0, False: 4]
  ------------------
  627|       |
  628|      4|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  629|      4|	if (list_head->type) (void)_talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (629:6): [True: 4, False: 0]
  ------------------
  630|      4|#endif
  631|       |
  632|      4|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  633|      4|	if (!fr_dlist_entry_in_list(entry)) return NULL;
  ------------------
  |  Branch (633:6): [True: 0, False: 4]
  ------------------
  634|       |
  635|      4|	head = &(list_head->entry);
  636|      4|	entry->prev->next = entry->next;
  637|      4|	entry->next->prev = prev = entry->prev;
  638|      4|	entry->prev = entry->next = entry;
  639|       |
  640|      4|	list_head->num_elements--;
  641|       |
  642|      4|	if (prev == head) return NULL;	/* Works with fr_dlist_next so that the next item is the list HEAD */
  ------------------
  |  Branch (642:6): [True: 4, False: 0]
  ------------------
  643|       |
  644|      0|	return fr_dlist_entry_to_item(list_head->offset, prev);
  645|      4|}
dict_fixup.c:fr_dlist_empty:
  484|      4|{
  485|      4|	fr_dlist_t const *head = &(list_head->entry);
  486|      4|	return (head->prev == head);
  487|      4|}
dict_fixup.c:fr_dlist_entry_in_list:
  146|      4|{
  147|      4|	if (((entry->prev == entry) && (entry->next == entry)) ||
  ------------------
  |  Branch (147:7): [True: 0, False: 4]
  |  Branch (147:33): [True: 0, False: 0]
  ------------------
  148|      4|	    ((entry->prev == NULL) && (entry->next == NULL))) return false;
  ------------------
  |  Branch (148:7): [True: 0, False: 4]
  |  Branch (148:32): [True: 0, False: 0]
  ------------------
  149|       |
  150|      4|	return true;
  151|      4|}
dict_tokenize.c:fr_dlist_head:
  469|    118|{
  470|    118|	fr_dlist_t const *head = &(list_head->entry);
  471|       |
  472|    118|	if (head->next == head) return NULL;
  ------------------
  |  Branch (472:6): [True: 4, False: 114]
  ------------------
  473|       |
  474|    114|	return fr_dlist_entry_to_item(list_head->offset, head->next);
  475|    118|}
dict_tokenize.c:fr_dlist_entry_to_item:
  113|  2.60k|{
  114|  2.60k|	return (void *)(((uintptr_t) entry) - offset);
  115|  2.60k|}
dict_tokenize.c:fr_dlist_next:
  538|  2.60k|{
  539|  2.60k|	fr_dlist_t const	*entry;
  540|  2.60k|	fr_dlist_t const	*head;
  541|       |
  542|  2.60k|	if (!ptr) return fr_dlist_head(list_head);
  ------------------
  |  Branch (542:6): [True: 0, False: 2.60k]
  ------------------
  543|       |
  544|  2.60k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  545|  2.60k|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (545:6): [True: 2.60k, False: 0]
  ------------------
  546|  2.60k|#endif
  547|  2.60k|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  548|  2.60k|	head = &(list_head->entry);
  549|       |
  550|  2.60k|	if (entry->next == head) return NULL;
  ------------------
  |  Branch (550:6): [True: 114, False: 2.49k]
  ------------------
  551|  2.49k|	if (!entry->next) return NULL;
  ------------------
  |  Branch (551:6): [True: 0, False: 2.49k]
  ------------------
  552|  2.49k|	entry = entry->next;
  553|       |
  554|  2.49k|	return fr_dlist_entry_to_item(list_head->offset, entry);
  555|  2.49k|}
dict_tokenize.c:fr_dlist_item_to_entry:
  105|  2.72k|{
  106|  2.72k|	return (fr_dlist_t *)(((uintptr_t) item) + offset);
  107|  2.72k|}
dict_tokenize.c:fr_dlist_insert_tail:
  361|    118|{
  362|    118|	fr_dlist_t *entry;
  363|    118|	fr_dlist_t *head;
  364|       |
  365|    118|	CHECK_ELEMENT_COUNT(list_head, 1);
  ------------------
  |  |  287|    118|	if (unlikely((_head)->num_elements > (UINT_MAX - (_add)))) do { \
  |  |  ------------------
  |  |  |  |  397|    118|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 118]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|		fr_strerror_const("Maximum elements in list"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |  289|      0|		return -1; \
  |  |  290|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (290:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
  366|       |
  367|    118|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  368|    118|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (368:6): [True: 118, False: 0]
  ------------------
  369|    118|#endif
  370|       |
  371|    118|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  372|    118|	head = &(list_head->entry);
  373|       |
  374|    118|	if (!fr_cond_assert(head->next != NULL)) return -1;
  ------------------
  |  |  131|    118|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|    236|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 118, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (374:6): [True: 0, False: 118]
  ------------------
  375|    118|	if (!fr_cond_assert(head->prev != NULL)) return -1;
  ------------------
  |  |  131|    118|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|    236|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 118, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (375:6): [True: 0, False: 118]
  ------------------
  376|       |
  377|    118|	entry->next = head;
  378|    118|	entry->prev = head->prev;
  379|    118|	head->prev->next = entry;
  380|    118|	head->prev = entry;
  381|       |
  382|    118|	list_head->num_elements++;
  383|       |
  384|    118|	return 0;
  385|    118|}
dict_tokenize.c:fr_value_box_list_entry_init:
 1144|      4|		{ \
 1145|      4|			_Generic((&entry->_element_entry), \
 1146|      4|				 FR_DLIST_ENTRY(_name) *: fr_dlist_entry_init(UNCONST(fr_dlist_t *, &entry->_element_entry.entry)), \
  ------------------
  |  |  186|      4|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1147|      4|				 FR_DLIST_ENTRY(_name) const *: fr_dlist_noop()\
 1148|      4|			); \
 1149|      4|		} \
dict_tokenize.c:fr_dlist_entry_init:
  121|      4|{
  122|      4|	entry->prev = entry->next = entry;
  123|      4|}
dict_util.c:fr_value_box_list_entry_init:
 1144|  1.48k|		{ \
 1145|  1.48k|			_Generic((&entry->_element_entry), \
 1146|  1.48k|				 FR_DLIST_ENTRY(_name) *: fr_dlist_entry_init(UNCONST(fr_dlist_t *, &entry->_element_entry.entry)), \
  ------------------
  |  |  186|  1.48k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1147|  1.48k|				 FR_DLIST_ENTRY(_name) const *: fr_dlist_noop()\
 1148|  1.48k|			); \
 1149|  1.48k|		} \
dict_util.c:fr_dlist_entry_init:
  121|  1.48k|{
  122|  1.48k|	entry->prev = entry->next = entry;
  123|  1.48k|}
dict_util.c:_fr_dlist_init:
  264|      4|{
  265|      4|	fr_assert(offset < (1 << 20)); /* list_head->offset is `unsigned int`, and 1G structs are stupid. */
  ------------------
  |  |  194|      4|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|       |
  267|      4|	fr_dlist_entry_init(&list_head->entry);
  268|      4|	list_head->offset = offset;
  269|      4|	list_head->type = type;
  270|      4|	list_head->num_elements = 0;
  271|      4|}
dl.c:fr_dlist_next:
  538|      8|{
  539|      8|	fr_dlist_t const	*entry;
  540|      8|	fr_dlist_t const	*head;
  541|       |
  542|      8|	if (!ptr) return fr_dlist_head(list_head);
  ------------------
  |  Branch (542:6): [True: 8, False: 0]
  ------------------
  543|       |
  544|      0|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  545|      0|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (545:6): [True: 0, False: 0]
  ------------------
  546|      0|#endif
  547|      0|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  548|      0|	head = &(list_head->entry);
  549|       |
  550|      0|	if (entry->next == head) return NULL;
  ------------------
  |  Branch (550:6): [True: 0, False: 0]
  ------------------
  551|      0|	if (!entry->next) return NULL;
  ------------------
  |  Branch (551:6): [True: 0, False: 0]
  ------------------
  552|      0|	entry = entry->next;
  553|       |
  554|      0|	return fr_dlist_entry_to_item(list_head->offset, entry);
  555|      0|}
dl.c:fr_dlist_head:
  469|      8|{
  470|      8|	fr_dlist_t const *head = &(list_head->entry);
  471|       |
  472|      8|	if (head->next == head) return NULL;
  ------------------
  |  Branch (472:6): [True: 8, False: 0]
  ------------------
  473|       |
  474|      0|	return fr_dlist_entry_to_item(list_head->offset, head->next);
  475|      8|}
dl.c:_fr_dlist_init:
  264|      4|{
  265|      4|	fr_assert(offset < (1 << 20)); /* list_head->offset is `unsigned int`, and 1G structs are stupid. */
  ------------------
  |  |  194|      4|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|       |
  267|      4|	fr_dlist_entry_init(&list_head->entry);
  268|      4|	list_head->offset = offset;
  269|      4|	list_head->type = type;
  270|      4|	list_head->num_elements = 0;
  271|      4|}
dl.c:fr_dlist_entry_init:
  121|      4|{
  122|      4|	entry->prev = entry->next = entry;
  123|      4|}
dns.c:fr_value_box_list_entry_init:
 1144|    722|		{ \
 1145|    722|			_Generic((&entry->_element_entry), \
 1146|    722|				 FR_DLIST_ENTRY(_name) *: fr_dlist_entry_init(UNCONST(fr_dlist_t *, &entry->_element_entry.entry)), \
  ------------------
  |  |  186|    722|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1147|    722|				 FR_DLIST_ENTRY(_name) const *: fr_dlist_noop()\
 1148|    722|			); \
 1149|    722|		} \
dns.c:fr_dlist_entry_init:
  121|    722|{
  122|    722|	entry->prev = entry->next = entry;
  123|    722|}
pair.c:_fr_dlist_init:
  264|  14.1k|{
  265|  14.1k|	fr_assert(offset < (1 << 20)); /* list_head->offset is `unsigned int`, and 1G structs are stupid. */
  ------------------
  |  |  194|  14.1k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  14.1k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 14.1k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|       |
  267|  14.1k|	fr_dlist_entry_init(&list_head->entry);
  268|  14.1k|	list_head->offset = offset;
  269|  14.1k|	list_head->type = type;
  270|  14.1k|	list_head->num_elements = 0;
  271|  14.1k|}
pair.c:fr_dlist_entry_init:
  121|  60.7k|{
  122|  60.7k|	entry->prev = entry->next = entry;
  123|  60.7k|}
pair.c:fr_value_box_list_entry_init:
 1144|  21.7k|		{ \
 1145|  21.7k|			_Generic((&entry->_element_entry), \
 1146|  21.7k|				 FR_DLIST_ENTRY(_name) *: fr_dlist_entry_init(UNCONST(fr_dlist_t *, &entry->_element_entry.entry)), \
  ------------------
  |  |  186|  21.7k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1147|  21.7k|				 FR_DLIST_ENTRY(_name) const *: fr_dlist_noop()\
 1148|  21.7k|			); \
 1149|  21.7k|		} \
pair.c:fr_dlist_remove:
  621|  8.06k|{
  622|  8.06k|	fr_dlist_t *entry;
  623|  8.06k|	fr_dlist_t *head;
  624|  8.06k|	fr_dlist_t *prev;
  625|       |
  626|  8.06k|	if (!ptr || fr_dlist_empty(list_head)) return NULL;
  ------------------
  |  Branch (626:6): [True: 0, False: 8.06k]
  |  Branch (626:14): [True: 0, False: 8.06k]
  ------------------
  627|       |
  628|  8.06k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  629|  8.06k|	if (list_head->type) (void)_talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (629:6): [True: 8.06k, False: 0]
  ------------------
  630|  8.06k|#endif
  631|       |
  632|  8.06k|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  633|  8.06k|	if (!fr_dlist_entry_in_list(entry)) return NULL;
  ------------------
  |  Branch (633:6): [True: 0, False: 8.06k]
  ------------------
  634|       |
  635|  8.06k|	head = &(list_head->entry);
  636|  8.06k|	entry->prev->next = entry->next;
  637|  8.06k|	entry->next->prev = prev = entry->prev;
  638|  8.06k|	entry->prev = entry->next = entry;
  639|       |
  640|  8.06k|	list_head->num_elements--;
  641|       |
  642|  8.06k|	if (prev == head) return NULL;	/* Works with fr_dlist_next so that the next item is the list HEAD */
  ------------------
  |  Branch (642:6): [True: 7.93k, False: 133]
  ------------------
  643|       |
  644|    133|	return fr_dlist_entry_to_item(list_head->offset, prev);
  645|  8.06k|}
pair.c:fr_dlist_empty:
  484|  16.0k|{
  485|  16.0k|	fr_dlist_t const *head = &(list_head->entry);
  486|  16.0k|	return (head->prev == head);
  487|  16.0k|}
pair.c:fr_dlist_item_to_entry:
  105|   507k|{
  106|   507k|	return (fr_dlist_t *)(((uintptr_t) item) + offset);
  107|   507k|}
pair.c:fr_dlist_entry_in_list:
  146|  8.06k|{
  147|  8.06k|	if (((entry->prev == entry) && (entry->next == entry)) ||
  ------------------
  |  Branch (147:7): [True: 0, False: 8.06k]
  |  Branch (147:33): [True: 0, False: 0]
  ------------------
  148|  8.06k|	    ((entry->prev == NULL) && (entry->next == NULL))) return false;
  ------------------
  |  Branch (148:7): [True: 0, False: 8.06k]
  |  Branch (148:32): [True: 0, False: 0]
  ------------------
  149|       |
  150|  8.06k|	return true;
  151|  8.06k|}
pair.c:fr_dlist_entry_to_item:
  113|   486k|{
  114|   486k|	return (void *)(((uintptr_t) entry) - offset);
  115|   486k|}
pair.c:fr_dlist_next:
  538|   490k|{
  539|   490k|	fr_dlist_t const	*entry;
  540|   490k|	fr_dlist_t const	*head;
  541|       |
  542|   490k|	if (!ptr) return fr_dlist_head(list_head);
  ------------------
  |  Branch (542:6): [True: 14.5k, False: 476k]
  ------------------
  543|       |
  544|   476k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  545|   476k|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (545:6): [True: 476k, False: 0]
  ------------------
  546|   476k|#endif
  547|   476k|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  548|   476k|	head = &(list_head->entry);
  549|       |
  550|   476k|	if (entry->next == head) return NULL;
  ------------------
  |  Branch (550:6): [True: 5.95k, False: 470k]
  ------------------
  551|   470k|	if (!entry->next) return NULL;
  ------------------
  |  Branch (551:6): [True: 0, False: 470k]
  ------------------
  552|   470k|	entry = entry->next;
  553|       |
  554|   470k|	return fr_dlist_entry_to_item(list_head->offset, entry);
  555|   470k|}
pair.c:fr_dlist_head:
  469|  18.8k|{
  470|  18.8k|	fr_dlist_t const *head = &(list_head->entry);
  471|       |
  472|  18.8k|	if (head->next == head) return NULL;
  ------------------
  |  Branch (472:6): [True: 3.09k, False: 15.7k]
  ------------------
  473|       |
  474|  15.7k|	return fr_dlist_entry_to_item(list_head->offset, head->next);
  475|  18.8k|}
pair.c:fr_dlist_insert_tail:
  361|  22.9k|{
  362|  22.9k|	fr_dlist_t *entry;
  363|  22.9k|	fr_dlist_t *head;
  364|       |
  365|  22.9k|	CHECK_ELEMENT_COUNT(list_head, 1);
  ------------------
  |  |  287|  22.9k|	if (unlikely((_head)->num_elements > (UINT_MAX - (_add)))) do { \
  |  |  ------------------
  |  |  |  |  397|  22.9k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 22.9k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|		fr_strerror_const("Maximum elements in list"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |  289|      0|		return -1; \
  |  |  290|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (290:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
  366|       |
  367|  22.9k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  368|  22.9k|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (368:6): [True: 22.9k, False: 0]
  ------------------
  369|  22.9k|#endif
  370|       |
  371|  22.9k|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  372|  22.9k|	head = &(list_head->entry);
  373|       |
  374|  22.9k|	if (!fr_cond_assert(head->next != NULL)) return -1;
  ------------------
  |  |  131|  22.9k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  45.9k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 22.9k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (374:6): [True: 0, False: 22.9k]
  ------------------
  375|  22.9k|	if (!fr_cond_assert(head->prev != NULL)) return -1;
  ------------------
  |  |  131|  22.9k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  45.9k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 22.9k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (375:6): [True: 0, False: 22.9k]
  ------------------
  376|       |
  377|  22.9k|	entry->next = head;
  378|  22.9k|	entry->prev = head->prev;
  379|  22.9k|	head->prev->next = entry;
  380|  22.9k|	head->prev = entry;
  381|       |
  382|  22.9k|	list_head->num_elements++;
  383|       |
  384|  22.9k|	return 0;
  385|  22.9k|}
pair_inline.c:fr_dlist_head:
  469|  6.44k|{
  470|  6.44k|	fr_dlist_t const *head = &(list_head->entry);
  471|       |
  472|  6.44k|	if (head->next == head) return NULL;
  ------------------
  |  Branch (472:6): [True: 1.62k, False: 4.81k]
  ------------------
  473|       |
  474|  4.81k|	return fr_dlist_entry_to_item(list_head->offset, head->next);
  475|  6.44k|}
pair_inline.c:fr_dlist_entry_to_item:
  113|  25.8k|{
  114|  25.8k|	return (void *)(((uintptr_t) entry) - offset);
  115|  25.8k|}
pair_inline.c:fr_dlist_tail:
  514|    133|{
  515|    133|	fr_dlist_t const *head = &(list_head->entry);
  516|       |
  517|    133|	if (head->prev == head) return NULL;
  ------------------
  |  Branch (517:6): [True: 0, False: 133]
  ------------------
  518|       |
  519|    133|	return fr_dlist_entry_to_item(list_head->offset, head->prev);
  520|       |
  521|    133|}
pair_inline.c:fr_dlist_next:
  538|  27.3k|{
  539|  27.3k|	fr_dlist_t const	*entry;
  540|  27.3k|	fr_dlist_t const	*head;
  541|       |
  542|  27.3k|	if (!ptr) return fr_dlist_head(list_head);
  ------------------
  |  Branch (542:6): [True: 4.35k, False: 22.9k]
  ------------------
  543|       |
  544|  22.9k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  545|  22.9k|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (545:6): [True: 22.9k, False: 0]
  ------------------
  546|  22.9k|#endif
  547|  22.9k|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  548|  22.9k|	head = &(list_head->entry);
  549|       |
  550|  22.9k|	if (entry->next == head) return NULL;
  ------------------
  |  Branch (550:6): [True: 2.02k, False: 20.9k]
  ------------------
  551|  20.9k|	if (!entry->next) return NULL;
  ------------------
  |  Branch (551:6): [True: 0, False: 20.9k]
  ------------------
  552|  20.9k|	entry = entry->next;
  553|       |
  554|  20.9k|	return fr_dlist_entry_to_item(list_head->offset, entry);
  555|  20.9k|}
pair_inline.c:fr_dlist_item_to_entry:
  105|  25.7k|{
  106|  25.7k|	return (fr_dlist_t *)(((uintptr_t) item) + offset);
  107|  25.7k|}
pair_inline.c:fr_dlist_remove:
  621|  2.78k|{
  622|  2.78k|	fr_dlist_t *entry;
  623|  2.78k|	fr_dlist_t *head;
  624|  2.78k|	fr_dlist_t *prev;
  625|       |
  626|  2.78k|	if (!ptr || fr_dlist_empty(list_head)) return NULL;
  ------------------
  |  Branch (626:6): [True: 0, False: 2.78k]
  |  Branch (626:14): [True: 0, False: 2.78k]
  ------------------
  627|       |
  628|  2.78k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  629|  2.78k|	if (list_head->type) (void)_talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (629:6): [True: 2.78k, False: 0]
  ------------------
  630|  2.78k|#endif
  631|       |
  632|  2.78k|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  633|  2.78k|	if (!fr_dlist_entry_in_list(entry)) return NULL;
  ------------------
  |  Branch (633:6): [True: 0, False: 2.78k]
  ------------------
  634|       |
  635|  2.78k|	head = &(list_head->entry);
  636|  2.78k|	entry->prev->next = entry->next;
  637|  2.78k|	entry->next->prev = prev = entry->prev;
  638|  2.78k|	entry->prev = entry->next = entry;
  639|       |
  640|  2.78k|	list_head->num_elements--;
  641|       |
  642|  2.78k|	if (prev == head) return NULL;	/* Works with fr_dlist_next so that the next item is the list HEAD */
  ------------------
  |  Branch (642:6): [True: 2.78k, False: 0]
  ------------------
  643|       |
  644|      0|	return fr_dlist_entry_to_item(list_head->offset, prev);
  645|  2.78k|}
pair_inline.c:fr_dlist_empty:
  484|  4.81k|{
  485|  4.81k|	fr_dlist_t const *head = &(list_head->entry);
  486|  4.81k|	return (head->prev == head);
  487|  4.81k|}
pair_inline.c:fr_dlist_entry_in_list:
  146|  2.78k|{
  147|  2.78k|	if (((entry->prev == entry) && (entry->next == entry)) ||
  ------------------
  |  Branch (147:7): [True: 0, False: 2.78k]
  |  Branch (147:33): [True: 0, False: 0]
  ------------------
  148|  2.78k|	    ((entry->prev == NULL) && (entry->next == NULL))) return false;
  ------------------
  |  Branch (148:7): [True: 0, False: 2.78k]
  |  Branch (148:32): [True: 0, False: 0]
  ------------------
  149|       |
  150|  2.78k|	return true;
  151|  2.78k|}
pair_inline.c:fr_dlist_move:
  746|  2.02k|{
  747|  2.02k|	fr_dlist_t *dst = &(list_dst->entry);
  748|  2.02k|	fr_dlist_t *src = &(list_src->entry);
  749|       |
  750|  2.02k|	CHECK_ELEMENT_COUNT(list_dst, list_src->num_elements);
  ------------------
  |  |  287|  2.02k|	if (unlikely((_head)->num_elements > (UINT_MAX - (_add)))) do { \
  |  |  ------------------
  |  |  |  |  397|  2.02k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.02k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|		fr_strerror_const("Maximum elements in list"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |  289|      0|		return -1; \
  |  |  290|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (290:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
  751|       |
  752|  2.02k|#ifdef WITH_VERIFY_PTR
  753|       |	/*
  754|       |	 *	Must be both talloced or both not
  755|       |	 */
  756|  2.02k|	if (!fr_cond_assert((list_dst->type && list_src->type) || (!list_dst->type && !list_src->type))) return -1;
  ------------------
  |  |  131|  2.02k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  10.1k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 2.02k, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 2.02k, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (756:6): [True: 0, False: 2.02k]
  ------------------
  757|       |
  758|       |	/*
  759|       |	 *	Must be of the same type
  760|       |	 */
  761|  2.02k|	if (!fr_cond_assert(!list_dst->type || (strcmp(list_dst->type, list_src->type) == 0))) return -1;
  ------------------
  |  |  131|  2.02k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  8.10k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 2.02k]
  |  |  |  |  |  Branch (396:41): [True: 2.02k, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (761:6): [True: 0, False: 2.02k]
  ------------------
  762|  2.02k|#endif
  763|       |
  764|  2.02k|	if (!fr_cond_assert(dst->next != NULL)) return -1;
  ------------------
  |  |  131|  2.02k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  4.05k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 2.02k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (764:6): [True: 0, False: 2.02k]
  ------------------
  765|  2.02k|	if (!fr_cond_assert(dst->prev != NULL)) return -1;
  ------------------
  |  |  131|  2.02k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  4.05k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 2.02k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (765:6): [True: 0, False: 2.02k]
  ------------------
  766|       |
  767|  2.02k|	if (fr_dlist_empty(list_src)) return 0;
  ------------------
  |  Branch (767:6): [True: 0, False: 2.02k]
  ------------------
  768|       |
  769|       |	/*
  770|       |	 *	This is different to fr_dlist_entry_move
  771|       |	 *	because we need need to snip out the
  772|       |	 *	list head entry from the src.
  773|       |	 */
  774|  2.02k|	src->prev->next = dst;
  775|  2.02k|	src->next->prev = dst->prev;
  776|       |
  777|  2.02k|	dst->prev->next = src->next;
  778|  2.02k|	dst->prev = src->prev;
  779|       |
  780|  2.02k|	list_dst->num_elements += list_src->num_elements;
  781|       |
  782|  2.02k|	fr_dlist_entry_init(src);
  783|  2.02k|	list_src->num_elements = 0;
  784|       |
  785|  2.02k|	return 0;
  786|  2.02k|}
pair_inline.c:fr_dlist_entry_init:
  121|  2.02k|{
  122|  2.02k|	entry->prev = entry->next = entry;
  123|  2.02k|}
strerror.c:_fr_dlist_init:
  264|      4|{
  265|      4|	fr_assert(offset < (1 << 20)); /* list_head->offset is `unsigned int`, and 1G structs are stupid. */
  ------------------
  |  |  194|      4|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|       |
  267|      4|	fr_dlist_entry_init(&list_head->entry);
  268|      4|	list_head->offset = offset;
  269|      4|	list_head->type = type;
  270|      4|	list_head->num_elements = 0;
  271|      4|}
strerror.c:fr_dlist_entry_init:
  121|  8.22k|{
  122|  8.22k|	entry->prev = entry->next = entry;
  123|  8.22k|}
strerror.c:fr_dlist_insert_tail:
  361|  6.24k|{
  362|  6.24k|	fr_dlist_t *entry;
  363|  6.24k|	fr_dlist_t *head;
  364|       |
  365|  6.24k|	CHECK_ELEMENT_COUNT(list_head, 1);
  ------------------
  |  |  287|  6.24k|	if (unlikely((_head)->num_elements > (UINT_MAX - (_add)))) do { \
  |  |  ------------------
  |  |  |  |  397|  6.24k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 6.24k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|		fr_strerror_const("Maximum elements in list"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |  289|      0|		return -1; \
  |  |  290|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (290:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
  366|       |
  367|  6.24k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  368|  6.24k|	if (list_head->type) ptr = _talloc_get_type_abort(ptr, list_head->type, __location__);
  ------------------
  |  Branch (368:6): [True: 6.24k, False: 0]
  ------------------
  369|  6.24k|#endif
  370|       |
  371|  6.24k|	entry = fr_dlist_item_to_entry(list_head->offset, ptr);
  372|  6.24k|	head = &(list_head->entry);
  373|       |
  374|  6.24k|	if (!fr_cond_assert(head->next != NULL)) return -1;
  ------------------
  |  |  131|  6.24k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  12.4k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 6.24k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (374:6): [True: 0, False: 6.24k]
  ------------------
  375|  6.24k|	if (!fr_cond_assert(head->prev != NULL)) return -1;
  ------------------
  |  |  131|  6.24k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  12.4k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 6.24k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (375:6): [True: 0, False: 6.24k]
  ------------------
  376|       |
  377|  6.24k|	entry->next = head;
  378|  6.24k|	entry->prev = head->prev;
  379|  6.24k|	head->prev->next = entry;
  380|  6.24k|	head->prev = entry;
  381|       |
  382|  6.24k|	list_head->num_elements++;
  383|       |
  384|  6.24k|	return 0;
  385|  6.24k|}
strerror.c:fr_dlist_item_to_entry:
  105|  6.24k|{
  106|  6.24k|	return (fr_dlist_t *)(((uintptr_t) item) + offset);
  107|  6.24k|}
strerror.c:fr_dlist_clear:
  278|  8.22k|{
  279|  8.22k|	fr_dlist_entry_init(&list_head->entry);
  280|  8.22k|	list_head->num_elements = 0;
  281|  8.22k|}
value.c:fr_dlist_entry_init:
  121|  20.0k|{
  122|  20.0k|	entry->prev = entry->next = entry;
  123|  20.0k|}
value.c:fr_value_box_list_entry_init:
 1144|  20.0k|		{ \
 1145|  20.0k|			_Generic((&entry->_element_entry), \
 1146|  20.0k|				 FR_DLIST_ENTRY(_name) *: fr_dlist_entry_init(UNCONST(fr_dlist_t *, &entry->_element_entry.entry)), \
  ------------------
  |  |  186|  20.0k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1147|  20.0k|				 FR_DLIST_ENTRY(_name) const *: fr_dlist_noop()\
 1148|  20.0k|			); \
 1149|  20.0k|		} \
decode.c:fr_value_box_list_entry_init:
 1144|    421|		{ \
 1145|    421|			_Generic((&entry->_element_entry), \
 1146|    421|				 FR_DLIST_ENTRY(_name) *: fr_dlist_entry_init(UNCONST(fr_dlist_t *, &entry->_element_entry.entry)), \
  ------------------
  |  |  186|    421|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1147|    421|				 FR_DLIST_ENTRY(_name) const *: fr_dlist_noop()\
 1148|    421|			); \
 1149|    421|		} \
decode.c:fr_dlist_entry_init:
  121|    421|{
  122|    421|	entry->prev = entry->next = entry;
  123|    421|}

dict_fixup.c:fr_ext_ptr:
  151|      2|{
  152|      2|	uintptr_t out;
  153|       |
  154|      2|	out = (uintptr_t)chunk;					/* chunk start */
  155|      2|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|      2|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|      2|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|      2|	return (void *)out;
  159|      2|}
dict_tokenize.c:fr_ext_ptr:
  151|     38|{
  152|     38|	uintptr_t out;
  153|       |
  154|     38|	out = (uintptr_t)chunk;					/* chunk start */
  155|     38|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|     38|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|     38|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|     38|	return (void *)out;
  159|     38|}
dict_unknown.c:fr_ext_ptr:
  151|  6.86k|{
  152|  6.86k|	uintptr_t out;
  153|       |
  154|  6.86k|	out = (uintptr_t)chunk;					/* chunk start */
  155|  6.86k|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|  6.86k|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|  6.86k|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|  6.86k|	return (void *)out;
  159|  6.86k|}
dict_util.c:fr_ext_ptr:
  151|  87.9k|{
  152|  87.9k|	uintptr_t out;
  153|       |
  154|  87.9k|	out = (uintptr_t)chunk;					/* chunk start */
  155|  87.9k|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|  87.9k|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|  87.9k|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|  87.9k|	return (void *)out;
  159|  87.9k|}
dict_validate.c:fr_ext_ptr:
  151|      2|{
  152|      2|	uintptr_t out;
  153|       |
  154|      2|	out = (uintptr_t)chunk;					/* chunk start */
  155|      2|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|      2|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|      2|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|      2|	return (void *)out;
  159|      2|}
ext.c:fr_ext_offsets:
  143|   119k|{
  144|   119k|	return (uint8_t *)(((uintptr_t)chunk) + def->offset_of_exts);
  145|   119k|}
ext.c:fr_ext_ptr:
  151|  27.4k|{
  152|  27.4k|	uintptr_t out;
  153|       |
  154|  27.4k|	out = (uintptr_t)chunk;					/* chunk start */
  155|  27.4k|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|  27.4k|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|  27.4k|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|  27.4k|	return (void *)out;
  159|  27.4k|}
struct.c:fr_ext_ptr:
  151|    102|{
  152|    102|	uintptr_t out;
  153|       |
  154|    102|	out = (uintptr_t)chunk;					/* chunk start */
  155|    102|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|    102|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|    102|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|    102|	return (void *)out;
  159|    102|}
base.c:fr_ext_ptr:
  151|    848|{
  152|    848|	uintptr_t out;
  153|       |
  154|    848|	out = (uintptr_t)chunk;					/* chunk start */
  155|    848|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|    848|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|    848|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|    848|	return (void *)out;
  159|    848|}
decode.c:fr_ext_ptr:
  151|  2.64k|{
  152|  2.64k|	uintptr_t out;
  153|       |
  154|  2.64k|	out = (uintptr_t)chunk;					/* chunk start */
  155|  2.64k|	out += offset * FR_EXT_ALIGNMENT;			/* offset described by the extension */
  ------------------
  |  |   54|  2.64k|#  define FR_EXT_ALIGNMENT	sizeof(uint64_t)
  ------------------
  156|  2.64k|	out += sizeof(fr_ext_hdr_t) * (has_hdr == true);	/* data field offset by length header */
  157|       |
  158|  2.64k|	return (void *)out;
  159|  2.64k|}

struct.c:fr_bytes_from_bits:
  244|  7.00k|{
  245|  7.00k|	return (bits + 7) >> 3;
  246|  7.00k|}
value.c:fr_nbo_to_uint16:
  147|  1.43k|{
  148|  1.43k|	return (((uint16_t)data[0]) << 8) | data[1];
  149|  1.43k|}
value.c:fr_nbo_to_uint32:
  168|    480|{
  169|    480|	return ((uint32_t)fr_nbo_to_uint16(data) << 16) | fr_nbo_to_uint16(data + sizeof(uint16_t));
  170|    480|}
value.c:fr_nbo_to_uint64:
  178|    110|{
  179|    110|	return ((uint64_t)fr_nbo_to_uint32(data) << 32) | fr_nbo_to_uint32(data + sizeof(uint32_t));
  180|    110|}
decode.c:fr_nbo_to_uint32:
  168|    191|{
  169|    191|	return ((uint32_t)fr_nbo_to_uint16(data) << 16) | fr_nbo_to_uint16(data + sizeof(uint16_t));
  170|    191|}
decode.c:fr_nbo_to_uint16:
  147|    415|{
  148|    415|	return (((uint16_t)data[0]) << 8) | data[1];
  149|    415|}
decode.c:fr_nbo_to_uint24:
  158|      2|{
  159|      2|	return (((uint32_t)data[0]) << 16) | (((uint32_t)data[1]) << 8) | data[2];
  160|      2|}

pair.c:fr_pair_remove:
   94|    133|{
   95|       |	/*
   96|       |	 *	This check is commented out because it fails for
   97|       |	 *	update sections, things really don't work right :(
   98|       |	 */
   99|       |#if 0
  100|       |	fr_assert(fr_pair_order_list_in_a_list(vp));
  101|       |	fr_assert(list == fr_pair_parent_list(vp));
  102|       |	list->verified = false;
  103|       |#endif
  104|       |
  105|    133|	return fr_pair_order_list_remove(&list->order, vp);
  106|    133|}
pair.c:fr_pair_list_empty:
  125|  8.02k|{
  126|  8.02k|	return fr_pair_order_list_empty(&list->order);
  127|  8.02k|}
pair.c:fr_pair_list_next:
   70|   479k|{
   71|   479k|	return fr_pair_order_list_next(&list->order, item);
   72|   479k|}
pair.c:fr_pair_list_head:
   43|  4.35k|{
   44|  4.35k|	return fr_pair_order_list_head(&list->order);
   45|  4.35k|}
pair.c:fr_pair_list_free:
  113|  3.09k|{
  114|  3.09k|	fr_pair_order_list_talloc_free(&list->order);
  115|  3.09k|}

dict_util.c:_fr_sbuff_error:
  952|      4|{
  953|      4|	fr_sbuff_t	*parent = sbuff->parent;
  954|      4|	fr_slen_t	slen;
  955|       |
  956|      4|	if (sbuff->err) err = sbuff->err;
  ------------------
  |  Branch (956:6): [True: 0, False: 4]
  ------------------
  957|      4|	if (parent) parent->err = err;
  ------------------
  |  Branch (957:6): [True: 4, False: 0]
  ------------------
  958|       |
  959|      4|	slen = -((err - fr_sbuff_start(sbuff)) + 1);
  ------------------
  |  |  828|      4|	(_Generic((_sbuff_or_marker), \
  |  |  829|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  830|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  831|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  832|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  833|      4|	))
  ------------------
  960|       |
  961|       |#ifdef __clang_analyzer__
  962|       |	/*
  963|       |	 *	Convince clang that the return value
  964|       |	 *	is always negative. It never can be
  965|       |	 *	else the sbuff code is very broken.
  966|       |	 */
  967|       |	if (slen >= 0) return -1;
  968|       |#endif
  969|       |
  970|      4|	return slen;
  971|      4|}
dict_util.c:_fr_sbuff_extend_lowat:
 1036|  23.5k|{
 1037|  23.5k|	size_t extended;
 1038|  23.5k|	fr_sbuff_extend_status_t our_status = 0;
 1039|       |
 1040|  23.5k|	if (!fr_sbuff_is_extendable(in)) {
  ------------------
  |  Branch (1040:6): [True: 23.5k, False: 0]
  ------------------
 1041|  23.5k|	no_extend:
 1042|  23.5k|		if (status) *status = our_status;
  ------------------
  |  Branch (1042:7): [True: 0, False: 23.5k]
  ------------------
 1043|  23.5k|		return remaining;
 1044|  23.5k|	}
 1045|       |
 1046|       |	/* Still have data remaining, no need to try and extend */
 1047|      0|	if (remaining >= lowat) goto no_extend;
  ------------------
  |  Branch (1047:6): [True: 0, False: 0]
  ------------------
 1048|       |
 1049|      0|	if (!in->extend || ((extended = in->extend(&our_status, in, lowat - remaining)) == 0)) {
  ------------------
  |  Branch (1049:6): [True: 0, False: 0]
  |  Branch (1049:21): [True: 0, False: 0]
  ------------------
 1050|      0|		goto no_extend;
 1051|      0|	}
 1052|       |
 1053|      0|	our_status |= FR_SBUFF_FLAG_EXTENDED;
 1054|       |
 1055|      0|	if (status) *status = our_status;
  ------------------
  |  Branch (1055:6): [True: 0, False: 0]
  ------------------
 1056|      0|	return remaining + extended;
 1057|      0|}
dict_util.c:fr_sbuff_is_extendable:
  285|  23.5k|{
  286|  23.5k|	return sbuff->extend && (!sbuff->eof || (sbuff->eof(sbuff) == false));
  ------------------
  |  Branch (286:9): [True: 0, False: 23.5k]
  |  Branch (286:27): [True: 0, False: 0]
  |  Branch (286:42): [True: 0, False: 0]
  ------------------
  287|  23.5k|}
dict_util.c:fr_sbuff_set_to_start:
 1201|      4|{
 1202|      4|	_fr_sbuff_set_recurse(sbuff, sbuff->start);
 1203|      4|}
dict_util.c:_fr_sbuff_set_recurse:
 1114|  8.63k|{
 1115|  8.63k|	sbuff->p_i = p;
 1116|  8.63k|	sbuff->err = NULL;	/* Modifying the position of the sbuff clears the error */
 1117|       |
 1118|  8.63k|	if (sbuff->adv_parent && sbuff->parent) _fr_sbuff_set_recurse(sbuff->parent, p);
  ------------------
  |  Branch (1118:6): [True: 0, False: 8.63k]
  |  Branch (1118:27): [True: 0, False: 0]
  ------------------
 1119|  8.63k|}
dict_util.c:fr_sbuff_marker:
 1235|     90|{
 1236|     90|	*m = (fr_sbuff_marker_t){
 1237|     90|		.next = sbuff->m,	/* Link into the head */
 1238|     90|		.p = sbuff->p,		/* Set the current position in the sbuff */
 1239|     90|		.parent = sbuff		/* Record which sbuff this marker was associated with */
 1240|     90|	};
 1241|     90|	sbuff->m = m;
 1242|       |
 1243|     90|	return sbuff->p;
 1244|     90|}
dict_util.c:_fr_sbuff_set:
 1136|  8.62k|{
 1137|  8.62k|	char const *c;
 1138|       |
 1139|  8.62k|	if (unlikely(p > sbuff->end)) return -(p - sbuff->end);
  ------------------
  |  |  397|  8.62k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8.62k]
  |  |  ------------------
  ------------------
 1140|  8.62k|	if (unlikely(p < sbuff->start)) return 0;
  ------------------
  |  |  397|  8.62k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8.62k]
  |  |  ------------------
  ------------------
 1141|       |
 1142|  8.62k|	c = sbuff->p;
 1143|  8.62k|	_fr_sbuff_set_recurse(sbuff, p);
 1144|       |
 1145|  8.62k|	return p - c;
 1146|  8.62k|}
dict_util.c:_fr_sbuff_marker_set:
 1122|     94|{
 1123|     94|	fr_sbuff_t 	*sbuff = m->parent;
 1124|     94|	char		*current = m->p;
 1125|       |
 1126|     94|	if (unlikely(p > sbuff->end)) return -(p - sbuff->end);
  ------------------
  |  |  397|     94|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 94]
  |  |  ------------------
  ------------------
 1127|     94|	if (unlikely(p < sbuff->start)) return 0;
  ------------------
  |  |  397|     94|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 94]
  |  |  ------------------
  ------------------
 1128|       |
 1129|     94|	sbuff->err = NULL;	/* Modifying the position of any markers clears the error, unsure if this is correct? */
 1130|     94|	m->p_i = p;
 1131|       |
 1132|     94|	return p - current;
 1133|     94|}
dict_util.c:fr_sbuff_next:
 1749|  7.62k|{
 1750|  7.62k|	if (!fr_sbuff_extend(sbuff)) return '\0';
  ------------------
  |  | 1099|  7.62k|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|  7.62k|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|  7.62k|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|  7.62k|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|  7.62k|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|  7.62k|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|  7.62k|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|  7.62k|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  7.62k|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 7.62k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|  7.62k|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1750:6): [True: 0, False: 7.62k]
  ------------------
 1751|  7.62k|	return fr_sbuff_advance(sbuff, 1);
  ------------------
  |  | 1194|  7.62k|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|  7.62k|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|  7.62k|_Generic((_dst), \
  |  |  |  | 1164|  7.62k|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|  7.62k|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|  7.62k|)(_dst, \
  |  |  |  | 1167|  7.62k|_Generic((_src), \
  |  |  |  | 1168|  7.62k|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|  7.62k|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|  7.62k|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|  7.62k|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|  7.62k|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|  7.62k|	char *				: (char const *)(_src), \
  |  |  |  | 1174|  7.62k|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|  7.62k|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|  7.62k|))
  |  |  ------------------
  ------------------
 1752|  7.62k|}
dict_util.c:fr_sbuff_is_in_charset:
 1771|  8.34k|{
 1772|  8.34k|	if (!fr_sbuff_extend(sbuff)) return false;
  ------------------
  |  | 1099|  8.34k|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|  8.34k|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|  8.34k|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|  8.34k|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|  8.34k|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|  8.34k|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|  8.34k|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|  8.34k|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  8.34k|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  8.34k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  8.34k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  8.34k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  8.34k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  8.34k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  8.34k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  8.34k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  8.34k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  8.34k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  8.34k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  8.34k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  8.34k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 8.34k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|  8.34k|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  8.34k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  8.34k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  8.34k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  8.34k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  8.34k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  8.34k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  8.34k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  8.34k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  8.34k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  8.34k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  8.34k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  8.34k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1772:6): [True: 726, False: 7.62k]
  ------------------
 1773|  7.62k|	return chars[(uint8_t)*sbuff->p];
 1774|  8.34k|}
dict_util.c:_fr_sbuff_is_alpha:
 1804|  7.62k|	{ \
 1805|  7.62k|		if (!fr_sbuff_extend(sbuff)) return false; \
  ------------------
  |  | 1099|  7.62k|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|  7.62k|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|  7.62k|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|  7.62k|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|  7.62k|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|  7.62k|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|  7.62k|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|  7.62k|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  7.62k|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 7.62k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|  7.62k|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1805:7): [True: 0, False: 7.62k]
  ------------------
 1806|  7.62k|		return _test; \
 1807|  7.62k|	}\
dl.c:fr_sbuff_init_talloc:
  747|      2|{
  748|      2|	char *buff;
  749|       |
  750|      2|	*tctx = (fr_sbuff_uctx_talloc_t){
  751|      2|		.ctx = ctx,
  752|      2|		.init = init,
  753|      2|		.max = max
  754|      2|	};
  755|       |
  756|       |	/*
  757|       |	 *	Allocate the initial buffer
  758|       |	 *
  759|       |	 *	We always allocate a buffer so we don't
  760|       |	 *	trigger ubsan errors by performing
  761|       |	 *	arithmetic on NULL pointers.
  762|       |	 */
  763|      2|	buff = talloc_zero_array(ctx, char, init + 1);
  764|      2|	if (!buff) {
  ------------------
  |  Branch (764:6): [True: 0, False: 2]
  ------------------
  765|      0|		fr_strerror_printf("Failed allocating buffer of %zu bytes", init + 1);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  766|      0|		memset(sbuff, 0, sizeof(*sbuff));	/* clang scan */
  767|      0|		return NULL;
  768|      0|	}
  769|       |
  770|      2|	*sbuff = (fr_sbuff_t){
  771|      2|		.buff = buff,
  772|      2|		.start = buff,
  773|      2|		.p = buff,
  774|      2|		.end = buff + init,
  775|      2|		.extend = fr_sbuff_extend_talloc,
  776|      2|		.uctx = tctx
  777|      2|	};
  778|       |
  779|      2|	return sbuff;
  780|      2|}
dl.c:_sbuff_thread_local_free:
  590|      2|{
  591|       |	return talloc_free(sbtl);
  592|      2|}
sbuff.c:fr_sbuff_set_to_start:
 1201|      2|{
 1202|      2|	_fr_sbuff_set_recurse(sbuff, sbuff->start);
 1203|      2|}
sbuff.c:_fr_sbuff_set_recurse:
 1114|  7.83k|{
 1115|  7.83k|	sbuff->p_i = p;
 1116|  7.83k|	sbuff->err = NULL;	/* Modifying the position of the sbuff clears the error */
 1117|       |
 1118|  7.83k|	if (sbuff->adv_parent && sbuff->parent) _fr_sbuff_set_recurse(sbuff->parent, p);
  ------------------
  |  Branch (1118:6): [True: 824, False: 7.00k]
  |  Branch (1118:27): [True: 824, False: 0]
  ------------------
 1119|  7.83k|}
sbuff.c:_fr_sbuff_extend_lowat:
 1036|  8.10k|{
 1037|  8.10k|	size_t extended;
 1038|  8.10k|	fr_sbuff_extend_status_t our_status = 0;
 1039|       |
 1040|  8.10k|	if (!fr_sbuff_is_extendable(in)) {
  ------------------
  |  Branch (1040:6): [True: 8.09k, False: 8]
  ------------------
 1041|  8.09k|	no_extend:
 1042|  8.09k|		if (status) *status = our_status;
  ------------------
  |  Branch (1042:7): [True: 0, False: 8.09k]
  ------------------
 1043|  8.09k|		return remaining;
 1044|  8.09k|	}
 1045|       |
 1046|       |	/* Still have data remaining, no need to try and extend */
 1047|      8|	if (remaining >= lowat) goto no_extend;
  ------------------
  |  Branch (1047:6): [True: 0, False: 8]
  ------------------
 1048|       |
 1049|      8|	if (!in->extend || ((extended = in->extend(&our_status, in, lowat - remaining)) == 0)) {
  ------------------
  |  Branch (1049:6): [True: 0, False: 8]
  |  Branch (1049:21): [True: 0, False: 8]
  ------------------
 1050|      0|		goto no_extend;
 1051|      0|	}
 1052|       |
 1053|      8|	our_status |= FR_SBUFF_FLAG_EXTENDED;
 1054|       |
 1055|      8|	if (status) *status = our_status;
  ------------------
  |  Branch (1055:6): [True: 0, False: 8]
  ------------------
 1056|      8|	return remaining + extended;
 1057|      8|}
sbuff.c:fr_sbuff_is_extendable:
  285|  8.10k|{
  286|  8.10k|	return sbuff->extend && (!sbuff->eof || (sbuff->eof(sbuff) == false));
  ------------------
  |  Branch (286:9): [True: 8, False: 8.09k]
  |  Branch (286:27): [True: 8, False: 0]
  |  Branch (286:42): [True: 0, False: 0]
  ------------------
  287|  8.10k|}
sbuff.c:_fr_sbuff_set:
 1136|  7.00k|{
 1137|  7.00k|	char const *c;
 1138|       |
 1139|  7.00k|	if (unlikely(p > sbuff->end)) return -(p - sbuff->end);
  ------------------
  |  |  397|  7.00k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 7.00k]
  |  |  ------------------
  ------------------
 1140|  7.00k|	if (unlikely(p < sbuff->start)) return 0;
  ------------------
  |  |  397|  7.00k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 7.00k]
  |  |  ------------------
  ------------------
 1141|       |
 1142|  7.00k|	c = sbuff->p;
 1143|  7.00k|	_fr_sbuff_set_recurse(sbuff, p);
 1144|       |
 1145|  7.00k|	return p - c;
 1146|  7.00k|}
sbuff.c:fr_sbuff_is_in_charset:
 1771|      4|{
 1772|      4|	if (!fr_sbuff_extend(sbuff)) return false;
  ------------------
  |  | 1099|      4|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|      4|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|      4|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      4|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      4|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      4|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      4|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|      4|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      4|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 4]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|      4|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1772:6): [True: 0, False: 4]
  ------------------
 1773|      4|	return chars[(uint8_t)*sbuff->p];
 1774|      4|}

decode.c:_fr_strerror_printf:
   69|     60|{
   70|     60|	va_list		ap;
   71|       |
   72|     60|	va_start(ap, fmt);
   73|     60|	_fr_strerror_vprintf(file, line, fmt, ap);
   74|       |	va_end(ap);
   75|     60|}
dict_unknown.c:_fr_strerror_printf:
   69|    571|{
   70|    571|	va_list		ap;
   71|       |
   72|    571|	va_start(ap, fmt);
   73|    571|	_fr_strerror_vprintf(file, line, fmt, ap);
   74|       |	va_end(ap);
   75|    571|}
dict_util.c:_fr_strerror_printf:
   69|  3.23k|{
   70|  3.23k|	va_list		ap;
   71|       |
   72|  3.23k|	va_start(ap, fmt);
   73|  3.23k|	_fr_strerror_vprintf(file, line, fmt, ap);
   74|       |	va_end(ap);
   75|  3.23k|}
dns.c:_fr_strerror_printf:
   69|    337|{
   70|    337|	va_list		ap;
   71|       |
   72|    337|	va_start(ap, fmt);
   73|    337|	_fr_strerror_vprintf(file, line, fmt, ap);
   74|       |	va_end(ap);
   75|    337|}
value.c:_fr_strerror_printf:
   69|    719|{
   70|    719|	va_list		ap;
   71|       |
   72|    719|	va_start(ap, fmt);
   73|    719|	_fr_strerror_vprintf(file, line, fmt, ap);
   74|       |	va_end(ap);
   75|    719|}
base.c:_fr_strerror_printf:
   69|    749|{
   70|    749|	va_list		ap;
   71|       |
   72|    749|	va_start(ap, fmt);
   73|    749|	_fr_strerror_vprintf(file, line, fmt, ap);
   74|       |	va_end(ap);
   75|    749|}
packet.c:_fr_strerror_printf:
   69|     12|{
   70|     12|	va_list		ap;
   71|       |
   72|     12|	va_start(ap, fmt);
   73|     12|	_fr_strerror_vprintf(file, line, fmt, ap);
   74|       |	va_end(ap);
   75|     12|}

dict_tokenize.c:fr_dict_attr_flag_to_parser:
  145|    322|bool _our_name(_our_out_type *out, _our_table_type table, size_t table_len, char const *name, _our_def_type def) \
  146|    322|{ \
  147|    322|	_our_table_type found; \
  148|    322|	found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name); \
  149|    322|	if (!found) { \
  ------------------
  |  Branch (149:6): [True: 122, False: 200]
  ------------------
  150|    122|		*out = def; \
  151|    122|		return false; \
  152|    122|	} \
  153|    322|	*out = &found->value; \
  154|    200|	return true; \
  155|    322|}
dict_tokenize.c:table_sorted_value_by_str:
  330|  2.84k|{
  331|  2.84k|	ssize_t	start = 0;
  332|  2.84k|	ssize_t	end = table_len - 1;
  333|  2.84k|	ssize_t	mid;
  334|       |
  335|  2.84k|	int	ret;
  336|       |
  337|  2.84k|	if (!name) return NULL;
  ------------------
  |  Branch (337:6): [True: 0, False: 2.84k]
  ------------------
  338|       |
  339|  9.95k|	while (start <= end) {
  ------------------
  |  Branch (339:9): [True: 9.71k, False: 246]
  ------------------
  340|  9.71k|		void const *offset;
  341|       |
  342|  9.71k|		mid = start + ((end - start) / 2);	/* Avoid overflow */
  343|       |
  344|  9.71k|		offset = TABLE_IDX(table, mid, element_size);
  ------------------
  |  |  104|  9.71k|#define TABLE_IDX(_table, _idx, _element_size) (((uint8_t const *)(_table)) + ((_idx) * (_element_size)))
  ------------------
  345|  9.71k|		ret = strcasecmp(name, ELEM_STR(offset));
  ------------------
  |  |  105|  9.71k|#define ELEM_STR(_offset) (*((fr_table_elem_name_t const *)(_offset))).str
  ------------------
  346|  9.71k|		if (ret == 0) return offset;
  ------------------
  |  Branch (346:7): [True: 2.59k, False: 7.11k]
  ------------------
  347|  7.11k|		if (ret < 0) {
  ------------------
  |  Branch (347:7): [True: 3.82k, False: 3.29k]
  ------------------
  348|  3.82k|			end = mid - 1;
  349|  3.82k|		} else {
  350|  3.29k|			start = mid + 1;
  351|  3.29k|		}
  352|  7.11k|	}
  353|       |
  354|    246|	return NULL;
  355|  2.84k|}
dict_tokenize.c:fr_dict_keyword:
  145|  2.52k|bool _our_name(_our_out_type *out, _our_table_type table, size_t table_len, char const *name, _our_def_type def) \
  146|  2.52k|{ \
  147|  2.52k|	_our_table_type found; \
  148|  2.52k|	found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name); \
  149|  2.52k|	if (!found) { \
  ------------------
  |  Branch (149:6): [True: 124, False: 2.39k]
  ------------------
  150|    124|		*out = def; \
  151|    124|		return false; \
  152|    124|	} \
  153|  2.52k|	*out = &found->value; \
  154|  2.39k|	return true; \
  155|  2.52k|}
fr_table_sorted_num_by_str:
  120|      4|_our_return_type _our_name(_our_table_type table, size_t table_len, char const *name, _our_def_type def) \
  121|      4|{ \
  122|      4|	_our_return_type ret; \
  123|      4|	_our_table_type found; \
  124|      4|	found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name); \
  125|      4|	if (!found) { \
  ------------------
  |  Branch (125:6): [True: 0, False: 4]
  ------------------
  126|      0|		memcpy(&ret, &def, sizeof(ret)); \
  127|      0|		return ret; \
  128|      0|	} \
  129|      4|	memcpy(&ret, &found->value, sizeof(ret)); \
  130|      4|	return ret; \
  131|      4|}
fr_table_ordered_num_by_str:
  120|  1.52k|_our_return_type _our_name(_our_table_type table, size_t table_len, char const *name, _our_def_type def) \
  121|  1.52k|{ \
  122|  1.52k|	_our_return_type ret; \
  123|  1.52k|	_our_table_type found; \
  124|  1.52k|	found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name); \
  125|  1.52k|	if (!found) { \
  ------------------
  |  Branch (125:6): [True: 0, False: 1.52k]
  ------------------
  126|      0|		memcpy(&ret, &def, sizeof(ret)); \
  127|      0|		return ret; \
  128|      0|	} \
  129|  1.52k|	memcpy(&ret, &found->value, sizeof(ret)); \
  130|  1.52k|	return ret; \
  131|  1.52k|}
fr_table_ordered_str_by_num:
  284|  1.73k|char const *_our_name(_our_table_type table, size_t table_len, _our_value_type value, char const *def) \
  285|  1.73k|{ \
  286|  1.73k|	size_t		i; \
  287|  21.2k|	for (i = 0; i < table_len; i++) if (table[i].value == value) return table[i].name.str; \
  ------------------
  |  Branch (287:14): [True: 21.2k, False: 0]
  |  Branch (287:38): [True: 1.73k, False: 19.5k]
  ------------------
  288|  1.73k|	return def; \
  289|  1.73k|}
table.c:table_sorted_value_by_str:
  330|      4|{
  331|      4|	ssize_t	start = 0;
  332|      4|	ssize_t	end = table_len - 1;
  333|      4|	ssize_t	mid;
  334|       |
  335|      4|	int	ret;
  336|       |
  337|      4|	if (!name) return NULL;
  ------------------
  |  Branch (337:6): [True: 0, False: 4]
  ------------------
  338|       |
  339|      6|	while (start <= end) {
  ------------------
  |  Branch (339:9): [True: 6, False: 0]
  ------------------
  340|      6|		void const *offset;
  341|       |
  342|      6|		mid = start + ((end - start) / 2);	/* Avoid overflow */
  343|       |
  344|      6|		offset = TABLE_IDX(table, mid, element_size);
  ------------------
  |  |  104|      6|#define TABLE_IDX(_table, _idx, _element_size) (((uint8_t const *)(_table)) + ((_idx) * (_element_size)))
  ------------------
  345|      6|		ret = strcasecmp(name, ELEM_STR(offset));
  ------------------
  |  |  105|      6|#define ELEM_STR(_offset) (*((fr_table_elem_name_t const *)(_offset))).str
  ------------------
  346|      6|		if (ret == 0) return offset;
  ------------------
  |  Branch (346:7): [True: 4, False: 2]
  ------------------
  347|      2|		if (ret < 0) {
  ------------------
  |  Branch (347:7): [True: 0, False: 2]
  ------------------
  348|      0|			end = mid - 1;
  349|      2|		} else {
  350|      2|			start = mid + 1;
  351|      2|		}
  352|      2|	}
  353|       |
  354|      0|	return NULL;
  355|      4|}
table.c:table_ordered_value_by_str:
  369|  1.52k|{
  370|  1.52k|	size_t		i;
  371|       |
  372|  1.52k|	if (!name) return NULL;
  ------------------
  |  Branch (372:6): [True: 0, False: 1.52k]
  ------------------
  373|       |
  374|  17.9k|	for (i = 0; i < table_len; i++) {
  ------------------
  |  Branch (374:14): [True: 17.9k, False: 0]
  ------------------
  375|  17.9k|		void const *offset = TABLE_IDX(table, i, element_size);
  ------------------
  |  |  104|  17.9k|#define TABLE_IDX(_table, _idx, _element_size) (((uint8_t const *)(_table)) + ((_idx) * (_element_size)))
  ------------------
  376|  17.9k|		if (strcasecmp(name, ELEM_STR(offset)) == 0) return offset;
  ------------------
  |  |  105|  17.9k|#define ELEM_STR(_offset) (*((fr_table_elem_name_t const *)(_offset))).str
  ------------------
  |  Branch (376:7): [True: 1.52k, False: 16.4k]
  ------------------
  377|  17.9k|	}
  378|       |
  379|      0|	return NULL;
  380|  1.52k|}

fuzzer_dhcpv4.c:talloc_init_const:
  128|  1.23k|{
  129|  1.23k|	TALLOC_CTX *ctx;
  130|       |
  131|  1.23k|	ctx = talloc_new(NULL);
  132|  1.23k|	if (unlikely(!ctx)) return NULL;
  ------------------
  |  |  397|  1.23k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.23k]
  |  |  ------------------
  ------------------
  133|       |
  134|  1.23k|	talloc_set_name_const(ctx, name);
  135|       |
  136|  1.23k|	return ctx;
  137|  1.23k|}
dict_unknown.c:talloc_const_free:
  255|  2.72k|{
  256|  2.72k|	if (!ptr) return 0;
  ------------------
  |  Branch (256:6): [True: 0, False: 2.72k]
  ------------------
  257|       |
  258|  2.72k|	return talloc_free(UNCONST(void *, ptr));
  259|  2.72k|}
dict_util.c:talloc_bstr_tolower:
  158|      8|{
  159|      8|	char *p, *end;
  160|       |
  161|      8|	end = str + talloc_strlen(str);
  162|       |
  163|    232|	for (p = str; p < end; p++) *p = tolower((uint8_t) *p);
  ------------------
  |  Branch (163:16): [True: 224, False: 8]
  |  Branch (163:35): [True: 0, False: 0]
  |  Branch (163:35): [True: 0, False: 0]
  |  Branch (163:35): [Folded, False: 224]
  ------------------
  164|      8|}
dict_util.c:talloc_strlen:
  144|     12|{
  145|       |//	char const *our_s = talloc_get_type_abort_const(s, char);
  146|     12|	char const *our_s = s;
  147|       |	return talloc_array_length(our_s) - 1;
  148|     12|}
pair.c:talloc_strlen:
  144|  6.09k|{
  145|       |//	char const *our_s = talloc_get_type_abort_const(s, char);
  146|  6.09k|	char const *our_s = s;
  147|       |	return talloc_array_length(our_s) - 1;
  148|  6.09k|}
sbuff.c:talloc_strlen:
  144|  2.28k|{
  145|       |//	char const *our_s = talloc_get_type_abort_const(s, char);
  146|  2.28k|	char const *our_s = s;
  147|       |	return talloc_array_length(our_s) - 1;
  148|  2.28k|}
talloc.c:talloc_init_const:
  128|      2|{
  129|      2|	TALLOC_CTX *ctx;
  130|       |
  131|      2|	ctx = talloc_new(NULL);
  132|      2|	if (unlikely(!ctx)) return NULL;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  133|       |
  134|      2|	talloc_set_name_const(ctx, name);
  135|       |
  136|      2|	return ctx;
  137|      2|}

pair.c:_fr_tlist_init:
  161|  14.1k|{
  162|  14.1k|	list_head->parent = NULL;
  163|       |
  164|       |	/*
  165|       |	 *	Initialize the dlist, but point to the ENCLOSING data
  166|       |	 *	structure and type, not to the #fr_tlist_t.
  167|       |	 */
  168|       |	fr_dlist_init(&list_head->dlist_head, fr_tlist_t, dlist_entry);
  ------------------
  |  |  243|  14.1k|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), NULL))
  ------------------
  169|  14.1k|	list_head->dlist_head.offset += offset;
  170|  14.1k|	list_head->dlist_head.type = type;
  171|  14.1k|}
pair.c:fr_pair_order_list_entry_init:
  800|  24.8k|		{ \
  801|  24.8k|			_Generic((&entry->_element_entry), \
  802|  24.8k|				 FR_TLIST_ENTRY(_name) *: fr_tlist_entry_init(UNCONST(fr_tlist_t *, &entry->_element_entry.entry)), \
  ------------------
  |  |  186|  24.8k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  803|  24.8k|				 FR_TLIST_ENTRY(_name) const *: fr_tlist_noop()\
  804|  24.8k|			); \
  805|  24.8k|		} \
pair.c:fr_tlist_entry_init:
   78|  24.8k|{
   79|  24.8k|	fr_dlist_entry_init(&entry->dlist_entry);
   80|       |	entry->list_head = NULL;
   81|  24.8k|}
pair.c:fr_pair_order_list_talloc_init_children:
  901|  3.09k|		{		_name ## _talloc_init(children); ptr->_element_entry.entry.children = &children->head; } \
pair.c:fr_pair_order_list_remove:
  853|    133|		{ return	fr_tlist_remove(&list->head, ptr); } \
pair.c:fr_tlist_remove:
  414|  8.06k|{
  415|  8.06k|	fr_tlist_t *entry = fr_tlist_item_to_entry(list_head, ptr);
  416|       |
  417|  8.06k|	entry->list_head = NULL;
  418|       |
  419|  8.06k|	return fr_dlist_remove(&list_head->dlist_head, ptr);
  420|  8.06k|}
pair.c:fr_tlist_item_to_entry:
   54|  31.0k|{
   55|       |	return (fr_tlist_t *)(((uintptr_t) item) + list_head->dlist_head.offset - offsetof(fr_tlist_t, dlist_entry));
   56|  31.0k|}
pair.c:fr_pair_order_list_in_a_list:
  820|  45.9k|		{ return	fr_tlist_entry_in_a_list(&ptr->_element_entry.entry); } \
pair.c:fr_tlist_entry_in_a_list:
  100|  45.9k|{
  101|       |	return (entry->list_head != NULL);
  102|  45.9k|}
pair.c:fr_pair_order_list_empty:
  838|  8.02k|		{ return	fr_tlist_empty(&list->head); } \
pair.c:fr_tlist_empty:
  318|  8.02k|{
  319|  8.02k|	if (!list_head) return true;
  ------------------
  |  Branch (319:6): [True: 0, False: 8.02k]
  ------------------
  320|       |
  321|  8.02k|	return fr_dlist_empty(&list_head->dlist_head);
  322|  8.02k|}
pair.c:fr_pair_order_list_next:
  847|   479k|		{ return	fr_tlist_next(&list->head, ptr); } \
pair.c:fr_tlist_next:
  363|   490k|{
  364|   490k|	return fr_dlist_next(&list_head->dlist_head, ptr);
  365|   490k|}
pair.c:fr_pair_order_list_parent:
  895|   254k|		{		return (FR_TLIST_HEAD(_name) *) (ptr->_element_entry.entry.list_head); } \
pair.c:fr_pair_order_list_head:
  835|  4.35k|		{ return	fr_tlist_head(&list->head); } \
pair.c:fr_tlist_head:
  307|  4.35k|{
  308|  4.35k|	return fr_dlist_head(&list_head->dlist_head);
  309|  4.35k|}
pair.c:fr_pair_order_list_insert_tail:
  826|  22.9k|		{ return	fr_tlist_insert_tail(&list->head, ptr); } \
pair.c:fr_tlist_insert_tail:
  246|  22.9k|{
  247|  22.9k|	fr_tlist_t *entry = fr_tlist_item_to_entry(list_head, ptr);
  248|       |
  249|  22.9k|	if (fr_dlist_insert_tail(&list_head->dlist_head, ptr) < 0) return -1;
  ------------------
  |  Branch (249:6): [True: 0, False: 22.9k]
  ------------------
  250|       |
  251|  22.9k|	entry->list_head = list_head;
  252|  22.9k|	return 0;
  253|  22.9k|}
pair.c:fr_pair_order_list_talloc_free:
  880|  3.09k|		{		fr_tlist_talloc_free(&list->head); } \
pair.c:fr_tlist_talloc_free:
  664|  3.09k|{
  665|  3.09k|	void *e = NULL, *p;
  666|       |
  667|  11.0k|	while ((e = fr_tlist_next(head, e))) {
  ------------------
  |  Branch (667:9): [True: 7.93k, False: 3.09k]
  ------------------
  668|  7.93k|		p = fr_tlist_remove(head, e);
  669|       |		talloc_free(e);
  670|  7.93k|		e = p;
  671|  7.93k|	}
  672|  3.09k|}
pair_inline.c:fr_pair_order_list_tail:
  844|    133|		{ return	fr_tlist_tail(&list->head); } \
pair_inline.c:fr_tlist_tail:
  345|    133|{
  346|    133|	return fr_dlist_tail(&list_head->dlist_head);
  347|    133|}
pair_inline.c:fr_tlist_next:
  363|  4.35k|{
  364|  4.35k|	return fr_dlist_next(&list_head->dlist_head, ptr);
  365|  4.35k|}
pair_inline.c:fr_tlist_remove:
  414|  2.78k|{
  415|  2.78k|	fr_tlist_t *entry = fr_tlist_item_to_entry(list_head, ptr);
  416|       |
  417|  2.78k|	entry->list_head = NULL;
  418|       |
  419|  2.78k|	return fr_dlist_remove(&list_head->dlist_head, ptr);
  420|  2.78k|}
pair_inline.c:fr_tlist_item_to_entry:
   54|  25.7k|{
   55|       |	return (fr_tlist_t *)(((uintptr_t) item) + list_head->dlist_head.offset - offsetof(fr_tlist_t, dlist_entry));
   56|  25.7k|}
pair_inline.c:fr_pair_order_list_talloc_free:
  880|  1.56k|		{		fr_tlist_talloc_free(&list->head); } \
pair_inline.c:fr_tlist_talloc_free:
  664|  1.56k|{
  665|  1.56k|	void *e = NULL, *p;
  666|       |
  667|  4.35k|	while ((e = fr_tlist_next(head, e))) {
  ------------------
  |  Branch (667:9): [True: 2.78k, False: 1.56k]
  ------------------
  668|  2.78k|		p = fr_tlist_remove(head, e);
  669|       |		talloc_free(e);
  670|  2.78k|		e = p;
  671|  2.78k|	}
  672|  1.56k|}
pair_inline.c:fr_pair_order_list_move:
  865|  2.09k|		{ return	fr_tlist_move(&dst->head, &src->head); } \
pair_inline.c:fr_tlist_move:
  535|  2.09k|{
  536|  2.09k|	void *item;
  537|       |
  538|  2.09k|#ifdef WITH_VERIFY_PTR
  539|       |	/*
  540|       |	 *	Must be both talloced or both not
  541|       |	 */
  542|  2.09k|	if (!fr_cond_assert((tlist_type(list_dst) && tlist_type(list_src)) || (!tlist_type(list_dst) && !tlist_type(list_src)))) return -1;
  ------------------
  |  |  131|  2.09k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  10.4k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 2.09k, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 2.09k, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (542:6): [True: 0, False: 2.09k]
  ------------------
  543|       |
  544|       |	/*
  545|       |	 *	Must be of the same type
  546|       |	 */
  547|  2.09k|	if (!fr_cond_assert(!tlist_type(list_dst) || (strcmp(tlist_type(list_dst), tlist_type(list_src)) == 0))) return -1;
  ------------------
  |  |  131|  2.09k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  8.36k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 2.09k]
  |  |  |  |  |  Branch (396:41): [True: 2.09k, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (547:6): [True: 0, False: 2.09k]
  ------------------
  548|  2.09k|#endif
  549|       |
  550|  2.09k|	item = fr_dlist_head(&list_src->dlist_head);
  551|  2.09k|	if (!item) return 0;
  ------------------
  |  Branch (551:6): [True: 65, False: 2.02k]
  ------------------
  552|       |
  553|  2.02k|	if (fr_dlist_move(&list_dst->dlist_head, &list_src->dlist_head) < 0) return -1;
  ------------------
  |  Branch (553:6): [True: 0, False: 2.02k]
  ------------------
  554|       |
  555|       |	/*
  556|       |	 *	Update new parent from the middle of the list to the end.
  557|       |	 */
  558|  22.9k|	do {
  559|  22.9k|		fr_tlist_t *entry = fr_tlist_item_to_entry(list_src, item);
  560|  22.9k|		entry->list_head = list_dst;
  561|  22.9k|	} while ((item = fr_dlist_next(&list_dst->dlist_head, item)) != NULL);
  ------------------
  |  Branch (561:11): [True: 20.9k, False: 2.02k]
  ------------------
  562|       |
  563|  2.02k|	return 0;
  564|  2.02k|}

dict_tokenize.c:fr_type_from_str:
  465|  1.49k|{
  466|  1.49k|	return fr_table_value_by_str(fr_type_table, type, FR_TYPE_NULL);
  ------------------
  |  |  653|  1.49k|#define fr_table_value_by_str(_table, _name, _def) \
  |  |  654|  1.49k|_Generic((_table), \
  |  |  655|  1.49k|	 fr_table_num_sorted_t const *		: fr_table_sorted_num_by_str,			\
  |  |  656|  1.49k|	 fr_table_num_ordered_t const *		: fr_table_ordered_num_by_str,			\
  |  |  657|  1.49k|	 fr_table_num_sorted_t *		: fr_table_sorted_num_by_str,			\
  |  |  658|  1.49k|	 fr_table_num_ordered_t *		: fr_table_ordered_num_by_str,			\
  |  |  659|  1.49k|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_ptr_by_str,			\
  |  |  660|  1.49k|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_ptr_by_str,			\
  |  |  661|  1.49k|	 fr_table_ptr_sorted_t *		: fr_table_sorted_ptr_by_str,			\
  |  |  662|  1.49k|	 fr_table_ptr_ordered_t *		: fr_table_ordered_ptr_by_str,			\
  |  |  663|  1.49k|	 fr_table_num_indexed_bit_pos_t *	: fr_table_ordered_num_by_str,			\
  |  |  664|  1.49k|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_ordered_num_by_str,			\
  |  |  665|  1.49k|	 fr_table_num_indexed_t *		: fr_table_ordered_num_by_str,			\
  |  |  666|  1.49k|	 fr_table_num_indexed_t const *		: fr_table_ordered_num_by_str			\
  |  |  667|  1.49k|)(_table, _table ## _len, _name, _def)
  ------------------
  467|  1.49k|}
dict_unknown.c:fr_type_to_str:
  455|  1.14k|{
  456|  1.14k|	return fr_table_str_by_value(fr_type_table, type, "<INVALID>");
  ------------------
  |  |  772|  1.14k|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  773|  1.14k|_Generic((_table), \
  |  |  774|  1.14k|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  775|  1.14k|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  776|  1.14k|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  777|  1.14k|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  778|  1.14k|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  779|  1.14k|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  780|  1.14k|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  781|  1.14k|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  782|  1.14k|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  783|  1.14k|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  784|  1.14k|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  785|  1.14k|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  786|  1.14k|)(_table, _table ## _len, _number, _def)
  ------------------
  457|  1.14k|}
value.c:fr_type_to_str:
  455|    592|{
  456|    592|	return fr_table_str_by_value(fr_type_table, type, "<INVALID>");
  ------------------
  |  |  772|    592|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  773|    592|_Generic((_table), \
  |  |  774|    592|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  775|    592|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  776|    592|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  777|    592|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  778|    592|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  779|    592|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  780|    592|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  781|    592|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  782|    592|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  783|    592|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  784|    592|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  785|    592|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  786|    592|)(_table, _table ## _len, _number, _def)
  ------------------
  457|    592|}

dict_tokenize.c:_fr_value_box_init:
  537|      4|{
  538|       |	/*
  539|       |	 *	Initializes an fr_value_box_t pointed at by vb appropriately for a given type.
  540|       |	 * 	Coverity gets involved here because an fr_value_box_t has members with const-
  541|       |	 * 	qualified type (and members that have members with const-qualified type), so an
  542|       |	 *	attempt to assign to *vb or any of its cosnt-qualified members will give an error.
  543|       |	 *
  544|       |	 * 	C compilers, at least currently, let one get around the issue. See the memcpy()
  545|       |	 * 	below. Coverity, though, isn't faked out, and reports the store_writes_const_field
  546|       |	 * 	defect annotated here. Anything we do has to eventually assign to the whole of *vb
  547|       |	 * 	and thus will raise the issue.
  548|       |	 */
  549|       |	/* coverity[store_writes_const_field] */
  550|      4|	memcpy((void *) vb, &(fr_value_box_t){
  551|      4|			.type = type,
  552|      4|			.enumv = enumv,
  553|      4|			.tainted = tainted,
  554|      4|			.secret = enumv && enumv->flags.secret,
  ------------------
  |  Branch (554:14): [True: 0, False: 4]
  |  Branch (554:23): [True: 0, False: 0]
  ------------------
  555|       |			/* don't set the immutable flag.  The caller has to do it once he's finished editing the values */
  556|      4|		}, sizeof(*vb));
  557|      4|	fr_value_box_list_entry_init(vb);
  558|       |
  559|       |	/*
  560|       |	 *	The majority of types are fine to initialise to
  561|       |	 *	all zeros, the following are the exceptions.
  562|       |	 */
  563|      4|	switch (type) {
  564|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 4]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 4]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 4]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 4]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:2): [True: 0, False: 4]
  ------------------
  565|      0|		fr_value_box_list_init(&vb->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  566|      0|		break;
  567|       |
  568|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (568:2): [True: 0, False: 4]
  ------------------
  569|      0|	case FR_TYPE_COMBO_IP_ADDR:	/* Default to the smaller type */
  ------------------
  |  Branch (569:2): [True: 0, False: 4]
  ------------------
  570|      0|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  571|      0|		vb->vb_ip.prefix = 32;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  572|      0|		break;
  573|       |
  574|      0|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (574:2): [True: 0, False: 4]
  ------------------
  575|      0|	case FR_TYPE_COMBO_IP_PREFIX:	/* Default to the samaller type */
  ------------------
  |  Branch (575:2): [True: 0, False: 4]
  ------------------
  576|      0|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  577|      0|		break;
  578|       |
  579|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (579:2): [True: 0, False: 4]
  ------------------
  580|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  581|      0|		vb->vb_ip.prefix = 128;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  582|      0|		break;
  583|       |
  584|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (584:2): [True: 0, False: 4]
  ------------------
  585|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  586|      0|		break;
  587|       |
  588|      4|	default:
  ------------------
  |  Branch (588:2): [True: 4, False: 0]
  ------------------
  589|      4|		break;
  590|      4|	}
  591|       |
  592|      4|#ifndef NDEBUG
  593|      4|	vb->magic = FR_VALUE_BOX_MAGIC;
  ------------------
  |  |   91|      4|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  ------------------
  |  |  |  |   81|      4|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  ------------------
  |  |  |  |  |  |  206|      4|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  205|      4|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|      4|	vb->file = file;
  595|      4|	vb->line = line;
  596|      4|#endif
  597|      4|}
dict_util.c:_fr_value_box_init:
  537|  1.48k|{
  538|       |	/*
  539|       |	 *	Initializes an fr_value_box_t pointed at by vb appropriately for a given type.
  540|       |	 * 	Coverity gets involved here because an fr_value_box_t has members with const-
  541|       |	 * 	qualified type (and members that have members with const-qualified type), so an
  542|       |	 *	attempt to assign to *vb or any of its cosnt-qualified members will give an error.
  543|       |	 *
  544|       |	 * 	C compilers, at least currently, let one get around the issue. See the memcpy()
  545|       |	 * 	below. Coverity, though, isn't faked out, and reports the store_writes_const_field
  546|       |	 * 	defect annotated here. Anything we do has to eventually assign to the whole of *vb
  547|       |	 * 	and thus will raise the issue.
  548|       |	 */
  549|       |	/* coverity[store_writes_const_field] */
  550|  1.48k|	memcpy((void *) vb, &(fr_value_box_t){
  551|  1.48k|			.type = type,
  552|  1.48k|			.enumv = enumv,
  553|  1.48k|			.tainted = tainted,
  554|  1.48k|			.secret = enumv && enumv->flags.secret,
  ------------------
  |  Branch (554:14): [True: 0, False: 1.48k]
  |  Branch (554:23): [True: 0, False: 0]
  ------------------
  555|       |			/* don't set the immutable flag.  The caller has to do it once he's finished editing the values */
  556|  1.48k|		}, sizeof(*vb));
  557|  1.48k|	fr_value_box_list_entry_init(vb);
  558|       |
  559|       |	/*
  560|       |	 *	The majority of types are fine to initialise to
  561|       |	 *	all zeros, the following are the exceptions.
  562|       |	 */
  563|  1.48k|	switch (type) {
  564|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.48k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.48k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.48k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.48k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:2): [True: 0, False: 1.48k]
  ------------------
  565|      0|		fr_value_box_list_init(&vb->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  566|      0|		break;
  567|       |
  568|    162|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (568:2): [True: 162, False: 1.32k]
  ------------------
  569|    166|	case FR_TYPE_COMBO_IP_ADDR:	/* Default to the smaller type */
  ------------------
  |  Branch (569:2): [True: 4, False: 1.47k]
  ------------------
  570|    166|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|    166|#define vb_ip					datum.ip
  ------------------
  571|    166|		vb->vb_ip.prefix = 32;
  ------------------
  |  |  264|    166|#define vb_ip					datum.ip
  ------------------
  572|    166|		break;
  573|       |
  574|     12|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (574:2): [True: 12, False: 1.47k]
  ------------------
  575|     14|	case FR_TYPE_COMBO_IP_PREFIX:	/* Default to the samaller type */
  ------------------
  |  Branch (575:2): [True: 2, False: 1.48k]
  ------------------
  576|     14|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|     14|#define vb_ip					datum.ip
  ------------------
  577|     14|		break;
  578|       |
  579|     10|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (579:2): [True: 10, False: 1.47k]
  ------------------
  580|     10|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|     10|#define vb_ip					datum.ip
  ------------------
  581|     10|		vb->vb_ip.prefix = 128;
  ------------------
  |  |  264|     10|#define vb_ip					datum.ip
  ------------------
  582|     10|		break;
  583|       |
  584|      4|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (584:2): [True: 4, False: 1.47k]
  ------------------
  585|      4|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      4|#define vb_ip					datum.ip
  ------------------
  586|      4|		break;
  587|       |
  588|  1.28k|	default:
  ------------------
  |  Branch (588:2): [True: 1.28k, False: 194]
  ------------------
  589|  1.28k|		break;
  590|  1.48k|	}
  591|       |
  592|  1.48k|#ifndef NDEBUG
  593|  1.48k|	vb->magic = FR_VALUE_BOX_MAGIC;
  ------------------
  |  |   91|  1.48k|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  ------------------
  |  |  |  |   81|  1.48k|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  ------------------
  |  |  |  |  |  |  206|  1.48k|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  205|  1.48k|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|  1.48k|	vb->file = file;
  595|  1.48k|	vb->line = line;
  596|  1.48k|#endif
  597|  1.48k|}
dict_util.c:_fr_value_box_alloc:
  620|    804|{
  621|    804|	fr_value_box_t *vb;
  622|       |
  623|    804|	vb = talloc(ctx, fr_value_box_t);
  624|    804|	if (unlikely(!vb)) return NULL;
  ------------------
  |  |  397|    804|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 804]
  |  |  ------------------
  ------------------
  625|       |
  626|    804|	_fr_value_box_init(NDEBUG_LOCATION_VALS vb, type, enumv, false);
  ------------------
  |  |  283|    804|#  define NDEBUG_LOCATION_VALS			file, line,
  ------------------
  627|    804|	vb->talloced = 1;
  628|       |
  629|    804|	return vb;
  630|    804|}
dns.c:_fr_value_box_init:
  537|    722|{
  538|       |	/*
  539|       |	 *	Initializes an fr_value_box_t pointed at by vb appropriately for a given type.
  540|       |	 * 	Coverity gets involved here because an fr_value_box_t has members with const-
  541|       |	 * 	qualified type (and members that have members with const-qualified type), so an
  542|       |	 *	attempt to assign to *vb or any of its cosnt-qualified members will give an error.
  543|       |	 *
  544|       |	 * 	C compilers, at least currently, let one get around the issue. See the memcpy()
  545|       |	 * 	below. Coverity, though, isn't faked out, and reports the store_writes_const_field
  546|       |	 * 	defect annotated here. Anything we do has to eventually assign to the whole of *vb
  547|       |	 * 	and thus will raise the issue.
  548|       |	 */
  549|       |	/* coverity[store_writes_const_field] */
  550|    722|	memcpy((void *) vb, &(fr_value_box_t){
  551|    722|			.type = type,
  552|    722|			.enumv = enumv,
  553|    722|			.tainted = tainted,
  554|    722|			.secret = enumv && enumv->flags.secret,
  ------------------
  |  Branch (554:14): [True: 0, False: 722]
  |  Branch (554:23): [True: 0, False: 0]
  ------------------
  555|       |			/* don't set the immutable flag.  The caller has to do it once he's finished editing the values */
  556|    722|		}, sizeof(*vb));
  557|    722|	fr_value_box_list_entry_init(vb);
  558|       |
  559|       |	/*
  560|       |	 *	The majority of types are fine to initialise to
  561|       |	 *	all zeros, the following are the exceptions.
  562|       |	 */
  563|    722|	switch (type) {
  564|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 722]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 722]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 722]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 722]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:2): [True: 0, False: 722]
  ------------------
  565|      0|		fr_value_box_list_init(&vb->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  566|      0|		break;
  567|       |
  568|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (568:2): [True: 0, False: 722]
  ------------------
  569|      0|	case FR_TYPE_COMBO_IP_ADDR:	/* Default to the smaller type */
  ------------------
  |  Branch (569:2): [True: 0, False: 722]
  ------------------
  570|      0|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  571|      0|		vb->vb_ip.prefix = 32;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  572|      0|		break;
  573|       |
  574|      0|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (574:2): [True: 0, False: 722]
  ------------------
  575|      0|	case FR_TYPE_COMBO_IP_PREFIX:	/* Default to the samaller type */
  ------------------
  |  Branch (575:2): [True: 0, False: 722]
  ------------------
  576|      0|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  577|      0|		break;
  578|       |
  579|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (579:2): [True: 0, False: 722]
  ------------------
  580|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  581|      0|		vb->vb_ip.prefix = 128;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  582|      0|		break;
  583|       |
  584|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (584:2): [True: 0, False: 722]
  ------------------
  585|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  586|      0|		break;
  587|       |
  588|    722|	default:
  ------------------
  |  Branch (588:2): [True: 722, False: 0]
  ------------------
  589|    722|		break;
  590|    722|	}
  591|       |
  592|    722|#ifndef NDEBUG
  593|    722|	vb->magic = FR_VALUE_BOX_MAGIC;
  ------------------
  |  |   91|    722|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  ------------------
  |  |  |  |   81|    722|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  ------------------
  |  |  |  |  |  |  206|    722|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  205|    722|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|    722|	vb->file = file;
  595|    722|	vb->line = line;
  596|    722|#endif
  597|    722|}
pair.c:_fr_value_box_init:
  537|  21.7k|{
  538|       |	/*
  539|       |	 *	Initializes an fr_value_box_t pointed at by vb appropriately for a given type.
  540|       |	 * 	Coverity gets involved here because an fr_value_box_t has members with const-
  541|       |	 * 	qualified type (and members that have members with const-qualified type), so an
  542|       |	 *	attempt to assign to *vb or any of its cosnt-qualified members will give an error.
  543|       |	 *
  544|       |	 * 	C compilers, at least currently, let one get around the issue. See the memcpy()
  545|       |	 * 	below. Coverity, though, isn't faked out, and reports the store_writes_const_field
  546|       |	 * 	defect annotated here. Anything we do has to eventually assign to the whole of *vb
  547|       |	 * 	and thus will raise the issue.
  548|       |	 */
  549|       |	/* coverity[store_writes_const_field] */
  550|  21.7k|	memcpy((void *) vb, &(fr_value_box_t){
  551|  21.7k|			.type = type,
  552|  21.7k|			.enumv = enumv,
  553|  21.7k|			.tainted = tainted,
  554|  21.7k|			.secret = enumv && enumv->flags.secret,
  ------------------
  |  Branch (554:14): [True: 21.7k, False: 0]
  |  Branch (554:23): [True: 0, False: 21.7k]
  ------------------
  555|       |			/* don't set the immutable flag.  The caller has to do it once he's finished editing the values */
  556|  21.7k|		}, sizeof(*vb));
  557|  21.7k|	fr_value_box_list_entry_init(vb);
  558|       |
  559|       |	/*
  560|       |	 *	The majority of types are fine to initialise to
  561|       |	 *	all zeros, the following are the exceptions.
  562|       |	 */
  563|  21.7k|	switch (type) {
  564|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 21.7k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 21.7k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 21.7k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 21.7k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:2): [True: 0, False: 21.7k]
  ------------------
  565|      0|		fr_value_box_list_init(&vb->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  566|      0|		break;
  567|       |
  568|  2.58k|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (568:2): [True: 2.58k, False: 19.1k]
  ------------------
  569|  2.58k|	case FR_TYPE_COMBO_IP_ADDR:	/* Default to the smaller type */
  ------------------
  |  Branch (569:2): [True: 0, False: 21.7k]
  ------------------
  570|  2.58k|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|  2.58k|#define vb_ip					datum.ip
  ------------------
  571|  2.58k|		vb->vb_ip.prefix = 32;
  ------------------
  |  |  264|  2.58k|#define vb_ip					datum.ip
  ------------------
  572|  2.58k|		break;
  573|       |
  574|    546|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (574:2): [True: 546, False: 21.2k]
  ------------------
  575|    546|	case FR_TYPE_COMBO_IP_PREFIX:	/* Default to the samaller type */
  ------------------
  |  Branch (575:2): [True: 0, False: 21.7k]
  ------------------
  576|    546|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|    546|#define vb_ip					datum.ip
  ------------------
  577|    546|		break;
  578|       |
  579|    220|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (579:2): [True: 220, False: 21.5k]
  ------------------
  580|    220|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|    220|#define vb_ip					datum.ip
  ------------------
  581|    220|		vb->vb_ip.prefix = 128;
  ------------------
  |  |  264|    220|#define vb_ip					datum.ip
  ------------------
  582|    220|		break;
  583|       |
  584|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (584:2): [True: 0, False: 21.7k]
  ------------------
  585|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  586|      0|		break;
  587|       |
  588|  18.4k|	default:
  ------------------
  |  Branch (588:2): [True: 18.4k, False: 3.34k]
  ------------------
  589|  18.4k|		break;
  590|  21.7k|	}
  591|       |
  592|  21.7k|#ifndef NDEBUG
  593|  21.7k|	vb->magic = FR_VALUE_BOX_MAGIC;
  ------------------
  |  |   91|  21.7k|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  ------------------
  |  |  |  |   81|  21.7k|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  ------------------
  |  |  |  |  |  |  206|  21.7k|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  205|  21.7k|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|  21.7k|	vb->file = file;
  595|  21.7k|	vb->line = line;
  596|  21.7k|#endif
  597|  21.7k|}
value.c:_fr_value_box_init:
  537|  19.2k|{
  538|       |	/*
  539|       |	 *	Initializes an fr_value_box_t pointed at by vb appropriately for a given type.
  540|       |	 * 	Coverity gets involved here because an fr_value_box_t has members with const-
  541|       |	 * 	qualified type (and members that have members with const-qualified type), so an
  542|       |	 *	attempt to assign to *vb or any of its cosnt-qualified members will give an error.
  543|       |	 *
  544|       |	 * 	C compilers, at least currently, let one get around the issue. See the memcpy()
  545|       |	 * 	below. Coverity, though, isn't faked out, and reports the store_writes_const_field
  546|       |	 * 	defect annotated here. Anything we do has to eventually assign to the whole of *vb
  547|       |	 * 	and thus will raise the issue.
  548|       |	 */
  549|       |	/* coverity[store_writes_const_field] */
  550|  19.2k|	memcpy((void *) vb, &(fr_value_box_t){
  551|  19.2k|			.type = type,
  552|  19.2k|			.enumv = enumv,
  553|  19.2k|			.tainted = tainted,
  554|  19.2k|			.secret = enumv && enumv->flags.secret,
  ------------------
  |  Branch (554:14): [True: 13.6k, False: 5.58k]
  |  Branch (554:23): [True: 0, False: 13.6k]
  ------------------
  555|       |			/* don't set the immutable flag.  The caller has to do it once he's finished editing the values */
  556|  19.2k|		}, sizeof(*vb));
  557|  19.2k|	fr_value_box_list_entry_init(vb);
  558|       |
  559|       |	/*
  560|       |	 *	The majority of types are fine to initialise to
  561|       |	 *	all zeros, the following are the exceptions.
  562|       |	 */
  563|  19.2k|	switch (type) {
  564|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 19.2k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 19.2k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 19.2k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 19.2k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:2): [True: 0, False: 19.2k]
  ------------------
  565|      0|		fr_value_box_list_init(&vb->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  566|      0|		break;
  567|       |
  568|  2.16k|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (568:2): [True: 2.16k, False: 17.1k]
  ------------------
  569|  2.16k|	case FR_TYPE_COMBO_IP_ADDR:	/* Default to the smaller type */
  ------------------
  |  Branch (569:2): [True: 0, False: 19.2k]
  ------------------
  570|  2.16k|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|  2.16k|#define vb_ip					datum.ip
  ------------------
  571|  2.16k|		vb->vb_ip.prefix = 32;
  ------------------
  |  |  264|  2.16k|#define vb_ip					datum.ip
  ------------------
  572|  2.16k|		break;
  573|       |
  574|    250|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (574:2): [True: 250, False: 19.0k]
  ------------------
  575|    250|	case FR_TYPE_COMBO_IP_PREFIX:	/* Default to the samaller type */
  ------------------
  |  Branch (575:2): [True: 0, False: 19.2k]
  ------------------
  576|    250|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|    250|#define vb_ip					datum.ip
  ------------------
  577|    250|		break;
  578|       |
  579|     93|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (579:2): [True: 93, False: 19.1k]
  ------------------
  580|     93|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|     93|#define vb_ip					datum.ip
  ------------------
  581|     93|		vb->vb_ip.prefix = 128;
  ------------------
  |  |  264|     93|#define vb_ip					datum.ip
  ------------------
  582|     93|		break;
  583|       |
  584|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (584:2): [True: 0, False: 19.2k]
  ------------------
  585|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  586|      0|		break;
  587|       |
  588|  16.7k|	default:
  ------------------
  |  Branch (588:2): [True: 16.7k, False: 2.50k]
  ------------------
  589|  16.7k|		break;
  590|  19.2k|	}
  591|       |
  592|  19.2k|#ifndef NDEBUG
  593|  19.2k|	vb->magic = FR_VALUE_BOX_MAGIC;
  ------------------
  |  |   91|  19.2k|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  ------------------
  |  |  |  |   81|  19.2k|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  ------------------
  |  |  |  |  |  |  206|  19.2k|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  205|  19.2k|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|  19.2k|	vb->file = file;
  595|  19.2k|	vb->line = line;
  596|  19.2k|#endif
  597|  19.2k|}
value.c:fr_value_box_raw:
  774|  2.43k|{
  775|  2.43k|	return UNCONST(uint8_t *, vb) + fr_value_box_offsets[type];
  ------------------
  |  |  186|  2.43k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  776|  2.43k|}
value.c:fr_value_box_memcpy_out:
  798|    806|{
  799|    806|	size_t len;
  800|       |
  801|    806|	len = fr_value_box_field_sizes[vb->type];
  802|    806|	if (len == 0) {
  ------------------
  |  Branch (802:6): [True: 0, False: 806]
  ------------------
  803|      0|		fr_strerror_printf("Type %s not supported for conversion to C type", fr_type_to_str(vb->type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  804|      0|		return -1;
  805|      0|	}
  806|       |
  807|    806|	memcpy(out, ((uint8_t const *)vb) + fr_value_box_offsets[vb->type], len);
  808|       |
  809|    806|	return 0;
  810|    806|}
decode.c:_fr_value_box_init:
  537|    421|{
  538|       |	/*
  539|       |	 *	Initializes an fr_value_box_t pointed at by vb appropriately for a given type.
  540|       |	 * 	Coverity gets involved here because an fr_value_box_t has members with const-
  541|       |	 * 	qualified type (and members that have members with const-qualified type), so an
  542|       |	 *	attempt to assign to *vb or any of its cosnt-qualified members will give an error.
  543|       |	 *
  544|       |	 * 	C compilers, at least currently, let one get around the issue. See the memcpy()
  545|       |	 * 	below. Coverity, though, isn't faked out, and reports the store_writes_const_field
  546|       |	 * 	defect annotated here. Anything we do has to eventually assign to the whole of *vb
  547|       |	 * 	and thus will raise the issue.
  548|       |	 */
  549|       |	/* coverity[store_writes_const_field] */
  550|    421|	memcpy((void *) vb, &(fr_value_box_t){
  551|    421|			.type = type,
  552|    421|			.enumv = enumv,
  553|    421|			.tainted = tainted,
  554|    421|			.secret = enumv && enumv->flags.secret,
  ------------------
  |  Branch (554:14): [True: 421, False: 0]
  |  Branch (554:23): [True: 0, False: 421]
  ------------------
  555|       |			/* don't set the immutable flag.  The caller has to do it once he's finished editing the values */
  556|    421|		}, sizeof(*vb));
  557|    421|	fr_value_box_list_entry_init(vb);
  558|       |
  559|       |	/*
  560|       |	 *	The majority of types are fine to initialise to
  561|       |	 *	all zeros, the following are the exceptions.
  562|       |	 */
  563|    421|	switch (type) {
  564|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 421]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 421]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 421]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 421]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:2): [True: 0, False: 421]
  ------------------
  565|      0|		fr_value_box_list_init(&vb->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  566|      0|		break;
  567|       |
  568|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (568:2): [True: 0, False: 421]
  ------------------
  569|      0|	case FR_TYPE_COMBO_IP_ADDR:	/* Default to the smaller type */
  ------------------
  |  Branch (569:2): [True: 0, False: 421]
  ------------------
  570|      0|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  571|      0|		vb->vb_ip.prefix = 32;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  572|      0|		break;
  573|       |
  574|    421|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (574:2): [True: 421, False: 0]
  ------------------
  575|    421|	case FR_TYPE_COMBO_IP_PREFIX:	/* Default to the samaller type */
  ------------------
  |  Branch (575:2): [True: 0, False: 421]
  ------------------
  576|    421|		vb->vb_ip.af = AF_INET;
  ------------------
  |  |  264|    421|#define vb_ip					datum.ip
  ------------------
  577|    421|		break;
  578|       |
  579|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (579:2): [True: 0, False: 421]
  ------------------
  580|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  581|      0|		vb->vb_ip.prefix = 128;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  582|      0|		break;
  583|       |
  584|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (584:2): [True: 0, False: 421]
  ------------------
  585|      0|		vb->vb_ip.af = AF_INET6;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  586|      0|		break;
  587|       |
  588|      0|	default:
  ------------------
  |  Branch (588:2): [True: 0, False: 421]
  ------------------
  589|      0|		break;
  590|    421|	}
  591|       |
  592|    421|#ifndef NDEBUG
  593|    421|	vb->magic = FR_VALUE_BOX_MAGIC;
  ------------------
  |  |   91|    421|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  ------------------
  |  |  |  |   81|    421|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  ------------------
  |  |  |  |  |  |  206|    421|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  205|    421|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|    421|	vb->file = file;
  595|    421|	vb->line = line;
  596|    421|#endif
  597|    421|}

fr_atexit_global_setup:
  180|      4|{
  181|      4|	if (fr_atexit_global) return 0;
  ------------------
  |  Branch (181:6): [True: 0, False: 4]
  ------------------
  182|       |
  183|      4|	fr_atexit_global = talloc_zero(NULL, fr_atexit_list_t);
  184|      4|	if (unlikely(!fr_atexit_global)) return -1;
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  185|       |
  186|      4|	ATEXIT_DEBUG("%s - Alloced global destructor list %p", __FUNCTION__, fr_atexit_global);
  187|       |
  188|      4|	fr_dlist_talloc_init(&fr_atexit_global->head, fr_atexit_entry_t, entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  189|      4|	talloc_set_destructor(fr_atexit_global, _destructor_list_free);
  ------------------
  |  Branch (189:2): [Folded, False: 4]
  ------------------
  190|       |
  191|      4|#ifdef HAVE_PTHREADS
  192|      4|	fr_atexit_threads = talloc_zero(NULL, fr_atexit_list_t);
  193|      4|	if (unlikely(!fr_atexit_threads)) return -1;
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  194|       |
  195|      4|	ATEXIT_DEBUG("%s - Alloced threads destructor list %p", __FUNCTION__, fr_atexit_threads);
  196|       |
  197|      4|	fr_dlist_talloc_init(&fr_atexit_threads->head, fr_atexit_entry_t, entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  198|      4|	talloc_set_destructor(fr_atexit_threads, _destructor_list_free);
  ------------------
  |  Branch (198:2): [Folded, False: 4]
  ------------------
  199|      4|#endif
  200|       |
  201|      4|	atexit(_global_free);	/* Call all remaining destructors at process exit */
  202|       |
  203|      4|	return 0;
  204|      4|}
_atexit_global:
  230|      8|{
  231|      8|	CHECK_GLOBAL_SETUP();
  ------------------
  |  |  207|      8|#define CHECK_GLOBAL_SETUP() \
  |  |  208|      8|do { \
  |  |  209|      8|	int _ret = 0; \
  |  |  210|      8|	pthread_mutex_lock(&fr_atexit_global_mutex); \
  |  |  211|      8|	fr_cond_assert_msg(!is_exiting, "New atexit handlers should not be allocated whilst exiting"); \
  |  |  ------------------
  |  |  |  |  148|      8|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  |  |  ------------------
  |  |  |  |  |  |  396|     16|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  |  |  Branch (396:41): [True: 8, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  212|      8|	if (!fr_atexit_global) _ret = fr_atexit_global_setup(); \
  |  |  ------------------
  |  |  |  Branch (212:6): [True: 0, False: 8]
  |  |  ------------------
  |  |  213|      8|	pthread_mutex_unlock(&fr_atexit_global_mutex); \
  |  |  214|      8|	if (_ret < 0) return _ret; \
  |  |  ------------------
  |  |  |  Branch (214:6): [True: 0, False: 8]
  |  |  ------------------
  |  |  215|      8|} while(0)
  |  |  ------------------
  |  |  |  Branch (215:9): [Folded, False: 8]
  |  |  ------------------
  ------------------
  232|       |
  233|      8|	if (unlikely(atexit_entry_alloc(file, line, fr_atexit_global, func, uctx) == NULL)) return -1;
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  234|       |
  235|      8|	return 0;
  236|      8|}
fr_atexit_global_disarm:
  249|      4|{
  250|      4|	fr_atexit_entry_t 	*e = NULL;
  251|      4|	unsigned int		count = 0;
  252|       |
  253|     12|	while ((e = fr_dlist_next(&fr_atexit_global->head, e))) {
  ------------------
  |  Branch (253:9): [True: 8, False: 4]
  ------------------
  254|      8|		fr_atexit_entry_t *disarm;
  255|       |
  256|      8|		if ((e->func != func) || ((e->uctx != uctx) && uctx_scope)) continue;
  ------------------
  |  Branch (256:7): [True: 6, False: 2]
  |  Branch (256:29): [True: 0, False: 2]
  |  Branch (256:50): [True: 0, False: 0]
  ------------------
  257|       |
  258|      2|		ATEXIT_DEBUG("%s - Disarming %p/%p func=%p, uctx=%p (alloced %s:%d)",
  259|      2|			     __FUNCTION__,
  260|      2|			     fr_atexit_global, e, e->func, e->uctx, e->file, e->line);
  261|       |
  262|      2|		disarm = e;
  263|      2|		e = fr_dlist_remove(&fr_atexit_global->head, e);
  264|      2|		talloc_set_destructor(disarm, NULL);
  ------------------
  |  Branch (264:3): [Folded, False: 2]
  ------------------
  265|      2|		talloc_free(disarm);
  266|       |
  267|      2|		count++;
  268|      2|	}
  269|       |
  270|      4|	return count;
  271|      4|}
fr_atexit_global_trigger_all:
  306|      4|{
  307|      4|	fr_atexit_entry_t		*e = NULL, *to_free;
  308|      4|	unsigned int			count = 0;
  309|       |
  310|       |	/*
  311|       |	 *	Iterate over the list of thread local
  312|       |	 *	destructor lists running the
  313|       |	 *	destructors.
  314|       |	 */
  315|     10|	while ((e = fr_dlist_next(&fr_atexit_global->head, e))) {
  ------------------
  |  Branch (315:9): [True: 6, False: 4]
  ------------------
  316|      6|		ATEXIT_DEBUG("%s - Triggering %p/%p func=%p, uctx=%p (alloced %s:%d)",
  317|      6|			     __FUNCTION__,
  318|      6|			     fr_atexit_global, e, e->func, e->uctx, e->file, e->line);
  319|       |
  320|      6|		count++;
  321|      6|		to_free = e;
  322|      6|		e = fr_dlist_remove(&fr_atexit_global->head, e);
  323|      6|		if (talloc_free(to_free) < 0) {
  ------------------
  |  Branch (323:7): [True: 0, False: 6]
  ------------------
  324|      0|			fr_strerror_printf_push("atexit handler failed %p/%p func=%p, uctx=%p"
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  325|      0|						" (alloced %s:%d)",
  326|      0|						fr_atexit_global, to_free,
  327|      0|						to_free->func, to_free->uctx,
  328|      0|						to_free->file, to_free->line);
  329|      0|			return -1;
  330|      0|		}
  331|      6|	}
  332|       |
  333|      4|	return count;
  334|      4|}
fr_atexit_thread_local_alloc_disabled:
  443|  2.28k|{
  444|       |	return atomic_load_explicit(&thread_local_alloc_disabled, memory_order_relaxed);
  445|  2.28k|}
_fr_atexit_thread_local:
  509|      8|{
  510|      8|	CHECK_GLOBAL_SETUP();
  ------------------
  |  |  207|      8|#define CHECK_GLOBAL_SETUP() \
  |  |  208|      8|do { \
  |  |  209|      8|	int _ret = 0; \
  |  |  210|      8|	pthread_mutex_lock(&fr_atexit_global_mutex); \
  |  |  211|      8|	fr_cond_assert_msg(!is_exiting, "New atexit handlers should not be allocated whilst exiting"); \
  |  |  ------------------
  |  |  |  |  148|      8|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  |  |  ------------------
  |  |  |  |  |  |  396|     16|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  |  |  Branch (396:41): [True: 8, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  212|      8|	if (!fr_atexit_global) _ret = fr_atexit_global_setup(); \
  |  |  ------------------
  |  |  |  Branch (212:6): [True: 0, False: 8]
  |  |  ------------------
  |  |  213|      8|	pthread_mutex_unlock(&fr_atexit_global_mutex); \
  |  |  214|      8|	if (_ret < 0) return _ret; \
  |  |  ------------------
  |  |  |  Branch (214:6): [True: 0, False: 8]
  |  |  ------------------
  |  |  215|      8|} while(0)
  |  |  ------------------
  |  |  |  Branch (215:9): [Folded, False: 8]
  |  |  ------------------
  ------------------
  511|       |
  512|       |	/*
  513|       |	 *	Initialise the thread local list, just for pthread_exit().
  514|       |	 */
  515|      8|	if (!fr_atexit_thread_local) {
  ------------------
  |  Branch (515:6): [True: 4, False: 4]
  ------------------
  516|      4|		fr_atexit_list_t *list;
  517|       |
  518|       |		/*
  519|       |		 *	Must be heap allocated, because thread local
  520|       |		 *	structures can be freed before the key
  521|       |		 *	destructor is run (depending on platform).
  522|       |		 */
  523|      4|		list = talloc_zero(NULL, fr_atexit_list_t);
  524|      4|		if (unlikely(!list)) return -1;
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  525|       |
  526|      4|		ATEXIT_DEBUG("%s - Thread %u alloced _Thread_local destructor list %p",
  527|      4|			     __FUNCTION__,
  528|      4|			     (unsigned int)pthread_self(), list);
  529|       |
  530|      4|		fr_dlist_talloc_init(&list->head, fr_atexit_entry_t, entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  531|      4|		(void) pthread_key_create(&list->key, _thread_local_pthread_free);
  532|       |
  533|       |		/*
  534|       |		 *	We need to pass in a pointer to the heap
  535|       |		 *	memory because, again, the thread local
  536|       |		 *	indirection table may have disappeared
  537|       |		 *	by the time the thread destructor is
  538|       |		 *	called.
  539|       |		 */
  540|      4|		(void) pthread_setspecific(list->key, list);
  541|      4|		talloc_set_destructor(list, _thread_local_list_free);
  ------------------
  |  Branch (541:3): [Folded, False: 4]
  ------------------
  542|       |
  543|       |		/*
  544|       |		 *	Add a destructor for the thread-local list
  545|       |		 *	The pthread based destructor will disarm
  546|       |		 *	this if it fires, but leave it enabled if
  547|       |		 *	it doesn't, thus ensuring the memory is
  548|       |		 *	*always* freed one way or another.
  549|       |		 */
  550|      4|		pthread_mutex_lock(&fr_atexit_global_mutex);
  551|      4|		list->e = atexit_entry_alloc(file, line,
  552|      4|					     fr_atexit_threads,
  553|      4|					     _thread_local_free,
  554|      4|					     list);
  555|       |
  556|      4|		pthread_mutex_unlock(&fr_atexit_global_mutex);
  557|       |
  558|      4|		fr_atexit_thread_local = list;
  559|      4|	}
  560|       |
  561|       |	/*
  562|       |	 *	Now allocate the actual atexit handler entry
  563|       |	 */
  564|      8|	if (atexit_entry_alloc(file, line, fr_atexit_thread_local, func, uctx) == NULL) return -1;
  ------------------
  |  Branch (564:6): [True: 0, False: 8]
  ------------------
  565|       |
  566|      8|	return 0;
  567|      8|}
atexit.c:_destructor_list_free:
  150|      8|{
  151|      8|	ATEXIT_DEBUG("%s - Freeing destructor list %p", __FUNCTION__, list);
  152|       |
  153|      8|	fr_dlist_talloc_free(&list->head);	/* Free in order */
  154|      8|	return 0;
  155|      8|}
atexit.c:_global_free:
  161|      4|{
  162|      4|#ifdef HAVE_PTHREADS
  163|      4|	pthread_mutex_lock(&fr_atexit_global_mutex);
  164|      4|#endif
  165|       |
  166|      4|	fr_cond_assert_msg(!is_exiting, "Global free function called multiple times");
  ------------------
  |  |  148|      4|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|      8|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|      4|	is_exiting = true;
  168|       |
  169|      4|#ifdef HAVE_PTHREADS
  170|      4|	pthread_mutex_unlock(&fr_atexit_global_mutex);
  171|      4|	TALLOC_FREE(fr_atexit_threads);	/* Forcefully cleanup any thread-specific memory */
  ------------------
  |  Branch (171:2): [True: 4, False: 0]
  |  Branch (171:2): [Folded, False: 4]
  ------------------
  172|      4|#endif
  173|       |	TALLOC_FREE(fr_atexit_global);
  ------------------
  |  Branch (173:2): [True: 4, False: 0]
  |  Branch (173:2): [Folded, False: 4]
  ------------------
  174|      4|}
atexit.c:atexit_entry_alloc:
  124|     20|{
  125|     20|	fr_atexit_entry_t *e;
  126|       |
  127|     20|	e = talloc_zero(list, fr_atexit_entry_t);
  128|     20|	if (unlikely(!e)) return NULL;
  ------------------
  |  |  397|     20|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 20]
  |  |  ------------------
  ------------------
  129|       |
  130|     20|	e->list = list;
  131|     20|	e->func = func;
  132|     20|	e->uctx = UNCONST(void *, uctx);
  ------------------
  |  |  186|     20|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  133|     20|	e->file = file;
  134|     20|	e->line = line;
  135|       |
  136|     20|	ATEXIT_DEBUG("%s - Thread %u arming %p/%p func=%p, uctx=%p (alloced %s:%d)",
  137|     20|		     __FUNCTION__, (unsigned int)pthread_self(),
  138|     20|		     list, e, e->func, e->uctx, e->file, e->line);
  139|       |
  140|     20|	fr_dlist_insert_head(&list->head, e);
  141|     20|	talloc_set_destructor(e, _atexit_entry_free);
  ------------------
  |  Branch (141:2): [Folded, False: 20]
  ------------------
  142|       |
  143|     20|	return e;
  144|     20|}
atexit.c:_atexit_entry_free:
  103|     18|{
  104|     18|	ATEXIT_DEBUG("%s - Thread %u freeing %p/%p func=%p, uctx=%p (alloced %s:%d)",
  105|     18|		     __FUNCTION__, (unsigned int)pthread_self(),
  106|     18|		     e->list, e, e->func, e->uctx, e->file, e->line);
  107|       |
  108|     18|	if (fr_dlist_entry_in_list(&e->entry)) fr_dlist_remove(&e->list->head, e);
  ------------------
  |  Branch (108:6): [True: 0, False: 18]
  ------------------
  109|       |
  110|       |	/*
  111|       |	 *	If the exit handler wasn't disarmed, call it...
  112|       |	 */
  113|     18|	if (e->func) e->func(e->uctx);
  ------------------
  |  Branch (113:6): [True: 18, False: 0]
  ------------------
  114|       |
  115|     18|	return 0;
  116|     18|}
atexit.c:_thread_local_list_free:
  472|      4|{
  473|      4|	ATEXIT_DEBUG("%s - Freeing _Thread_local destructor list %p",  __FUNCTION__, list);
  474|       |
  475|      4|	fr_dlist_talloc_free(&list->head);	/* Free in order */
  476|      4|	pthread_mutex_lock(&fr_atexit_global_mutex);
  477|       |	list->e->func = NULL;			/* Disarm the global entry that'd free the thread-specific list */
  478|      4|	pthread_mutex_unlock(&fr_atexit_global_mutex);
  479|      4|	return 0;
  480|      4|}
atexit.c:_thread_local_free:
  496|      4|{
  497|      4|	thread_is_exiting = true;
  498|       |	return talloc_free(list);
  499|      4|}

fr_backtrace_init:
  325|      2|{
  326|       |#ifdef HAVE_BACKTRACE
  327|       |		/*
  328|       |		 *  Initialise the state for libbacktrace.  As per the docs
  329|       |		 *  these resources can never be freed, and should be ignore
  330|       |		 *  in any leak tracking code.
  331|       |		 */
  332|       |		backtrace_state = backtrace_create_state(program, 1, _backtrace_error, NULL);
  333|       |#elif defined(HAVE_EXECINFO) && defined(__GNUC__) && !defined(NDEBUG)
  334|       |	       /*
  335|       |		*  We need to pre-load lgcc_s, else we can get into a deadlock
  336|       |		*  in fr_fault, as backtrace() attempts to dlopen it.
  337|       |		*
  338|       |		*  Apparently there's a performance impact of loading lgcc_s,
  339|       |		*  so only do it if this is a debug build.
  340|       |		*
  341|       |		*  See: https://sourceware.org/bugzilla/show_bug.cgi?id=16159
  342|       |		*/
  343|      2|		{
  344|      2|			void *stack[10];
  345|       |
  346|      2|			backtrace(stack, 10);
  347|      2|		}
  348|      2|#endif
  349|      2|}

__lsan_default_suppressions:
  124|      2|{
  125|      2|	return
  126|      2|		"leak:CRYPTO_THREAD_lock_new\n"		/* OpenSSL init leak - reported by heaptrack */
  127|       |		/* librdkafka initialises Cyrus SASL on first rd_kafka_new(), which dlopens
  128|       |		 * libsasl2 and never unloads it.  Not an rlm_kafka bug. */
  129|      2|		"leak:rd_kafka_sasl_cyrus_global_init\n"
  130|       |#if defined(__APPLE__)
  131|       |		"leak:*gmtsub*\n"
  132|       |		"leak:ImageLoaderMachO::doImageInit\n"
  133|       |		"leak:initializeNonMetaClass\n"
  134|       |		"leak:_st_tzset_basic\n"
  135|       |		"leak:attachCategories\n"
  136|       |		"leak:fork\n"
  137|       |		"leak:getaddrinfo\n"
  138|       |		"leak:getpwuid_r\n"
  139|       |		"leak:libSystem_atfork_child\n"
  140|       |		"leak:libsystem_notify\n"
  141|       |		"leak:load_images\n"
  142|       |		"leak:newlocale\n"
  143|       |		/* Perl >= 5.32.0 - Upstream bug, tracked by https://github.com/Perl/perl5/issues/18108 */
  144|       |		"leak:perl_construct\n"
  145|       |		"leak:realizeClassWithoutSwift\n"
  146|       |		"leak:tzset\n"
  147|       |		"leak:tzsetwall_basic\n"
  148|       |		/* macOS Objective-C runtime and CoreFoundation lazily allocate
  149|       |		 * metadata on first class touch (e.g. inside libsasl2 which
  150|       |		 * librdkafka dlopens, or on dispatch-apply worker threads).
  151|       |		 * These stacks have no symbols, only library paths; suppress by
  152|       |		 * path substring since the process-wide state is reclaimed on
  153|       |		 * exit by the OS. */
  154|       |		"leak:libobjc.A.dylib\n"
  155|       |		"leak:CoreFoundation.framework\n"
  156|       |#elif defined(__linux__)
  157|       |		"leak:*getpwnam_r*\n"			/* libc startup leak - reported by heaptrack */
  158|      2|		"leak:_dl_init\n"			/* dl startup leak - reported by heaptrack */
  159|      2|		"leak:initgroups\n"			/* libc startup leak - reported by heaptrack */
  160|      2|		"leak:kqueue\n"
  161|       |		/* libdigestmd5 (cyrus-sasl) calls EVP_CIPHER_fetch on OpenSSL 3.x
  162|       |		 * but never calls EVP_CIPHER_free.  Third-party bug; not ours to fix. */
  163|      2|		"leak:libdigestmd5\n"
  164|      2|#endif
  165|      2|		;
  166|      2|}
__lsan_is_turned_off:
  182|      4|{
  183|      4|	uint8_t ret = 1;
  184|       |
  185|       |	/* Disable LSAN explicitly - Used for tests involving fork() */
  186|      4|	if (lsan_disable) return 1;
  ------------------
  |  Branch (186:6): [True: 0, False: 4]
  ------------------
  187|       |
  188|       |	/* Parent */
  189|      4|	if (lsan_test_pid != 0) return 0;
  ------------------
  |  Branch (189:6): [True: 2, False: 2]
  ------------------
  190|       |
  191|       |	/* Child */
  192|      2|	if (write(lsan_test_pipe[1], &ret, sizeof(ret)) < 0) {
  ------------------
  |  Branch (192:6): [True: 0, False: 2]
  ------------------
  193|      0|		fprintf(stderr, "Writing LSAN status failed: %s", fr_syserror(errno));
  194|      0|	}
  195|      2|	close(lsan_test_pipe[1]);
  196|      2|	return 0;
  197|      4|}
fr_get_lsan_state:
  209|      4|{
  210|      4|	uint8_t ret = 0;
  211|       |
  212|      4|	if (lsan_state != INT_MAX) return lsan_state;/* Use cached result */
  ------------------
  |  Branch (212:6): [True: 0, False: 4]
  ------------------
  213|       |
  214|      4|	if (pipe(lsan_test_pipe) < 0) {
  ------------------
  |  Branch (214:6): [True: 0, False: 4]
  ------------------
  215|      0|		fr_strerror_printf("Failed opening internal pipe: %s", fr_syserror(errno));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  215|      0|		fr_strerror_printf("Failed opening internal pipe: %s", fr_syserror(errno));
  |  |  ------------------
  ------------------
  216|      0|		return -1;
  217|      0|	}
  218|       |
  219|      4|	lsan_test_pid = fork();
  220|      4|	if (lsan_test_pid == -1) {
  ------------------
  |  Branch (220:6): [True: 0, False: 4]
  ------------------
  221|      0|		fr_strerror_printf("Error forking: %s", fr_syserror(errno));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  221|      0|		fr_strerror_printf("Error forking: %s", fr_syserror(errno));
  |  |  ------------------
  ------------------
  222|      0|		return -1;
  223|      0|	}
  224|       |
  225|       |	/* Child */
  226|      4|	if (lsan_test_pid == 0) {
  ------------------
  |  Branch (226:6): [True: 2, False: 2]
  ------------------
  227|      2|		close(lsan_test_pipe[0]);	/* Close parent's side */
  228|      2|		exit(EXIT_SUCCESS);		/* Results in LSAN calling __lsan_is_turned_off via onexit handler */
  229|      2|	}
  230|       |
  231|       |	/* Parent */
  232|      2|	close(lsan_test_pipe[1]);		/* Close child's side */
  233|       |
  234|      2|	while ((read(lsan_test_pipe[0], &ret, sizeof(ret)) < 0) && (errno == EINTR));
  ------------------
  |  Branch (234:9): [True: 0, False: 2]
  |  Branch (234:61): [True: 0, False: 0]
  ------------------
  235|       |
  236|      2|	close(lsan_test_pipe[0]);		/* Close our side (so we don't leak FDs) */
  237|       |
  238|       |	/* Collect child */
  239|      2|	waitpid(lsan_test_pid, NULL, 0);
  240|       |
  241|      2|	lsan_state = ret;			/* Cache test results */
  242|       |
  243|      2|	return ret;
  244|      4|}
fr_get_debug_state:
  327|      2|{
  328|      2|	int pid;
  329|       |
  330|      2|	int from_child[2] = {-1, -1};
  331|       |
  332|       |#ifdef HAVE_CAPABILITY_H
  333|       |	cap_flag_value_t	state;
  334|       |	cap_t			caps;
  335|       |
  336|       |	/*
  337|       |	 *  If we're running under linux, we first need to check if we have
  338|       |	 *  permission to to ptrace. We do that using the capabilities
  339|       |	 *  functions.
  340|       |	 */
  341|       |	caps = cap_get_proc();
  342|       |	if (!caps) {
  343|       |		fr_strerror_printf("Failed getting process capabilities: %s", fr_syserror(errno));
  344|       |		return DEBUGGER_STATE_UNKNOWN;
  345|       |	}
  346|       |
  347|       |	if (cap_get_flag(caps, CAP_SYS_PTRACE, CAP_PERMITTED, &state) < 0) {
  348|       |		fr_strerror_printf("Failed getting CAP_SYS_PTRACE permitted state: %s",
  349|       |				   fr_syserror(errno));
  350|       |		cap_free(caps);
  351|       |		return DEBUGGER_STATE_UNKNOWN;
  352|       |	}
  353|       |
  354|       |	if ((state == CAP_SET) && (cap_get_flag(caps, CAP_SYS_PTRACE, CAP_EFFECTIVE, &state) < 0)) {
  355|       |		fr_strerror_printf("Failed getting CAP_SYS_PTRACE effective state: %s",
  356|       |				   fr_syserror(errno));
  357|       |		cap_free(caps);
  358|       |		return DEBUGGER_STATE_UNKNOWN;
  359|       |	}
  360|       |
  361|       |	/*
  362|       |	 *  We don't have permission to ptrace, so this test will always fail.
  363|       |	 */
  364|       |	if (state == CAP_CLEAR) {
  365|       |		fr_strerror_printf("ptrace capability not set.  If debugger detection is required run as root or: "
  366|       |				   "setcap cap_sys_ptrace+ep <path_to_binary>");
  367|       |		cap_free(caps);
  368|       |		return DEBUGGER_STATE_UNKNOWN_NO_PTRACE_CAP;
  369|       |	}
  370|       |	cap_free(caps);
  371|       |#endif
  372|       |
  373|      2|	if (pipe(from_child) < 0) {
  ------------------
  |  Branch (373:6): [True: 0, False: 2]
  ------------------
  374|      0|		fr_strerror_printf("Error opening internal pipe: %s", fr_syserror(errno));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  374|      0|		fr_strerror_printf("Error opening internal pipe: %s", fr_syserror(errno));
  |  |  ------------------
  ------------------
  375|      0|		return DEBUGGER_STATE_UNKNOWN;
  376|      0|	}
  377|       |
  378|      2|	pid = fork();
  379|      2|	if (pid == -1) {
  ------------------
  |  Branch (379:6): [True: 0, False: 2]
  ------------------
  380|      0|		fr_strerror_printf("Error forking: %s", fr_syserror(errno));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  380|      0|		fr_strerror_printf("Error forking: %s", fr_syserror(errno));
  |  |  ------------------
  ------------------
  381|      0|		return DEBUGGER_STATE_UNKNOWN;
  382|      0|	}
  383|       |
  384|       |	/* Child */
  385|      2|	if (pid == 0) {
  ------------------
  |  Branch (385:6): [True: 0, False: 2]
  ------------------
  386|      0|		int8_t	ret = DEBUGGER_STATE_NOT_ATTACHED;
  387|      0|		int	ppid = getppid();
  388|      0|		int	flags;
  389|       |
  390|       |		/*
  391|       |		 *	Disable the leak checker for this forked process
  392|       |		 *	so we don't get spurious leaks reported.
  393|       |		 */
  394|      0|#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H
  395|      0|		lsan_disable = true;
  396|      0|#endif
  397|       |
  398|      0|DIAG_OFF(deprecated-declarations)
  399|      0|		flags = PT_ATTACH;
  400|      0|DIAG_ON(deprecated-declarations)
  401|       |
  402|       |		/* Close parent's side */
  403|      0|		close(from_child[0]);
  404|       |
  405|       |		/*
  406|       |		 *	FreeBSD is extremely picky about the order of operations here
  407|       |		 *	we need to attach, wait *then* write whilst the parent is still
  408|       |		 *	suspended, then detach, continuing the process.
  409|       |		 *
  410|       |		 *	If we don't do it in that order the read in the parent triggers
  411|       |		 *	a SIGKILL.
  412|       |		 */
  413|      0|		errno = 0;
  414|      0|		_PTRACE(flags, ppid);
  ------------------
  |  |   90|      0|#    define _PTRACE(_x, _y) ptrace(_x, _y, NULL, NULL)
  ------------------
  415|      0|		if (errno == 0) {
  ------------------
  |  Branch (415:7): [True: 0, False: 0]
  ------------------
  416|       |			/* Wait for the parent to stop */
  417|      0|			waitpid(ppid, NULL, 0);
  418|       |
  419|       |			/* Tell the parent what happened */
  420|      0|		send_status:
  421|      0|			if (write(from_child[1], &ret, sizeof(ret)) < 0) {
  ------------------
  |  Branch (421:8): [True: 0, False: 0]
  ------------------
  422|      0|				fprintf(stderr, "Writing ptrace status to parent failed: %s\n", fr_syserror(errno));
  423|      0|			}
  424|       |
  425|       |			/* Detach */
  426|      0|			_PTRACE_DETACH(ppid);
  ------------------
  |  |   91|      0|#    define _PTRACE_DETACH(_x) ptrace(PT_DETACH, _x, NULL, NULL)
  ------------------
  427|       |
  428|       |
  429|       |			/*
  430|       |			*	We call _exit() instead of exit().  This means that we skip the atexit() handlers,
  431|       |			*	which don't need to run in a temporary child process.  Skipping them means that we
  432|       |			*	avoid dirtying those pages to "clean things up", which is then immediately followed by
  433|       |			*	exiting.
  434|       |			*
  435|       |			*	Skipping the atexit() handlers also means that we're not worried about memory leaks
  436|       |			*	because things "aren't cleaned up correctly".  We're not exiting cleanly here (and
  437|       |			*	don't care to exit cleanly).  So just exiting with no cleanups is fine.
  438|       |			*/
  439|      0|			_exit(0); /* don't run the atexit() handlers. */
  440|       |		/*
  441|       |		 *	man ptrace says the following:
  442|       |		 *
  443|       |		 *	EPERM  The specified process cannot be traced.  This could be
  444|       |                 *	because the tracer has insufficient privileges (the
  445|       |                 *	required capability is CAP_SYS_PTRACE); unprivileged
  446|       |                 *	processes cannot trace processes that they cannot send
  447|       |                 *	signals to or those running set-user-ID/set-group-ID
  448|       |                 *	programs, for obvious reasons.  Alternatively, the process
  449|       |		 *	may already be being traced, or (before Linux 2.6.26) be
  450|       |        	 *	init(1) (PID 1).
  451|       |		 *
  452|       |		 *	In any case, we are very unlikely to be able to attach to
  453|       |		 *	the process from the panic action.
  454|       |		 *
  455|       |		 *	We checked for CAP_SYS_PTRACE previously, so know that
  456|       |		 *	we _should_ haven been ablle to attach, so if we can't, it's
  457|       |		 *	likely that we're already being traced.
  458|       |		 */
  459|      0|		} else if (errno == EPERM) {
  ------------------
  |  Branch (459:14): [True: 0, False: 0]
  ------------------
  460|      0|			ret = DEBUGGER_STATE_ATTACHED;
  461|      0|			goto send_status;
  462|      0|		}
  463|       |
  464|       |		/*
  465|       |		 *	Unexpected error, we don't know whether we're already running
  466|       |		 * 	under a debugger or not...
  467|       |		 */
  468|      0|		ret = DEBUGGER_STATE_UNKNOWN;
  469|      0|		fprintf(stderr, "Debugger check failed to attach to parent with unexpected error: %s\n", fr_syserror(errno));
  470|      0|		goto send_status;
  471|       |	/* Parent */
  472|      2|	} else {
  473|      2|		int8_t ret = DEBUGGER_STATE_UNKNOWN;
  474|       |
  475|       |		/*
  476|       |		 *	The child writes errno (reason) if pattach failed else 0.
  477|       |		 *
  478|       |		 *	This read may be interrupted by pattach,
  479|       |		 *	which is why we need the loop.
  480|       |		 */
  481|      2|		while ((read(from_child[0], &ret, sizeof(ret)) < 0) && (errno == EINTR));
  ------------------
  |  Branch (481:10): [True: 0, False: 2]
  |  Branch (481:58): [True: 0, False: 0]
  ------------------
  482|       |
  483|       |		/* Close the pipes here (if we did it above, it might race with pattach) */
  484|      2|		close(from_child[1]);
  485|      2|		close(from_child[0]);
  486|       |
  487|       |		/* Collect the status of the child */
  488|      2|		waitpid(pid, NULL, 0);
  489|       |
  490|      2|		return ret;
  491|      2|	}
  492|      2|}
fr_disable_null_tracking_on_free:
 1036|      2|{
 1037|      2|	bool *marker;
 1038|       |
 1039|       |	/*
 1040|       |	 *  Disable null tracking on exit, else valgrind complains
 1041|       |	 */
 1042|      2|	marker = talloc(ctx, bool);
 1043|       |	talloc_set_destructor(marker, _disable_null_tracking);
  ------------------
  |  Branch (1043:2): [Folded, False: 2]
  ------------------
 1044|      2|}
fr_talloc_fault_setup:
 1052|      4|{
 1053|      4|	talloc_set_log_fn(_fr_talloc_log);
 1054|      4|	talloc_set_abort_fn(_fr_talloc_fault_simple);
 1055|      4|}
fr_fault_setup:
 1071|      2|{
 1072|      2|	static bool setup = false;
 1073|       |
 1074|      2|	char *out = panic_action;
 1075|      2|	size_t left = sizeof(panic_action);
 1076|       |
 1077|      2|	char const *p = cmd;
 1078|      2|	char const *q;
 1079|       |
 1080|      2|	if (cmd) {
  ------------------
  |  Branch (1080:6): [True: 0, False: 2]
  ------------------
 1081|      0|		size_t ret;
 1082|       |
 1083|       |		/* Substitute %e for the current program */
 1084|      0|		while ((q = strstr(p, "%e"))) {
  ------------------
  |  Branch (1084:10): [True: 0, False: 0]
  ------------------
 1085|      0|			out += ret = snprintf(out, left, "%.*s%s", (int) (q - p), p, program ? program : "");
  ------------------
  |  Branch (1085:65): [True: 0, False: 0]
  ------------------
 1086|      0|			if (left <= ret) {
  ------------------
  |  Branch (1086:8): [True: 0, False: 0]
  ------------------
 1087|      0|			oob:
 1088|      0|				fr_strerror_const("Panic action too long");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1089|      0|				return -1;
 1090|      0|			}
 1091|      0|			left -= ret;
 1092|      0|			p = q + 2;
 1093|      0|		}
 1094|      0|		if (strlen(p) >= left) goto oob;
  ------------------
  |  Branch (1094:7): [True: 0, False: 0]
  ------------------
 1095|      0|		strlcpy(out, p, left);
 1096|      2|	} else {
 1097|      2|		*panic_action = '\0';
 1098|      2|	}
 1099|       |
 1100|       |	/*
 1101|       |	 *	Check for administrator sanity.
 1102|       |	 */
 1103|      2|	if (fr_fault_check_permissions() < 0) return -1;
  ------------------
  |  Branch (1103:6): [True: 0, False: 2]
  ------------------
 1104|       |
 1105|       |	/* Unsure what the side effects of changing the signal handler mid execution might be */
 1106|      2|	if (!setup) {
  ------------------
  |  Branch (1106:6): [True: 2, False: 0]
  ------------------
 1107|      2|		char			*env;
 1108|       |
 1109|       |		/*
 1110|       |		 *  Installing signal handlers interferes with some debugging
 1111|       |		 *  operations.  Give the developer control over whether the
 1112|       |		 *  signal handlers are installed or not.
 1113|       |		 */
 1114|      2|		env = getenv("DEBUGGER_ATTACHED");
 1115|      2|		if (env && (strcmp(env, "yes") == 0)) {
  ------------------
  |  Branch (1115:7): [True: 0, False: 2]
  |  Branch (1115:14): [True: 0, False: 0]
  ------------------
 1116|      0|			fr_debug_state = DEBUGGER_STATE_ATTACHED;		/* i.e. disable signal handlers */
 1117|       |
 1118|      2|		} else if (env && (strcmp(env, "no") == 0)) {
  ------------------
  |  Branch (1118:14): [True: 0, False: 2]
  |  Branch (1118:21): [True: 0, False: 0]
  ------------------
 1119|      0|			fr_debug_state = DEBUGGER_STATE_NOT_ATTACHED;	/* i.e. enable signal handlers */
 1120|       |
 1121|       |			/*
 1122|       |			 *  Figure out if we were started under a debugger
 1123|       |			 */
 1124|      2|		} else {
 1125|      2|			if (fr_debug_state < 0) fr_debug_state = fr_get_debug_state();
  ------------------
  |  Branch (1125:8): [True: 2, False: 0]
  ------------------
 1126|      2|		}
 1127|       |
 1128|      2|		talloc_set_log_fn(_fr_talloc_log);
 1129|       |
 1130|       |		/*
 1131|       |		 *  These signals can't be properly dealt with in the debugger
 1132|       |		 *  if we set our own signal handlers.
 1133|       |		 */
 1134|      2|		switch (fr_debug_state) {
 1135|      0|		default:
  ------------------
  |  Branch (1135:3): [True: 0, False: 2]
  ------------------
 1136|      2|		case DEBUGGER_STATE_NOT_ATTACHED:
  ------------------
  |  Branch (1136:3): [True: 2, False: 0]
  ------------------
 1137|      2|#ifdef SIGABRT
 1138|      2|			if (fr_set_signal(SIGABRT, fr_fault) < 0) return -1;
  ------------------
  |  Branch (1138:8): [True: 0, False: 2]
  ------------------
 1139|       |
 1140|       |			/*
 1141|       |			 *  Use this instead of abort so we get a
 1142|       |			 *  full backtrace with broken versions of LLDB
 1143|       |			 */
 1144|      2|			talloc_set_abort_fn(_fr_talloc_fault);
 1145|      2|#endif
 1146|      2|#ifdef SIGILL
 1147|      2|			if (fr_set_signal(SIGILL, fr_fault) < 0) return -1;
  ------------------
  |  Branch (1147:8): [True: 0, False: 2]
  ------------------
 1148|      2|#endif
 1149|      2|#ifdef SIGFPE
 1150|      2|			if (fr_set_signal(SIGFPE, fr_fault) < 0) return -1;
  ------------------
  |  Branch (1150:8): [True: 0, False: 2]
  ------------------
 1151|      2|#endif
 1152|      2|#ifdef SIGSEGV
 1153|      2|			if (fr_set_signal(SIGSEGV, fr_fault) < 0) return -1;
  ------------------
  |  Branch (1153:8): [True: 0, False: 2]
  ------------------
 1154|      2|#endif
 1155|      2|#ifdef SIGALRM
 1156|       |			/*
 1157|       |			 *  This is used be jlibtool to terminate
 1158|       |			 *  processes which have been running too
 1159|       |			 *  long.
 1160|       |			 */
 1161|      2|			if (fr_set_signal(SIGALRM, fr_fault) < 0) return -1;
  ------------------
  |  Branch (1161:8): [True: 0, False: 2]
  ------------------
 1162|      2|#endif
 1163|      2|			break;
 1164|       |
 1165|      2|		case DEBUGGER_STATE_ATTACHED:
  ------------------
  |  Branch (1165:3): [True: 0, False: 2]
  ------------------
 1166|      0|			break;
 1167|      2|		}
 1168|       |
 1169|       |		/*
 1170|       |		 *  Needed for memory reports
 1171|       |		 */
 1172|      2|		fr_disable_null_tracking_on_free(ctx);
 1173|       |
 1174|      2|#if defined(HAVE_MALLOPT) && !defined(NDEBUG)
 1175|       |		/*
 1176|       |		 *  If were using glibc malloc > 2.4 this scribbles over
 1177|       |		 *  uninitialised and freed memory, to make memory issues easier
 1178|       |		 *  to track down.
 1179|       |		 */
 1180|      2|#  ifdef M_PERTURB
 1181|      2|		if (!getenv("TALLOC_FREE_FILL")) mallopt(M_PERTURB, 0x42);
  ------------------
  |  Branch (1181:7): [True: 2, False: 0]
  ------------------
 1182|      2|#  endif
 1183|      2|#  ifdef M_CHECK_ACTION
 1184|      2|		mallopt(M_CHECK_ACTION, 3);
 1185|      2|#  endif
 1186|      2|#endif
 1187|      2|		fr_backtrace_init(program);
 1188|      2|	}
 1189|      2|	setup = true;
 1190|       |
 1191|      2|	return 0;
 1192|      2|}
debug.c:fr_fault_check_permissions:
  769|      2|{
  770|      2|	char const *p, *q;
  771|      2|	size_t len;
  772|      2|	char filename[256];
  773|      2|	struct stat statbuf;
  774|       |
  775|       |	/*
  776|       |	 *	Try and guess which part of the command is the binary, and check to see if
  777|       |	 *	it's world writable, to try and save the admin from their own stupidity.
  778|       |	 *
  779|       |	 *	@fixme we should do this properly and take into account single and double
  780|       |	 *	quotes.
  781|       |	 */
  782|      2|	if ((q = strchr(panic_action, ' '))) {
  ------------------
  |  Branch (782:6): [True: 0, False: 2]
  ------------------
  783|       |		/*
  784|       |		 *	need to use a static buffer, because allocing memory in a signal handler
  785|       |		 *	is a bad idea and can result in deadlock.
  786|       |		 */
  787|      0|		len = snprintf(filename, sizeof(filename), "%.*s", (int)(q - panic_action), panic_action);
  788|      0|		if (is_truncated(len, sizeof(filename))) {
  ------------------
  |  |   48|      0|#define		is_truncated(_ret, _max) ((_ret) >= (size_t)(_max))
  |  |  ------------------
  |  |  |  Branch (48:35): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  789|      0|			fr_strerror_const("Failed writing panic_action to temporary buffer (truncated)");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  790|      0|			return -1;
  791|      0|		}
  792|      0|		p = filename;
  793|      2|	} else {
  794|      2|		p = panic_action;
  795|      2|	}
  796|       |
  797|      2|	if (stat(p, &statbuf) == 0) {
  ------------------
  |  Branch (797:6): [True: 0, False: 2]
  ------------------
  798|      0|#ifdef S_IWOTH
  799|      0|		if ((statbuf.st_mode & S_IWOTH) != 0) {
  ------------------
  |  Branch (799:7): [True: 0, False: 0]
  ------------------
  800|      0|			fr_strerror_printf("panic_action file \"%s\" is globally writable", p);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  801|      0|			return -1;
  802|      0|		}
  803|      0|#endif
  804|      0|	}
  805|       |
  806|      2|	return 0;
  807|      2|}
debug.c:_disable_null_tracking:
 1027|      2|{
 1028|      2|	talloc_disable_null_tracking();
 1029|      2|	return 0;
 1030|      2|}

fr_pair_array_from_network:
   44|  1.65k|{
   45|  1.65k|	uint8_t const  		*p = data, *end = p + data_len;
   46|  1.65k|	ssize_t			slen;
   47|  1.65k|	fr_pair_list_t		list;
   48|       |
   49|  1.65k|	fr_pair_list_init(&list);
   50|       |
   51|  1.65k|	FR_PROTO_HEX_DUMP(data, data_len, "fr_pair_array_from_network");
  ------------------
  |  |   42|  1.65k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 1.65k]
  |  |  ------------------
  ------------------
   52|       |
   53|  1.65k|	if (!fr_cond_assert_msg(parent->flags.array,
  ------------------
  |  |  148|  1.65k|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|  3.30k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 1.65k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (53:6): [True: 0, False: 1.65k]
  ------------------
   54|  1.65k|				"%s: Internal sanity check failed, attribute \"%s\" does not have array bit set",
   55|  1.65k|				__FUNCTION__, parent->name)) return PAIR_DECODE_FATAL_ERROR;
  ------------------
  |  |   49|      0|#define PAIR_DECODE_FATAL_ERROR	FR_VALUE_BOX_NET_ERROR
  |  |  ------------------
  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   56|       |
   57|       |	/*
   58|       |	 *	Catch stupidities.
   59|       |	 */
   60|  1.65k|	if (data_len == 0) return data_len;
  ------------------
  |  Branch (60:6): [True: 199, False: 1.45k]
  ------------------
   61|       |
   62|  11.6k|	while (p < end) {
  ------------------
  |  Branch (62:9): [True: 10.5k, False: 1.17k]
  ------------------
   63|  10.5k|		slen = decode_value(ctx, &list, parent, p, (end - p), decode_ctx);
   64|  10.5k|		if (slen <= 0) {
  ------------------
  |  Branch (64:7): [True: 278, False: 10.2k]
  ------------------
   65|    278|			fr_pair_list_free(&list);
   66|    278|			return slen - (p - data);
   67|    278|		}
   68|       |
   69|  10.2k|		p += slen;
   70|  10.2k|	}
   71|       |
   72|  1.17k|	fr_pair_list_append(out, &list);
   73|  1.17k|	return data_len;
   74|  1.45k|}
fr_pair_raw_from_network:
   88|  3.29k|{
   89|  3.29k|	ssize_t slen;
   90|  3.29k|	fr_pair_t *vp;
   91|  3.29k|	fr_dict_attr_t *unknown;
   92|  3.29k|	fr_dict_attr_t const *child;
   93|       |
   94|  3.29k|#if defined(STATIC_ANALYZER) || !defined(NDEBUG)
   95|  3.29k|	if (!da->parent) return -1; /* stupid static analyzers */
  ------------------
  |  Branch (95:6): [True: 0, False: 3.29k]
  ------------------
   96|  3.29k|#endif
   97|       |
   98|  3.29k|	FR_PROTO_TRACE("Creating Raw attribute %s", da->name);
  ------------------
  |  |   41|  3.29k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 3.29k]
  |  |  ------------------
  ------------------
   99|  3.29k|	FR_PROTO_HEX_DUMP(data, data_len, "fr_pair_raw_from_network");
  ------------------
  |  |   42|  3.29k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 3.29k]
  |  |  ------------------
  ------------------
  100|       |
  101|       |	/*
  102|       |	 *	Build an unknown attr of the entire data.
  103|       |	 */
  104|  3.29k|	unknown = fr_dict_attr_unknown_raw_afrom_da(ctx, da);
  105|  3.29k|	if (!unknown) return -1;
  ------------------
  |  Branch (105:6): [True: 571, False: 2.71k]
  ------------------
  106|       |
  107|  2.71k|	vp = fr_pair_afrom_da(ctx, unknown); /* makes a copy of 'unknown' */
  108|  2.71k|	child = unknown;
  109|  2.71k|	fr_dict_attr_unknown_free(&child); /* const issues */
  110|  2.71k|	if (!vp) return -1;
  ------------------
  |  Branch (110:6): [True: 0, False: 2.71k]
  ------------------
  111|       |
  112|       |	/*
  113|       |	 *	Don't bother getting data from the network if there's no data.
  114|       |	 */
  115|  2.71k|	if (data_len > 0) {
  ------------------
  |  Branch (115:6): [True: 1.07k, False: 1.64k]
  ------------------
  116|  1.07k|		slen = fr_value_box_from_network(vp, &vp->data, vp->da->type, vp->da,
  117|  1.07k|						 &FR_DBUFF_TMP(data, data_len), data_len, true);
  ------------------
  |  |  522|  1.07k|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|  1.07k|(fr_dbuff_t){ \
  |  |  524|  1.07k|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|  1.07k|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|  1.07k|	.end_i		= _Generic((_len_or_end), \
  |  |  527|  1.07k|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|  1.07k|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|  1.07k|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|  1.07k|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|  1.07k|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|  1.07k|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|  1.07k|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|  1.07k|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|  1.07k|			), \
  |  |  536|  1.07k|	.p_i		= _start, \
  |  |  537|  1.07k|	.is_const	= _Generic((_start), \
  |  |  538|  1.07k|				uint8_t *	: false, \
  |  |  539|  1.07k|				uint8_t const *	: true, \
  |  |  540|  1.07k|				char *		: false, \
  |  |  541|  1.07k|				char const *	: true \
  |  |  542|  1.07k|	       		) \
  |  |  543|  1.07k|}
  ------------------
  118|  1.07k|		if (slen < 0) {
  ------------------
  |  Branch (118:7): [True: 40, False: 1.03k]
  ------------------
  119|     40|			talloc_free(vp);
  120|     40|			return slen;
  121|     40|		}
  122|  1.07k|	}
  123|       |
  124|       |	/*
  125|       |	 *	Raw VPs are always tainted.
  126|       |	 */
  127|  2.67k|	vp->vp_tainted = true;
  ------------------
  |  |  150|  2.67k|#define vp_tainted		data.tainted
  ------------------
  128|  2.67k|	fr_pair_append(out, vp);
  129|       |
  130|  2.67k|	return data_len;
  131|  2.71k|}
fr_pair_tlvs_from_network:
  162|    103|{
  163|    103|	uint8_t const *p, *end;
  164|    103|	fr_pair_list_t tlvs, *list;
  165|    103|	fr_pair_t *vp = NULL;
  166|    103|	TALLOC_CTX *child_ctx;
  167|       |
  168|    103|	FR_PROTO_HEX_DUMP(data, data_len, "fr_pair_tlvs_from_network");
  ------------------
  |  |   42|    103|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 103]
  |  |  ------------------
  ------------------
  169|       |
  170|    103|	switch (parent->type) {
  171|     96|	case FR_TYPE_TLV:
  ------------------
  |  Branch (171:2): [True: 96, False: 7]
  ------------------
  172|    103|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (172:2): [True: 7, False: 96]
  ------------------
  173|    103|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (173:2): [True: 0, False: 103]
  ------------------
  174|    103|		break;
  175|       |
  176|      0|	default:
  ------------------
  |  Branch (176:2): [True: 0, False: 103]
  ------------------
  177|      0|		fr_strerror_printf("Internal sanity check failed, attribute \"%s\" has unexpected data type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  178|      0|				   parent->name, fr_type_to_str(parent->type));
  179|      0|		return PAIR_DECODE_FATAL_ERROR;
  ------------------
  |  |   49|      0|#define PAIR_DECODE_FATAL_ERROR	FR_VALUE_BOX_NET_ERROR
  |  |  ------------------
  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|    103|	}
  181|       |
  182|       |	/*
  183|       |	 *	Do a quick sanity check to see if the TLVs are at all OK.
  184|       |	 */
  185|    103|	if (verify_tlvs && !verify_tlvs(data, data_len)) return -1;
  ------------------
  |  Branch (185:6): [True: 103, False: 0]
  |  Branch (185:21): [True: 43, False: 60]
  ------------------
  186|       |
  187|     60|	p = data;
  188|     60|	end = data + data_len;
  189|       |
  190|     60|	if (!nested) {
  ------------------
  |  Branch (190:6): [True: 6, False: 54]
  ------------------
  191|      6|		fr_pair_list_init(&tlvs);
  192|      6|		list = &tlvs;
  193|      6|		child_ctx = ctx;
  194|     54|	} else {
  195|     54|		vp = fr_pair_afrom_da(ctx, parent);
  196|     54|		if (!vp) return PAIR_DECODE_OOM;
  ------------------
  |  |   45|      0|#define PAIR_DECODE_OOM		FR_VALUE_BOX_NET_OOM
  |  |  ------------------
  |  |  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (196:7): [True: 0, False: 54]
  ------------------
  197|     54|		list = &vp->vp_group;
  ------------------
  |  |  144|     54|#define vp_group		children
  ------------------
  198|     54|		child_ctx = vp;
  199|     54|	}
  200|       |
  201|    471|	while (p < end) {
  ------------------
  |  Branch (201:9): [True: 411, False: 60]
  ------------------
  202|    411|		ssize_t slen;
  203|       |
  204|    411|		slen = decode_tlv(child_ctx, list, parent, p, (end - p), decode_ctx);
  205|    411|		if (slen <= 0) {
  ------------------
  |  Branch (205:7): [True: 0, False: 411]
  ------------------
  206|      0|			FR_PROTO_TRACE("    tlv decode failed at offset %zu - %s", (size_t) (p - data), fr_strerror());
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  207|      0|			fr_pair_list_free(list);
  208|      0|			talloc_free(vp);
  209|       |
  210|       |			/*
  211|       |			 *	Don't decode it as raw.  We don't know how the TLVs are structured, so the
  212|       |			 *	only da we have is the parent.  The output has to in the parent with a child
  213|       |			 *	da.  So if we create a raw attribute here, then we have the raw attribute of
  214|       |			 *	da==parent going into the parent, which is wrong.
  215|       |			 */
  216|      0|			return PAIR_DECODE_FATAL_ERROR;
  ------------------
  |  |   49|      0|#define PAIR_DECODE_FATAL_ERROR	FR_VALUE_BOX_NET_ERROR
  |  |  ------------------
  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  217|      0|		}
  218|       |
  219|    411|		p += slen;
  220|    411|	}
  221|       |
  222|     60|	if (!nested) {
  ------------------
  |  Branch (222:6): [True: 6, False: 54]
  ------------------
  223|      6|		fr_pair_list_append(out, &tlvs);
  224|     54|	} else {
  225|     54|		fr_pair_append(out, vp);
  226|     54|	}
  227|       |
  228|     60|	return data_len;
  229|     60|}
fr_pair_dns_labels_from_network:
  256|  1.44k|{
  257|  1.44k|	ssize_t slen;
  258|  1.44k|	size_t total, labels_len;
  259|  1.44k|	fr_pair_t *vp;
  260|  1.44k|	uint8_t const *next = data;
  261|  1.44k|	fr_pair_list_t tmp;
  262|       |
  263|  1.44k|	FR_PROTO_HEX_DUMP(data, data_len, "fr_pair_dns_labels_from_network");
  ------------------
  |  |   42|  1.44k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 1.44k]
  |  |  ------------------
  ------------------
  264|       |
  265|  1.44k|	fr_pair_list_init(&tmp);
  266|       |
  267|       |	/*
  268|       |	 *	This function handles both single-valued and array
  269|       |	 *	types.  It's just easier that way.
  270|       |	 */
  271|  1.44k|	if (!parent->flags.array) {
  ------------------
  |  Branch (271:6): [True: 313, False: 1.12k]
  ------------------
  272|       |		/*
  273|       |		 *	Decode starting at "NEXT", but allowing decodes from the start of the packet.
  274|       |		 */
  275|    313|		slen = fr_dns_label_uncompressed_length(start, data, data_len, &next, lb);
  276|    313|		if (slen <= 0) {
  ------------------
  |  Branch (276:7): [True: 139, False: 174]
  ------------------
  277|    139|			FR_PROTO_TRACE("ERROR - uncompressed length failed");
  ------------------
  |  |   41|    139|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 139]
  |  |  ------------------
  ------------------
  278|    139|			goto raw;
  279|    139|		}
  280|       |
  281|    174|		labels_len = next - data; /* decode only what we've found */
  282|  1.12k|	} else {
  283|       |		/*
  284|       |		 *	Get the length of the entire set of labels, up
  285|       |		 *	to (and including) the final 0x00.
  286|       |		 *
  287|       |		 *	If any of the labels point outside of this
  288|       |		 *	area, OR they are otherwise invalid, then that's an error.
  289|       |		 */
  290|  1.12k|		slen = fr_dns_labels_network_verify(start, data, data_len, data, lb);
  291|  1.12k|		if (slen <= 0) {
  ------------------
  |  Branch (291:7): [True: 571, False: 556]
  ------------------
  292|    571|			FR_PROTO_TRACE("ERROR - network verify failed");
  ------------------
  |  |   41|    571|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 571]
  |  |  ------------------
  ------------------
  293|    571|			goto raw;
  294|    571|		}
  295|       |
  296|    556|		labels_len = slen;
  297|    556|	}
  298|       |
  299|       |	/*
  300|       |	 *	The labels MUST fill the entire buffer.
  301|       |	 */
  302|    730|	if (exact && (labels_len != data_len)) {
  ------------------
  |  Branch (302:6): [True: 357, False: 373]
  |  Branch (302:15): [True: 8, False: 349]
  ------------------
  303|      8|		FR_PROTO_TRACE("ERROR - labels_len %zu != data_len %zu", labels_len, data_len);
  ------------------
  |  |   41|      8|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  304|    718|	raw:
  305|    718|		return fr_pair_raw_from_network(ctx, out, parent, data, data_len);
  306|      8|	}
  307|       |
  308|       |	/*
  309|       |	 *	Loop over the input buffer, decoding the labels one by
  310|       |	 *	one.
  311|       |	 *
  312|       |	 *	@todo - put the labels into a child cursor, and then
  313|       |	 *	merge them only if it succeeds.  That doesn't seem to
  314|       |	 *	work for some reason, and I don't have time to debug
  315|       |	 *	it right now.  So... let's leave it.
  316|       |	 */
  317|  1.44k|	for (total = 0; total < labels_len; total += slen) {
  ------------------
  |  Branch (317:18): [True: 722, False: 722]
  ------------------
  318|    722|		vp = fr_pair_afrom_da(ctx, parent);
  319|    722|		if (!vp) return PAIR_DECODE_OOM;
  ------------------
  |  |   45|      0|#define PAIR_DECODE_OOM		FR_VALUE_BOX_NET_OOM
  |  |  ------------------
  |  |  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (319:7): [True: 0, False: 722]
  ------------------
  320|       |
  321|       |		/*
  322|       |		 *	Having verified the input above, this next
  323|       |		 *	function should never fail unless there's a
  324|       |		 *	bug in the code.
  325|       |		 */
  326|    722|		slen = fr_dns_label_to_value_box(vp, &vp->data, data, labels_len, data + total, true, lb);
  327|    722|		if (slen <= 0) {
  ------------------
  |  Branch (327:7): [True: 0, False: 722]
  ------------------
  328|      0|			FR_PROTO_TRACE("ERROR - failed decoding DNS label at with %zu error %zd", total, slen);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  329|      0|			talloc_free(vp);
  330|      0|			fr_pair_list_free(&tmp);
  331|      0|			goto raw;
  332|      0|		}
  333|       |
  334|    722|		fr_pair_append(&tmp, vp);
  335|    722|	}
  336|       |
  337|    722|	fr_pair_list_append(out, &tmp);
  338|    722|	return labels_len;
  339|    722|}

dict_ext.c:fr_dict_attr_ext_name_fixup:
   46|      4|{
   47|      4|	fr_dict_attr_t			*da = talloc_get_type_abort(chunk, fr_dict_attr_t);
   48|       |
   49|      4|	da->name = ext_ptr;
   50|       |
   51|      4|	return 0;
   52|      4|}
dict_ext.c:fr_dict_attr_ext_enumv_copy:
   62|      4|{
   63|      4|	fr_dict_attr_t			*da_dst = talloc_get_type_abort(chunk_dst, fr_dict_attr_t);
   64|      4|	fr_dict_attr_ext_enumv_t	*src_ext = src_ext_ptr;
   65|      4|	fr_hash_iter_t			iter;
   66|      4|	fr_dict_enum_value_t		*enumv;
   67|      4|	fr_value_box_t			box;
   68|      4|	fr_value_box_t const		*vb;
   69|       |
   70|      4|	if (!src_ext->value_by_name) return 0;
  ------------------
  |  Branch (70:6): [True: 4, False: 0]
  ------------------
   71|       |
   72|       |	/*
   73|       |	 *	Add all the enumeration values from
   74|       |	 *      the old attribute to the new attribute.
   75|       |	 */
   76|      0|	for (enumv = fr_hash_table_iter_init(src_ext->value_by_name, &iter);
   77|      0|	     enumv;
  ------------------
  |  Branch (77:7): [True: 0, False: 0]
  ------------------
   78|      0|	     enumv = fr_hash_table_iter_next(src_ext->value_by_name, &iter)) {
   79|      0|		fr_dict_enum_ext_attr_ref_t *ref;
   80|      0|		fr_dict_attr_t const *key_child_ref;
   81|       |
   82|      0|		key_child_ref = NULL;
   83|       |
   84|       |		/*
   85|       |		 *	If the enum refers to a child, it MUST refer to a child of a union.
   86|       |		 *
   87|       |		 *	We then re-write the ref to point to the newly copied child.
   88|       |		 */
   89|      0|		ref = fr_dict_enum_ext(enumv, FR_DICT_ENUM_EXT_ATTR_REF);
   90|      0|		if (ref) {
  ------------------
  |  Branch (90:7): [True: 0, False: 0]
  ------------------
   91|      0|			fr_dict_attr_t const *ref_parent;
   92|       |
   93|      0|			fr_assert(ref->da->parent->type == FR_TYPE_UNION);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   94|       |
   95|      0|			ref_parent = fr_dict_attr_by_name(NULL, da_dst->parent, ref->da->parent->name);
   96|      0|			fr_assert(ref_parent);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|      0|			fr_assert(ref_parent->type == FR_TYPE_UNION);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|       |
   99|       |			/*
  100|       |			 *	The reference has to exist.
  101|       |			 */
  102|      0|			key_child_ref = fr_dict_attr_by_name(NULL, ref_parent, ref->da->name);
  103|      0|			fr_assert(key_child_ref != NULL);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  104|      0|		}
  105|       |
  106|      0|		vb = enumv->value;
  107|      0|		if (da_dst->type != enumv->value->type) {
  ------------------
  |  Branch (107:7): [True: 0, False: 0]
  ------------------
  108|      0|			fr_assert(fr_type_is_integer(enumv->value->type));
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  109|      0|			fr_assert(fr_type_is_integer(da_dst->type));
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  110|       |
  111|      0|			if (fr_value_box_cast(da_dst, &box, da_dst->type, NULL, enumv->value) < 0) return -1;
  ------------------
  |  Branch (111:8): [True: 0, False: 0]
  ------------------
  112|       |
  113|      0|			vb = &box;
  114|      0|		}
  115|       |
  116|      0|		if (dict_attr_enum_add_name(da_dst, enumv->name, vb,
  ------------------
  |  Branch (116:7): [True: 0, False: 0]
  ------------------
  117|      0|					    true, true, key_child_ref) < 0) return -1;
  118|      0|	}
  119|       |
  120|      0|	return 0;
  121|      0|}
dict_ext.c:dict_ext_protocol_specific_copy:
  164|  6.86k|{
  165|  6.86k|	fr_dict_attr_t const		*from = talloc_get_type_abort_const(src_chunk, fr_dict_attr_t);
  ------------------
  |  |  117|  6.86k|#  define talloc_get_type_abort_const talloc_get_type_abort
  ------------------
  166|  6.86k|	fr_dict_protocol_t const	*from_proto = fr_dict_protocol(from->dict);
  167|  6.86k|	fr_dict_attr_t			*to = talloc_get_type_abort(dst_chunk, fr_dict_attr_t);
  168|  6.86k|	fr_dict_protocol_t const	*to_proto = fr_dict_protocol(to->dict);
  169|       |
  170|       |	/*
  171|       |	 *	Whilst it's not strictly disallowed, we can't do anything
  172|       |	 *	sane without an N x N matrix of copy functions for different
  173|       |	 *	protocols.  Maybe we should add that at some point, but for
  174|       |	 *	now, just ignore the copy.
  175|       |	 */
  176|  6.86k|	if (from->dict != to->dict) return 0;
  ------------------
  |  Branch (176:6): [True: 0, False: 6.86k]
  ------------------
  177|       |
  178|       |	/*
  179|       |	 *	Sanity checks...
  180|       |	 */
  181|  6.86k|	if (unlikely(from_proto->attr.flags.len != src_ext_len)) {
  ------------------
  |  |  397|  6.86k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 6.86k]
  |  |  ------------------
  ------------------
  182|      0|		fr_strerror_printf("Protocol specific extension length mismatch in source attribute %s.  Expected %zu, got %zu",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  183|      0|				   from->name,
  184|      0|				   fr_dict_protocol(from->dict)->attr.flags.len, src_ext_len);
  185|      0|		return -1;
  186|      0|	}
  187|       |
  188|  6.86k|	if (unlikely(to_proto->attr.flags.len != dst_ext_len)) {
  ------------------
  |  |  397|  6.86k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 6.86k]
  |  |  ------------------
  ------------------
  189|      0|		fr_strerror_printf("Protocol specific extension length mismatch in destination attribute %s.  Expected %zu, got %zu",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  190|      0|				   to->name,
  191|      0|				   fr_dict_protocol(to->dict)->attr.flags.len, dst_ext_len);
  192|      0|		return -1;
  193|      0|	}
  194|       |
  195|       |	/*
  196|       |	 *	The simple case... No custom copy function, just memcpy
  197|       |	 */
  198|  6.86k|	if (!to_proto->attr.flags.copy) {
  ------------------
  |  Branch (198:6): [True: 6.86k, False: 0]
  ------------------
  199|  6.86k|		memcpy(dst_ext_ptr, src_ext_ptr, src_ext_len);
  200|  6.86k|		return 0;
  201|  6.86k|	}
  202|       |
  203|       |	/*
  204|       |	 *	Call the custom copy function.  This is only needed if
  205|       |	 *	there are heap allocated values, like strings, which
  206|       |	 *	need copying from sources flags to the destination.
  207|       |	 */
  208|      0|	return to_proto->attr.flags.copy(dst_chunk, dst_ext_ptr, src_ext_ptr);
  209|  6.86k|}

fr_dict_protocol_reference:
  136|      4|{
  137|      4|	fr_dict_t			*dict = fr_dict_unconst(rel->dict);
  138|      4|	fr_dict_attr_t const		*da = rel;
  139|      4|	ssize_t				slen;
  140|       |
  141|      4|	*da_p = NULL;
  142|       |
  143|       |	/*
  144|       |	 *	Are we resolving a foreign reference?
  145|       |	 */
  146|      4|	if (fr_sbuff_next_if_char(in, '@')) {
  ------------------
  |  Branch (146:6): [True: 0, False: 4]
  ------------------
  147|      0|		char proto_name[FR_DICT_ATTR_MAX_NAME_LEN + 1];
  148|      0|		fr_sbuff_t proto_name_sbuff = FR_SBUFF_OUT(proto_name, sizeof(proto_name));
  ------------------
  |  |  531|      0|#define FR_SBUFF_OUT(_start, _len_or_end) \
  |  |  532|      0|((fr_sbuff_t){ \
  |  |  533|      0|	.buff_i		= _start, \
  |  |  534|      0|	.start_i	= _Generic((_start), \
  |  |  535|      0|				char *		: _start, \
  |  |  536|      0|				uint8_t *	: _start \
  |  |  537|      0|			), \
  |  |  538|      0|	.end_i		= _Generic((_len_or_end), \
  |  |  539|      0|				size_t		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  540|      0|				long		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  541|      0|				int		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  542|      0|				unsigned int	: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  543|      0|				char *		: (char const *)(_len_or_end), \
  |  |  544|      0|				char const *	: (char const *)(_len_or_end) \
  |  |  545|      0|			), \
  |  |  546|      0|	.p_i		= _start, \
  |  |  547|      0|	.is_const	= false, \
  |  |  548|      0|})
  ------------------
  149|       |
  150|       |		/*
  151|       |		 *	@.foo is "foo from the current root".
  152|       |		 *
  153|       |		 *	This is a bit clearer than "foo".
  154|       |		 */
  155|      0|		if (fr_sbuff_next_if_char(in, '.')) {
  ------------------
  |  Branch (155:7): [True: 0, False: 0]
  ------------------
  156|      0|			if (fr_sbuff_is_char(in, '.')) goto above_root;
  ------------------
  |  | 1797|      0|	_Generic((_sbuff_or_marker), \
  |  |  ------------------
  |  |  |  Branch (1797:2): [True: 0, False: 0]
  |  |  ------------------
  |  | 1798|      0|		 fr_sbuff_t *		: _fr_sbuff_is_char((fr_sbuff_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker), _c), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1799|      0|		 fr_sbuff_marker_t *	: _fr_marker_is_char((fr_sbuff_marker_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker), _c) \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1800|      0|	)
  ------------------
  157|       |
  158|      0|			da = rel->dict->root;
  159|      0|			goto more;
  160|      0|		}
  161|       |
  162|      0|		slen = dict_by_protocol_substr(NULL, &dict, in, NULL);
  163|       |		/* Need to load it... */
  164|      0|		if (slen <= 0) {
  ------------------
  |  Branch (164:7): [True: 0, False: 0]
  ------------------
  165|       |			/* Quiet coverity */
  166|      0|			fr_sbuff_terminate(&proto_name_sbuff);
  167|       |
  168|       |			/* Fixme, probably want to limit allowed chars */
  169|      0|			if (fr_sbuff_out_bstrncpy_until(&proto_name_sbuff, in, SIZE_MAX,
  ------------------
  |  Branch (169:8): [True: 0, False: 0]
  ------------------
  170|      0|							&FR_SBUFF_TERMS(L(""), L(".")), NULL) <= 0) {
  ------------------
  |  |  190|      0|#define FR_SBUFF_TERMS(...) \
  |  |  191|      0|(fr_sbuff_term_t){ \
  |  |  192|      0|	.len = (sizeof((fr_sbuff_term_elem_t[]){ __VA_ARGS__ }) / sizeof(fr_sbuff_term_elem_t)), \
  |  |  193|      0|	.elem = (fr_sbuff_term_elem_t[]){ __VA_ARGS__ }, \
  |  |  194|      0|}
  ------------------
  171|      0|			invalid_name:
  172|      0|				fr_strerror_const("Invalid protocol name");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  173|      0|				return -1;
  174|      0|			}
  175|       |
  176|       |			/*
  177|       |			 *	The filenames are lowercase.  The names in the dictionaries are case-insensitive.  So
  178|       |			 *	we mash the name to all lowercase.
  179|       |			 */
  180|      0|			fr_tolower(proto_name);
  181|       |
  182|       |			/*
  183|       |			 *	Catch this early, so people don't do stupid things
  184|       |			 *	like put slashes in the references and then claim
  185|       |			 *	it's a security issue.
  186|       |			 */
  187|      0|			if (fr_dict_valid_oid_str(proto_name, -1) < 0) goto invalid_name;
  ------------------
  |  Branch (187:8): [True: 0, False: 0]
  ------------------
  188|       |
  189|       |			/*
  190|       |			 *	Load the new dictionary, and mark it as loaded from our dictionary.
  191|       |			 */
  192|      0|			if (fr_dict_protocol_afrom_file(&dict, proto_name, NULL, (rel->dict)->root->name) < 0) {
  ------------------
  |  Branch (192:8): [True: 0, False: 0]
  ------------------
  193|      0|				fr_strerror_printf_push("Perhaps there is a '.' missing before the attribute name in %.*s ?",
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  194|      0|							(int) fr_sbuff_used(in), fr_sbuff_start(in));
  |  |  |  |  ------------------
  |  |  |  |  |  |  940|      0|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (940:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  941|      0|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               							(int) fr_sbuff_used(in), fr_sbuff_start(in));
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  194|      0|							(int) fr_sbuff_used(in), fr_sbuff_start(in));
  195|      0|				return -1;
  196|      0|			}
  197|       |
  198|      0|			if (!fr_hash_table_insert((rel->dict)->autoref, dict)) {
  ------------------
  |  Branch (198:8): [True: 0, False: 0]
  ------------------
  199|      0|				fr_strerror_const("Failed inserting into internal autoref table");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  200|      0|				return -1;
  201|      0|			}
  202|      0|		}
  203|       |
  204|       |		/*
  205|       |		 *	Didn't stop at an attribute ref... we're done
  206|       |		 */
  207|      0|		if (fr_sbuff_eof(in)) {
  ------------------
  |  | 1784|      0|#define fr_sbuff_eof(_x) (!fr_sbuff_extend(_x))
  |  |  ------------------
  |  |  |  | 1099|      0|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  |  |  | 1075|      0|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1076|      0|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (1784:26): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  208|      0|			*da_p = dict->root;
  209|      0|			return 1;
  210|      0|		}
  211|       |
  212|      0|		da = dict->root;
  213|      0|	}
  214|       |
  215|       |	/*
  216|       |	 *	ref=.foo is a ref from the current parent.
  217|       |	 *
  218|       |	 *	ref=@foo is a ref from the root of the tree.
  219|       |	 */
  220|       |
  221|      4|	if (!fr_sbuff_next_if_char(in, '.')) {
  ------------------
  |  Branch (221:6): [True: 0, False: 4]
  ------------------
  222|      0|		fr_strerror_printf("Invalid reference '%s' - it should start with '@' (from the root), or '.' (from the parent)",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  223|      0|				   fr_sbuff_start(in));
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|      0|				   fr_sbuff_start(in));
  224|      0|		return -1;
  225|      0|	}
  226|       |
  227|       |	/*
  228|       |	 *	First '.' makes it relative, subsequent ones traverse up the tree.
  229|       |	 *
  230|       |	 *	No '.' means use the root.
  231|       |	 */
  232|      4|	while (fr_sbuff_next_if_char(in, '.')) {
  ------------------
  |  Branch (232:9): [True: 0, False: 4]
  ------------------
  233|      0|		if (!da->parent) {
  ------------------
  |  Branch (233:7): [True: 0, False: 0]
  ------------------
  234|      0|		above_root:
  235|      0|			fr_strerror_const("Reference attempted to navigate above dictionary root");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  236|      0|			return -1;
  237|      0|		}
  238|      0|		da = da->parent;
  239|      0|	}
  240|       |
  241|       |	/*
  242|       |	 *	Look up the attribute.  Note that this call will
  243|       |	 *	update *da_p with a partial reference if it exists.
  244|       |	 */
  245|      4|more:
  246|      4|	slen = fr_dict_attr_by_oid_substr(NULL, da_p, da, in, NULL);
  247|      4|	if (slen < 0) return -1;
  ------------------
  |  Branch (247:6): [True: 0, False: 4]
  ------------------
  248|       |
  249|      4|	if (slen == 0) {
  ------------------
  |  Branch (249:6): [True: 0, False: 4]
  ------------------
  250|      0|		*da_p = NULL;
  251|      0|		return 0;
  252|      0|	}
  253|       |
  254|      4|	return 1;
  255|      4|}
dict_fixup_clone:
  461|      2|{
  462|      2|	fr_dict_attr_t		*dst = *dst_p;
  463|      2|	fr_dict_t		*dict = fr_dict_unconst(dst->dict);
  464|       |
  465|       |	/*
  466|       |	 *	@todo - allow this for structural attributes, so long as they don't have a child TLV.
  467|       |	 */
  468|      2|	if (src->dict->proto != dst->dict->proto) {
  ------------------
  |  Branch (468:6): [True: 0, False: 2]
  ------------------
  469|      0|		fr_strerror_printf("Incompatible protocols.  Referenced '%s', referencing '%s'.  Defined at %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  470|      0|				   src->dict->proto->name, dst->dict->proto->name, dst->filename, dst->line);
  471|      0|		return -1;
  472|      0|	}
  473|       |
  474|       |	/*
  475|       |	 *	The referenced DA is higher than the one we're creating.  Ensure it's not a parent.
  476|       |	 *
  477|       |	 *	@todo - Do we want to require that aliases only go deeper in the tree?  Otherwise aliases can
  478|       |	 *	make the tree a lot more complicated.
  479|       |	 */
  480|      2|	if (src->depth < dst->depth) {
  ------------------
  |  Branch (480:6): [True: 0, False: 2]
  ------------------
  481|      0|		fr_dict_attr_t const *parent;
  482|       |
  483|      0|		for (parent = dst->parent; !parent->flags.is_root; parent = parent->parent) {
  ------------------
  |  Branch (483:30): [True: 0, False: 0]
  ------------------
  484|      0|			if (parent == src) {
  ------------------
  |  Branch (484:8): [True: 0, False: 0]
  ------------------
  485|      0|				fr_strerror_printf("References MUST NOT be to a parent attribute %s at %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  486|      0|						   parent->name, fr_cwd_strip(dst->filename), dst->line);
  487|      0|				return -1;
  488|      0|			}
  489|      0|		}
  490|      0|	}
  491|       |
  492|      2|	if (fr_dict_attr_ref(src)) {
  ------------------
  |  Branch (492:6): [True: 0, False: 2]
  ------------------
  493|      0|		fr_strerror_printf("References MUST NOT refer to an ATTRIBUTE which itself has a 'ref=...' at %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  494|      0|				   fr_cwd_strip(dst->filename), dst->line);
  495|      0|		return -1;
  496|      0|	}
  497|       |
  498|       |	/*
  499|       |	 *	Leaf attributes can be cloned.  TLV and STRUCT can be cloned.  But all other data types cannot
  500|       |	 *	be cloned.
  501|       |	 *
  502|       |	 *	And while we're at it, copy the flags over.
  503|       |	 */
  504|      2|	switch (src->type) {
  505|      0|	default:
  ------------------
  |  Branch (505:2): [True: 0, False: 2]
  ------------------
  506|      0|		fr_strerror_printf("References MUST NOT refer to an attribute of data type '%s' at %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  507|      0|				   fr_type_to_str(src->type), fr_cwd_strip(dst->filename), dst->line);
  508|      0|		return -1;
  509|       |
  510|      2|	case FR_TYPE_TLV:
  ------------------
  |  Branch (510:2): [True: 2, False: 0]
  ------------------
  511|      2|		dst->flags.type_size = src->flags.type_size;
  512|      2|		dst->flags.length = src->flags.length;
  513|      2|		FALL_THROUGH;
  ------------------
  |  |  341|      2|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      2|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
  514|       |
  515|      2|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (515:2): [True: 0, False: 2]
  ------------------
  516|      2|		if (!dict_attr_children(src)) {
  ------------------
  |  Branch (516:7): [True: 0, False: 2]
  ------------------
  517|      0|			fr_strerror_printf_push("Reference %s has no children defined at %s[%d]",
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  518|      0|						src->name, fr_cwd_strip(dst->filename), dst->line);
  519|      0|			return -1;
  520|      0|		}
  521|      2|		break;
  522|      2|	}
  523|       |
  524|      2|	dst->flags.array = src->flags.array;
  525|      2|	dst->flags.is_known_width = src->flags.is_known_width;
  526|      2|	dst->flags.internal = src->flags.internal;
  527|      2|	dst->flags.name_only = src->flags.name_only;
  528|       |
  529|       |	/*
  530|       |	 *	Clone the children from the source to the dst.
  531|       |	 *
  532|       |	 *	Note that the destination may already have children!
  533|       |	 */
  534|      2|	if (dict_attr_acopy_children(dict, dst, src) < 0) {
  ------------------
  |  Branch (534:6): [True: 0, False: 2]
  ------------------
  535|      0|		fr_strerror_printf("Failed populating attribute '%s' with children of %s - %s", dst->name, src->name, fr_strerror());
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  536|      0|		return -1;
  537|      0|	}
  538|       |
  539|      2|	return fr_dict_attr_add_initialised(dst);
  540|      2|}
dict_fixup_vsa_enqueue:
  677|      2|{
  678|      2|	dict_fixup_vsa_t *fixup;
  679|       |
  680|      2|	fixup = talloc(fctx->pool, dict_fixup_vsa_t);
  681|      2|	if (!fixup) {
  ------------------
  |  Branch (681:6): [True: 0, False: 2]
  ------------------
  682|      0|		fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  683|      0|		return -1;
  684|      0|	}
  685|      2|	*fixup = (dict_fixup_vsa_t) {
  686|      2|		.da = da,
  687|      2|	};
  688|       |
  689|      2|	return dict_fixup_common(&fctx->vsa, &fixup->common);
  690|      2|}
dict_fixup_alias_enqueue:
  740|      2|{
  741|      2|	dict_fixup_alias_t *fixup;
  742|       |
  743|      2|	fixup = talloc(fctx->pool, dict_fixup_alias_t);
  744|      2|	if (!fixup) {
  ------------------
  |  Branch (744:6): [True: 0, False: 2]
  ------------------
  745|      0|	oom:
  746|      0|		fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  747|      0|		return -1;
  748|      0|	}
  749|      2|	*fixup = (dict_fixup_alias_t) {
  750|      2|		.alias = talloc_strdup(fixup, alias),
  ------------------
  |  |  149|      2|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  751|      2|		.alias_parent = alias_parent,
  752|      2|		.ref = talloc_strdup(fixup, ref),
  ------------------
  |  |  149|      2|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  753|      2|		.ref_parent = ref_parent
  754|      2|	};
  755|       |
  756|      2|	fixup->filename = talloc_strdup(fixup, filename);
  ------------------
  |  |  149|      2|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  757|      2|	if (!fixup->filename) goto oom;
  ------------------
  |  Branch (757:6): [True: 0, False: 2]
  ------------------
  758|      2|	fixup->line = line;
  759|       |
  760|      2|	alias_parent->flags.has_fixup = true;
  761|       |
  762|      2|	return dict_fixup_common(&fctx->alias, &fixup->common);
  763|      2|}
dict_fixup_init:
  791|      4|{
  792|      4|	if (fctx->pool) return 0;
  ------------------
  |  Branch (792:6): [True: 0, False: 4]
  ------------------
  793|       |
  794|      4|	fr_dlist_talloc_init(&fctx->enumv, dict_fixup_enumv_t, common.entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  795|      4|	fr_dlist_talloc_init(&fctx->group, dict_fixup_group_t, common.entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  796|      4|	fr_dlist_talloc_init(&fctx->clone, dict_fixup_clone_t, common.entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  797|      4|	fr_dlist_talloc_init(&fctx->clone_enum, dict_fixup_clone_t, common.entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  798|      4|	fr_dlist_talloc_init(&fctx->vsa, dict_fixup_vsa_t, common.entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  799|      4|	fr_dlist_talloc_init(&fctx->alias, dict_fixup_alias_t, common.entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  800|       |
  801|      4|	fctx->pool = talloc_pool(NULL, DICT_FIXUP_POOL_SIZE);
  ------------------
  |  |   38|      4|#define DICT_FIXUP_POOL_SIZE	(1024)
  ------------------
  802|      4|	if (!fctx->pool) return -1;
  ------------------
  |  Branch (802:6): [True: 0, False: 4]
  ------------------
  803|       |
  804|      4|	return 0;
  805|      4|}
dict_fixup_apply:
  811|      6|{
  812|       |
  813|      6|#define APPLY_FIXUP(_fctx, _list, _func, _type) \
  814|      6|do { \
  815|      6|	_type *_fixup; \
  816|      6|	while ((_fixup = fr_dlist_head(&(_fctx)->_list))) { \
  817|      6|		if (_func(_fctx, _fixup) < 0) return -1; \
  818|      6|		fr_dlist_remove(&(_fctx)->_list, _fixup); \
  819|      6|		talloc_free(_fixup); \
  820|      6|	} \
  821|      6|} while (0)
  822|       |
  823|       |	/*
  824|       |	 *	Apply all the fctx in order
  825|       |	 *
  826|       |
  827|       |	 *	- Enumerations first as they have no dependencies
  828|       |	 *	- Group references next, as group attributes may be cloned.
  829|       |	 *	- Clones last as all other references and additions should
  830|       |	 *	  be applied before cloning.
  831|       |	 *	- Clone enum clones the enumeration values from a dedicated
  832|       |	 *	  enum, or another attribute with enumerations.
  833|       |	 *	- VSAs
  834|       |	 *	- Aliases last as all attributes need to be defined.
  835|       |	 */
  836|      6|	APPLY_FIXUP(fctx, enumv,	dict_fixup_enumv_apply, dict_fixup_enumv_t);
  ------------------
  |  |  813|      6|#define APPLY_FIXUP(_fctx, _list, _func, _type) \
  |  |  814|      6|do { \
  |  |  815|      6|	_type *_fixup; \
  |  |  816|      6|	while ((_fixup = fr_dlist_head(&(_fctx)->_list))) { \
  |  |  ------------------
  |  |  |  Branch (816:9): [True: 0, False: 6]
  |  |  ------------------
  |  |  817|      0|		if (_func(_fctx, _fixup) < 0) return -1; \
  |  |  ------------------
  |  |  |  Branch (817:7): [True: 0, False: 0]
  |  |  ------------------
  |  |  818|      0|		fr_dlist_remove(&(_fctx)->_list, _fixup); \
  |  |  819|      0|		talloc_free(_fixup); \
  |  |  820|      0|	} \
  |  |  821|      6|} while (0)
  |  |  ------------------
  |  |  |  Branch (821:10): [Folded, False: 6]
  |  |  ------------------
  ------------------
  837|      6|	APPLY_FIXUP(fctx, group,	dict_fixup_group_apply, dict_fixup_group_t);
  ------------------
  |  |  813|      6|#define APPLY_FIXUP(_fctx, _list, _func, _type) \
  |  |  814|      6|do { \
  |  |  815|      6|	_type *_fixup; \
  |  |  816|      6|	while ((_fixup = fr_dlist_head(&(_fctx)->_list))) { \
  |  |  ------------------
  |  |  |  Branch (816:9): [True: 0, False: 6]
  |  |  ------------------
  |  |  817|      0|		if (_func(_fctx, _fixup) < 0) return -1; \
  |  |  ------------------
  |  |  |  Branch (817:7): [True: 0, False: 0]
  |  |  ------------------
  |  |  818|      0|		fr_dlist_remove(&(_fctx)->_list, _fixup); \
  |  |  819|      0|		talloc_free(_fixup); \
  |  |  820|      0|	} \
  |  |  821|      6|} while (0)
  |  |  ------------------
  |  |  |  Branch (821:10): [Folded, False: 6]
  |  |  ------------------
  ------------------
  838|      6|	APPLY_FIXUP(fctx, clone,	dict_fixup_clone_apply, dict_fixup_clone_t);
  ------------------
  |  |  813|      6|#define APPLY_FIXUP(_fctx, _list, _func, _type) \
  |  |  814|      6|do { \
  |  |  815|      6|	_type *_fixup; \
  |  |  816|      6|	while ((_fixup = fr_dlist_head(&(_fctx)->_list))) { \
  |  |  ------------------
  |  |  |  Branch (816:9): [True: 0, False: 6]
  |  |  ------------------
  |  |  817|      0|		if (_func(_fctx, _fixup) < 0) return -1; \
  |  |  ------------------
  |  |  |  Branch (817:7): [True: 0, False: 0]
  |  |  ------------------
  |  |  818|      0|		fr_dlist_remove(&(_fctx)->_list, _fixup); \
  |  |  819|      0|		talloc_free(_fixup); \
  |  |  820|      0|	} \
  |  |  821|      6|} while (0)
  |  |  ------------------
  |  |  |  Branch (821:10): [Folded, False: 6]
  |  |  ------------------
  ------------------
  839|      6|	APPLY_FIXUP(fctx, clone_enum,	dict_fixup_clone_enum_apply, dict_fixup_clone_t);
  ------------------
  |  |  813|      6|#define APPLY_FIXUP(_fctx, _list, _func, _type) \
  |  |  814|      6|do { \
  |  |  815|      6|	_type *_fixup; \
  |  |  816|      6|	while ((_fixup = fr_dlist_head(&(_fctx)->_list))) { \
  |  |  ------------------
  |  |  |  Branch (816:9): [True: 0, False: 6]
  |  |  ------------------
  |  |  817|      0|		if (_func(_fctx, _fixup) < 0) return -1; \
  |  |  ------------------
  |  |  |  Branch (817:7): [True: 0, False: 0]
  |  |  ------------------
  |  |  818|      0|		fr_dlist_remove(&(_fctx)->_list, _fixup); \
  |  |  819|      0|		talloc_free(_fixup); \
  |  |  820|      0|	} \
  |  |  821|      6|} while (0)
  |  |  ------------------
  |  |  |  Branch (821:10): [Folded, False: 6]
  |  |  ------------------
  ------------------
  840|      6|	APPLY_FIXUP(fctx, vsa,		dict_fixup_vsa_apply,   dict_fixup_vsa_t);
  ------------------
  |  |  813|      6|#define APPLY_FIXUP(_fctx, _list, _func, _type) \
  |  |  814|      6|do { \
  |  |  815|      6|	_type *_fixup; \
  |  |  816|      8|	while ((_fixup = fr_dlist_head(&(_fctx)->_list))) { \
  |  |  ------------------
  |  |  |  Branch (816:9): [True: 2, False: 6]
  |  |  ------------------
  |  |  817|      2|		if (_func(_fctx, _fixup) < 0) return -1; \
  |  |  ------------------
  |  |  |  Branch (817:7): [True: 0, False: 2]
  |  |  ------------------
  |  |  818|      2|		fr_dlist_remove(&(_fctx)->_list, _fixup); \
  |  |  819|      2|		talloc_free(_fixup); \
  |  |  820|      2|	} \
  |  |  821|      6|} while (0)
  |  |  ------------------
  |  |  |  Branch (821:10): [Folded, False: 6]
  |  |  ------------------
  ------------------
  841|      6|	APPLY_FIXUP(fctx, alias,	dict_fixup_alias_apply, dict_fixup_alias_t);
  ------------------
  |  |  813|      6|#define APPLY_FIXUP(_fctx, _list, _func, _type) \
  |  |  814|      6|do { \
  |  |  815|      6|	_type *_fixup; \
  |  |  816|      8|	while ((_fixup = fr_dlist_head(&(_fctx)->_list))) { \
  |  |  ------------------
  |  |  |  Branch (816:9): [True: 2, False: 6]
  |  |  ------------------
  |  |  817|      2|		if (_func(_fctx, _fixup) < 0) return -1; \
  |  |  ------------------
  |  |  |  Branch (817:7): [True: 0, False: 2]
  |  |  ------------------
  |  |  818|      2|		fr_dlist_remove(&(_fctx)->_list, _fixup); \
  |  |  819|      2|		talloc_free(_fixup); \
  |  |  820|      2|	} \
  |  |  821|      6|} while (0)
  |  |  ------------------
  |  |  |  Branch (821:10): [Folded, False: 6]
  |  |  ------------------
  ------------------
  842|       |
  843|      6|	TALLOC_FREE(fctx->pool);
  ------------------
  |  Branch (843:2): [True: 4, False: 2]
  |  Branch (843:2): [Folded, False: 6]
  ------------------
  844|       |
  845|      6|	return 0;
  846|      6|}
dict_fixup.c:dict_fixup_common:
  119|      4|{
  120|      4|	fr_dlist_insert_tail(fixup_list, common);
  121|       |
  122|      4|	return 0;
  123|      4|}
dict_fixup.c:dict_fixup_vsa_apply:
  701|      2|{
  702|      2|	fr_dict_vendor_t *dv;
  703|      2|	fr_dict_t *dict = fr_dict_unconst(fr_dict_by_da(fixup->da));
  704|      2|	fr_hash_iter_t iter;
  705|       |
  706|      2|	if (!dict->vendors_by_num) return 0;
  ------------------
  |  Branch (706:6): [True: 0, False: 2]
  ------------------
  707|       |
  708|      2|	for (dv = fr_hash_table_iter_init(dict->vendors_by_num, &iter);
  709|     12|	     dv;
  ------------------
  |  Branch (709:7): [True: 10, False: 2]
  ------------------
  710|     10|	     dv = fr_hash_table_iter_next(dict->vendors_by_num, &iter)) {
  711|     10|		if (dict_attr_child_by_num(fixup->da, dv->pen)) continue;
  ------------------
  |  Branch (711:7): [True: 10, False: 0]
  ------------------
  712|       |
  713|      0|		if (fr_dict_attr_add(dict, fixup->da, dv->name, dv->pen, FR_TYPE_VENDOR, NULL) < 0) return -1;
  ------------------
  |  Branch (713:7): [True: 0, False: 0]
  ------------------
  714|      0|	}
  715|       |
  716|      2|	fixup->da->flags.has_fixup = false;
  717|      2|	return 0;
  718|      2|}
dict_fixup.c:dict_fixup_alias_apply:
  766|      2|{
  767|      2|	fr_dict_attr_t const *da;
  768|       |
  769|       |	/*
  770|       |	 *	The <ref> can be a name.
  771|       |	 */
  772|      2|	da = fr_dict_attr_by_oid(NULL, fixup->ref_parent, fixup->ref);
  773|      2|	if (!da) {
  ------------------
  |  Branch (773:6): [True: 0, False: 2]
  ------------------
  774|      0|		fr_strerror_printf("Attribute '%s' aliased by '%s' doesn't exist in namespace '%s', at %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  775|      0|				   fixup->ref, fixup->alias, fixup->ref_parent->name, fixup->filename, fixup->line);
  776|      0|		return -1;
  777|      0|	}
  778|       |
  779|      2|	fixup->alias_parent->flags.has_fixup = false;
  780|      2|	return dict_attr_alias_add(fixup->alias_parent, fixup->alias, da, true);
  781|      2|}

fr_dict_str_to_argv:
  235|  2.52k|{
  236|  2.52k|	int argc = 0;
  237|       |
  238|  12.2k|	while (*str) {
  ------------------
  |  Branch (238:9): [True: 12.2k, False: 0]
  ------------------
  239|  12.2k|		if (argc >= max_argc) break;
  ------------------
  |  Branch (239:7): [True: 0, False: 12.2k]
  ------------------
  240|       |
  241|       |		/*
  242|       |		 *	Chop out comments early.
  243|       |		 */
  244|  12.2k|		if (*str == '#') {
  ------------------
  |  Branch (244:7): [True: 0, False: 12.2k]
  ------------------
  245|      0|			*str = '\0';
  246|      0|			break;
  247|      0|		}
  248|       |
  249|  28.4k|		while ((*str == ' ') ||
  ------------------
  |  Branch (249:10): [True: 288, False: 28.2k]
  ------------------
  250|  28.2k|		       (*str == '\t') ||
  ------------------
  |  Branch (250:10): [True: 13.4k, False: 14.7k]
  ------------------
  251|  14.7k|		       (*str == '\r') ||
  ------------------
  |  Branch (251:10): [True: 0, False: 14.7k]
  ------------------
  252|  14.7k|		       (*str == '\n'))
  ------------------
  |  Branch (252:10): [True: 2.46k, False: 12.2k]
  ------------------
  253|  16.2k|			*(str++) = '\0';
  254|       |
  255|  12.2k|		if (!*str) break;
  ------------------
  |  Branch (255:7): [True: 2.52k, False: 9.73k]
  ------------------
  256|       |
  257|  9.73k|		argv[argc] = str;
  258|  9.73k|		argc++;
  259|       |
  260|  89.3k|		while (*str &&
  ------------------
  |  Branch (260:10): [True: 89.3k, False: 0]
  ------------------
  261|  89.3k|		       (*str != ' ') &&
  ------------------
  |  Branch (261:10): [True: 89.1k, False: 274]
  ------------------
  262|  89.1k|		       (*str != '\t') &&
  ------------------
  |  Branch (262:10): [True: 82.1k, False: 6.99k]
  ------------------
  263|  82.1k|		       (*str != '\r') &&
  ------------------
  |  Branch (263:10): [True: 82.1k, False: 0]
  ------------------
  264|  82.1k|		       (*str != '\n'))
  ------------------
  |  Branch (264:10): [True: 79.6k, False: 2.46k]
  ------------------
  265|  79.6k|			str++;
  266|  9.73k|	}
  267|       |
  268|  2.52k|	return argc;
  269|  2.52k|}
fr_dict_internal_afrom_file:
 3558|      2|{
 3559|      2|	fr_dict_t		*dict;
 3560|      2|	char			*dict_path = NULL;
 3561|      2|	size_t			i;
 3562|      2|	fr_dict_attr_flags_t	flags = { .internal = true };
 3563|      2|	char			*type_name;
 3564|      2|	fr_dict_attr_t		*cast_base;
 3565|      2|	fr_value_box_t		box = FR_VALUE_BOX_INITIALISER_NULL(box);
  ------------------
  |  |  512|      2|	{ \
  |  |  513|      2|		.type = FR_TYPE_NULL, \
  |  |  514|      2|		.entry = { \
  |  |  515|      2|			.entry = FR_DLIST_ENTRY_INITIALISER((_vb).entry.entry) \
  |  |  ------------------
  |  |  |  |   75|      2|#define FR_DLIST_ENTRY_INITIALISER(_entry) { .next = &_entry, .prev = &_entry }
  |  |  ------------------
  |  |  516|      2|		}, \
  |  |  517|      2| 		VALUE_BOX_NDEBUG_INITIALISER \
  |  |  ------------------
  |  |  |  |  246|      2|#define VALUE_BOX_NDEBUG_INITIALISER .file = __FILE__, .line = __LINE__, .magic = FR_VALUE_BOX_MAGIC
  |  |  |  |  ------------------
  |  |  |  |  |  |   91|      2|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   81|      2|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  206|      2|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  205|      2|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  518|      2|	}
  ------------------
 3566|       |
 3567|      2|	if (unlikely(!dict_gctx)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 3568|      0|		fr_strerror_const("fr_dict_global_ctx_init() must be called before loading dictionary files");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3569|      0|		return -1;
 3570|      0|	}
 3571|       |
 3572|       |	/*
 3573|       |	 *	Increase the reference count of the internal dictionary.
 3574|       |	 */
 3575|      2|	if (dict_gctx->internal) {
  ------------------
  |  Branch (3575:6): [True: 0, False: 2]
  ------------------
 3576|      0|		 dict_dependent_add(dict_gctx->internal, dependent);
 3577|      0|		 *out = dict_gctx->internal;
 3578|      0|		 return 0;
 3579|      0|	}
 3580|       |
 3581|      2|	dict_path = dict_subdir ?
  ------------------
  |  Branch (3581:14): [True: 2, False: 0]
  ------------------
 3582|      2|		    talloc_asprintf(NULL, "%s%c%s", fr_dict_global_ctx_dir(), FR_DIR_SEP, dict_subdir) :
  ------------------
  |  |  151|      2|#define talloc_asprintf 	talloc_typed_asprintf
  ------------------
              		    talloc_asprintf(NULL, "%s%c%s", fr_dict_global_ctx_dir(), FR_DIR_SEP, dict_subdir) :
  ------------------
  |  |  436|      2|#  define FR_DIR_SEP '/'
  ------------------
 3583|      2|		    talloc_strdup(NULL, fr_dict_global_ctx_dir());
  ------------------
  |  |  149|      2|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
 3584|       |
 3585|      2|	fr_strerror_clear();	/* Ensure we don't report spurious errors */
 3586|       |
 3587|      2|	dict = dict_alloc(dict_gctx);
 3588|      2|	if (!dict) {
  ------------------
  |  Branch (3588:6): [True: 0, False: 2]
  ------------------
 3589|      0|	error:
 3590|      0|		if (!dict_gctx->internal) talloc_free(dict);
  ------------------
  |  Branch (3590:7): [True: 0, False: 0]
  ------------------
 3591|      0|		talloc_free(dict_path);
 3592|      0|		return -1;
 3593|      0|	}
 3594|       |
 3595|       |	/*
 3596|       |	 *	Set the root name of the dictionary
 3597|       |	 */
 3598|      2|	if (dict_root_set(dict, "internal", 0) < 0) goto error;
  ------------------
  |  Branch (3598:6): [True: 0, False: 2]
  ------------------
 3599|       |
 3600|      2|	if (dict_path && dict_from_file(dict, dict_path, FR_DICTIONARY_FILE, NULL, 0) < 0) goto error;
  ------------------
  |  |    7|      2|#define FR_DICTIONARY_FILE		"dictionary"
  ------------------
  |  Branch (3600:6): [True: 2, False: 0]
  |  Branch (3600:19): [True: 0, False: 2]
  ------------------
 3601|       |
 3602|      2|	TALLOC_FREE(dict_path);
  ------------------
  |  Branch (3602:2): [True: 2, False: 0]
  |  Branch (3602:2): [Folded, False: 2]
  ------------------
 3603|       |
 3604|      2|	dict_dependent_add(dict, dependent);
 3605|       |
 3606|      2|	if (!dict_gctx->internal) {
  ------------------
  |  Branch (3606:6): [True: 2, False: 0]
  ------------------
 3607|      2|		dict_gctx->internal = dict;
 3608|      2|		dict_dependent_add(dict, "global");
 3609|      2|	}
 3610|       |
 3611|       |	/*
 3612|       |	 *	Try to load libfreeradius-internal, too.  If that
 3613|       |	 *	fails (i.e. fuzzers???), ignore it.
 3614|       |	 */
 3615|      2|	(void) dict_dlopen(dict, "internal");
 3616|       |
 3617|      2|	cast_base = dict_attr_child_by_num(dict->root, FR_CAST_BASE);
  ------------------
  |  |  275|      2|#define FR_CAST_BASE 2300	//!< AUTOGENERATED ATTRIBUTE DEFINITION
  ------------------
 3618|      2|	if (!cast_base) {
  ------------------
  |  Branch (3618:6): [True: 0, False: 2]
  ------------------
 3619|      0|		fr_strerror_printf("Failed to find 'Cast-Base' in internal dictionary");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3620|      0|		goto error;
 3621|      0|	}
 3622|       |
 3623|      2|	fr_assert(cast_base->type == FR_TYPE_UINT8);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3624|      2|	fr_value_box_init(&box, FR_TYPE_UINT8, NULL, false);
  ------------------
  |  |  610|      2|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      2|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 3625|       |
 3626|       |	/*
 3627|       |	 *	Add cast attributes.  We do it this way,
 3628|       |	 *	so cast attributes get added automatically for new types.
 3629|       |	 *
 3630|       |	 *	We manually add the attributes to the dictionary, and bypass
 3631|       |	 *	fr_dict_attr_add(), because we know what we're doing, and
 3632|       |	 *	that function does too many checks.
 3633|       |	 */
 3634|     82|	for (i = 0; i < fr_type_table_len; i++) {
  ------------------
  |  Branch (3634:14): [True: 80, False: 2]
  ------------------
 3635|     80|		fr_dict_attr_t			*n;
 3636|     80|		fr_table_num_ordered_t const	*p = &fr_type_table[i];
 3637|       |
 3638|     80|		switch (p->value) {
  ------------------
  |  Branch (3638:11): [True: 4, False: 76]
  ------------------
 3639|      2|		case FR_TYPE_NULL:	/* Can't cast to NULL */
  ------------------
  |  Branch (3639:3): [True: 2, False: 78]
  ------------------
 3640|      4|		case FR_TYPE_VENDOR:	/* Vendors can't exist in dictionaries as attributes */
  ------------------
  |  Branch (3640:3): [True: 2, False: 78]
  ------------------
 3641|      4|			continue;
 3642|     80|		}
 3643|       |
 3644|     76|		type_name = talloc_typed_asprintf(NULL, "Tmp-Cast-%s", p->name.str);
 3645|       |
 3646|     76|		n = dict_attr_alloc(dict->pool, dict->root, type_name,
  ------------------
  |  |  257|     76|				_dict_attr_alloc(__FILE__, __LINE__, _ctx, _parent, _name, _attr, _type, (_args))
  ------------------
 3647|     76|				    FR_CAST_BASE + p->value, p->value, &(dict_attr_args_t){ .flags = &flags});
 3648|     76|		if (!n) {
  ------------------
  |  Branch (3648:7): [True: 0, False: 76]
  ------------------
 3649|      0|			talloc_free(type_name);
 3650|      0|			goto error;
 3651|      0|		}
 3652|       |
 3653|     76|		if (dict_attr_add_to_namespace(dict->root, n) < 0) {
  ------------------
  |  Branch (3653:7): [True: 0, False: 76]
  ------------------
 3654|      0|			fr_strerror_printf_push("Failed inserting '%s' into internal dictionary", type_name);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3655|      0|			talloc_free(type_name);
 3656|      0|			goto error;
 3657|      0|		}
 3658|       |
 3659|     76|		talloc_free(type_name);
 3660|       |
 3661|       |		/*
 3662|       |		 *	Set up parenting for the attribute.
 3663|       |		 */
 3664|     76|		if (dict_attr_child_add(dict->root, n) < 0) goto error;
  ------------------
  |  Branch (3664:7): [True: 0, False: 76]
  ------------------
 3665|       |
 3666|       |		/*
 3667|       |		 *	Add the enum, too.
 3668|       |		 */
 3669|     76|		box.vb_uint8 = p->value;
  ------------------
  |  |  272|     76|#define vb_uint8				datum.uint8
  ------------------
 3670|     76|		if (dict_attr_enum_add_name(cast_base, p->name.str, &box, false, false, NULL) < 0) {
  ------------------
  |  Branch (3670:7): [True: 0, False: 76]
  ------------------
 3671|      0|			fr_strerror_printf_push("Failed adding '%s' as a VALUE into internal dictionary", p->name.str);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3672|      0|			goto error;
 3673|      0|		}
 3674|     76|	}
 3675|       |
 3676|      2|	*out = dict;
 3677|       |
 3678|      2|	return 0;
 3679|      2|}
fr_dict_protocol_afrom_file:
 3695|      2|{
 3696|      2|	char		*dict_dir = NULL;
 3697|      2|	fr_dict_t	*dict;
 3698|      2|	bool		added = false;
 3699|       |
 3700|      2|	*out = NULL;
 3701|       |
 3702|      2|	if (unlikely(!dict_gctx)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 3703|      0|		fr_strerror_const("fr_dict_global_ctx_init() must be called before loading dictionary files");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3704|      0|		return -1;
 3705|      0|	}
 3706|       |
 3707|      2|	if (unlikely(!dict_gctx->internal)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 3708|      0|		fr_strerror_const("Internal dictionary must be initialised before loading protocol dictionaries");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3709|      0|		return -1;
 3710|      0|	}
 3711|       |
 3712|       |	/*
 3713|       |	 *	Increment the reference count if the dictionary
 3714|       |	 *	has already been loaded and return that.
 3715|       |	 */
 3716|      2|	dict = dict_by_protocol_name(proto_name);
 3717|      2|	if (dict) {
  ------------------
  |  Branch (3717:6): [True: 0, False: 2]
  ------------------
 3718|       |		/*
 3719|       |		 *	If we're in the middle of loading this dictionary, then the only way we get back here
 3720|       |		 *	is via a circular reference.  So we catch that, and drop the circular dependency.
 3721|       |		 *
 3722|       |		 *	When we have A->B->A, it means that we don't need to track B->A, because we track
 3723|       |		 *	A->B.  And if A is freed, then B is freed.
 3724|       |		 */
 3725|      0|		added = true;
 3726|      0|		dict_dependent_add(dict, dependent);
 3727|       |
 3728|       |		/*
 3729|       |		 *	But we only return a pre-existing dict if _this function_ has loaded it.
 3730|       |		 */
 3731|      0|		if (dict->loaded) {
  ------------------
  |  Branch (3731:7): [True: 0, False: 0]
  ------------------
 3732|      0|			*out = dict;
 3733|      0|			return 0;
 3734|      0|		}
 3735|       |
 3736|       |		/*
 3737|       |		 *	Set the flag to true _before_ loading the file.  That prevents recursion.
 3738|       |		 */
 3739|      0|		dict->loaded = true;
 3740|      0|	}
 3741|       |
 3742|      2|	if (!proto_dir) {
  ------------------
  |  Branch (3742:6): [True: 2, False: 0]
  ------------------
 3743|      2|		dict_dir = talloc_asprintf(NULL, "%s%c%s", fr_dict_global_ctx_dir(), FR_DIR_SEP, proto_name);
  ------------------
  |  |  151|      2|#define talloc_asprintf 	talloc_typed_asprintf
  ------------------
              		dict_dir = talloc_asprintf(NULL, "%s%c%s", fr_dict_global_ctx_dir(), FR_DIR_SEP, proto_name);
  ------------------
  |  |  436|      2|#  define FR_DIR_SEP '/'
  ------------------
 3744|      2|	} else {
 3745|      0|		dict_dir = talloc_asprintf(NULL, "%s%c%s", fr_dict_global_ctx_dir(), FR_DIR_SEP, proto_dir);
  ------------------
  |  |  151|      0|#define talloc_asprintf 	talloc_typed_asprintf
  ------------------
              		dict_dir = talloc_asprintf(NULL, "%s%c%s", fr_dict_global_ctx_dir(), FR_DIR_SEP, proto_dir);
  ------------------
  |  |  436|      0|#  define FR_DIR_SEP '/'
  ------------------
 3746|      0|	}
 3747|       |
 3748|      2|	fr_strerror_clear();	/* Ensure we don't report spurious errors */
 3749|       |
 3750|       |	/*
 3751|       |	 *	Start in the context of the internal dictionary,
 3752|       |	 *	and switch to the context of a protocol dictionary
 3753|       |	 *	when we hit a BEGIN-PROTOCOL line.
 3754|       |	 *
 3755|       |	 *	This allows a single file to provide definitions
 3756|       |	 *	for multiple protocols, which'll probably be useful
 3757|       |	 *	at some point.
 3758|       |	 */
 3759|      2|	if (dict_from_file(dict_gctx->internal, dict_dir, FR_DICTIONARY_FILE, NULL, 0) < 0) {
  ------------------
  |  |    7|      2|#define FR_DICTIONARY_FILE		"dictionary"
  ------------------
  |  Branch (3759:6): [True: 0, False: 2]
  ------------------
 3760|      0|	error:
 3761|      0|		if (dict) dict->loading = false;
  ------------------
  |  Branch (3761:7): [True: 0, False: 0]
  ------------------
 3762|      0|		talloc_free(dict_dir);
 3763|      0|		return -1;
 3764|      0|	}
 3765|       |
 3766|       |	/*
 3767|       |	 *	Check the dictionary actually defined the protocol
 3768|       |	 */
 3769|      2|	dict = dict_by_protocol_name(proto_name);
 3770|      2|	if (!dict) {
  ------------------
  |  Branch (3770:6): [True: 0, False: 2]
  ------------------
 3771|      0|		fr_strerror_printf("Dictionary \"%s\" missing \"BEGIN-PROTOCOL %s\" declaration", dict_dir, proto_name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3772|      0|		goto error;
 3773|      0|	}
 3774|       |
 3775|       |	/*
 3776|       |	 *	Initialize the library.
 3777|       |	 */
 3778|      2|	dict->loaded = true;
 3779|      2|	if (dict->proto && dict->proto->init) {
  ------------------
  |  Branch (3779:6): [True: 2, False: 0]
  |  Branch (3779:21): [True: 2, False: 0]
  ------------------
 3780|      2|		if (dict->proto->init() < 0) goto error;
  ------------------
  |  Branch (3780:7): [True: 0, False: 2]
  ------------------
 3781|      2|	}
 3782|      2|	dict->loading = false;
 3783|       |
 3784|      2|	dict->dir = talloc_steal(dict, dict_dir);
 3785|       |
 3786|      2|	if (!added) dict_dependent_add(dict, dependent);
  ------------------
  |  Branch (3786:6): [True: 2, False: 0]
  ------------------
 3787|       |
 3788|      2|	*out = dict;
 3789|       |
 3790|      2|	return 0;
 3791|      2|}
dict_tokenize.c:dict_filename_loaded:
 3098|    118|{
 3099|    118|	fr_dict_filename_t *file;
 3100|       |
 3101|    118|	for (file = (fr_dict_filename_t *) fr_dlist_head(&dict->filenames);
 3102|  2.72k|	     file != NULL;
  ------------------
  |  Branch (3102:7): [True: 2.60k, False: 118]
  ------------------
 3103|  2.60k|	     file = (fr_dict_filename_t *) fr_dlist_next(&dict->filenames, &file->entry)) {
 3104|  2.60k|		if (file->src_file && src_file) {
  ------------------
  |  Branch (3104:7): [True: 2.59k, False: 14]
  |  Branch (3104:25): [True: 2.58k, False: 12]
  ------------------
 3105|  2.58k|			if (file->src_line != src_line) continue;
  ------------------
  |  Branch (3105:8): [True: 2.58k, False: 0]
  ------------------
 3106|      0|			if (strcmp(file->src_file, src_file) != 0) continue;
  ------------------
  |  Branch (3106:8): [True: 0, False: 0]
  ------------------
 3107|      0|		}
 3108|       |
 3109|     26|		if (strcmp(file->filename, filename) == 0) return true; /* this should always be true */
  ------------------
  |  Branch (3109:7): [True: 0, False: 26]
  ------------------
 3110|     26|	}
 3111|       |
 3112|    118|	return false;
 3113|    118|}
dict_tokenize.c:dict_root_set:
  317|      4|{
  318|      4|	fr_dict_attr_t *da;
  319|       |
  320|      4|	fr_dict_attr_flags_t flags = {
  321|      4|		.is_root = 1,
  322|      4|		.type_size = dict->proto->default_type_size,
  323|      4|		.length = dict->proto->default_type_length,
  324|      4|	};
  325|       |
  326|      4|	if (!fr_cond_assert(!dict->root)) {
  ------------------
  |  |  131|      4|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|      8|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (326:6): [True: 0, False: 4]
  ------------------
  327|      0|		fr_strerror_const("Dictionary root already set");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  328|      0|		return -1;
  329|      0|	}
  330|       |
  331|      4|	da = dict_attr_alloc_root(dict->pool, dict, name, proto_number, &(dict_attr_args_t){ .flags = &flags });
  ------------------
  |  |  249|      4|					     _dict_attr_alloc_root(__FILE__, __LINE__, _ctx, _dict, _name, _attr, _args)
  ------------------
  332|      4|	if (unlikely(!da)) return -1;
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  333|       |
  334|      4|	dict->root = da;
  335|      4|	dict->root->dict = dict;
  336|      4|	DA_VERIFY(dict->root);
  ------------------
  |  |   64|      4|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
  337|       |
  338|      4|	return 0;
  339|      4|}
dict_tokenize.c:dict_from_file:
 3516|      4|{
 3517|      4|	int ret;
 3518|      4|	dict_tokenize_ctx_t dctx;
 3519|       |
 3520|      4|	memset(&dctx, 0, sizeof(dctx));
 3521|      4|	dctx.dict = dict;
 3522|      4|	if (dict_fixup_init(&dctx.fixup) < 0) return -1;
  ------------------
  |  Branch (3522:6): [True: 0, False: 4]
  ------------------
 3523|      4|	dctx.stack[0].da = dict->root;
 3524|      4|	dctx.stack[0].nest = NEST_TOP;
 3525|       |
 3526|      4|	ret = _dict_from_file(&dctx, dir_name, filename, src_file, src_line);
 3527|      4|	if (ret < 0) {
  ------------------
  |  Branch (3527:6): [True: 0, False: 4]
  ------------------
 3528|      0|		talloc_free(dctx.fixup.pool);
 3529|      0|		return ret;
 3530|      0|	}
 3531|       |
 3532|       |	/*
 3533|       |	 *	Applies  to any attributes added to the *internal*
 3534|       |	 *	dictionary.
 3535|       |	 *
 3536|       |	 *	Fixups should have been applied already to any protocol
 3537|       |	 *	dictionaries.
 3538|       |	 */
 3539|      4|	return dict_finalise(&dctx);
 3540|      4|}
dict_tokenize.c:_dict_from_file:
 3204|    118|{
 3205|    118|	static fr_dict_keyword_t const keywords[] = {
 3206|    118|		{ L("ALIAS"),			{ .parse = dict_read_process_alias } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3207|    118|		{ L("ATTRIBUTE"),		{ .parse = dict_read_process_attribute } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3208|    118|		{ L("BEGIN-PROTOCOL"),		{ .parse = dict_read_process_begin_protocol } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3209|    118|		{ L("BEGIN-VENDOR"),		{ .parse = dict_read_process_begin_vendor } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3210|    118|		{ L("DEFINE"),			{ .parse = dict_read_process_define } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3211|    118|		{ L("END"),			{ .parse = dict_read_process_end } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3212|    118|		{ L("END-PROTOCOL"),		{ .parse = dict_read_process_end_protocol } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3213|    118|		{ L("END-VENDOR"),		{ .parse = dict_read_process_end_vendor } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3214|    118|		{ L("ENUM"),			{ .parse = dict_read_process_enum } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3215|    118|		{ L("FLAGS"),			{ .parse = dict_read_process_flags } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3216|    118|		{ L("MEMBER"),			{ .parse = dict_read_process_member } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3217|    118|		{ L("PROTOCOL"),		{ .parse = dict_read_process_protocol, .begin = dict_begin_protocol }},
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3218|    118|		{ L("VALUE"),			{ .parse = dict_read_process_value } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3219|    118|		{ L("VENDOR"),			{ .parse = dict_read_process_vendor } },
  ------------------
  |  |  228|    118|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
 3220|    118|	};
 3221|       |
 3222|    118|	FILE			*fp;
 3223|    118|	char 			filename_buf[256];
 3224|    118|	char			buf[256];
 3225|    118|	char			*p;
 3226|    118|	int			line = 0;
 3227|       |
 3228|    118|	struct stat		statbuf;
 3229|    118|	char			*argv[DICT_MAX_ARGV];
 3230|    118|	int			argc;
 3231|       |
 3232|    118|	int			stack_depth = dctx->stack_depth;
 3233|    118|	char			*old_filename;
 3234|    118|	int			old_line;
 3235|       |
 3236|       |	/*
 3237|       |	 *	Base flags are only set for the current file
 3238|       |	 */
 3239|    118|	fr_dict_attr_flags_t	base_flags = {};
 3240|       |
 3241|    118|	if (!fr_cond_assert(!dctx->dict->root || CURRENT_FRAME(dctx)->da)) return -1;
  ------------------
  |  |  131|    118|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|    472|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 118]
  |  |  |  |  |  Branch (396:41): [True: 118, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (3241:6): [True: 0, False: 118]
  ------------------
 3242|       |
 3243|       |	/*
 3244|       |	 *	The filename is relative to the current directory.
 3245|       |	 *
 3246|       |	 *	Ensure that the directory name doesn't end with 2 '/',
 3247|       |	 *	and then create the full path from dir + filename.
 3248|       |	 */
 3249|    118|	if (FR_DIR_IS_RELATIVE(filename)) {
  ------------------
  |  |  437|    118|#  define FR_DIR_IS_RELATIVE(p) ((*p) != '/')
  |  |  ------------------
  |  |  |  Branch (437:33): [True: 118, False: 0]
  |  |  ------------------
  ------------------
 3250|    118|		char const *q;
 3251|    118|		bool slash = false;
 3252|       |
 3253|    118|		if (!dir) {
  ------------------
  |  Branch (3253:7): [True: 0, False: 118]
  ------------------
 3254|      0|			fr_strerror_printf("Error reading dictionary: No directory was supplied");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3255|      0|			return -1;
 3256|      0|		}
 3257|       |
 3258|    118|		if ((strlen(dir) + 2 + strlen(filename)) > sizeof(filename_buf)) {
  ------------------
  |  Branch (3258:7): [True: 0, False: 118]
  ------------------
 3259|      0|			fr_strerror_printf("%s: Filename name too long", "Error reading dictionary");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3260|      0|			return -1;
 3261|      0|		}
 3262|       |
 3263|       |		/*
 3264|       |		 *	We either have to do strcpy + strrchr(), or manual checks.
 3265|       |		 */
 3266|    118|		p = filename_buf;
 3267|  6.31k|		for (q = dir; *q != '\0'; q++) {
  ------------------
  |  Branch (3267:17): [True: 6.19k, False: 118]
  ------------------
 3268|  6.19k|			if (*q != '/') {
  ------------------
  |  Branch (3268:8): [True: 5.60k, False: 590]
  ------------------
 3269|  5.60k|				*(p++) = *q;
 3270|  5.60k|				slash = false;
 3271|  5.60k|				continue;
 3272|  5.60k|			}
 3273|       |
 3274|       |			/*
 3275|       |			 *	Suppress multiple consecutive slashes.
 3276|       |			 */
 3277|    590|			if (slash) continue;
  ------------------
  |  Branch (3277:8): [True: 0, False: 590]
  ------------------
 3278|       |
 3279|    590|			*(p++) = *q;
 3280|    590|			slash = true;
 3281|    590|		}
 3282|       |
 3283|    118|		if (!slash) *(p++) = '/';
  ------------------
  |  Branch (3283:7): [True: 118, False: 0]
  ------------------
 3284|    118|		strcpy(p, filename);
 3285|       |
 3286|    118|		filename = filename_buf;
 3287|    118|	}
 3288|       |	/*
 3289|       |	 *	Else we ignore the input directory.  We also assume
 3290|       |	 *	that the filename is normalized, and therefore don't
 3291|       |	 *	change it.
 3292|       |	 */
 3293|       |
 3294|       |	/*
 3295|       |	 *	See if we have already loaded this filename.  If so, suppress it.
 3296|       |	 */
 3297|    118|	if (unlikely(dict_filename_loaded(dctx->dict, filename, src_file, src_line))) {
  ------------------
  |  |  397|    118|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 118]
  |  |  ------------------
  ------------------
 3298|      0|		fr_strerror_printf("ERROR - we have a recursive $INCLUDE or load of file %s", filename);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3299|      0|		return -1;
 3300|      0|	}
 3301|       |
 3302|       |
 3303|    118|	if ((fp = fopen(filename, "r")) == NULL) {
  ------------------
  |  Branch (3303:6): [True: 0, False: 118]
  ------------------
 3304|      0|		if (!src_file) {
  ------------------
  |  Branch (3304:7): [True: 0, False: 0]
  ------------------
 3305|      0|			fr_strerror_printf("Couldn't open dictionary %s: %s", fr_syserror(errno), filename);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3305|      0|			fr_strerror_printf("Couldn't open dictionary %s: %s", fr_syserror(errno), filename);
  |  |  ------------------
  ------------------
 3306|      0|		} else {
 3307|      0|			fr_strerror_printf("Error reading dictionary: %s[%d]: Couldn't open dictionary '%s': %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3308|      0|					   fr_cwd_strip(src_file), src_line, filename,
  |  |  |  | 3309|      0|					   fr_syserror(errno));
  |  |  ------------------
  ------------------
 3308|      0|					   fr_cwd_strip(src_file), src_line, filename,
 3309|      0|					   fr_syserror(errno));
 3310|      0|		}
 3311|      0|		return -2;
 3312|      0|	}
 3313|       |
 3314|       |	/*
 3315|       |	 *	If fopen works, this works.
 3316|       |	 */
 3317|    118|	if (fstat(fileno(fp), &statbuf) < 0) {
  ------------------
  |  Branch (3317:6): [True: 0, False: 118]
  ------------------
 3318|      0|		fr_strerror_printf("Failed stating dictionary \"%s\" - %s", filename, fr_syserror(errno));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3318|      0|		fr_strerror_printf("Failed stating dictionary \"%s\" - %s", filename, fr_syserror(errno));
  |  |  ------------------
  ------------------
 3319|       |
 3320|      0|	perm_error:
 3321|      0|		fclose(fp);
 3322|      0|		return -1;
 3323|      0|	}
 3324|       |
 3325|    118|	if (!S_ISREG(statbuf.st_mode)) {
  ------------------
  |  Branch (3325:6): [True: 0, False: 118]
  ------------------
 3326|      0|		fr_strerror_printf("Dictionary is not a regular file: %s", filename);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3327|      0|		goto perm_error;
 3328|      0|	}
 3329|       |
 3330|       |	/*
 3331|       |	 *	Globally writable dictionaries means that users can control
 3332|       |	 *	the server configuration with little difficulty.
 3333|       |	 */
 3334|    118|#ifdef S_IWOTH
 3335|    118|	if (dict_gctx->perm_check && ((statbuf.st_mode & S_IWOTH) != 0)) {
  ------------------
  |  Branch (3335:6): [True: 118, False: 0]
  |  Branch (3335:31): [True: 0, False: 118]
  ------------------
 3336|      0|		fr_strerror_printf("Dictionary is globally writable: %s. "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3337|      0|				   "Refusing to start due to insecure configuration", filename);
 3338|      0|		goto perm_error;
 3339|      0|	}
 3340|    118|#endif
 3341|       |
 3342|    118|	old_filename = dctx->filename;
 3343|    118|	old_line = dctx->line;
 3344|       |
 3345|       |	/*
 3346|       |	 *	Now that we've opened the file, copy the filename into the dictionary and add it to the ctx
 3347|       |	 *	This string is safe to assign to the filename pointer in any attributes added beneath the
 3348|       |	 *	dictionary.
 3349|       |	 */
 3350|    118|	if (unlikely(dict_filename_add(&dctx->filename, dctx->dict, filename, src_file, src_line) < 0)) {
  ------------------
  |  |  397|    118|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 118]
  |  |  ------------------
  ------------------
 3351|      0|		goto perm_error;
 3352|      0|	}
 3353|       |
 3354|    118|	CURRENT_FRAME(dctx)->filename = dctx->filename;
  ------------------
  |  |  108|    118|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3355|    118|	CURRENT_FRAME(dctx)->line = line;
  ------------------
  |  |  108|    118|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3356|       |
 3357|  5.54k|	while (fgets(buf, sizeof(buf), fp) != NULL) {
  ------------------
  |  Branch (3357:9): [True: 5.42k, False: 118]
  ------------------
 3358|  5.42k|		bool do_begin = false;
 3359|  5.42k|		fr_dict_keyword_parser_t const	*parser;
 3360|  5.42k|		char **argv_p = argv;
 3361|       |
 3362|  5.42k|		dctx->line = ++line;
 3363|       |
 3364|  5.42k|		switch (buf[0]) {
  ------------------
  |  Branch (3364:11): [True: 2.90k, False: 2.52k]
  ------------------
 3365|  2.27k|		case '#':
  ------------------
  |  Branch (3365:3): [True: 2.27k, False: 3.14k]
  ------------------
 3366|  2.27k|		case '\0':
  ------------------
  |  Branch (3366:3): [True: 0, False: 5.42k]
  ------------------
 3367|  2.90k|		case '\n':
  ------------------
  |  Branch (3367:3): [True: 624, False: 4.80k]
  ------------------
 3368|  2.90k|		case '\r':
  ------------------
  |  Branch (3368:3): [True: 0, False: 5.42k]
  ------------------
 3369|  2.90k|			continue;
 3370|  5.42k|		}
 3371|       |
 3372|       |		/*
 3373|       |		 *  Comment characters should NOT be appearing anywhere but
 3374|       |		 *  as start of a comment;
 3375|       |		 */
 3376|  2.52k|		p = strchr(buf, '#');
 3377|  2.52k|		if (p) *p = '\0';
  ------------------
  |  Branch (3377:7): [True: 54, False: 2.46k]
  ------------------
 3378|       |
 3379|  2.52k|		argc = fr_dict_str_to_argv(buf, argv, DICT_MAX_ARGV);
  ------------------
  |  |   39|  2.52k|#define DICT_MAX_ARGV (8)
  ------------------
 3380|  2.52k|		if (argc == 0) continue;
  ------------------
  |  Branch (3380:7): [True: 0, False: 2.52k]
  ------------------
 3381|       |
 3382|  2.52k|		if (argc == 1) {
  ------------------
  |  Branch (3382:7): [True: 0, False: 2.52k]
  ------------------
 3383|       |			/*
 3384|       |			 *	Be nice.
 3385|       |			 */
 3386|      0|			if ((strcmp(argv[0], "BEGIN") == 0) ||
  ------------------
  |  Branch (3386:8): [True: 0, False: 0]
  ------------------
 3387|      0|			    (fr_dict_keyword(&parser, keywords, NUM_ELEMENTS(keywords), argv_p[0], NULL))) {
  ------------------
  |  |  358|      0|#define NUM_ELEMENTS(_t) (sizeof((_t)) / sizeof((_t)[0]))
  ------------------
  |  Branch (3387:8): [True: 0, False: 0]
  ------------------
 3388|      0|				fr_strerror_printf("Keyword %s is missing all of its arguments", argv[0]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3389|      0|			} else {
 3390|      0|				fr_strerror_printf("Invalid syntax - unknown keyword %s", argv[0]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3391|      0|			}
 3392|       |
 3393|      0|		error:
 3394|      0|			fr_strerror_printf_push("Failed parsing dictionary at %s[%d]", fr_cwd_strip(filename), line);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3395|      0|			fclose(fp);
 3396|       |
 3397|      0|			dctx->filename = CURRENT_FRAME(dctx)->filename = old_filename;
  ------------------
  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3398|      0|			dctx->line = CURRENT_FRAME(dctx)->line = old_line;
  ------------------
  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3399|      0|			return -1;
 3400|      0|		}
 3401|       |
 3402|       |		/*
 3403|       |		 *	Special prefix for "beginnable" keywords.
 3404|       |		 *	These are keywords that can automatically change
 3405|       |		 *	the context of subsequent definitions if they're
 3406|       |		 *	prefixed with a BEGIN keyword.
 3407|       |		 */
 3408|  2.52k|		if (strcasecmp(argv_p[0], "BEGIN") == 0) {
  ------------------
  |  Branch (3408:7): [True: 12, False: 2.51k]
  ------------------
 3409|     12|			do_begin = true;
 3410|     12|			argv_p++;
 3411|     12|			argc--;
 3412|     12|		}
 3413|       |
 3414|  2.52k|		if (fr_dict_keyword(&parser, keywords, NUM_ELEMENTS(keywords), argv_p[0], NULL)) {
  ------------------
  |  |  358|  2.52k|#define NUM_ELEMENTS(_t) (sizeof((_t)) / sizeof((_t)[0]))
  ------------------
  |  Branch (3414:7): [True: 2.39k, False: 124]
  ------------------
 3415|       |			/*
 3416|       |			 *	We are allowed to have attributes
 3417|       |			 *	named for keywords.  Most notably
 3418|       |			 *	"value".  If there's no such attribute
 3419|       |			 *	'value', then the user will get a
 3420|       |			 *	descriptive error.
 3421|       |			 */
 3422|  2.39k|			if (do_begin && !parser->begin) {
  ------------------
  |  Branch (3422:8): [True: 2, False: 2.39k]
  |  Branch (3422:20): [True: 0, False: 2]
  ------------------
 3423|      0|				goto process_begin;
 3424|      0|			}
 3425|       |
 3426|  2.39k|			if (unlikely(parser->parse(dctx, argv_p + 1 , argc - 1, &base_flags) < 0)) goto error;
  ------------------
  |  |  397|  2.39k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2.39k]
  |  |  ------------------
  ------------------
 3427|       |
 3428|       |			/*
 3429|       |			 *	We've processed the definition, now enter the section
 3430|       |			 */
 3431|  2.39k|			if (do_begin && unlikely(parser->begin(dctx) < 0)) goto error;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  |  Branch (3431:8): [True: 2, False: 2.39k]
  ------------------
 3432|  2.39k|			continue;
 3433|  2.39k|		}
 3434|       |
 3435|       |		/*
 3436|       |		 *	It's a naked BEGIN keyword
 3437|       |		 */
 3438|    124|		if (do_begin) {
  ------------------
  |  Branch (3438:7): [True: 10, False: 114]
  ------------------
 3439|     10|		process_begin:
 3440|     10|			if (unlikely(dict_read_process_begin(dctx, argv_p, argc, &base_flags) < 0)) goto error;
  ------------------
  |  |  397|     10|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10]
  |  |  ------------------
  ------------------
 3441|     10|			continue;
 3442|     10|		}
 3443|       |
 3444|       |		/*
 3445|       |		 *	See if we need to import another dictionary.
 3446|       |		 */
 3447|    114|		if (strncasecmp(argv_p[0], "$INCLUDE", 8) == 0) {
  ------------------
  |  Branch (3447:7): [True: 114, False: 0]
  ------------------
 3448|       |			/*
 3449|       |			 *	Included files operate on a copy of the context.
 3450|       |			 *
 3451|       |			 *	This copy means that they inherit the
 3452|       |			 *	current context, including parents,
 3453|       |			 *	TLVs, etc.  But if the included file
 3454|       |			 *	leaves a "dangling" TLV or "last
 3455|       |			 *	attribute", then it won't affect the
 3456|       |			 *	parent.
 3457|       |			 */
 3458|    114|			if (dict_read_process_include(dctx, argv_p, argc, dir) < 0) goto error;
  ------------------
  |  Branch (3458:8): [True: 0, False: 114]
  ------------------
 3459|    114|			continue;
 3460|    114|		} /* $INCLUDE */
 3461|       |
 3462|       |		/*
 3463|       |		 *	Any other string: We don't recognize it.
 3464|       |		 */
 3465|      0|		fr_strerror_printf("Invalid keyword '%s'", argv_p[0]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3466|      0|		goto error;
 3467|    114|	}
 3468|       |
 3469|       |	/*
 3470|       |	 *	Unwind until the stack depth matches what we had on input.
 3471|       |	 */
 3472|    146|	while (dctx->stack_depth > stack_depth) {
  ------------------
  |  Branch (3472:9): [True: 28, False: 118]
  ------------------
 3473|     28|		dict_tokenize_frame_t *frame = CURRENT_FRAME(dctx);
  ------------------
  |  |  108|     28|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3474|       |
 3475|     28|		if (frame->nest == NEST_PROTOCOL) {
  ------------------
  |  Branch (3475:7): [True: 0, False: 28]
  ------------------
 3476|      0|			fr_strerror_printf("BEGIN-PROTOCOL at %s[%d] is missing END-PROTOCOL",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3477|      0|					   fr_cwd_strip(frame->filename), line);
 3478|      0|			goto error;
 3479|      0|		}
 3480|       |
 3481|     28|		if (frame->nest == NEST_ATTRIBUTE) {
  ------------------
  |  Branch (3481:7): [True: 0, False: 28]
  ------------------
 3482|      0|			fr_strerror_printf("BEGIN %s at %s[%d] is missing END %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3483|      0|					   frame->da->name, fr_cwd_strip(frame->filename), line,
 3484|      0|					   frame->da->name);
 3485|      0|			goto error;
 3486|      0|		}
 3487|       |
 3488|     28|		if (frame->nest == NEST_VENDOR) {
  ------------------
  |  Branch (3488:7): [True: 0, False: 28]
  ------------------
 3489|      0|			fr_strerror_printf("BEGIN-VENDOR at %s[%d] is missing END-VENDOR",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3490|      0|					   fr_cwd_strip(frame->filename), line);
 3491|      0|			goto error;
 3492|      0|		}
 3493|       |
 3494|       |		/*
 3495|       |		 *	Run any necessary finalise callback, and then pop the frame.
 3496|       |		 */
 3497|     28|		if (frame->finalise) {
  ------------------
  |  Branch (3497:7): [True: 26, False: 2]
  ------------------
 3498|     26|			if (frame->finalise(dctx) < 0) goto error;
  ------------------
  |  Branch (3498:8): [True: 0, False: 26]
  ------------------
 3499|     26|			frame->finalise = NULL;
 3500|     26|		}
 3501|       |
 3502|     28|		fr_assert(!dctx->stack[dctx->stack_depth].finalise);
  ------------------
  |  |  194|     28|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     28|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3503|     28|		dctx->stack_depth--;
 3504|     28|	}
 3505|       |
 3506|    118|	fclose(fp);
 3507|    118|	dctx->filename = CURRENT_FRAME(dctx)->filename = old_filename;
  ------------------
  |  |  108|    118|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3508|    118|	dctx->line = CURRENT_FRAME(dctx)->line = old_line;
  ------------------
  |  |  108|    118|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3509|       |
 3510|    118|	return 0;
 3511|    118|}
dict_tokenize.c:dict_read_process_alias:
 1420|      4|{
 1421|      4|	fr_dict_attr_t const	*da;
 1422|      4|	fr_dict_attr_t const	*parent = CURRENT_FRAME(dctx)->da;
  ------------------
  |  |  108|      4|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 1423|       |
 1424|      4|	if (argc != 2) {
  ------------------
  |  Branch (1424:6): [True: 0, False: 4]
  ------------------
 1425|      0|		fr_strerror_const("Invalid ALIAS syntax");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1426|      0|		return -1;
 1427|      0|	}
 1428|       |
 1429|       |	/*
 1430|       |	 *	Dictionaries need to have real names, not shitty ones.
 1431|       |	 */
 1432|      4|	if (strncmp(argv[0], "Attr-", 5) == 0) {
  ------------------
  |  Branch (1432:6): [True: 0, False: 4]
  ------------------
 1433|      0|		fr_strerror_const("Invalid ALIAS name");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1434|      0|		return -1;
 1435|      0|	}
 1436|       |
 1437|      4|	if (strchr(argv[0], '.') != NULL) {
  ------------------
  |  Branch (1437:6): [True: 0, False: 4]
  ------------------
 1438|      0|		fr_strerror_const("ALIAS names must be in the local context, and cannot contain '.'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1439|      0|		return -1;
 1440|      0|	}
 1441|       |
 1442|       |	/*
 1443|       |	 *	Internally we can add aliases to STRUCTs and GROUPs.  But the poor user can't.
 1444|       |	 *
 1445|       |	 *	This limitation is mainly so that we can differentiate automatically added aliases (which
 1446|       |	 *	point to unions), from ones added by users.  If we make dict_attr_acopy_aliases() a little
 1447|       |	 *	smarter, then we can relax those checks.
 1448|       |	 */
 1449|      4|	switch (parent->type) {
 1450|      4|	case FR_TYPE_TLV:
  ------------------
  |  Branch (1450:2): [True: 4, False: 0]
  ------------------
 1451|      4|	case FR_TYPE_VSA:
  ------------------
  |  Branch (1451:2): [True: 0, False: 4]
  ------------------
 1452|      4|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (1452:2): [True: 0, False: 4]
  ------------------
 1453|      4|		break;
 1454|       |
 1455|      0|	default:
  ------------------
  |  Branch (1455:2): [True: 0, False: 4]
  ------------------
 1456|      0|		fr_strerror_printf("ALIAS cannot be added to data type '%s'", fr_type_to_str(parent->type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1457|      0|		return -1;
 1458|      4|	}
 1459|       |
 1460|       |	/*
 1461|       |	 *	Relative refs get resolved from the current namespace.
 1462|       |	 */
 1463|      4|	if (argv[1][0] == '@') {
  ------------------
  |  Branch (1463:6): [True: 0, False: 4]
  ------------------
 1464|      0|		fr_strerror_const("An ALIAS reference cannot cross protocol boundaries");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1465|      0|		return -1;
 1466|       |
 1467|      4|	} else if (argv[1][0] == '.') {
  ------------------
  |  Branch (1467:13): [True: 0, False: 4]
  ------------------
 1468|      0|		if (argv[1][1] == '.') {
  ------------------
  |  Branch (1468:7): [True: 0, False: 0]
  ------------------
 1469|      0|			fr_strerror_const("An ALIAS reference cannot use '..' to go back up to another parent");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1470|      0|			return -1;
 1471|      0|		}
 1472|       |
 1473|      4|	} else if (parent != dctx->dict->root) {
  ------------------
  |  Branch (1473:13): [True: 0, False: 4]
  ------------------
 1474|      0|		fr_strerror_const("An ALIAS reference must use a leading '.' when referring to attributes with the same parent");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1475|      0|		return -1;
 1476|      0|	}
 1477|       |
 1478|       |	/*
 1479|       |	 *	The <ref> can be a name.
 1480|       |	 */
 1481|      4|	da = fr_dict_attr_by_oid(NULL, parent, argv[1]);
 1482|      4|	if (!da) {
  ------------------
  |  Branch (1482:6): [True: 2, False: 2]
  ------------------
 1483|       |		/*
 1484|       |		 *	If we can't find it now, the file containing the ALIASes may have been read before
 1485|       |		 *	the ALIASed attributes.
 1486|       |		 *
 1487|       |		 *	@todo - we likely just want to forbid this.
 1488|       |		 */
 1489|      2|		return dict_fixup_alias_enqueue(&dctx->fixup, CURRENT_FILENAME(dctx), CURRENT_LINE(dctx),
  ------------------
  |  |  110|      2|#define CURRENT_FILENAME(_dctx)	(CURRENT_FRAME(_dctx)->filename)
  |  |  ------------------
  |  |  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  ------------------
  ------------------
              		return dict_fixup_alias_enqueue(&dctx->fixup, CURRENT_FILENAME(dctx), CURRENT_LINE(dctx),
  ------------------
  |  |  111|      2|#define CURRENT_LINE(_dctx)	(CURRENT_FRAME(_dctx)->line)
  |  |  ------------------
  |  |  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  ------------------
  ------------------
 1490|      2|					fr_dict_attr_unconst(parent), argv[0],
 1491|      2|					fr_dict_attr_unconst(parent), argv[1]);
 1492|      2|	}
 1493|       |
 1494|      2|	return dict_attr_alias_add(fr_dict_attr_unconst(parent), argv[0], da, true);
 1495|      4|}
dict_tokenize.c:dict_dctx_find_frame:
  133|     30|{
  134|     30|	int i;
  135|       |
  136|     54|	for (i = dctx->stack_depth; i >= 0; i--) {
  ------------------
  |  Branch (136:30): [True: 44, False: 10]
  ------------------
  137|     44|		if (dctx->stack[i].nest & nest) return &dctx->stack[i];
  ------------------
  |  Branch (137:7): [True: 20, False: 24]
  ------------------
  138|     44|	}
  139|       |
  140|     10|	return NULL;
  141|     30|}
dict_tokenize.c:dict_read_process_begin_vendor:
 1878|     10|{
 1879|     10|	fr_dict_vendor_t const		*vendor;
 1880|       |
 1881|     10|	fr_dict_attr_t const		*vsa_da;
 1882|     10|	fr_dict_attr_t const		*vendor_da;
 1883|     10|	fr_dict_attr_t			*new;
 1884|     10|	dict_tokenize_frame_t const	*frame;
 1885|     10|	char				*p;
 1886|       |
 1887|     10|	dctx->value_attr = NULL;
 1888|     10|	dctx->relative_attr = NULL;
 1889|       |
 1890|     10|	if (argc < 1) {
  ------------------
  |  Branch (1890:6): [True: 0, False: 10]
  ------------------
 1891|      0|		fr_strerror_const("Invalid BEGIN-VENDOR entry");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1892|      0|		return -1;
 1893|      0|	}
 1894|       |
 1895|     10|	vendor = fr_dict_vendor_by_name(dctx->dict, argv[0]);
 1896|     10|	if (!vendor) {
  ------------------
  |  Branch (1896:6): [True: 0, False: 10]
  ------------------
 1897|      0|		fr_strerror_printf("Unknown vendor '%s'", argv[0]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1898|      0|		return -1;
 1899|      0|	}
 1900|       |
 1901|       |	/*
 1902|       |	 *	Check for extended attr VSAs
 1903|       |	 *
 1904|       |	 *	BEGIN-VENDOR foo parent=Foo-Encapsulation-Attr
 1905|       |	 */
 1906|     10|	if (argc > 1) {
  ------------------
  |  Branch (1906:6): [True: 0, False: 10]
  ------------------
 1907|      0|		fr_dict_attr_t const *da;
 1908|       |
 1909|      0|		if (strncmp(argv[1], "parent=", 7) != 0) {
  ------------------
  |  Branch (1909:7): [True: 0, False: 0]
  ------------------
 1910|      0|			fr_strerror_const("BEGIN-VENDOR invalid argument - expected 'parent='");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1911|      0|			return -1;
 1912|      0|		}
 1913|       |
 1914|      0|		p = argv[1] + 7;
 1915|      0|		da = fr_dict_attr_by_oid(NULL, CURRENT_FRAME(dctx)->da, p);
  ------------------
  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 1916|      0|		if (!da) {
  ------------------
  |  Branch (1916:7): [True: 0, False: 0]
  ------------------
 1917|      0|			fr_strerror_printf("BEGIN-VENDOR Failed to find attribute '%s'", p);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1918|      0|			return -1;
 1919|      0|		}
 1920|       |
 1921|      0|		if (da->type != FR_TYPE_VSA) {
  ------------------
  |  Branch (1921:7): [True: 0, False: 0]
  ------------------
 1922|      0|			fr_strerror_printf("Invalid parent for BEGIN-VENDOR.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1923|      0|					   "Attribute '%s' should be 'vsa' but is '%s'", p,
 1924|      0|					   fr_type_to_str(da->type));
 1925|      0|			return -1;
 1926|      0|		}
 1927|       |
 1928|      0|		vsa_da = da;
 1929|       |
 1930|     10|	} else if (dctx->dict->vsa_parent) {
  ------------------
  |  Branch (1930:13): [True: 10, False: 0]
  ------------------
 1931|       |		/*
 1932|       |		 *	Check that the protocol-specific VSA parent exists.
 1933|       |		 */
 1934|     10|		vsa_da = dict_attr_child_by_num(CURRENT_FRAME(dctx)->da, dctx->dict->vsa_parent);
  ------------------
  |  |  108|     10|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 1935|     10|		if (!vsa_da) {
  ------------------
  |  Branch (1935:7): [True: 0, False: 10]
  ------------------
 1936|      0|			fr_strerror_printf("Failed finding VSA parent for Vendor %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1937|      0|					   vendor->name);
 1938|      0|			return -1;
 1939|      0|		}
 1940|       |
 1941|     10|	} else if (dctx->dict->string_based) {
  ------------------
  |  Branch (1941:13): [True: 0, False: 0]
  ------------------
 1942|      0|		vsa_da = dctx->dict->root;
 1943|       |
 1944|      0|	} else {
 1945|      0|		fr_strerror_printf("BEGIN-VENDOR is forbidden for protocol %s - it has no ATTRIBUTE of type 'vsa'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1946|      0|				   dctx->dict->root->name);
 1947|      0|		return -1;
 1948|      0|	}
 1949|       |
 1950|     10|	frame = dict_dctx_find_frame(dctx, NEST_VENDOR);
 1951|     10|	if (frame) {
  ------------------
  |  Branch (1951:6): [True: 0, False: 10]
  ------------------
 1952|      0|		fr_strerror_printf("Nested BEGIN-VENDOR is forbidden.  Previous definition is at %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1953|      0|				   frame->filename, frame->line);
 1954|      0|		return -1;
 1955|      0|	}
 1956|       |
 1957|       |	/*
 1958|       |	 *	Check if the VENDOR attribute exists under this VSA.  If not, create one.
 1959|       |	 *
 1960|       |	 *	@todo - There are no vendor fixups, so if the vendor has unusual type sizes, it MUST be
 1961|       |	 *	defined before the BEGIN-VENDOR is used.
 1962|       |	 */
 1963|     10|	vendor_da = dict_attr_child_by_num(vsa_da, vendor->pen);
 1964|     10|	if (!vendor_da) {
  ------------------
  |  Branch (1964:6): [True: 10, False: 0]
  ------------------
 1965|     10|		fr_dict_attr_flags_t flags = {};
 1966|       |
 1967|     10|		new = dict_attr_alloc(dctx->dict->pool,
  ------------------
  |  |  257|     10|				_dict_attr_alloc(__FILE__, __LINE__, _ctx, _parent, _name, _attr, _type, (_args))
  ------------------
 1968|     10|				      vsa_da, argv[0], vendor->pen, FR_TYPE_VENDOR,
 1969|     10|				      &(dict_attr_args_t){ .flags = &flags });
 1970|     10|		if (unlikely(!new)) return -1;
  ------------------
  |  |  397|     10|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10]
  |  |  ------------------
  ------------------
 1971|       |
 1972|     10|		if (dict_attr_child_add(UNCONST(fr_dict_attr_t *, vsa_da), new) < 0) {
  ------------------
  |  |  186|     10|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  |  Branch (1972:7): [True: 0, False: 10]
  ------------------
 1973|      0|			talloc_free(new);
 1974|      0|			return -1;
 1975|      0|		}
 1976|       |
 1977|     10|		if (dict_attr_add_to_namespace(UNCONST(fr_dict_attr_t *, vsa_da), new) < 0) {
  ------------------
  |  |  186|     10|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  |  Branch (1977:7): [True: 0, False: 10]
  ------------------
 1978|      0|			return -1; /* leaves attr added */
 1979|      0|		}
 1980|       |
 1981|     10|		vendor_da = new;
 1982|     10|	} else {
 1983|      0|		fr_assert(vendor_da->type == FR_TYPE_VENDOR);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1984|      0|	}
 1985|       |
 1986|     10|	return dict_dctx_push(dctx, vendor_da, NEST_VENDOR);
 1987|     10|}
dict_tokenize.c:dict_read_process_end:
 2126|     10|{
 2127|     10|	fr_dict_attr_t const *current;
 2128|     10|	fr_dict_attr_t const *da;
 2129|     10|	dict_tokenize_frame_t const *frame;
 2130|       |
 2131|     10|	dctx->value_attr = NULL;
 2132|     10|	dctx->relative_attr = NULL;
 2133|       |
 2134|     10|	if (argc > 2) {
  ------------------
  |  Branch (2134:6): [True: 0, False: 10]
  ------------------
 2135|      0|		fr_strerror_const("Invalid END syntax, expected END <ref>");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2136|      0|		return -1;
 2137|      0|	}
 2138|       |
 2139|       |	/*
 2140|       |	 *	Allow for the obvious.
 2141|       |	 */
 2142|     10|	if (strcmp(argv[0], "PROTOCOL") == 0) return dict_read_process_end_protocol(dctx, argv + 1, argc - 1, base_flags);
  ------------------
  |  Branch (2142:6): [True: 0, False: 10]
  ------------------
 2143|       |
 2144|     10|	if (strcmp(argv[0], "VENDOR") == 0) return dict_read_process_end_vendor(dctx, argv + 1, argc - 1, base_flags);
  ------------------
  |  Branch (2144:6): [True: 0, False: 10]
  ------------------
 2145|       |
 2146|       |	/*
 2147|       |	 *	Unwind until we hit an attribute nesting section
 2148|       |	 */
 2149|     10|	if (!dict_dctx_unwind_until(dctx, NEST_ATTRIBUTE)) {
  ------------------
  |  Branch (2149:6): [True: 0, False: 10]
  ------------------
 2150|      0|		return -1;
 2151|      0|	}
 2152|       |
 2153|       |	/*
 2154|       |	 *	Pop the stack to get the attribute we're ending.
 2155|       |	 */
 2156|     10|	current = dict_dctx_pop(dctx)->da;
 2157|       |
 2158|       |	/*
 2159|       |	 *	No checks on the attribute, we're just popping _A_ frame,
 2160|       |	 *	we don't care what attribute it represents.
 2161|       |	 */
 2162|     10|	if (argc == 0) return 0;
  ------------------
  |  Branch (2162:6): [True: 0, False: 10]
  ------------------
 2163|       |
 2164|       |	/*
 2165|       |	 *	This is where we'll have begun the previous search to
 2166|       |	 *	evaluate the BEGIN keyword.
 2167|       |	 */
 2168|     10|	frame = dict_dctx_find_frame(dctx, NEST_TOP | NEST_PROTOCOL | NEST_ATTRIBUTE);
 2169|     10|	if (!fr_cond_assert(frame)) return -1;
  ------------------
  |  |  131|     10|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|     20|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 10, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2169:6): [True: 0, False: 10]
  ------------------
 2170|       |
 2171|     10|	da = fr_dict_attr_by_oid(NULL, frame->da, argv[0]);
 2172|     10|	if (!da) {
  ------------------
  |  Branch (2172:6): [True: 0, False: 10]
  ------------------
 2173|      0|		fr_strerror_const_push("Failed resolving attribute in BEGIN entry");
  ------------------
  |  |  227|      0|#define		fr_strerror_const_push(_msg) _fr_strerror_const_push(__FILE__, __LINE__, _msg)
  ------------------
 2174|      0|		return -1;
 2175|      0|	}
 2176|       |
 2177|     10|	if (da != current) {
  ------------------
  |  Branch (2177:6): [True: 0, False: 10]
  ------------------
 2178|      0|		fr_strerror_printf("END %s does not match previous BEGIN %s", argv[0], current->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2179|      0|		return -1;
 2180|      0|	}
 2181|       |
 2182|     10|	return 0;
 2183|     10|}
dict_tokenize.c:dict_dctx_unwind_until:
  186|  1.22k|{
  187|  1.22k|	int i;
  188|       |
  189|  1.23k|	for (i = dctx->stack_depth; i >= 0; i--) {
  ------------------
  |  Branch (189:30): [True: 1.23k, False: 0]
  ------------------
  190|  1.23k|		dict_tokenize_frame_t *frame;
  191|       |
  192|       |		/*
  193|       |		 *	We mash the stack depth here, because the finalisation function needs it.  Plus, if
  194|       |		 *	there's any error, we don't care about the dctx stack, we just return up the C stack.
  195|       |		 */
  196|  1.23k|		dctx->stack_depth = i;
  197|  1.23k|		frame = CURRENT_FRAME(dctx);
  ------------------
  |  |  108|  1.23k|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  198|       |
  199|  1.23k|		if (frame->finalise) {
  ------------------
  |  Branch (199:7): [True: 12, False: 1.22k]
  ------------------
  200|     12|			if (frame->finalise(dctx) < 0) return NULL;
  ------------------
  |  Branch (200:8): [True: 0, False: 12]
  ------------------
  201|     12|			frame->finalise = NULL;
  202|     12|		}
  203|       |
  204|       |		/*
  205|       |		 *	END-foo cannot be used without BEGIN-foo.
  206|       |		 */
  207|  1.23k|		if (frame->filename && (frame->filename != dctx->filename) &&
  ------------------
  |  Branch (207:7): [True: 1.23k, False: 0]
  |  Branch (207:26): [True: 0, False: 1.23k]
  ------------------
  208|      0|		    (nest != NEST_ANY)) {
  ------------------
  |  |   61|      0|#define NEST_ANY (NEST_TOP | NEST_PROTOCOL | NEST_VENDOR | NEST_ATTRIBUTE)
  ------------------
  |  Branch (208:7): [True: 0, False: 0]
  ------------------
  209|      0|			char const *name;
  210|       |
  211|      0|			name = fr_table_str_by_value(dict_nest_table, nest, "<INVALID>");
  ------------------
  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  773|      0|_Generic((_table), \
  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  ------------------
  212|      0|			fr_strerror_printf("END-%s in file %s[%d] without matching BEGIN-%s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  213|      0|					   name, dctx->filename, dctx->line, name);
  214|      0|			return NULL;
  215|      0|		}
  216|       |
  217|  1.23k|		if ((frame->nest & nest) != 0) {
  ------------------
  |  Branch (217:7): [True: 1.22k, False: 12]
  ------------------
  218|  1.22k|			return frame;
  219|  1.22k|		}
  220|  1.23k|	}
  221|       |
  222|      0|	return NULL;
  223|  1.22k|}
dict_tokenize.c:dict_dctx_pop:
  169|     10|{
  170|     10|	if (dctx->stack_depth == 0) return NULL;
  ------------------
  |  Branch (170:6): [True: 0, False: 10]
  ------------------
  171|       |
  172|     10|	fr_assert(!dctx->stack[dctx->stack_depth].finalise);
  ------------------
  |  |  194|     10|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     10|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 10]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  173|       |
  174|     10|	return &dctx->stack[dctx->stack_depth--];
  175|     10|}
dict_tokenize.c:dict_read_process_end_protocol:
 2187|      2|{
 2188|      2|	fr_dict_t const *found;
 2189|       |
 2190|      2|	dctx->value_attr = NULL;
 2191|      2|	dctx->relative_attr = NULL;
 2192|       |
 2193|      2|	if (argc != 1) {
  ------------------
  |  Branch (2193:6): [True: 0, False: 2]
  ------------------
 2194|      0|		fr_strerror_const("Invalid END-PROTOCOL entry");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2195|      0|		return -1;
 2196|      0|	}
 2197|       |
 2198|      2|	found = dict_by_protocol_name(argv[0]);
 2199|      2|	if (!found) {
  ------------------
  |  Branch (2199:6): [True: 0, False: 2]
  ------------------
 2200|      0|		fr_strerror_printf("END-PROTOCOL %s does not refer to a valid protocol", argv[0]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2201|      0|		return -1;
 2202|      0|	}
 2203|       |
 2204|      2|	if (found != dctx->dict) {
  ------------------
  |  Branch (2204:6): [True: 0, False: 2]
  ------------------
 2205|      0|		fr_strerror_printf("END-PROTOCOL %s does not match previous BEGIN-PROTOCOL %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2206|      0|				   argv[0], dctx->dict->root->name);
 2207|      0|		return -1;
 2208|      0|	}
 2209|       |
 2210|       |	/*
 2211|       |	 *	Unwind until we get to a BEGIN-PROTOCOL nesting.
 2212|       |	 */
 2213|      2|	if (!dict_dctx_unwind_until(dctx, NEST_PROTOCOL)) {
  ------------------
  |  Branch (2213:6): [True: 0, False: 2]
  ------------------
 2214|      0|		return -1;
 2215|      0|	}
 2216|       |
 2217|      2|	if (found->root != CURRENT_FRAME(dctx)->da) {
  ------------------
  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2217:6): [True: 0, False: 2]
  ------------------
 2218|      0|		fr_strerror_printf("END-PROTOCOL %s does not match previous BEGIN-PROTOCOL %s", argv[0],
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2218|      0|		fr_strerror_printf("END-PROTOCOL %s does not match previous BEGIN-PROTOCOL %s", argv[0],
  |  |  |  | 2219|      0|				   CURRENT_FRAME(dctx)->da->name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2219|      0|				   CURRENT_FRAME(dctx)->da->name);
 2220|      0|		return -1;
 2221|      0|	}
 2222|       |
 2223|       |	/*
 2224|       |	 *	Applies fixups to any attributes added to the protocol
 2225|       |	 *	dictionary.  Note that the finalise function prints
 2226|       |	 *	out the original filename / line of the error. So we
 2227|       |	 *	don't need to do that here.
 2228|       |	 */
 2229|      2|	if (dict_finalise(dctx) < 0) return -1;
  ------------------
  |  Branch (2229:6): [True: 0, False: 2]
  ------------------
 2230|       |
 2231|      2|	ASSERT_CURRENT_NEST(dctx, NEST_PROTOCOL);
  ------------------
  |  |  113|      2|#define ASSERT_CURRENT_NEST(_dctx, _nest) fr_assert_msg(CURRENT_FRAME(_dctx)->nest == (_nest), "Expected frame type %s, got %s", \
  |  |  ------------------
  |  |  |  |  202|      2|#  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  114|      0|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  114|      0|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  114|      2|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  ------------------
 2232|       |
 2233|      2|	fr_assert(!dctx->stack[dctx->stack_depth].finalise);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2234|      2|	dctx->stack_depth--;	/* nuke the BEGIN-PROTOCOL */
 2235|       |
 2236|      2|	ASSERT_CURRENT_NEST(dctx, NEST_TOP);
  ------------------
  |  |  113|      2|#define ASSERT_CURRENT_NEST(_dctx, _nest) fr_assert_msg(CURRENT_FRAME(_dctx)->nest == (_nest), "Expected frame type %s, got %s", \
  |  |  ------------------
  |  |  |  |  202|      2|#  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  114|      0|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  114|      0|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  114|      2|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  ------------------
 2237|      2|	dctx->dict = dict_gctx->internal;
 2238|       |
 2239|      2|	return 0;
 2240|      2|}
dict_tokenize.c:dict_read_process_end_vendor:
 2244|     10|{
 2245|     10|	fr_dict_vendor_t const *vendor;
 2246|       |
 2247|     10|	dctx->value_attr = NULL;
 2248|     10|	dctx->relative_attr = NULL;
 2249|       |
 2250|     10|	if (argc != 1) {
  ------------------
  |  Branch (2250:6): [True: 0, False: 10]
  ------------------
 2251|      0|		fr_strerror_const("END-VENDOR is missing vendor name");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2252|      0|		return -1;
 2253|      0|	}
 2254|       |
 2255|     10|	vendor = fr_dict_vendor_by_name(dctx->dict, argv[0]);
 2256|     10|	if (!vendor) {
  ------------------
  |  Branch (2256:6): [True: 0, False: 10]
  ------------------
 2257|      0|		fr_strerror_printf("Unknown vendor '%s'", argv[0]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2258|      0|		return -1;
 2259|      0|	}
 2260|       |
 2261|       |	/*
 2262|       |	 *	Unwind until we get to a BEGIN-VENDOR nesting.
 2263|       |	 */
 2264|     10|	if (!dict_dctx_unwind_until(dctx, NEST_VENDOR)) {
  ------------------
  |  Branch (2264:6): [True: 0, False: 10]
  ------------------
 2265|      0|		return -1;
 2266|      0|	}
 2267|       |
 2268|     10|	if (vendor->pen != CURRENT_FRAME(dctx)->da->attr) {
  ------------------
  |  |  108|     10|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2268:6): [True: 0, False: 10]
  ------------------
 2269|      0|		fr_strerror_printf("END-VENDOR %s does not match previous BEGIN-VENDOR %s", argv[0],
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2269|      0|		fr_strerror_printf("END-VENDOR %s does not match previous BEGIN-VENDOR %s", argv[0],
  |  |  |  | 2270|      0|				   CURRENT_FRAME(dctx)->da->name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2270|      0|				   CURRENT_FRAME(dctx)->da->name);
 2271|      0|		return -1;
 2272|      0|	}
 2273|       |
 2274|     10|	fr_assert(!dctx->stack[dctx->stack_depth].finalise);
  ------------------
  |  |  194|     10|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     10|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 10]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2275|     10|	dctx->stack_depth--;	/* nuke the BEGIN-VENDOR */
 2276|       |
 2277|     10|	return 0;
 2278|     10|}
dict_tokenize.c:dict_attr_location_set:
  942|  1.61k|{
  943|  1.61k|	da->filename = CURRENT_FILENAME(dctx);
  ------------------
  |  |  110|  1.61k|#define CURRENT_FILENAME(_dctx)	(CURRENT_FRAME(_dctx)->filename)
  |  |  ------------------
  |  |  |  |  108|  1.61k|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  ------------------
  ------------------
  944|  1.61k|	da->line = CURRENT_LINE(dctx);
  ------------------
  |  |  111|  1.61k|#define CURRENT_LINE(_dctx)	(CURRENT_FRAME(_dctx)->line)
  |  |  ------------------
  |  |  |  |  108|  1.61k|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  ------------------
  ------------------
  945|  1.61k|}
dict_tokenize.c:dict_process_type_field:
  342|  1.60k|{
  343|  1.60k|	char *p;
  344|  1.60k|	fr_type_t type;
  345|       |
  346|       |	/*
  347|       |	 *	Some types can have fixed length
  348|       |	 */
  349|  1.60k|	p = strchr(name, '[');
  350|  1.60k|	if (p) {
  ------------------
  |  Branch (350:6): [True: 112, False: 1.49k]
  ------------------
  351|    112|		char *q;
  352|    112|		unsigned int length;
  353|       |
  354|    112|		*p = '\0';
  355|    112|		q = strchr(p + 1, ']');
  356|    112|		if (!q) {
  ------------------
  |  Branch (356:7): [True: 0, False: 112]
  ------------------
  357|      0|			fr_strerror_printf("Invalid format for '%s[...]'", name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  358|      0|			return -1;
  359|      0|		}
  360|       |
  361|    112|		*q = '\0';
  362|    112|		if (q[1]) {
  ------------------
  |  Branch (362:7): [True: 0, False: 112]
  ------------------
  363|      0|			fr_strerror_const("length, if present, must end type field");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  364|      0|			return -1;
  365|      0|		}
  366|       |
  367|    112|		if (!dict_read_sscanf_i(&length, p + 1)) {
  ------------------
  |  Branch (367:7): [True: 0, False: 112]
  ------------------
  368|      0|			fr_strerror_printf("Invalid length for '%s[...]'", name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  369|      0|			return -1;
  370|      0|		}
  371|       |
  372|       |		/*
  373|       |		 *	"length" has to fit into the flags.length field.
  374|       |		 */
  375|    112|		if ((length == 0) || (length > UINT16_MAX)) {
  ------------------
  |  Branch (375:7): [True: 0, False: 112]
  |  Branch (375:24): [True: 0, False: 112]
  ------------------
  376|      0|			fr_strerror_printf("Invalid length for '%s[...]'", name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  377|      0|			return -1;
  378|      0|		}
  379|       |
  380|       |		/*
  381|       |		 *	Now that we have a length, check the data type.
  382|       |		 */
  383|    112|		if (strcmp(name, "octets") == 0) {
  ------------------
  |  Branch (383:7): [True: 14, False: 98]
  ------------------
  384|     14|			type = FR_TYPE_OCTETS;
  385|       |
  386|     98|		} else if (strcmp(name, "string") == 0) {
  ------------------
  |  Branch (386:14): [True: 2, False: 96]
  ------------------
  387|      2|			type = FR_TYPE_STRING;
  388|       |
  389|     96|		} else if (strcmp(name, "struct") == 0) {
  ------------------
  |  Branch (389:14): [True: 0, False: 96]
  ------------------
  390|      0|			type = FR_TYPE_STRUCT;
  391|       |
  392|     96|		} else if (strcmp(name, "union") == 0) {
  ------------------
  |  Branch (392:14): [True: 0, False: 96]
  ------------------
  393|      0|			type = FR_TYPE_UNION;
  394|       |
  395|     96|		} else if (strcmp(name, "bit") == 0) {
  ------------------
  |  Branch (395:14): [True: 96, False: 0]
  ------------------
  396|     96|			if (CURRENT_FRAME(dctx)->da->type != FR_TYPE_STRUCT) {
  ------------------
  |  |  108|     96|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (396:8): [True: 0, False: 96]
  ------------------
  397|      0|				fr_strerror_const("Bit fields can only be defined as a MEMBER of data type 'struct'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  398|      0|				return -1;
  399|      0|			}
  400|       |
  401|     96|			(*da_p)->flags.extra = 1;
  402|     96|			(*da_p)->flags.subtype = FLAG_BIT_FIELD;
  403|       |
  404|     96|			if (length == 1) {
  ------------------
  |  Branch (404:8): [True: 48, False: 48]
  ------------------
  405|     48|				type = FR_TYPE_BOOL;
  406|     48|			} else if (length <= 8) {
  ------------------
  |  Branch (406:15): [True: 28, False: 20]
  ------------------
  407|     28|				type = FR_TYPE_UINT8;
  408|     28|			} else if (length <= 16) {
  ------------------
  |  Branch (408:15): [True: 6, False: 14]
  ------------------
  409|      6|				type = FR_TYPE_UINT16;
  410|     14|			} else if (length <= 32) {
  ------------------
  |  Branch (410:15): [True: 6, False: 8]
  ------------------
  411|      6|				type = FR_TYPE_UINT32;
  412|      8|			} else if (length <= 56) { /* for laziness in encode / decode */
  ------------------
  |  Branch (412:15): [True: 8, False: 0]
  ------------------
  413|      8|				type = FR_TYPE_UINT64;
  414|      8|			} else {
  415|      0|				fr_strerror_const("Invalid length for bit field");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  416|      0|				return -1;
  417|      0|			}
  418|       |
  419|       |			/*
  420|       |			 *	Cache where on a byte boundary this
  421|       |			 *	bit field ends.  We could have the
  422|       |			 *	validation function loop through all
  423|       |			 *	previous siblings, but that's
  424|       |			 *	annoying.
  425|       |			 */
  426|     96|			(*da_p)->flags.flag_byte_offset = length;
  ------------------
  |  |  157|     96|#define flag_byte_offset type_size
  ------------------
  427|       |
  428|     96|		} else {
  429|      0|			fr_strerror_printf("Attributes of type '%s' cannot use the %s[...] syntax",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  430|      0|					   name, name);
  431|      0|			return -1;
  432|      0|		}
  433|       |
  434|    112|		(*da_p)->flags.is_known_width = true;
  435|    112|		(*da_p)->flags.length = length;
  436|    112|		return dict_attr_type_init(da_p, type);
  437|    112|	}
  438|       |
  439|       |	/*
  440|       |	 *	We default to using the standard FreeRADIUS types.
  441|       |	 *
  442|       |	 *	However, if there is a protocol-specific type parsing
  443|       |	 *	function, we call that, too.  That ordering allows the
  444|       |	 *	protocol-specific names to over-ride the default ones.
  445|       |	 */
  446|  1.49k|	type = fr_type_from_str(name);
  447|       |
  448|  1.49k|	if (dctx->dict->proto->attr.type_parse &&
  ------------------
  |  Branch (448:6): [True: 0, False: 1.49k]
  ------------------
  449|      0|	    !dctx->dict->proto->attr.type_parse(&type, da_p, name)) {
  ------------------
  |  Branch (449:6): [True: 0, False: 0]
  ------------------
  450|      0|		return -1;
  451|      0|	}
  452|       |
  453|  1.49k|	switch (type) {
  454|       |		/*
  455|       |		 *	Still not known, or is still a NULL type, that's an error.
  456|       |		 *
  457|       |		 *	The protocol-specific function can return an error if
  458|       |		 *	it has an error in its parsing.  Or, it can return
  459|       |		 *	"true"
  460|       |		 */
  461|      0|	case FR_TYPE_NULL:
  ------------------
  |  Branch (461:2): [True: 0, False: 1.49k]
  ------------------
  462|      0|		fr_strerror_printf("Unknown data type '%s'", name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  463|      0|		return -1;
  464|       |
  465|  18.7k|	case FR_TYPE_LEAF:
  ------------------
  |  |  317|     22|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|     22|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|     22|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|     22|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|     22|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|     22|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|     22|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.49k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|     24|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|     24|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|     24|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2, False: 1.49k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|    202|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|     26|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|     26|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|     26|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2, False: 1.49k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|     26|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|     26|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|     26|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.49k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|    184|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    184|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    184|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 158, False: 1.33k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|    192|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    192|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    192|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 8, False: 1.48k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|    200|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    200|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    200|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 8, False: 1.48k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|    202|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    202|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    202|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2, False: 1.49k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|    870|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|    582|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    582|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    582|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 380, False: 1.11k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|    870|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    870|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    870|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 288, False: 1.20k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|    870|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|    890|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    890|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    890|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 20, False: 1.47k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|    890|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    890|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    890|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.49k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|    890|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|    954|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|    954|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    954|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 64, False: 1.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|    954|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|  1.03k|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.03k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.03k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 78, False: 1.41k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|  1.07k|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.07k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.07k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 42, False: 1.45k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|  1.21k|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.21k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.21k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 138, False: 1.35k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|  1.24k|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.24k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.24k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 28, False: 1.46k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|  1.24k|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.24k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.24k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.49k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|  1.24k|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.24k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.24k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.49k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|  1.26k|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.26k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.26k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 24, False: 1.47k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|  1.28k|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.28k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.28k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 20, False: 1.47k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|  1.33k|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.33k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.33k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 48, False: 1.44k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|  1.37k|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.37k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.37k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 42, False: 1.45k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|  1.37k|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  1.37k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|  1.37k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (465:2): [True: 22, False: 1.47k]
  ------------------
  466|  18.7k|	case FR_TYPE_TLV:
  ------------------
  |  Branch (466:2): [True: 46, False: 1.45k]
  ------------------
  467|  1.45k|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (467:2): [True: 38, False: 1.45k]
  ------------------
  468|  1.46k|	case FR_TYPE_VSA:
  ------------------
  |  Branch (468:2): [True: 2, False: 1.49k]
  ------------------
  469|  1.49k|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (469:2): [True: 34, False: 1.46k]
  ------------------
  470|  1.49k|	case FR_TYPE_UNION:
  ------------------
  |  Branch (470:2): [True: 2, False: 1.49k]
  ------------------
  471|  1.49k|		break;
  472|       |
  473|       |		/*
  474|       |		 *	@todo - allow definitions of type 'vendor' only if we need to have different
  475|       |		 *	type_size/length for VSAs or "evs" in the Extended-Attribute space.
  476|       |		 */
  477|      0|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (477:2): [True: 0, False: 1.49k]
  ------------------
  478|      0|		fr_strerror_const("Cannot use data type 'vendor' - use BEGIN-VENDOR instead");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  479|      0|		return -1;
  480|       |
  481|      0|	default:
  ------------------
  |  Branch (481:2): [True: 0, False: 1.49k]
  ------------------
  482|      0|		fr_strerror_printf("Invalid data type '%s'", name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  483|      0|		return -1;
  484|  1.49k|	}
  485|       |
  486|  1.49k|	return dict_attr_type_init(da_p, type);
  487|  1.49k|}
dict_tokenize.c:dict_read_sscanf_i:
  272|  1.29k|{
  273|  1.29k|	int unsigned ret = 0;
  274|  1.29k|	int base = 10;
  275|  1.29k|	char const *tab = "0123456789";
  276|       |
  277|  1.29k|	if ((str[0] == '0') &&
  ------------------
  |  Branch (277:6): [True: 0, False: 1.29k]
  ------------------
  278|      0|	    ((str[1] == 'x') || (str[1] == 'X'))) {
  ------------------
  |  Branch (278:7): [True: 0, False: 0]
  |  Branch (278:26): [True: 0, False: 0]
  ------------------
  279|      0|		tab = "0123456789abcdef";
  280|      0|		base = 16;
  281|       |
  282|      0|		str += 2;
  283|      0|	}
  284|       |
  285|  5.00k|	while (*str) {
  ------------------
  |  Branch (285:9): [True: 3.71k, False: 1.29k]
  ------------------
  286|  3.71k|		char const *c;
  287|       |
  288|  3.71k|		if (*str == '.') break;
  ------------------
  |  Branch (288:7): [True: 0, False: 3.71k]
  ------------------
  289|       |
  290|  3.71k|		c = memchr(tab, tolower((uint8_t)*str), base);
  ------------------
  |  Branch (290:19): [True: 0, False: 0]
  |  Branch (290:19): [True: 0, False: 0]
  |  Branch (290:19): [Folded, False: 3.71k]
  ------------------
  291|  3.71k|		if (!c) return false;
  ------------------
  |  Branch (291:7): [True: 0, False: 3.71k]
  ------------------
  292|       |
  293|  3.71k|		if (ret >= (UINT_MAX / base)) return false;
  ------------------
  |  Branch (293:7): [True: 0, False: 3.71k]
  ------------------
  294|       |
  295|  3.71k|		ret *= base;
  296|  3.71k|		ret += (c - tab);
  297|  3.71k|		str++;
  298|  3.71k|	}
  299|       |
  300|  1.29k|	*pvalue = ret;
  301|  1.29k|	return true;
  302|  1.29k|}
dict_tokenize.c:dict_attr_add_or_fixup:
  957|  1.61k|{
  958|  1.61k|	fr_dict_attr_ext_ref_t	*ref;
  959|  1.61k|	fr_dict_attr_t *da = *da_p;
  960|  1.61k|	int ret = 0;
  961|       |
  962|       |	/*
  963|       |	 *	Check for any references associated with the attribute,
  964|       |	 *	if they're unresolved, then add fixups.
  965|       |	 *
  966|       |	 *	We do this now, as we know the attribute memory chunk
  967|       |	 * 	is stable, and we can safely add the fixups.
  968|       |	 */
  969|  1.61k|	ref = fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_REF);
  970|  1.61k|	if (ref && fr_dict_attr_ref_is_unresolved(ref->type)) {
  ------------------
  |  |   71|     36|#define fr_dict_attr_ref_is_unresolved(_type)	((_type) & FR_DICT_ATTR_REF_UNRESOLVED)
  |  |  ------------------
  |  |  |  Branch (71:47): [True: 2, False: 34]
  |  |  ------------------
  ------------------
  |  Branch (970:6): [True: 36, False: 1.57k]
  ------------------
  971|       |		/*
  972|       |		 *	See if we can immediately apply the ref.
  973|       |		 */
  974|      2|		fr_dict_attr_t const *src;
  975|       |
  976|      2|		switch (fr_dict_attr_ref_type(ref->type)) {
  ------------------
  |  |   72|      2|#define fr_dict_attr_ref_type(_type)		((_type) & ~FR_DICT_ATTR_REF_UNRESOLVED)
  ------------------
  977|      0|		case FR_DICT_ATTR_REF_ALIAS:
  ------------------
  |  Branch (977:3): [True: 0, False: 2]
  ------------------
  978|       |			/*
  979|       |			 *	IF the ref exists, we can always add it.  The ref won't be changed later.
  980|       |			 */
  981|      0|			if (fr_dict_protocol_reference(&src, da->parent, &FR_SBUFF_IN_STR(ref->unresolved)) < 0) return -1;
  ------------------
  |  |  579|      0|#define FR_SBUFF_IN_STR(_start) FR_SBUFF_IN(_start, strlen(_start))
  |  |  ------------------
  |  |  |  |  558|      0|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  |  |  559|      0|((fr_sbuff_t){ \
  |  |  |  |  560|      0|	.buff_i		= _start, \
  |  |  |  |  561|      0|	.start_i	= _Generic((_start), \
  |  |  |  |  562|      0|				char *		: _start, \
  |  |  |  |  563|      0|				char const *	: _start, \
  |  |  |  |  564|      0|				uint8_t *	: _start, \
  |  |  |  |  565|      0|				uint8_t const *	: _start \
  |  |  |  |  566|      0|			), \
  |  |  |  |  567|      0|	.end_i		= _Generic((_len_or_end), \
  |  |  |  |  568|      0|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  569|      0|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  570|      0|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  571|      0|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  572|      0|				char *		: (char const *)(_len_or_end), \
  |  |  |  |  573|      0|				char const *	: (char const *)(_len_or_end) \
  |  |  |  |  574|      0|			), \
  |  |  |  |  575|      0|	.p_i		= _start, \
  |  |  |  |  576|      0|	.is_const	= true, \
  |  |  |  |  577|      0|})
  |  |  ------------------
  ------------------
  |  Branch (981:8): [True: 0, False: 0]
  ------------------
  982|       |
  983|      0|			if (src && (dict_attr_ref_set(*da_p, src, FR_DICT_ATTR_REF_ALIAS) < 0)) return -1;
  ------------------
  |  Branch (983:8): [True: 0, False: 0]
  |  Branch (983:15): [True: 0, False: 0]
  ------------------
  984|       |
  985|      0|			if (fr_dict_attr_add_initialised(da) < 0) {
  ------------------
  |  Branch (985:8): [True: 0, False: 0]
  ------------------
  986|      0|			error:
  987|      0|				talloc_free(da);
  988|      0|				*da_p = NULL;
  989|      0|				return -1;
  990|      0|			}
  991|       |
  992|      0|			if (!src && (dict_fixup_group_enqueue(fixup, da, ref->unresolved) < 0)) return -1;
  ------------------
  |  Branch (992:8): [True: 0, False: 0]
  |  Branch (992:16): [True: 0, False: 0]
  ------------------
  993|      0|			ret = 1;
  994|      0|			break;
  995|       |
  996|      0|		case FR_DICT_ATTR_REF_ENUM:
  ------------------
  |  Branch (996:3): [True: 0, False: 2]
  ------------------
  997|       |			/*
  998|       |			 *	Do NOT copy the enums now.  Later dictionaries may add more values, and we
  999|       |			 *	want to be able to copy all values.
 1000|       |			 */
 1001|      0|			if (fr_dict_attr_add_initialised(da) < 0) goto error;
  ------------------
  |  Branch (1001:8): [True: 0, False: 0]
  ------------------
 1002|       |
 1003|      0|			if (dict_fixup_clone_enum_enqueue(fixup, da, ref->unresolved) < 0) return -1;
  ------------------
  |  Branch (1003:8): [True: 0, False: 0]
  ------------------
 1004|      0|			break;
 1005|       |
 1006|      2|		case FR_DICT_ATTR_REF_CLONE:
  ------------------
  |  Branch (1006:3): [True: 2, False: 0]
  ------------------
 1007|       |			/*
 1008|       |			 *	@todo - if we defer this clone, we get errors loading dictionary.wimax.  That
 1009|       |			 *	likely means there are issues with the dict_fixup_clone_apply() function.
 1010|       |			 */
 1011|      2|			if (fr_dict_protocol_reference(&src, da->parent, &FR_SBUFF_IN_STR(ref->unresolved)) < 0) return -1;
  ------------------
  |  |  579|      2|#define FR_SBUFF_IN_STR(_start) FR_SBUFF_IN(_start, strlen(_start))
  |  |  ------------------
  |  |  |  |  558|      2|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  |  |  559|      2|((fr_sbuff_t){ \
  |  |  |  |  560|      2|	.buff_i		= _start, \
  |  |  |  |  561|      2|	.start_i	= _Generic((_start), \
  |  |  |  |  562|      2|				char *		: _start, \
  |  |  |  |  563|      2|				char const *	: _start, \
  |  |  |  |  564|      2|				uint8_t *	: _start, \
  |  |  |  |  565|      2|				uint8_t const *	: _start \
  |  |  |  |  566|      2|			), \
  |  |  |  |  567|      2|	.end_i		= _Generic((_len_or_end), \
  |  |  |  |  568|      2|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  569|      2|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  570|      2|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  571|      2|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  |  |  572|      2|				char *		: (char const *)(_len_or_end), \
  |  |  |  |  573|      2|				char const *	: (char const *)(_len_or_end) \
  |  |  |  |  574|      2|			), \
  |  |  |  |  575|      2|	.p_i		= _start, \
  |  |  |  |  576|      2|	.is_const	= true, \
  |  |  |  |  577|      2|})
  |  |  ------------------
  ------------------
  |  Branch (1011:8): [True: 0, False: 2]
  ------------------
 1012|      2|			if (src) {
  ------------------
  |  Branch (1012:8): [True: 2, False: 0]
  ------------------
 1013|      2|				if (dict_fixup_clone(da_p, src) < 0) return -1;
  ------------------
  |  Branch (1013:9): [True: 0, False: 2]
  ------------------
 1014|      2|				break;
 1015|      2|			}
 1016|       |
 1017|      0|			if (dict_fixup_clone_enqueue(fixup, da, ref->unresolved) < 0) return -1;
  ------------------
  |  Branch (1017:8): [True: 0, False: 0]
  ------------------
 1018|      0|			ret = 1;
 1019|      0|			break;
 1020|       |
 1021|      0|		default:
  ------------------
  |  Branch (1021:3): [True: 0, False: 2]
  ------------------
 1022|      0|			fr_strerror_const("Unknown reference type");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1023|      0|			return -1;
 1024|      2|		}
 1025|  1.60k|	} else {
 1026|  1.60k|		if (fr_dict_attr_add_initialised(da) < 0) goto error;
  ------------------
  |  Branch (1026:7): [True: 0, False: 1.60k]
  ------------------
 1027|  1.60k|	}
 1028|       |
 1029|  1.61k|	return ret;
 1030|  1.61k|}
dict_tokenize.c:dict_read_process_flags:
 2388|     14|{
 2389|     14|	bool sense = true;
 2390|       |
 2391|     14|	if (argc == 1) {
  ------------------
  |  Branch (2391:6): [True: 14, False: 0]
  ------------------
 2392|     14|		char *p;
 2393|       |
 2394|     14|		p = argv[0];
 2395|     14|		if (*p == '!') {
  ------------------
  |  Branch (2395:7): [True: 0, False: 14]
  ------------------
 2396|      0|			sense = false;
 2397|      0|			p++;
 2398|      0|		}
 2399|       |
 2400|     14|		if (strcmp(p, "internal") == 0) {
  ------------------
  |  Branch (2400:7): [True: 14, False: 0]
  ------------------
 2401|     14|			base_flags->internal = sense;
 2402|     14|			return 0;
 2403|     14|		}
 2404|     14|	}
 2405|       |
 2406|      0|	fr_strerror_const("Invalid FLAGS syntax");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2407|      0|	return -1;
 2408|     14|}
dict_tokenize.c:dict_read_process_member:
 2415|    180|{
 2416|    180|	fr_dict_attr_t		*da = NULL;
 2417|       |
 2418|    180|	if ((argc < 2) || (argc > 3)) {
  ------------------
  |  Branch (2418:6): [True: 0, False: 180]
  |  Branch (2418:20): [True: 0, False: 180]
  ------------------
 2419|      0|		fr_strerror_const("Invalid MEMBER syntax");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2420|      0|		return -1;
 2421|      0|	}
 2422|       |
 2423|    180|	if (CURRENT_FRAME(dctx)->da->type != FR_TYPE_STRUCT) {
  ------------------
  |  |  108|    180|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2423:6): [True: 0, False: 180]
  ------------------
 2424|      0|		fr_strerror_printf("MEMBER can only be used for ATTRIBUTEs of type 'struct', not for data type %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2425|      0|				   fr_type_to_str(CURRENT_FRAME(dctx)->da->type));
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2425|      0|				   fr_type_to_str(CURRENT_FRAME(dctx)->da->type));
 2426|      0|		return -1;
 2427|      0|	}
 2428|       |
 2429|       |	/*
 2430|       |	 *	Check if the parent 'struct' is fixed size.  And if
 2431|       |	 *	so, complain if we're adding a variable sized member.
 2432|       |	 */
 2433|    180|	if (CURRENT_FRAME(dctx)->struct_is_closed) {
  ------------------
  |  |  108|    180|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2433:6): [True: 0, False: 180]
  ------------------
 2434|      0|		fr_strerror_printf("Cannot add MEMBER to 'struct' %s after a variable sized member %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2435|      0|				   CURRENT_FRAME(dctx)->da->name,
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  |  | 2436|      0|				   CURRENT_FRAME(dctx)->struct_is_closed->name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2435|      0|				   CURRENT_FRAME(dctx)->da->name,
 2436|      0|				   CURRENT_FRAME(dctx)->struct_is_closed->name);
 2437|      0|		return -1;
 2438|      0|	}
 2439|       |
 2440|       |	/*
 2441|       |	 *	We don't set the attribute number before parsing the
 2442|       |	 *	type and flags.  The number is chosen internally, and
 2443|       |	 *	no one should depend on it.
 2444|       |	 *
 2445|       |	 *	Although _arguably_, it may be useful to know which
 2446|       |	 *	field this is, 0..N?
 2447|       |	 */
 2448|    180|	if (dict_read_process_common(dctx, &da, CURRENT_FRAME(dctx)->da, argv[0], argv[1],
  ------------------
  |  |  108|    180|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2448:6): [True: 0, False: 180]
  ------------------
 2449|    180|				     (argc > 2) ? argv[2] : NULL, base_flags) < 0) {
  ------------------
  |  Branch (2449:10): [True: 20, False: 160]
  ------------------
 2450|      0|		return -1;
 2451|      0|	}
 2452|       |
 2453|       |#ifdef STATIC_ANALYZER
 2454|       |	if (!dctx->dict) goto error;
 2455|       |#endif
 2456|       |
 2457|       |	/*
 2458|       |	 *	If our parent is a known width struct, then we're
 2459|       |	 *	allowed to be variable width.  The parent might just
 2460|       |	 *	have a "length=16" prefix, which lets its children be
 2461|       |	 *	variable sized.
 2462|       |	 */
 2463|       |
 2464|       |	/*
 2465|       |	 *	Double check any bit field magic
 2466|       |	 */
 2467|    180|	if (CURRENT_FRAME(dctx)->member_num > 0) {
  ------------------
  |  |  108|    180|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2467:6): [True: 142, False: 38]
  ------------------
 2468|    142|		fr_dict_attr_t const *previous;
 2469|       |
 2470|    142|		previous = dict_attr_child_by_num(CURRENT_FRAME(dctx)->da,
  ------------------
  |  |  108|    142|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2471|    142|						  CURRENT_FRAME(dctx)->member_num);
  ------------------
  |  |  108|    142|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2472|       |		/*
 2473|       |		 *	Check that the previous bit field ended on a
 2474|       |		 *	byte boundary.
 2475|       |		 *
 2476|       |		 *	Note that the previous attribute might be a deferred TLV, in which case it doesn't
 2477|       |		 *	exist.  That's fine.
 2478|       |		 */
 2479|    142|		if (previous && da_is_bit_field(previous)) {
  ------------------
  |  |  171|    142|#define da_is_bit_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_BIT_FIELD))
  |  |  ------------------
  |  |  |  Branch (171:31): [True: 94, False: 48]
  |  |  |  Branch (171:53): [True: 92, False: 2]
  |  |  ------------------
  ------------------
  |  Branch (2479:7): [True: 142, False: 0]
  ------------------
 2480|       |			/*
 2481|       |			 *	This attribute is a bit field.  Keep
 2482|       |			 *	track of where in the byte we are
 2483|       |			 *	located.
 2484|       |			 */
 2485|     92|			if (da_is_bit_field(da)) {
  ------------------
  |  |  171|     92|#define da_is_bit_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_BIT_FIELD))
  |  |  ------------------
  |  |  |  Branch (171:31): [True: 88, False: 4]
  |  |  |  Branch (171:53): [True: 88, False: 0]
  |  |  ------------------
  ------------------
 2486|     88|				da->flags.flag_byte_offset = (da->flags.length + previous->flags.flag_byte_offset) & 0x07;
  ------------------
  |  |  157|     88|#define flag_byte_offset type_size
  ------------------
              				da->flags.flag_byte_offset = (da->flags.length + previous->flags.flag_byte_offset) & 0x07;
  ------------------
  |  |  157|     88|#define flag_byte_offset type_size
  ------------------
 2487|       |
 2488|     88|			} else {
 2489|      4|				if (previous->flags.flag_byte_offset != 0) {
  ------------------
  |  |  157|      4|#define flag_byte_offset type_size
  ------------------
  |  Branch (2489:9): [True: 0, False: 4]
  ------------------
 2490|      0|					fr_strerror_printf("Previous bitfield %s did not end on a byte boundary",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2491|      0|							   previous->name);
 2492|      0|				error:
 2493|      0|					talloc_free(da);
 2494|      0|					return -1;
 2495|      0|				}
 2496|      4|			}
 2497|     92|		}
 2498|    142|	}
 2499|       |
 2500|       |	/*
 2501|       |	 *	Ensure that no previous child has "key" or "length" set.
 2502|       |	 */
 2503|    180|	if (da->type == FR_TYPE_TLV) {
  ------------------
  |  Branch (2503:6): [True: 2, False: 178]
  ------------------
 2504|      2|		fr_dict_attr_t const *key;
 2505|      2|		int i;
 2506|       |
 2507|       |		/*
 2508|       |		 *	@todo - cache the key field in the stack frame, so we don't have to loop over the children.
 2509|       |		 */
 2510|      6|		for (i = 1; i <= CURRENT_FRAME(dctx)->member_num; i++) {
  ------------------
  |  |  108|      6|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2510:15): [True: 4, False: 2]
  ------------------
 2511|      4|			key = dict_attr_child_by_num(CURRENT_FRAME(dctx)->da, i);
  ------------------
  |  |  108|      4|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2512|      4|			if (!key) continue; /* really should be WTF? */
  ------------------
  |  Branch (2512:8): [True: 0, False: 4]
  ------------------
 2513|       |
 2514|       |			/*
 2515|       |			 *	@todo - we can allow this if the _rest_ of the struct is fixed size, i.e. if
 2516|       |			 *	there is a key field, and then the union is fixed size.
 2517|       |			 */
 2518|      4|			if (fr_dict_attr_is_key_field(key)) {
  ------------------
  |  |  170|      4|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 0, False: 4]
  |  |  |  Branch (170:63): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2519|      0|				fr_strerror_printf("'struct' %s has a 'key' field %s, and cannot end with a TLV %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2520|      0|						   CURRENT_FRAME(dctx)->da->name, key->name, argv[0]);
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2520|      0|						   CURRENT_FRAME(dctx)->da->name, key->name, argv[0]);
 2521|      0|				goto error;
 2522|      0|			}
 2523|       |
 2524|      4|			if (da_is_length_field(key)) {
  ------------------
  |  |  172|      4|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 0, False: 4]
  |  |  |  Branch (172:57): [True: 0, False: 0]
  |  |  |  Branch (172:104): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2525|      0|				fr_strerror_printf("'struct' %s has a 'length' field %s, and cannot end with a TLV %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2526|      0|						   CURRENT_FRAME(dctx)->da->name, key->name, argv[0]);
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2526|      0|						   CURRENT_FRAME(dctx)->da->name, key->name, argv[0]);
 2527|      0|				goto error;
 2528|      0|			}
 2529|      4|		}
 2530|       |
 2531|       |		/*
 2532|       |		 *      TLVs are variable sized, and close the parent struct.
 2533|       |		 */
 2534|      2|		CURRENT_FRAME(dctx)->struct_is_closed = da;
  ------------------
  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2535|      2|	}
 2536|       |
 2537|       |	/*
 2538|       |	 *      Unions close the parent struct, even if they're fixed size.  For now, the struct to/from
 2539|       |	 *      network code assumes that a union is the last member of a structure.
 2540|       |	 */
 2541|    180|	if (da->type == FR_TYPE_UNION) {
  ------------------
  |  Branch (2541:6): [True: 2, False: 178]
  ------------------
 2542|      2|		CURRENT_FRAME(dctx)->struct_is_closed = da;
  ------------------
  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2543|      2|        }
 2544|       |
 2545|    180|	if (unlikely(dict_attr_num_init(da, CURRENT_FRAME(dctx)->member_num + 1) < 0)) goto error;
  ------------------
  |  |  397|    180|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 180]
  |  |  ------------------
  ------------------
 2546|    180|	if (unlikely(dict_attr_finalise(&da, argv[0]) < 0)) goto error;
  ------------------
  |  |  397|    180|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 180]
  |  |  ------------------
  ------------------
 2547|       |
 2548|       |	/*
 2549|       |	 *	Check to see if this is a duplicate attribute
 2550|       |	 *	and whether we should ignore it or error out...
 2551|       |	 */
 2552|    180|	switch (dict_attr_allow_dup(da)) {
 2553|    180|	case 1:
  ------------------
  |  Branch (2553:2): [True: 180, False: 0]
  ------------------
 2554|    180|		break;
 2555|       |
 2556|      0|	case 0:
  ------------------
  |  Branch (2556:2): [True: 0, False: 180]
  ------------------
 2557|      0|		talloc_free(da);
 2558|      0|		return 0;
 2559|       |
 2560|      0|	default:
  ------------------
  |  Branch (2560:2): [True: 0, False: 180]
  ------------------
 2561|      0|		goto error;
 2562|    180|	}
 2563|       |
 2564|    180|	switch (dict_attr_add_or_fixup(&dctx->fixup, &da)) {
 2565|      0|	default:
  ------------------
  |  Branch (2565:2): [True: 0, False: 180]
  ------------------
 2566|      0|		goto error;
 2567|       |
 2568|      0|	case 1:
  ------------------
  |  Branch (2568:2): [True: 0, False: 180]
  ------------------
 2569|       |		/*
 2570|       |		 *	@todo - a MEMBER can theoretically have a "ref=..", though non currently do.
 2571|       |		 *
 2572|       |		 *	If the ref is deferred, then we cannot finalise the parent struct until we have
 2573|       |		 *	resolved the reference.  But the "finalise struct on fixup" code isn't written.  So
 2574|       |		 *	instead of silently doing the wrong thing, we just return an error.
 2575|       |		 */
 2576|      0|		fr_strerror_printf("Cannot have MEMBER with deferred ref=...");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2577|      0|		return -1;
 2578|       |
 2579|    180|	case 0:
  ------------------
  |  Branch (2579:2): [True: 180, False: 0]
  ------------------
 2580|       |		/*
 2581|       |		 *	New attribute - avoid lots of indentation.
 2582|       |		 */
 2583|    180|		break;
 2584|    180|	}
 2585|       |
 2586|       |	/*
 2587|       |	 *	Check if this MEMBER closes the structure.
 2588|       |	 *
 2589|       |	 *	Close this struct if the child struct is variable sized.  For now, it we only support
 2590|       |	 *	child structs at the end of the parent.
 2591|       |	 *
 2592|       |	 *	The solution is to update the unwind() function to check if the da we've
 2593|       |	 *	unwound to is a struct, and then if so... get the last child, and mark it
 2594|       |	 *	closed.
 2595|       |	 *
 2596|       |	 *	@todo - a MEMBER which is of type 'struct' and has 'clone=foo', we delay the clone
 2597|       |	 *	until after all of the dictionaries have been loaded.  As such, this attribute
 2598|       |	 *	is unknown width, and MUST be at the end of the parent structure.
 2599|       |	 *
 2600|       |	 *	If the cloned MEMBER is in the middle of a structure, then the user will get an opaque
 2601|       |	 *	error.  But that case should be rare.
 2602|       |	 */
 2603|    180|	if (!da->flags.is_known_width) {
  ------------------
  |  Branch (2603:6): [True: 6, False: 174]
  ------------------
 2604|       |		/*
 2605|       |		 *	The child is unknown width, but we were told that the parent has known width.
 2606|       |		 *	That's an error.
 2607|       |		 */
 2608|      6|		if (CURRENT_FRAME(dctx)->da->flags.length) {
  ------------------
  |  |  108|      6|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2608:7): [True: 0, False: 6]
  ------------------
 2609|      0|			fr_strerror_printf("'struct' %s has fixed size %u, but member %s is of unknown size",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2610|      0|					   CURRENT_FRAME(dctx)->da->name, CURRENT_FRAME(dctx)->da->flags.length,
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  |  |               					   CURRENT_FRAME(dctx)->da->name, CURRENT_FRAME(dctx)->da->flags.length,
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  |  | 2611|      0|					   argv[0]);
  |  |  ------------------
  ------------------
 2610|      0|					   CURRENT_FRAME(dctx)->da->name, CURRENT_FRAME(dctx)->da->flags.length,
 2611|      0|					   argv[0]);
 2612|      0|			return -1;
 2613|      0|		}
 2614|       |
 2615|       |		/*
 2616|       |		 *	Mark the structure as closed by this attribute.  And then set the size to
 2617|       |		 *	zero, for "unknown size".
 2618|       |		 */
 2619|      6|		CURRENT_FRAME(dctx)->struct_is_closed = da;
  ------------------
  |  |  108|      6|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2620|      6|		CURRENT_FRAME(dctx)->struct_size = 0;
  ------------------
  |  |  108|      6|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2621|       |
 2622|       |		/*
 2623|       |		 *	A 'struct' can have a MEMBER of type 'tlv', but ONLY
 2624|       |		 *	as the last entry in the 'struct'.  If we see that,
 2625|       |		 *	set the previous attribute to the TLV we just added.
 2626|       |		 *	This allows the children of the TLV to be parsed as
 2627|       |		 *	partial OIDs, so we don't need to know the full path
 2628|       |		 *	to them.
 2629|       |		 */
 2630|      6|		if (da->type == FR_TYPE_TLV) {
  ------------------
  |  Branch (2630:7): [True: 2, False: 4]
  ------------------
 2631|      2|			dctx->relative_attr = da;
 2632|      2|			if (dict_dctx_push(dctx, dctx->relative_attr, NEST_NONE) < 0) return -1;
  ------------------
  |  Branch (2632:8): [True: 0, False: 2]
  ------------------
 2633|      2|		}
 2634|       |
 2635|    174|	} else if (CURRENT_FRAME(dctx)->da->flags.length) {
  ------------------
  |  |  108|    174|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2635:13): [True: 0, False: 174]
  ------------------
 2636|       |		/*
 2637|       |		 *	The parent is fixed size, so we track the length of the children.
 2638|       |		 */
 2639|      0|		CURRENT_FRAME(dctx)->struct_size += da->flags.length;
  ------------------
  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2640|       |
 2641|       |		/*
 2642|       |		 *	Adding this child may result in an overflow, so we check that.
 2643|       |		 */
 2644|      0|		if (CURRENT_FRAME(dctx)->struct_size > CURRENT_FRAME(dctx)->da->flags.length) {
  ------------------
  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
              		if (CURRENT_FRAME(dctx)->struct_size > CURRENT_FRAME(dctx)->da->flags.length) {
  ------------------
  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2644:7): [True: 0, False: 0]
  ------------------
 2645|      0|			fr_strerror_printf("'struct' %s has fixed size %u, but member %s overflows that length",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2646|      0|					   CURRENT_FRAME(dctx)->da->name, CURRENT_FRAME(dctx)->da->flags.length,
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  |  |               					   CURRENT_FRAME(dctx)->da->name, CURRENT_FRAME(dctx)->da->flags.length,
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  |  | 2647|      0|					   argv[0]);
  |  |  ------------------
  ------------------
 2646|      0|					   CURRENT_FRAME(dctx)->da->name, CURRENT_FRAME(dctx)->da->flags.length,
 2647|      0|					   argv[0]);
 2648|      0|			return -1;
 2649|      0|		}
 2650|      0|	}
 2651|       |
 2652|       |	/*
 2653|       |	 *	Now that we know everything is OK, we can increase the number.
 2654|       |	 */
 2655|    180|	CURRENT_FRAME(dctx)->member_num++;
  ------------------
  |  |  108|    180|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2656|       |
 2657|       |	/*
 2658|       |	 *	Set or clear the attribute for VALUE statements.
 2659|       |	 */
 2660|    180|	return dict_set_value_attr(dctx, da);
 2661|    180|}
dict_tokenize.c:dict_read_process_common:
 1157|  1.61k|{
 1158|  1.61k|	fr_dict_attr_t *da, *to_free = NULL;
 1159|  1.61k|	size_t len;
 1160|       |
 1161|       |	/*
 1162|       |	 *	Dictionaries need to have real names, not v3-style ones "Attr-#".  And not ones which are
 1163|       |	 *	solely numerical.
 1164|       |	 */
 1165|  1.61k|	if (strncmp(name, "Attr-", 5) == 0) {
  ------------------
  |  Branch (1165:6): [True: 0, False: 1.61k]
  ------------------
 1166|      0|		fr_strerror_const("Invalid name - 'Attr-' is an invalid name");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1167|      0|		return -1;
 1168|      0|	}
 1169|       |
 1170|  1.61k|	len = strlen(name);
 1171|  1.61k|	if (fr_sbuff_adv_past_allowed( &FR_SBUFF_IN(name, len), SIZE_MAX, sbuff_char_class_int, NULL) == len) {
  ------------------
  |  |  558|  1.61k|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  559|  1.61k|((fr_sbuff_t){ \
  |  |  560|  1.61k|	.buff_i		= _start, \
  |  |  561|  1.61k|	.start_i	= _Generic((_start), \
  |  |  562|  1.61k|				char *		: _start, \
  |  |  563|  1.61k|				char const *	: _start, \
  |  |  564|  1.61k|				uint8_t *	: _start, \
  |  |  565|  1.61k|				uint8_t const *	: _start \
  |  |  566|  1.61k|			), \
  |  |  567|  1.61k|	.end_i		= _Generic((_len_or_end), \
  |  |  568|  1.61k|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  569|  1.61k|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  570|  1.61k|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  571|  1.61k|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  572|  1.61k|				char *		: (char const *)(_len_or_end), \
  |  |  573|  1.61k|				char const *	: (char const *)(_len_or_end) \
  |  |  574|  1.61k|			), \
  |  |  575|  1.61k|	.p_i		= _start, \
  |  |  576|  1.61k|	.is_const	= true, \
  |  |  577|  1.61k|})
  ------------------
  |  Branch (1171:6): [True: 0, False: 1.61k]
  ------------------
 1172|      0|		fr_strerror_printf("Invalid attribute name '%s' - the name cannot be an integer", name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1173|      0|		return -1;
 1174|      0|	}
 1175|       |
 1176|       |	/*
 1177|       |	 *	Allocate the attribute here, and then fill in the fields
 1178|       |	 *	as we start parsing the various elements of the definition.
 1179|       |	 */
 1180|  1.61k|	if (!*da_p) {
  ------------------
  |  Branch (1180:6): [True: 180, False: 1.43k]
  ------------------
 1181|    180|		da = dict_attr_alloc_null(dctx->dict->pool, dctx->dict->proto);
 1182|    180|		if (unlikely(!da)) return -1;
  ------------------
  |  |  397|    180|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 180]
  |  |  ------------------
  ------------------
 1183|    180|		to_free = da;
 1184|       |
 1185|  1.43k|	} else {
 1186|  1.43k|		da = *da_p;
 1187|  1.43k|	}
 1188|  1.61k|	dict_attr_location_set(dctx, da);
 1189|  1.61k|	da->dict = dctx->dict;
 1190|       |
 1191|       |	/*
 1192|       |	 *	Set some fields to be friendlier to the type / flag
 1193|       |	 *	parsing and validation routines.
 1194|       |	 */
 1195|  1.61k|	da->parent = parent;
 1196|  1.61k|	da->name = name;
 1197|       |
 1198|       |	/*
 1199|       |	 *	Set the attribute flags from the base flags.
 1200|       |	 */
 1201|  1.61k|	memcpy(&da->flags, base_flags, sizeof(da->flags));
 1202|       |
 1203|  1.61k|	if (unlikely(strcmp(type_name, "auto") == 0)) {
  ------------------
  |  |  397|  1.61k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 2, False: 1.60k]
  |  |  ------------------
  ------------------
 1204|      2|		fr_dict_attr_t const *src;
 1205|      2|		char const *p, *end;
 1206|       |
 1207|      2|		if (!flag_name || !(p = strstr(flag_name, "clone="))) {
  ------------------
  |  Branch (1207:7): [True: 0, False: 2]
  |  Branch (1207:21): [True: 0, False: 2]
  ------------------
 1208|      0|			fr_strerror_const("Data type of 'auto' is missing the required flag 'clone=...'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1209|      0|			goto error;
 1210|      0|		}
 1211|       |
 1212|      2|		p += 6;
 1213|     10|		for (end = p; *end != '\0'; end++) {
  ------------------
  |  Branch (1213:17): [True: 8, False: 2]
  ------------------
 1214|      8|			if (*end == ',') break;
  ------------------
  |  Branch (1214:8): [True: 0, False: 8]
  ------------------
 1215|      8|		}
 1216|       |
 1217|      2|		if (fr_dict_protocol_reference(&src, parent, &FR_SBUFF_IN(p, end)) < 0) goto error;
  ------------------
  |  |  558|      2|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  559|      2|((fr_sbuff_t){ \
  |  |  560|      2|	.buff_i		= _start, \
  |  |  561|      2|	.start_i	= _Generic((_start), \
  |  |  562|      2|				char *		: _start, \
  |  |  563|      2|				char const *	: _start, \
  |  |  564|      2|				uint8_t *	: _start, \
  |  |  565|      2|				uint8_t const *	: _start \
  |  |  566|      2|			), \
  |  |  567|      2|	.end_i		= _Generic((_len_or_end), \
  |  |  568|      2|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  569|      2|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  570|      2|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  571|      2|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  572|      2|				char *		: (char const *)(_len_or_end), \
  |  |  573|      2|				char const *	: (char const *)(_len_or_end) \
  |  |  574|      2|			), \
  |  |  575|      2|	.p_i		= _start, \
  |  |  576|      2|	.is_const	= true, \
  |  |  577|      2|})
  ------------------
  |  Branch (1217:7): [True: 0, False: 2]
  ------------------
 1218|      2|		if (!src) {
  ------------------
  |  Branch (1218:7): [True: 0, False: 2]
  ------------------
 1219|      0|			fr_strerror_const("Data type 'auto' requires that the 'clone=...' reference points to an attribute which already exists");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1220|      0|			goto error;
 1221|      0|		}
 1222|       |
 1223|       |		/*
 1224|       |		 *	Don't copy the source yet, as later things may add enums, children, etc. to the source
 1225|       |		 *	attribute.  Instead, we just copy the data type.
 1226|       |		 */
 1227|      2|		if (dict_attr_type_init(&da, src->type) < 0) goto error;
  ------------------
  |  Branch (1227:7): [True: 0, False: 2]
  ------------------
 1228|       |
 1229|  1.60k|	} else {
 1230|       |		/*
 1231|       |		 *	Set the base type of the attribute.
 1232|       |		 */
 1233|  1.60k|		if (dict_process_type_field(dctx, type_name, &da) < 0) {
  ------------------
  |  Branch (1233:7): [True: 0, False: 1.60k]
  ------------------
 1234|      0|		error:
 1235|      0|			if (da == to_free) talloc_free(to_free);
  ------------------
  |  Branch (1235:8): [True: 0, False: 0]
  ------------------
 1236|      0|			return -1;
 1237|      0|		}
 1238|  1.60k|	}
 1239|       |
 1240|       |	/*
 1241|       |	 *	Clear the temporary parent pointer.
 1242|       |	 */
 1243|  1.61k|	da->parent = NULL;
 1244|  1.61k|	if (unlikely(dict_attr_parent_init(&da, parent) < 0)) goto error;
  ------------------
  |  |  397|  1.61k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.61k]
  |  |  ------------------
  ------------------
 1245|       |
 1246|       |	/*
 1247|       |	 *	Parse optional flags.  We pass in the partially allocated
 1248|       |	 *	attribute so that flags can be set directly.
 1249|       |	 *
 1250|       |	 *	Where flags contain variable length fields, this is
 1251|       |	 *	significantly easier than populating a temporary struct.
 1252|       |	 */
 1253|  1.61k|	if (flag_name) if (dict_process_flag_field(dctx, flag_name, &da) < 0) goto error;
  ------------------
  |  Branch (1253:6): [True: 178, False: 1.43k]
  |  Branch (1253:21): [True: 0, False: 178]
  ------------------
 1254|       |
 1255|  1.61k|	da->name = NULL;	/* the real name will be a talloc'd chunk */
 1256|       |
 1257|  1.61k|	*da_p = da;
 1258|  1.61k|	return 0;
 1259|  1.61k|}
dict_tokenize.c:dict_process_flag_field:
  836|    178|{
  837|    178|	static fr_dict_flag_parser_t dict_common_flags[] = {
  838|    178|		{ L("array"),		{ .func = dict_flag_array } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  839|    178|		{ L("clone"),		{ .func = dict_flag_clone, .needs_value = true } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  840|    178|		{ L("counter"), 	{ .func = dict_flag_counter } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  841|    178|		{ L("enum"),		{ .func = dict_flag_enum, .needs_value = true } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  842|    178|		{ L("flat"),		{ .func = dict_flag_flat } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  843|    178|		{ L("internal"),	{ .func = dict_flag_internal } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  844|    178|		{ L("key"), 		{ .func = dict_flag_key } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  845|    178|		{ L("length"), 		{ .func = dict_flag_length, .needs_value = true } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  846|    178|		{ L("offset"), 		{ .func = dict_flag_offset, .needs_value = true } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  847|    178|		{ L("precision"),	{ .func = dict_flag_precision, .needs_value = true } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  848|    178|		{ L("ref"),		{ .func = dict_flag_ref, .needs_value = true } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  849|    178|		{ L("secret"), 		{ .func = dict_flag_secret } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  850|    178|		{ L("subtype"),		{ .func = dict_flag_subtype, .needs_value = true } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  851|    178|		{ L("unsafe"), 		{ .func = dict_flag_unsafe } },
  ------------------
  |  |  228|    178|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  852|    178|	};
  853|    178|	static size_t dict_common_flags_len = NUM_ELEMENTS(dict_common_flags);
  ------------------
  |  |  358|    178|#define NUM_ELEMENTS(_t) (sizeof((_t)) / sizeof((_t)[0]))
  ------------------
  854|       |
  855|    178|	char *p, *next = NULL;
  856|       |
  857|    178|	if ((*da_p)->type == FR_TYPE_NULL) {
  ------------------
  |  Branch (857:6): [True: 0, False: 178]
  ------------------
  858|      0|		fr_strerror_const("Type must be specified before parsing flags");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  859|      0|		return -1;
  860|      0|	}
  861|       |
  862|    378|	for (p = name; p && *p != '\0' ; p = next) {
  ------------------
  |  Branch (862:17): [True: 378, False: 0]
  |  Branch (862:22): [True: 200, False: 178]
  ------------------
  863|    200|		char *key, *value;
  864|    200|		fr_dict_flag_parser_rule_t const *parser;
  865|       |
  866|    200|		key = p;
  867|       |
  868|       |		/*
  869|       |		 *	Search for the first '=' or ','
  870|       |		 */
  871|  1.19k|		for (next = p + 1; *next && (*next != '=') && (*next != ','); next++) {
  ------------------
  |  Branch (871:22): [True: 1.04k, False: 150]
  |  Branch (871:31): [True: 1.01k, False: 34]
  |  Branch (871:49): [True: 994, False: 16]
  ------------------
  872|       |			/* do nothing */
  873|    994|		}
  874|       |
  875|       |		/*
  876|       |		 *	We have a value, zero out the '=' and point to the value.
  877|       |		 */
  878|    200|		if (*next == '=') {
  ------------------
  |  Branch (878:7): [True: 34, False: 166]
  ------------------
  879|     34|			*(next++) = '\0';
  880|     34|			value = next;
  881|       |
  882|     34|			if (!*value || (*value == ',')) {
  ------------------
  |  Branch (882:8): [True: 0, False: 34]
  |  Branch (882:19): [True: 0, False: 34]
  ------------------
  883|      0|				fr_strerror_printf("Missing value after '%s='", key);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  884|      0|				return -1;
  885|      0|			}
  886|    166|		} else {
  887|    166|			value = NULL;
  888|    166|		}
  889|       |
  890|       |		/*
  891|       |		 *	Skip any trailing text in the value.
  892|       |		 */
  893|    436|		for (/* nothing */; *next; next++) {
  ------------------
  |  Branch (893:23): [True: 258, False: 178]
  ------------------
  894|    258|			if (*next == ',') {
  ------------------
  |  Branch (894:8): [True: 22, False: 236]
  ------------------
  895|     22|				*(next++) = '\0';
  896|     22|				break;
  897|     22|			}
  898|    258|		}
  899|       |
  900|       |		/*
  901|       |		 *	Search the protocol table, then the main table.
  902|       |		 *	This allows protocols to overload common flags.
  903|       |		 */
  904|    200|		if (!((dctx->dict->proto->attr.flags.table &&
  ------------------
  |  Branch (904:10): [True: 158, False: 42]
  ------------------
  905|    158|		       fr_dict_attr_flag_to_parser(&parser, dctx->dict->proto->attr.flags.table,
  ------------------
  |  Branch (905:10): [True: 36, False: 122]
  ------------------
  906|    158|						   dctx->dict->proto->attr.flags.table_len, key, NULL)) ||
  907|    164|		       fr_dict_attr_flag_to_parser(&parser, dict_common_flags, dict_common_flags_len, key, NULL))) {
  ------------------
  |  Branch (907:10): [True: 164, False: 0]
  ------------------
  908|      0|			fr_strerror_printf("Unknown flag '%s'", key);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  909|      0|			return -1;
  910|      0|		}
  911|       |
  912|    200|		if (parser->needs_value && !value) {
  ------------------
  |  Branch (912:7): [True: 28, False: 172]
  |  Branch (912:30): [True: 0, False: 28]
  ------------------
  913|      0|			fr_strerror_printf("Flag '%s' requires a value", key);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  914|      0|			return -1;
  915|      0|		}
  916|       |
  917|    200|		if (unlikely(parser->func(da_p, value, parser) < 0)) return -1;
  ------------------
  |  |  397|    200|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 200]
  |  |  ------------------
  ------------------
  918|    200|	}
  919|       |
  920|       |	/*
  921|       |	 *	Don't check the flags field for validity via
  922|       |	 *	dict_attr_flags_valid().  It may be updated by various
  923|       |	 *	protocol-specific callback functions.  And,
  924|       |	 *	fr_dict_attr_add() calls dict_attr_flags_valid() anyways.
  925|       |	 */
  926|       |
  927|    178|	return 0;
  928|    178|}
dict_tokenize.c:dict_flag_array:
  495|    114|static int dict_flag_##_name(fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)\
  496|    114|{ \
  497|    114|	(*da_p)->flags._name = 1; \
  498|    114|	return 0; \
  499|    114|}
dict_tokenize.c:dict_flag_clone:
  504|      2|{
  505|       |	/*
  506|       |	 *	Clone has a limited scope.
  507|       |	 */
  508|      2|	switch ((*da_p)->type) {
  509|      0|	case FR_TYPE_LEAF:
  ------------------
  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|      0|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|      0|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|      0|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|      0|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|      0|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|      0|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|      0|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|      0|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|      0|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|      0|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|      0|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|      0|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|      0|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|      0|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|      0|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|      0|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|      0|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|      0|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|      0|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|      0|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|      0|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|      0|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|      0|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|      0|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|      0|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (509:2): [True: 0, False: 2]
  ------------------
  510|      0|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (510:2): [True: 0, False: 2]
  ------------------
  511|      2|	case FR_TYPE_TLV:
  ------------------
  |  Branch (511:2): [True: 2, False: 0]
  ------------------
  512|      2|		break;
  513|       |
  514|      0|	default:
  ------------------
  |  Branch (514:2): [True: 0, False: 2]
  ------------------
  515|      0|		fr_strerror_printf("Attributes of data type '%s' cannot use 'clone=...'", fr_type_to_str((*da_p)->type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  516|      0|		return -1;
  517|      2|	}
  518|       |
  519|       |	/*
  520|       |	 *	Allow cloning of any types, so long as
  521|       |	 *	the types are the same.  We do the checks later.
  522|       |	 */
  523|      2|	if (unlikely(dict_attr_ref_aunresolved(da_p, value, FR_DICT_ATTR_REF_CLONE) < 0)) return -1;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  524|       |
  525|       |	/*
  526|       |	 *	We don't know how big the cloned reference is, so it isn't known width.
  527|       |	 */
  528|      2|	(*da_p)->flags.is_known_width = 0;
  529|       |
  530|      2|	return 0;
  531|      2|}
dict_tokenize.c:dict_flag_flat:
  562|      2|{
  563|      2|	if ((*da_p)->type != FR_TYPE_GROUP) {
  ------------------
  |  Branch (563:6): [True: 0, False: 2]
  ------------------
  564|      0|		fr_strerror_const("'flat' flag can only be used for data type 'group'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  565|      0|		return -1;
  566|      0|	}
  567|       |
  568|      2|	if (!(*da_p)->flags.internal) {
  ------------------
  |  Branch (568:6): [True: 0, False: 2]
  ------------------
  569|      0|		fr_strerror_const("'flat' flag can only be used for 'internal' attributes");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  570|      0|		return -1;
  571|      0|	}
  572|       |
  573|      2|	(*da_p)->flags.allow_flat = true;
  574|       |
  575|      2|	return 0;
  576|      2|}
dict_tokenize.c:dict_flag_key:
  581|      4|{
  582|      4|	fr_dict_attr_t *da = *da_p;
  583|      4|	fr_dict_attr_t const *key;
  584|      4|	fr_dict_attr_ext_ref_t *ext;
  585|       |
  586|      4|	if (fr_type_is_leaf(da->type)) {
  ------------------
  |  |  393|      4|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 2, False: 2]
  |  |  ------------------
  ------------------
  587|      2|		if (value) {
  ------------------
  |  Branch (587:7): [True: 0, False: 2]
  ------------------
  588|      0|			fr_strerror_const("Attributes defining a 'key' field cannot specify a key reference");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  589|      0|			return -1;
  590|      0|		}
  591|       |
  592|      2|		if ((da->type != FR_TYPE_UINT8) && (da->type != FR_TYPE_UINT16) && (da->type != FR_TYPE_UINT32)) {
  ------------------
  |  Branch (592:7): [True: 0, False: 2]
  |  Branch (592:38): [True: 0, False: 0]
  |  Branch (592:70): [True: 0, False: 0]
  ------------------
  593|      0|			fr_strerror_const("The 'key' flag can only be used for attributes of type 'uint8', 'uint16', or 'uint32'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  594|      0|			return -1;
  595|      0|		}
  596|       |
  597|      2|		if (da->flags.extra) {
  ------------------
  |  Branch (597:7): [True: 0, False: 2]
  ------------------
  598|      0|			fr_strerror_const("Bit fields cannot be key fields");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  599|      0|			return -1;
  600|      0|		}
  601|       |
  602|      2|		da->flags.extra = 1;
  603|      2|		da->flags.subtype = FLAG_KEY_FIELD;
  604|      2|		return 0;
  605|      2|	}
  606|       |
  607|      2|	if (da->type != FR_TYPE_UNION) {
  ------------------
  |  Branch (607:6): [True: 0, False: 2]
  ------------------
  608|      0|		fr_strerror_printf("Attributes of type '%s' cannot define a 'key' reference", fr_type_to_str(da->type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  609|      0|		return -1;
  610|      0|	}
  611|       |
  612|      2|	if (!value) {
  ------------------
  |  Branch (612:6): [True: 0, False: 2]
  ------------------
  613|      0|		fr_strerror_const("Missing reference for 'key=...'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  614|      0|		return -1;
  615|      0|	}
  616|       |
  617|       |	/*
  618|       |	 *	The reference must be to a sibling, which is marked "is key".
  619|       |	 */
  620|      2|	key = fr_dict_attr_by_name(NULL, da->parent, value);
  621|      2|	if (!key) {
  ------------------
  |  Branch (621:6): [True: 0, False: 2]
  ------------------
  622|      0|		fr_strerror_printf("Invalid reference for 'key=...'.  Parent %s does not have a child attribute named %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  623|      0|				   da->parent->name, value);
  624|      0|		return -1;
  625|      0|	}
  626|       |
  627|      2|	if (da->parent != key->parent) {
  ------------------
  |  Branch (627:6): [True: 0, False: 2]
  ------------------
  628|      0|		fr_strerror_printf("Invalid reference for 'key=...'.  Reference %s does not share a common parent",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  629|      0|				   value);
  630|      0|		return -1;
  631|      0|	}
  632|       |
  633|      2|	if (!fr_dict_attr_is_key_field(key)) {
  ------------------
  |  |  170|      2|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 2, False: 0]
  |  |  |  Branch (170:63): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  634|      0|		fr_strerror_printf("Invalid reference for 'key=...'.  Reference %s is not a 'key' field",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  635|      0|				   value);
  636|      0|		return -1;
  637|      0|	}
  638|       |
  639|       |	/*
  640|       |	 *	Allocate the ref and save the value.  This link exists solely so that the children of the
  641|       |	 *	UNION can easily find the key field of the parent STRUCT.
  642|       |	 */
  643|      2|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_KEY);
  644|      2|	if (ext) {
  ------------------
  |  Branch (644:6): [True: 0, False: 2]
  ------------------
  645|      0|		fr_strerror_printf("Attribute already has a 'key=...' defined");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  646|      0|		return -1;
  647|      0|	}
  648|       |
  649|      2|	ext = dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_KEY); /* can change da_p */
  650|      2|	if (unlikely(!ext)) return -1;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  651|       |
  652|      2|	ext->type = FR_DICT_ATTR_REF_KEY;
  653|      2|	ext->ref = key;
  654|       |
  655|      2|	return 0;
  656|      2|}
dict_tokenize.c:dict_flag_length:
  659|      4|{
  660|      4|	fr_dict_attr_t *da = *da_p;
  661|       |
  662|      4|	if (strcmp(value, "uint8") == 0) {
  ------------------
  |  Branch (662:6): [True: 4, False: 0]
  ------------------
  663|      4|		da->flags.is_known_width = true;
  664|      4|		da->flags.extra = 1;
  665|      4|		da->flags.subtype = FLAG_LENGTH_UINT8;
  666|       |
  667|      4|	} else if (strcmp(value, "uint16") == 0) {
  ------------------
  |  Branch (667:13): [True: 0, False: 0]
  ------------------
  668|      0|		da->flags.is_known_width = true;
  669|      0|		da->flags.extra = 1;
  670|      0|		da->flags.subtype = FLAG_LENGTH_UINT16;
  671|       |
  672|      0|	} else {
  673|      0|		fr_strerror_const("Invalid value given for the 'length' flag");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  674|      0|		return -1;
  675|      0|	}
  676|      4|	da->flags.type_size = 0;
  677|       |
  678|      4|	return 0;
  679|      4|}
dict_tokenize.c:dict_flag_precision:
  707|     22|{
  708|     22|	fr_dict_attr_t *da = *da_p;
  709|     22|	int precision;
  710|       |
  711|     22|	switch (da->type) {
  712|      0|	case FR_TYPE_DATE:
  ------------------
  |  Branch (712:2): [True: 0, False: 22]
  ------------------
  713|     22|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (713:2): [True: 22, False: 0]
  ------------------
  714|     22|		break;
  715|       |
  716|      0|	default:
  ------------------
  |  Branch (716:2): [True: 0, False: 22]
  ------------------
  717|      0|		fr_strerror_const("The 'precision' flag can only be used with data types 'date' or 'time'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  718|      0|		return -1;
  719|     22|	}
  720|       |
  721|     22|	precision = fr_table_value_by_str(fr_time_precision_table, value, -1);
  ------------------
  |  |  653|     22|#define fr_table_value_by_str(_table, _name, _def) \
  |  |  654|     22|_Generic((_table), \
  |  |  655|     22|	 fr_table_num_sorted_t const *		: fr_table_sorted_num_by_str,			\
  |  |  656|     22|	 fr_table_num_ordered_t const *		: fr_table_ordered_num_by_str,			\
  |  |  657|     22|	 fr_table_num_sorted_t *		: fr_table_sorted_num_by_str,			\
  |  |  658|     22|	 fr_table_num_ordered_t *		: fr_table_ordered_num_by_str,			\
  |  |  659|     22|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_ptr_by_str,			\
  |  |  660|     22|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_ptr_by_str,			\
  |  |  661|     22|	 fr_table_ptr_sorted_t *		: fr_table_sorted_ptr_by_str,			\
  |  |  662|     22|	 fr_table_ptr_ordered_t *		: fr_table_ordered_ptr_by_str,			\
  |  |  663|     22|	 fr_table_num_indexed_bit_pos_t *	: fr_table_ordered_num_by_str,			\
  |  |  664|     22|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_ordered_num_by_str,			\
  |  |  665|     22|	 fr_table_num_indexed_t *		: fr_table_ordered_num_by_str,			\
  |  |  666|     22|	 fr_table_num_indexed_t const *		: fr_table_ordered_num_by_str			\
  |  |  667|     22|)(_table, _table ## _len, _name, _def)
  ------------------
  722|     22|	if (precision < 0) {
  ------------------
  |  Branch (722:6): [True: 0, False: 22]
  ------------------
  723|      0|		fr_strerror_printf("Unknown %s precision '%s'", fr_type_to_str(da->type), value);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  724|      0|		return -1;
  725|      0|	}
  726|     22|	da->flags.flag_time_res = precision;
  ------------------
  |  |  156|     22|#define flag_time_res type_size
  ------------------
  727|       |
  728|     22|	return 0;
  729|     22|}
dict_tokenize.c:dict_flag_secret:
  752|     12|{
  753|     12|	fr_dict_attr_t *da = *da_p;
  754|       |
  755|     12|	da->flags.secret = 1;
  756|       |
  757|     12|	if ((da->type != FR_TYPE_STRING) && (da->type != FR_TYPE_OCTETS)) {
  ------------------
  |  Branch (757:6): [True: 6, False: 6]
  |  Branch (757:38): [True: 0, False: 6]
  ------------------
  758|      0|		fr_strerror_const("The 'secret' flag can only be used with data types 'string' or 'octets'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  759|      0|		return -1;
  760|      0|	}
  761|       |
  762|     12|	return 0;
  763|     12|}
dict_tokenize.c:dict_flag_unsafe:
  495|      4|static int dict_flag_##_name(fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)\
  496|      4|{ \
  497|      4|	(*da_p)->flags._name = 1; \
  498|      4|	return 0; \
  499|      4|}
dict_tokenize.c:dict_attr_allow_dup:
 1040|  1.61k|{
 1041|  1.61k|	fr_dict_attr_t const *dup_name = NULL;
 1042|  1.61k|	fr_dict_attr_t const *dup_num = NULL;
 1043|  1.61k|	fr_dict_attr_t const *found;
 1044|       |
 1045|       |	/*
 1046|       |	 *	Search in the parent for a duplicate by name and then by num
 1047|       |	 */
 1048|  1.61k|	if (!da->parent) return 1;	/* no parent no conflicts possible */
  ------------------
  |  Branch (1048:6): [True: 0, False: 1.61k]
  ------------------
 1049|       |
 1050|  1.61k|	dup_name = fr_dict_attr_by_name(NULL, da->parent, da->name);
 1051|  1.61k|	if (!da->flags.name_only) dup_num = fr_dict_attr_child_by_num(da->parent, da->attr);
  ------------------
  |  Branch (1051:6): [True: 1.61k, False: 0]
  ------------------
 1052|       |
 1053|       |	/*
 1054|       |	 *	Not a duplicate...
 1055|       |	 */
 1056|  1.61k|	if (!dup_name && !dup_num) return 1;
  ------------------
  |  Branch (1056:6): [True: 1.61k, False: 0]
  |  Branch (1056:19): [True: 1.61k, False: 0]
  ------------------
 1057|       |
 1058|      0|	found = dup_name ? dup_name : dup_num;
  ------------------
  |  Branch (1058:10): [True: 0, False: 0]
  ------------------
 1059|       |
 1060|      0|	switch (da->type) {
 1061|       |	/*
 1062|       |	 *	For certain types, we allow strict duplicates as if
 1063|       |	 *	the user wants to add extra children in the custom
 1064|       |	 *	dictionary, or wants to avoid ordering issues between
 1065|       |	 *	multiple dictionaries, we need to support this.
 1066|       |	 */
 1067|      0|	case FR_TYPE_VSA:
  ------------------
  |  Branch (1067:2): [True: 0, False: 0]
  ------------------
 1068|      0|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (1068:2): [True: 0, False: 0]
  ------------------
 1069|      0|	case FR_TYPE_TLV:
  ------------------
  |  Branch (1069:2): [True: 0, False: 0]
  ------------------
 1070|      0|		if (fr_dict_attr_cmp_fields(da, found) == 0) return 0;
  ------------------
  |  Branch (1070:7): [True: 0, False: 0]
  ------------------
 1071|      0|		break;
 1072|       |
 1073|      0|	case FR_TYPE_LEAF:
  ------------------
  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|      0|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|      0|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|      0|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|      0|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|      0|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|      0|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|      0|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|      0|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|      0|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|      0|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|      0|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|      0|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|      0|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|      0|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|      0|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|      0|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|      0|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|      0|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|      0|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|      0|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|      0|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|      0|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|      0|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|      0|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|      0|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1073:2): [True: 0, False: 0]
  ------------------
 1074|       |		/*
 1075|       |		 *	Leaf types can be duplicated if they are identical.
 1076|       |		 */
 1077|      0|		if ((da->type == found->type) &&
  ------------------
  |  Branch (1077:7): [True: 0, False: 0]
  ------------------
 1078|      0|		    (fr_dict_attr_cmp_fields(da, found) == 0)) return 0;
  ------------------
  |  Branch (1078:7): [True: 0, False: 0]
  ------------------
 1079|      0|		break;
 1080|       |
 1081|      0|	default:
  ------------------
  |  Branch (1081:2): [True: 0, False: 0]
  ------------------
 1082|      0|		break;
 1083|      0|	}
 1084|       |
 1085|      0|	if (dup_name) {
  ------------------
  |  Branch (1085:6): [True: 0, False: 0]
  ------------------
 1086|      0|		fr_strerror_printf("Duplicate attribute name '%s' in namespace '%s'.  Originally defined %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1087|      0|				   da->name, da->parent->name, dup_name->filename, dup_name->line);
 1088|      0|		return -1;
 1089|      0|	}
 1090|       |
 1091|      0|	fr_strerror_printf("Duplicate attribute number %u in parent '%s'.  Originally defined %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1092|      0|				da->attr, da->parent->name, dup_num->filename, dup_num->line);
 1093|      0|	return -1;
 1094|      0|}
dict_tokenize.c:dict_set_value_attr:
 1132|    180|{
 1133|       |	/*
 1134|       |	 *	Adding an attribute of type 'struct' is an implicit
 1135|       |	 *	BEGIN-STRUCT.
 1136|       |	 */
 1137|    180|	if (da->type == FR_TYPE_STRUCT) {
  ------------------
  |  Branch (1137:6): [True: 4, False: 176]
  ------------------
 1138|      4|		if (dict_dctx_push(dctx, da, NEST_NONE) < 0) return -1;
  ------------------
  |  Branch (1138:7): [True: 0, False: 4]
  ------------------
 1139|       |
 1140|      4|		CURRENT_FRAME(dctx)->finalise = dict_struct_finalise;
  ------------------
  |  |  108|      4|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 1141|      4|		dctx->value_attr = NULL;
 1142|       |
 1143|    176|	} else if (fr_type_is_leaf(da->type)) {
  ------------------
  |  |  393|    176|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 172, False: 4]
  |  |  ------------------
  ------------------
 1144|    172|		dctx->value_attr = da;
 1145|       |
 1146|    172|	} else {
 1147|      4|		dctx->value_attr = NULL;
 1148|      4|	}
 1149|       |
 1150|    180|	return 0;
 1151|    180|}
dict_tokenize.c:dict_struct_finalise:
 1097|     38|{
 1098|     38|	fr_dict_attr_t const *da;
 1099|     38|	dict_tokenize_frame_t const *frame = CURRENT_FRAME(dctx);
  ------------------
  |  |  108|     38|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 1100|       |
 1101|     38|	da = frame->da;
 1102|     38|	fr_assert(da->type == FR_TYPE_STRUCT);
  ------------------
  |  |  194|     38|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     38|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 38]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1103|       |
 1104|       |	/*
 1105|       |	 *	The structure was fixed-size, but the fields don't fill it.  That's an error.
 1106|       |	 *
 1107|       |	 *	Since process_member() checks for overflow, the check here is really only for
 1108|       |	 *	underflow.
 1109|       |	 */
 1110|     38|	if (da->flags.is_known_width) {
  ------------------
  |  Branch (1110:6): [True: 4, False: 34]
  ------------------
 1111|      4|		if (CURRENT_FRAME(dctx)->struct_size != da->flags.length) {
  ------------------
  |  |  108|      4|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (1111:7): [True: 0, False: 4]
  ------------------
 1112|      0|			fr_strerror_printf("MEMBERs of %s struct[%u] do not exactly fill the fixed-size structure",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1113|      0|					   da->name, da->flags.length);
 1114|      0|			return -1;
 1115|      0|		}
 1116|       |
 1117|      4|		return 0;
 1118|      4|	}
 1119|       |
 1120|       |	/*
 1121|       |	 *	If we have discovered that the structure has a fixed size, then update the da with that
 1122|       |	 *	information.
 1123|       |	 */
 1124|     34|	if (frame->struct_size < UINT16_MAX) {
  ------------------
  |  Branch (1124:6): [True: 34, False: 0]
  ------------------
 1125|     34|		UNCONST(fr_dict_attr_t *, da)->flags.length = frame->struct_size;
  ------------------
  |  |  186|     34|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1126|     34|	} /* else length 0 means "unknown / variable size / too large */
 1127|       |
 1128|     34|	return 0;
 1129|     38|}
dict_tokenize.c:dict_read_process_protocol:
 2877|      2|{
 2878|      2|	unsigned int	value;
 2879|      2|	unsigned int	type_size = 0;
 2880|      2|	fr_dict_t	*dict;
 2881|      2|	unsigned int	required_value;
 2882|      2|	char const	*required_name;
 2883|      2|	bool		require_dl = false;
 2884|      2|	bool		string_based = false;
 2885|       |
 2886|       |	/*
 2887|       |	 *	We cannot define a PROTOCOL inside of another protocol.
 2888|       |	 */
 2889|      2|	if (CURRENT_FRAME(dctx)->nest != NEST_TOP) {
  ------------------
  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
  |  Branch (2889:6): [True: 0, False: 2]
  ------------------
 2890|      0|		fr_strerror_const("PROTOCOL definitions cannot occur inside of any other BEGIN/END block");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2891|      0|		return -1;
 2892|      0|	}
 2893|       |
 2894|      2|	dctx->value_attr = NULL;
 2895|      2|	dctx->relative_attr = NULL;
 2896|       |
 2897|      2|	if ((argc < 2) || (argc > 3)) {
  ------------------
  |  Branch (2897:6): [True: 0, False: 2]
  |  Branch (2897:20): [True: 0, False: 2]
  ------------------
 2898|      0|		fr_strerror_const("Missing arguments after PROTOCOL.  Expected PROTOCOL <name> <number>");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2899|      0|		return -1;
 2900|      0|	}
 2901|       |
 2902|       |	/*
 2903|       |	 *	 Validate all entries
 2904|       |	 */
 2905|      2|	if (!dict_read_sscanf_i(&value, argv[1])) {
  ------------------
  |  Branch (2905:6): [True: 0, False: 2]
  ------------------
 2906|      0|		fr_strerror_printf("Invalid number '%s' following PROTOCOL", argv[1]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2907|      0|		return -1;
 2908|      0|	}
 2909|       |
 2910|       |	/*
 2911|       |	 *	255 protocols FR_TYPE_GROUP type_size hack
 2912|       |	 */
 2913|      2|	if (!value) {
  ------------------
  |  Branch (2913:6): [True: 0, False: 2]
  ------------------
 2914|      0|		fr_strerror_printf("Invalid value '%u' following PROTOCOL", value);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2915|      0|		return -1;
 2916|      0|	}
 2917|       |
 2918|       |	/*
 2919|       |	 *	While the numbers are in the dictionaries, the administrator cannot change "RADIUS" to be a
 2920|       |	 *	different number.  Similarly, they can't assign the RADIUS number to a different protocol.
 2921|       |	 */
 2922|      2|	required_value = fr_table_value_by_str(dict_proto_table, argv[0], 0);
  ------------------
  |  |  653|      2|#define fr_table_value_by_str(_table, _name, _def) \
  |  |  654|      2|_Generic((_table), \
  |  |  655|      2|	 fr_table_num_sorted_t const *		: fr_table_sorted_num_by_str,			\
  |  |  656|      2|	 fr_table_num_ordered_t const *		: fr_table_ordered_num_by_str,			\
  |  |  657|      2|	 fr_table_num_sorted_t *		: fr_table_sorted_num_by_str,			\
  |  |  658|      2|	 fr_table_num_ordered_t *		: fr_table_ordered_num_by_str,			\
  |  |  659|      2|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_ptr_by_str,			\
  |  |  660|      2|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_ptr_by_str,			\
  |  |  661|      2|	 fr_table_ptr_sorted_t *		: fr_table_sorted_ptr_by_str,			\
  |  |  662|      2|	 fr_table_ptr_ordered_t *		: fr_table_ordered_ptr_by_str,			\
  |  |  663|      2|	 fr_table_num_indexed_bit_pos_t *	: fr_table_ordered_num_by_str,			\
  |  |  664|      2|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_ordered_num_by_str,			\
  |  |  665|      2|	 fr_table_num_indexed_t *		: fr_table_ordered_num_by_str,			\
  |  |  666|      2|	 fr_table_num_indexed_t const *		: fr_table_ordered_num_by_str			\
  |  |  667|      2|)(_table, _table ## _len, _name, _def)
  ------------------
 2923|      2|	if (required_value && (required_value != value)) {
  ------------------
  |  Branch (2923:6): [True: 2, False: 0]
  |  Branch (2923:24): [True: 0, False: 2]
  ------------------
 2924|      0|		fr_strerror_printf("Invalid value '%u' following PROTOCOL - expected '%u'", value, required_value);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2925|      0|		return -1;
 2926|      0|	}
 2927|       |
 2928|       |	/*
 2929|       |	 *	And the administrator can't define the name to be a different number.
 2930|       |	 */
 2931|      2|	required_name = fr_table_str_by_value(dict_proto_table, value, NULL);
  ------------------
  |  |  772|      2|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  773|      2|_Generic((_table), \
  |  |  774|      2|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  775|      2|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  776|      2|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  777|      2|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  778|      2|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  779|      2|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  780|      2|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  781|      2|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  782|      2|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  783|      2|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  784|      2|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  785|      2|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  786|      2|)(_table, _table ## _len, _number, _def)
  ------------------
 2932|      2|	if (required_name && (strcasecmp(required_name, argv[0]) != 0)) {
  ------------------
  |  Branch (2932:6): [True: 2, False: 0]
  |  Branch (2932:23): [True: 0, False: 2]
  ------------------
 2933|      0|		fr_strerror_printf("Invalid value '%u' for PROTOCOL '%s' - that value is already used by '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2934|      0|				   value, argv[0], required_name);
 2935|      0|		return -1;
 2936|      0|	}
 2937|       |
 2938|       |	/*
 2939|       |	 *	Look for a format statement.  This may specify the
 2940|       |	 *	type length of the protocol's types.
 2941|       |	 */
 2942|      2|	if (argc == 3) {
  ------------------
  |  Branch (2942:6): [True: 2, False: 0]
  ------------------
 2943|      2|		char const *p;
 2944|      2|		char *q;
 2945|       |
 2946|       |		/*
 2947|       |		 *	For now, we don't allow multiple options here.
 2948|       |		 *
 2949|       |		 *	@todo - allow multiple options.
 2950|       |		 */
 2951|      2|		if (strcmp(argv[2], "verify=lib") == 0) {
  ------------------
  |  Branch (2951:7): [True: 2, False: 0]
  ------------------
 2952|      2|			require_dl = true;
 2953|      2|			goto post_option;
 2954|      2|		}
 2955|       |
 2956|      0|		if (strcmp(argv[2], "format=string") == 0) {
  ------------------
  |  Branch (2956:7): [True: 0, False: 0]
  ------------------
 2957|      0|			type_size = 4;
 2958|      0|			string_based = true;
 2959|      0|			goto post_option;
 2960|      0|		}
 2961|       |
 2962|      0|		if (strncasecmp(argv[2], "format=", 7) != 0) {
  ------------------
  |  Branch (2962:7): [True: 0, False: 0]
  ------------------
 2963|      0|			fr_strerror_printf("Invalid format for PROTOCOL.  Expected 'format=', got '%s'", argv[2]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2964|      0|			return -1;
 2965|      0|		}
 2966|      0|		p = argv[2] + 7;
 2967|       |
 2968|      0|		type_size = strtoul(p, &q, 10);
 2969|      0|		if (q != (p + strlen(p))) {
  ------------------
  |  Branch (2969:7): [True: 0, False: 0]
  ------------------
 2970|      0|			fr_strerror_printf("Found trailing garbage '%s' after format specifier", p);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2971|      0|			return -1;
 2972|      0|		}
 2973|      0|	}
 2974|      2|post_option:
 2975|       |
 2976|       |	/*
 2977|       |	 *	Cross check name / number.
 2978|       |	 */
 2979|      2|	dict = dict_by_protocol_name(argv[0]);
 2980|      2|	if (dict) {
  ------------------
  |  Branch (2980:6): [True: 0, False: 2]
  ------------------
 2981|       |#ifdef STATIC_ANALYZER
 2982|       |		if (!dict->root) return -1;
 2983|       |#endif
 2984|       |
 2985|      0|		if (dict->root->attr != value) {
  ------------------
  |  Branch (2985:7): [True: 0, False: 0]
  ------------------
 2986|      0|			fr_strerror_printf("Conflicting numbers %u vs %u for PROTOCOL \"%s\"",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2987|      0|					   dict->root->attr, value, dict->root->name);
 2988|      0|			return -1;
 2989|      0|		}
 2990|       |
 2991|      2|	} else if ((dict = dict_by_protocol_num(value)) != NULL) {
  ------------------
  |  Branch (2991:13): [True: 0, False: 2]
  ------------------
 2992|       |#ifdef STATIC_ANALYZER
 2993|       |		if (!dict->root || !dict->root->name || !argv[0]) return -1;
 2994|       |#endif
 2995|       |
 2996|      0|		if (strcasecmp(dict->root->name, argv[0]) != 0) {
  ------------------
  |  Branch (2996:7): [True: 0, False: 0]
  ------------------
 2997|      0|			fr_strerror_printf("Conflicting names current \"%s\" vs new \"%s\" for PROTOCOL %u",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2998|      0|					   dict->root->name, argv[0], dict->root->attr);
 2999|      0|			return -1;
 3000|      0|		}
 3001|      0|	}
 3002|       |
 3003|       |	/*
 3004|       |	 *	And check types no matter what.
 3005|       |	 */
 3006|      2|	if (dict) {
  ------------------
  |  Branch (3006:6): [True: 0, False: 2]
  ------------------
 3007|      0|		if (type_size && (dict->root->flags.type_size != type_size)) {
  ------------------
  |  Branch (3007:7): [True: 0, False: 0]
  |  Branch (3007:20): [True: 0, False: 0]
  ------------------
 3008|      0|			fr_strerror_printf("Conflicting flags for PROTOCOL \"%s\" (current %d versus new %u)",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3009|      0|					   dict->root->name, dict->root->flags.type_size, type_size);
 3010|      0|			return -1;
 3011|      0|		}
 3012|       |
 3013|       |		/*
 3014|       |		 *	Do NOT talloc_free() dict on error.
 3015|       |		 */
 3016|      0|		return dict_dctx_push(dctx, dict->root, NEST_NONE);
 3017|      0|	}
 3018|       |
 3019|      2|	dict = dict_alloc(dict_gctx);
 3020|      2|	if (!dict) return -1;
  ------------------
  |  Branch (3020:6): [True: 0, False: 2]
  ------------------
 3021|       |
 3022|       |	/*
 3023|       |	 *	Try to load protocol-specific validation routines.
 3024|       |	 *	Some protocols don't need them, so it's OK if the
 3025|       |	 *	validation routines don't exist.
 3026|       |	 */
 3027|      2|	if ((dict_dlopen(dict, argv[0]) < 0) && require_dl) {
  ------------------
  |  Branch (3027:6): [True: 0, False: 2]
  |  Branch (3027:42): [True: 0, False: 0]
  ------------------
 3028|      0|	error:
 3029|      0|		talloc_free(dict);
 3030|      0|		return -1;
 3031|      0|	}
 3032|       |
 3033|       |	/*
 3034|       |	 *	Set the root attribute with the protocol name
 3035|       |	 */
 3036|      2|	if (dict_root_set(dict, argv[0], value) < 0) goto error;
  ------------------
  |  Branch (3036:6): [True: 0, False: 2]
  ------------------
 3037|       |
 3038|      2|	if (dict_protocol_add(dict) < 0) goto error;
  ------------------
  |  Branch (3038:6): [True: 0, False: 2]
  ------------------
 3039|       |
 3040|      2|	dict->string_based = string_based;
 3041|      2|	if (type_size) {
  ------------------
  |  Branch (3041:6): [True: 0, False: 2]
  ------------------
 3042|      0|		fr_dict_attr_t	*mutable;
 3043|       |
 3044|      0|		mutable = UNCONST(fr_dict_attr_t *, dict->root);
  ------------------
  |  |  186|      0|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 3045|      0|		mutable->flags.type_size = type_size;
 3046|      0|		mutable->flags.length = 1; /* who knows... */
 3047|      0|	}
 3048|       |
 3049|       |	/*
 3050|       |	 *	Make the root available on the stack, in case
 3051|       |	 *	something wants to begin it.  Note that we mark it as
 3052|       |	 *	NONE, so that it can be cleaned up by anything.
 3053|       |	 *
 3054|       |	 *	This stack entry is just a place-holder so that the
 3055|       |	 *	BEGIN statement can find the dictionary.
 3056|       |	 */
 3057|      2|	if (unlikely(dict_dctx_push(dctx, dict->root, NEST_NONE) < 0)) goto error;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 3058|       |
 3059|      2|	return 0;
 3060|      2|}
dict_tokenize.c:dict_begin_protocol:
 3131|      2|{
 3132|      2|	ASSERT_CURRENT_NEST(dctx, NEST_NONE);
  ------------------
  |  |  113|      2|#define ASSERT_CURRENT_NEST(_dctx, _nest) fr_assert_msg(CURRENT_FRAME(_dctx)->nest == (_nest), "Expected frame type %s, got %s", \
  |  |  ------------------
  |  |  |  |  202|      2|#  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  114|      0|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  114|      0|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  114|      2|						fr_table_str_by_value(dict_nest_table, (_nest), "<INVALID>"), fr_table_str_by_value(dict_nest_table, CURRENT_FRAME(_dctx)->nest, "<INVALID>"))
  ------------------
 3133|      2|	fr_assert(CURRENT_DA(dctx)->flags.is_root);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3134|       |
 3135|       |	/*
 3136|       |	 *	Rewrite it in place.
 3137|       |	 */
 3138|      2|	CURRENT_FRAME(dctx)->nest = NEST_PROTOCOL;
  ------------------
  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 3139|      2|	dctx->dict = CURRENT_DA(dctx)->dict;
  ------------------
  |  |  109|      2|#define CURRENT_DA(_dctx)	(CURRENT_FRAME(_dctx)->da)
  |  |  ------------------
  |  |  |  |  108|      2|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  ------------------
  ------------------
 3140|       |
 3141|      2|	return 0;
 3142|      2|}
dict_tokenize.c:dict_filename_add:
 3070|    118|{
 3071|    118|	fr_dict_filename_t *file;
 3072|       |
 3073|    118|	file = talloc_zero(dict, fr_dict_filename_t);
 3074|    118|	if (unlikely(!file)) {
  ------------------
  |  |  397|    118|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 118]
  |  |  ------------------
  ------------------
 3075|      0|	oom:
 3076|      0|		fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3077|      0|		return -1;
 3078|      0|	}
 3079|    118|	*filename_out = file->filename = talloc_strdup(file, filename);
  ------------------
  |  |  149|    118|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
 3080|    118|	if (unlikely(!*filename_out)) goto oom;
  ------------------
  |  |  397|    118|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 118]
  |  |  ------------------
  ------------------
 3081|       |
 3082|    118|	if (src_file) {
  ------------------
  |  Branch (3082:6): [True: 114, False: 4]
  ------------------
 3083|    114|		file->src_line = src_line;
 3084|    114|		file->src_file = talloc_strdup(file, src_file);
  ------------------
  |  |  149|    114|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
 3085|    114|		if (!file->src_file) goto oom;
  ------------------
  |  Branch (3085:7): [True: 0, False: 114]
  ------------------
 3086|    114|	}
 3087|       |
 3088|    118|	fr_dlist_insert_tail(&dict->filenames, file);
 3089|       |
 3090|    118|	return 0;
 3091|    118|}
dict_tokenize.c:dict_read_process_begin:
 1769|     10|{
 1770|     10|	dict_tokenize_frame_t const	*frame;
 1771|     10|	fr_dict_attr_t const		*da;
 1772|     10|	fr_dict_attr_t const		*common;
 1773|       |
 1774|     10|	dctx->value_attr = NULL;
 1775|     10|	dctx->relative_attr = NULL;
 1776|       |
 1777|     10|	if (argc != 1) {
  ------------------
  |  Branch (1777:6): [True: 0, False: 10]
  ------------------
 1778|      0|		fr_strerror_const("Invalid BEGIN keyword.  Expected BEGIN <name>");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1779|      0|		return -1;
 1780|      0|	}
 1781|       |
 1782|     10|	frame = dict_dctx_find_frame(dctx, NEST_TOP | NEST_PROTOCOL | NEST_ATTRIBUTE);
 1783|     10|	if (!fr_cond_assert_msg(frame, "Context stack doesn't have an attribute or dictionary "
  ------------------
  |  |  148|     10|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|     20|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 10, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1783:6): [True: 0, False: 10]
  ------------------
 1784|     10|				"root to begin searching from %s[%d]", CURRENT_FILENAME(dctx), CURRENT_LINE(dctx)) ||
 1785|     10|	    !fr_cond_assert_msg(fr_type_is_structural(frame->da->type), "Context attribute is not structural %s[%d]",
  ------------------
  |  |  148|     10|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|     20|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 10, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1785:6): [True: 0, False: 10]
  ------------------
 1786|     10|	    			CURRENT_FILENAME(dctx), CURRENT_LINE(dctx))) {
 1787|      0|		return -1;
 1788|      0|	}
 1789|       |
 1790|       |	/*
 1791|       |	 *	Not really a reference as we don't support any of the
 1792|       |	 *	fancy syntaxes like refs do.  A straight OID string
 1793|       |	 *	resolved from the current level of nesting is all we support.
 1794|       |	 */
 1795|     10|	da = fr_dict_attr_by_oid(NULL, frame->da, argv[0]);
 1796|     10|	if (!da) {
  ------------------
  |  Branch (1796:6): [True: 0, False: 10]
  ------------------
 1797|      0|		fr_strerror_printf("BEGIN %s is not resolvable in current context '%s'", argv[0], frame->da->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1798|      0|		return -1;
 1799|      0|	}
 1800|       |
 1801|       |	/*
 1802|       |	 *	We cannot use BEGIN/END on structs.  Once they're defined, they can't be modified.
 1803|       |	 *
 1804|       |	 *	This restriction can be lifted once we don't auto-push on FR_TYPE_STRUCT.
 1805|       |	 */
 1806|     10|	if (!fr_type_is_tlv(da->type) && (da->type != FR_TYPE_UNION)) {
  ------------------
  |  |  372|     20|#define fr_type_is_tlv(_x)			((_x) == FR_TYPE_TLV)
  ------------------
  |  Branch (1806:6): [True: 2, False: 8]
  |  Branch (1806:35): [True: 0, False: 2]
  ------------------
 1807|      0|		fr_strerror_printf("BEGIN %s cannot be used with data type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1808|      0|				   argv[0],
 1809|      0|				   fr_type_to_str(da->type));
 1810|      0|		return -1;
 1811|      0|	}
 1812|       |
 1813|     10|	common = fr_dict_attr_common_parent(frame->da, da, true);
 1814|     10|	if (!common) {
  ------------------
  |  Branch (1814:6): [True: 0, False: 10]
  ------------------
 1815|      0|		fr_strerror_printf("BEGIN %s should be a child of '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 1816|      0|				   argv[0], CURRENT_FRAME(dctx)->da->name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1816|      0|				   argv[0], CURRENT_FRAME(dctx)->da->name);
 1817|      0|		return -1;
 1818|      0|	}
 1819|       |
 1820|     10|	return dict_dctx_push(dctx, da, NEST_ATTRIBUTE);
 1821|     10|}
dict_tokenize.c:dict_read_process_include:
 1265|    114|{
 1266|    114|	int rcode;
 1267|    114|	bool required = true;
 1268|    114|	int stack_depth = dctx->stack_depth;
 1269|    114|	char *src_file = dctx->filename;
 1270|    114|	int src_line = dctx->line;
 1271|    114|	char *pattern;
 1272|    114|	char const *filename;
 1273|    114|	fr_globdir_iter_t iter;
 1274|       |
 1275|       |	/*
 1276|       |	 *	Allow "$INCLUDE" or "$INCLUDE-", but
 1277|       |	 *	not anything else.
 1278|       |	 */
 1279|    114|	if ((argv[0][8] != '\0') && ((argv[0][8] != '-') || (argv[0][9] != '\0'))) {
  ------------------
  |  Branch (1279:6): [True: 0, False: 114]
  |  Branch (1279:31): [True: 0, False: 0]
  |  Branch (1279:54): [True: 0, False: 0]
  ------------------
 1280|      0|		fr_strerror_printf("Invalid keyword '%s'", argv[0]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1281|      0|		return -1;
 1282|      0|	}
 1283|       |
 1284|    114|	if (argc != 2) {
  ------------------
  |  Branch (1284:6): [True: 0, False: 114]
  ------------------
 1285|      0|		fr_strerror_printf("Unexpected text after $INCLUDE at %s[%d]", fr_cwd_strip(src_file), src_line);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1286|      0|		return -1;
 1287|      0|	}
 1288|       |
 1289|    114|	pattern = argv[1];
 1290|    114|	required = (argv[0][8] != '-');
 1291|       |
 1292|       |	/*
 1293|       |	 *	Allow limited macro capability, so people don't have
 1294|       |	 *	to remember where the root dictionaries are located.
 1295|       |	 */
 1296|    114|	if (strncmp(pattern, "${dictdir}/", 11) == 0) {
  ------------------
  |  Branch (1296:6): [True: 0, False: 114]
  ------------------
 1297|      0|		dir = fr_dict_global_ctx_dir();
 1298|      0|		pattern += 11;
 1299|      0|	}
 1300|       |
 1301|       |	/*
 1302|       |	 *	Figure out what we need to open, and put the result into "filename".
 1303|       |	 */
 1304|    114|	rcode = fr_globdir_iter_init(&filename, dir, pattern, &iter);
 1305|    114|	if (rcode < 0) {
  ------------------
  |  Branch (1305:6): [True: 0, False: 114]
  ------------------
 1306|      0|	failed:
 1307|      0|		fr_strerror_printf("Failed opening $INCLUDE of %s/%s at %s[%d] - %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 1308|      0|				   dir, pattern, fr_cwd_strip(src_file), src_line, fr_syserror(errno));
  |  |  ------------------
  ------------------
 1308|      0|				   dir, pattern, fr_cwd_strip(src_file), src_line, fr_syserror(errno));
 1309|      0|		return -1;
 1310|      0|	}
 1311|       |
 1312|       |	/*
 1313|       |	 *	No files may or may not be an error, depending on if the $INCLUDE was required.
 1314|       |	 */
 1315|    114|	if (rcode == 0) {
  ------------------
  |  Branch (1315:6): [True: 0, False: 114]
  ------------------
 1316|      0|		if (required) {
  ------------------
  |  Branch (1316:7): [True: 0, False: 0]
  ------------------
 1317|      0|			errno = ENOENT;
 1318|      0|			goto failed;
 1319|      0|		}
 1320|       |
 1321|      0|		fr_strerror_clear(); /* delete all errors */
 1322|      0|		return 0;
 1323|      0|	}
 1324|       |
 1325|       |	/*
 1326|       |	 *	"filename" is already the file, so we use do{}while() instead of while{}
 1327|       |	 */
 1328|    114|	do {
 1329|    114|		rcode = _dict_from_file(dctx, dir, filename, src_file, src_line);
 1330|    114|		if (rcode < 0) {
  ------------------
  |  Branch (1330:7): [True: 0, False: 114]
  ------------------
 1331|      0|			fr_strerror_printf_push("from $INCLUDE at %s[%d]", fr_cwd_strip(src_file), src_line);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1332|      0|			break;
 1333|      0|		}
 1334|       |
 1335|    114|		if (dctx->stack_depth < stack_depth) {
  ------------------
  |  Branch (1335:7): [True: 0, False: 114]
  ------------------
 1336|      0|			fr_strerror_printf("unexpected END-??? in $INCLUDE at %s[%d]",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1337|      0|					   fr_cwd_strip(src_file), src_line);
 1338|      0|			rcode = -1;
 1339|      0|			break;
 1340|      0|		}
 1341|       |
 1342|    114|	} while ((rcode = fr_globdir_iter_next(&filename, &iter)) == 1);
  ------------------
  |  Branch (1342:11): [True: 0, False: 114]
  ------------------
 1343|    114|	(void) fr_globdir_iter_free(&iter);
 1344|       |
 1345|    114|	return rcode;		/* could be an error! */
 1346|    114|}
dict_tokenize.c:dict_read_process_value:
 2669|    726|{
 2670|    726|	fr_dict_attr_t		*da;
 2671|    726|	fr_value_box_t		value = FR_VALUE_BOX_INITIALISER_NULL(value);
  ------------------
  |  |  512|    726|	{ \
  |  |  513|    726|		.type = FR_TYPE_NULL, \
  |  |  514|    726|		.entry = { \
  |  |  515|    726|			.entry = FR_DLIST_ENTRY_INITIALISER((_vb).entry.entry) \
  |  |  ------------------
  |  |  |  |   75|    726|#define FR_DLIST_ENTRY_INITIALISER(_entry) { .next = &_entry, .prev = &_entry }
  |  |  ------------------
  |  |  516|    726|		}, \
  |  |  517|    726| 		VALUE_BOX_NDEBUG_INITIALISER \
  |  |  ------------------
  |  |  |  |  246|    726|#define VALUE_BOX_NDEBUG_INITIALISER .file = __FILE__, .line = __LINE__, .magic = FR_VALUE_BOX_MAGIC
  |  |  |  |  ------------------
  |  |  |  |  |  |   91|    726|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   81|    726|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  206|    726|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  205|    726|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  518|    726|	}
  ------------------
 2672|    726|	size_t			enum_len;
 2673|    726|	fr_dict_attr_t const 	*parent = CURRENT_FRAME(dctx)->da;
  ------------------
  |  |  108|    726|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 2674|    726|	fr_dict_attr_t const	*enumv = NULL;
 2675|       |
 2676|    726|	if (argc != 3) {
  ------------------
  |  Branch (2676:6): [True: 0, False: 726]
  ------------------
 2677|      0|		fr_strerror_const("Invalid VALUE syntax");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2678|      0|		return -1;
 2679|      0|	}
 2680|       |
 2681|       |	/*
 2682|       |	 *	Most VALUEs are bunched together by ATTRIBUTE.  We can
 2683|       |	 *	save a lot of lookups on dictionary initialization by
 2684|       |	 *	caching the last attribute for a VALUE.
 2685|       |	 *
 2686|       |	 *	If it's not the same, we look up the attribute in the
 2687|       |	 *	current context, which is generally:
 2688|       |	 *
 2689|       |	 *	* the current attribute of type `struct`
 2690|       |	 *	* if no `struct`, then the VENDOR for VSAs
 2691|       |	 *	* if no VENDOR, then the dictionary root
 2692|       |	 */
 2693|    726|	if (!dctx->value_attr || (strcasecmp(argv[0], dctx->value_attr->name) != 0)) {
  ------------------
  |  Branch (2693:6): [True: 2, False: 724]
  |  Branch (2693:27): [True: 10, False: 714]
  ------------------
 2694|     12|		fr_dict_attr_t const *tmp;
 2695|       |
 2696|     12|		if (!(tmp = fr_dict_attr_by_oid(NULL, parent, argv[0]))) goto fixup;
  ------------------
  |  Branch (2696:7): [True: 0, False: 12]
  ------------------
 2697|     12|		dctx->value_attr = fr_dict_attr_unconst(tmp);
 2698|     12|	}
 2699|    726|	da = dctx->value_attr;
 2700|       |
 2701|       |	/*
 2702|       |	 *	Verify the enum name matches the expected from.
 2703|       |	 */
 2704|    726|	enum_len = strlen(argv[1]);
 2705|    726|	if (fr_dict_enum_name_from_substr(NULL, NULL, &FR_SBUFF_IN(argv[1], enum_len), NULL) != (fr_slen_t) enum_len) {
  ------------------
  |  |  558|    726|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  559|    726|((fr_sbuff_t){ \
  |  |  560|    726|	.buff_i		= _start, \
  |  |  561|    726|	.start_i	= _Generic((_start), \
  |  |  562|    726|				char *		: _start, \
  |  |  563|    726|				char const *	: _start, \
  |  |  564|    726|				uint8_t *	: _start, \
  |  |  565|    726|				uint8_t const *	: _start \
  |  |  566|    726|			), \
  |  |  567|    726|	.end_i		= _Generic((_len_or_end), \
  |  |  568|    726|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  569|    726|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  570|    726|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  571|    726|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  572|    726|				char *		: (char const *)(_len_or_end), \
  |  |  573|    726|				char const *	: (char const *)(_len_or_end) \
  |  |  574|    726|			), \
  |  |  575|    726|	.p_i		= _start, \
  |  |  576|    726|	.is_const	= true, \
  |  |  577|    726|})
  ------------------
  |  Branch (2705:6): [True: 0, False: 726]
  ------------------
 2706|      0|		fr_strerror_printf_push("Invalid VALUE name '%s' for attribute '%s'", argv[1], da->name);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2707|      0|		return -1;
 2708|      0|	}
 2709|       |
 2710|       |	/*
 2711|       |	 *	enum names cannot be integers.  People should just use the integer instead.
 2712|       |	 *
 2713|       |	 *	But what about IPv6 addresses, which also use a "::" prefix?
 2714|       |	 *
 2715|       |	 *	The ::FOO addresses were historically part of the "ipv4 compatible ipv6 address" range
 2716|       |	 *	"::0.0.0.0/96".  That range has since been deprecated, and the "::FOO" range is tracked in the
 2717|       |	 *	IANA Special-Purpose Address Registry.  That lists three things beginning with ::
 2718|       |	 *
 2719|       |	 *	* ::/128  - unspecified address (i.e. ::0/128).
 2720|       |	 *	* ::1/128 - Loopback address
 2721|       |	 *	* ::ffff:0:0/96 - IPv4-mapped address.
 2722|       |	 *
 2723|       |	 *	Since IPv6 addresses are 128 bits, the first two are just ::0 and ::1.  No other possibilities
 2724|       |	 *	exist.
 2725|       |	 *
 2726|       |	 *	For the range "::ffff:0:0/96", a value such as "::ffff:192.168.1.2 is not a valid enum name.
 2727|       |	 *	It contains an extra ':' (and MUST contain the extra ':'), and the ':' is not allowed in an
 2728|       |	 *	enum name.
 2729|       |	 *
 2730|       |	 *	IANA could assign other values in the :: range, but this seems unlikely.
 2731|       |	 *
 2732|       |	 *	As a result, the only overlap between enum ::FOO and IPv6 addresses is the single case of ::1.
 2733|       |	 *	This check disallows that.
 2734|       |	 */
 2735|    726|	if (fr_sbuff_adv_past_allowed( &FR_SBUFF_IN(argv[1], enum_len), SIZE_MAX, sbuff_char_class_int, NULL) == enum_len) {
  ------------------
  |  |  558|    726|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  559|    726|((fr_sbuff_t){ \
  |  |  560|    726|	.buff_i		= _start, \
  |  |  561|    726|	.start_i	= _Generic((_start), \
  |  |  562|    726|				char *		: _start, \
  |  |  563|    726|				char const *	: _start, \
  |  |  564|    726|				uint8_t *	: _start, \
  |  |  565|    726|				uint8_t const *	: _start \
  |  |  566|    726|			), \
  |  |  567|    726|	.end_i		= _Generic((_len_or_end), \
  |  |  568|    726|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  569|    726|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  570|    726|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  571|    726|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  572|    726|				char *		: (char const *)(_len_or_end), \
  |  |  573|    726|				char const *	: (char const *)(_len_or_end) \
  |  |  574|    726|			), \
  |  |  575|    726|	.p_i		= _start, \
  |  |  576|    726|	.is_const	= true, \
  |  |  577|    726|})
  ------------------
  |  Branch (2735:6): [True: 0, False: 726]
  ------------------
 2736|      0|		fr_strerror_printf("Invalid VALUE name '%s' for attribute '%s' - the name cannot be an integer", argv[1], da->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2737|      0|		return -1;
 2738|      0|	}
 2739|       |
 2740|       |	/*
 2741|       |	 *	Remember which attribute is associated with this
 2742|       |	 *	value.  This allows us to define enum
 2743|       |	 *	values before the attribute exists, and fix them
 2744|       |	 *	up later.
 2745|       |	 */
 2746|    726|	if (!da) {
  ------------------
  |  Branch (2746:6): [True: 0, False: 726]
  ------------------
 2747|      0|	fixup:
 2748|      0|		if (!fr_cond_assert_msg(dctx->fixup.pool, "fixup pool context invalid")) return -1;
  ------------------
  |  |  148|      0|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|      0|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2748:7): [True: 0, False: 0]
  ------------------
 2749|       |
 2750|      0|		if (dict_fixup_enumv_enqueue(&dctx->fixup,
  ------------------
  |  Branch (2750:7): [True: 0, False: 0]
  ------------------
 2751|      0|				     CURRENT_FILENAME(dctx), CURRENT_LINE(dctx),
  ------------------
  |  |  110|      0|#define CURRENT_FILENAME(_dctx)	(CURRENT_FRAME(_dctx)->filename)
  |  |  ------------------
  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  ------------------
  ------------------
              				     CURRENT_FILENAME(dctx), CURRENT_LINE(dctx),
  ------------------
  |  |  111|      0|#define CURRENT_LINE(_dctx)	(CURRENT_FRAME(_dctx)->line)
  |  |  ------------------
  |  |  |  |  108|      0|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  |  |  ------------------
  ------------------
 2752|      0|				     argv[0], strlen(argv[0]),
 2753|      0|				     argv[1], strlen(argv[1]),
 2754|      0|				     argv[2], strlen(argv[2]), parent) < 0) {
 2755|      0|			fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2756|      0|			return -1;
 2757|      0|		}
 2758|      0|		return 0;
 2759|      0|	}
 2760|       |
 2761|       |	/*
 2762|       |	 *	Only a leaf types can have values defined.
 2763|       |	 */
 2764|    726|	if (!fr_type_is_leaf(da->type)) {
  ------------------
  |  |  393|    726|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  ------------------
  |  Branch (2764:6): [True: 0, False: 726]
  ------------------
 2765|      0|		fr_strerror_printf("Cannot define VALUE for attribute '%s' of data type '%s'", da->name,
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2766|      0|				   fr_type_to_str(da->type));
 2767|      0|		return -1;
 2768|      0|	}
 2769|       |
 2770|       |	/*
 2771|       |	 *	Pass in the DA.  The value-box parsing functions will figure out where the enums are found.
 2772|       |	 */
 2773|    726|	if (da->type == FR_TYPE_ATTR) enumv = da;
  ------------------
  |  Branch (2773:6): [True: 0, False: 726]
  ------------------
 2774|       |
 2775|    726|	if (fr_value_box_from_str(NULL, &value, da->type, enumv,
  ------------------
  |  Branch (2775:6): [True: 0, False: 726]
  ------------------
 2776|    726|				  argv[2], strlen(argv[2]),
 2777|    726|				  NULL) < 0) {
 2778|      0|		fr_strerror_printf_push("Invalid VALUE '%s' for attribute '%s' of data type '%s'",
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2779|      0|					argv[2],
 2780|      0|					da->name,
 2781|      0|					fr_type_to_str(da->type));
 2782|      0|		return -1;
 2783|      0|	}
 2784|       |
 2785|    726|	if (fr_dict_enum_add_name(da, argv[1], &value, false, true) < 0) {
  ------------------
  |  Branch (2785:6): [True: 0, False: 726]
  ------------------
 2786|      0|		fr_value_box_clear(&value);
 2787|      0|		return -1;
 2788|      0|	}
 2789|    726|	fr_value_box_clear(&value);
 2790|       |
 2791|    726|	return 0;
 2792|    726|}
dict_tokenize.c:dict_dctx_push:
  144|     62|{
  145|     62|	if ((dctx->stack_depth + 1) >= DICT_MAX_STACK) {
  ------------------
  |  |   45|     62|#define DICT_MAX_STACK (32)
  ------------------
  |  Branch (145:6): [True: 0, False: 62]
  ------------------
  146|      0|		fr_strerror_const("Attribute definitions are nested too deep.");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  147|      0|		return -1;
  148|      0|	}
  149|       |
  150|     62|	dctx->stack[++dctx->stack_depth] = (dict_tokenize_frame_t) {
  151|     62|		.da = da,
  152|     62|		.filename = dctx->filename,
  153|     62|		.line = dctx->line,
  154|     62|		.nest = nest,
  155|     62|	};
  156|       |
  157|     62|	return 0;
  158|     62|}
dict_tokenize.c:dict_read_process_attribute:
 1501|  1.43k|{
 1502|  1.43k|	bool			set_relative_attr;
 1503|       |
 1504|  1.43k|	ssize_t			slen;
 1505|  1.43k|	unsigned int		attr;
 1506|       |
 1507|  1.43k|	fr_dict_attr_t const	*parent, *key = NULL;
 1508|  1.43k|	fr_dict_attr_t		*da;
 1509|  1.43k|	fr_value_box_t		box;
 1510|       |
 1511|  1.43k|	if ((argc < 3) || (argc > 4)) {
  ------------------
  |  Branch (1511:6): [True: 0, False: 1.43k]
  |  Branch (1511:20): [True: 0, False: 1.43k]
  ------------------
 1512|      0|		fr_strerror_const("Invalid ATTRIBUTE syntax");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1513|      0|		return -1;
 1514|      0|	}
 1515|       |
 1516|       |#ifdef STATIC_ANALYZER
 1517|       |	if (!dctx->dict) return -1;
 1518|       |#endif
 1519|       |
 1520|       |	/*
 1521|       |	 *	A non-relative ATTRIBUTE definition means that it is
 1522|       |	 *	in the context of the previous BEGIN-FOO.  So we
 1523|       |	 *	unwind the stack to match.
 1524|       |	 */
 1525|  1.43k|	if (argv[1][0] != '.') {
  ------------------
  |  Branch (1525:6): [True: 1.20k, False: 226]
  ------------------
 1526|  1.20k|		dict_tokenize_frame_t const *frame;
 1527|       |
 1528|  1.20k|		frame = dict_dctx_unwind(dctx);
 1529|  1.20k|		if (!frame) return -1;
  ------------------
  |  Branch (1529:7): [True: 0, False: 1.20k]
  ------------------
 1530|       |
 1531|  1.20k|		parent = frame->da;
 1532|       |
 1533|       |		/*
 1534|       |		 *	Allow '0xff00' as attribute numbers, but only
 1535|       |		 *	if there is no OID component.
 1536|       |		 */
 1537|  1.20k|		if (strchr(argv[1], '.') == 0) {
  ------------------
  |  Branch (1537:7): [True: 1.17k, False: 32]
  ------------------
 1538|  1.17k|			if (!dict_read_sscanf_i(&attr, argv[1])) {
  ------------------
  |  Branch (1538:8): [True: 0, False: 1.17k]
  ------------------
 1539|      0|				fr_strerror_const("Invalid ATTRIBUTE number");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1540|      0|				return -1;
 1541|      0|			}
 1542|       |
 1543|  1.17k|		} else {
 1544|     32|			slen = fr_dict_attr_by_oid_legacy(&parent, &attr, argv[1]);
 1545|     32|			if (slen <= 0) return -1;
  ------------------
  |  Branch (1545:8): [True: 0, False: 32]
  ------------------
 1546|     32|		}
 1547|       |
 1548|       |		/*
 1549|       |		 *	We allow relative attributes only for TLVs.
 1550|       |		 *
 1551|       |		 *	We haven't parsed the type field yet, so we
 1552|       |		 *	just check it here manually.
 1553|       |		 */
 1554|  1.20k|		set_relative_attr = (strcasecmp(argv[2], "tlv") == 0);
 1555|       |
 1556|  1.20k|	} else {
 1557|    226|		if (!dctx->relative_attr) {
  ------------------
  |  Branch (1557:7): [True: 0, False: 226]
  ------------------
 1558|      0|			fr_strerror_printf("No parent attribute reference was set for partial OID %s", argv[1]);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1559|      0|			return -1;
 1560|      0|		}
 1561|       |
 1562|    226|		parent = dctx->relative_attr;
 1563|       |
 1564|    226|		slen = fr_dict_attr_by_oid_legacy(&parent, &attr, argv[1]);
 1565|    226|		if (slen <= 0) return -1;
  ------------------
  |  Branch (1565:7): [True: 0, False: 226]
  ------------------
 1566|       |
 1567|    226|		set_relative_attr = false;
 1568|    226|	}
 1569|       |
 1570|  1.43k|	if (!fr_cond_assert(parent)) return -1;	/* Should have provided us with a parent */
  ------------------
  |  |  131|  1.43k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  2.86k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 1.43k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1570:6): [True: 0, False: 1.43k]
  ------------------
 1571|       |
 1572|       |	/*
 1573|       |	 *	Members of a 'struct' MUST use MEMBER, not ATTRIBUTE.
 1574|       |	 */
 1575|  1.43k|	if (parent->type == FR_TYPE_STRUCT) {
  ------------------
  |  Branch (1575:6): [True: 0, False: 1.43k]
  ------------------
 1576|      0|		fr_strerror_printf("Member %s of ATTRIBUTE %s type 'struct' MUST use the \"MEMBER\" keyword",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1577|      0|				   argv[0], parent->name);
 1578|      0|		return -1;
 1579|      0|	}
 1580|       |
 1581|       |	/*
 1582|       |	 *	A UNION can have child ATTRIBUTEs
 1583|       |	 */
 1584|  1.43k|	if (parent->type == FR_TYPE_UNION) {
  ------------------
  |  Branch (1584:6): [True: 2, False: 1.42k]
  ------------------
 1585|      2|		fr_dict_attr_ext_ref_t *ext;
 1586|       |
 1587|       |		/*
 1588|       |		 *	The parent is a union.  Get and verify the key ref.
 1589|       |		 */
 1590|      2|		ext = fr_dict_attr_ext(parent, FR_DICT_ATTR_EXT_KEY);
 1591|      2|		fr_assert(ext != NULL);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1592|       |
 1593|       |		/*
 1594|       |		 *	Double-check names against the reference.
 1595|       |		 */
 1596|      2|		key = ext->ref;
 1597|      2|		fr_assert(key);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1598|      2|		fr_assert(fr_dict_attr_is_key_field(key));
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  |  Branch (397:43): [True: 2, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1599|      2|	}
 1600|       |
 1601|  1.43k|	da = dict_attr_alloc_null(dctx->dict->pool, dctx->dict->proto);
 1602|  1.43k|	if (unlikely(!da)) return -1;
  ------------------
  |  |  397|  1.43k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.43k]
  |  |  ------------------
  ------------------
 1603|       |
 1604|       |	/*
 1605|       |	 *	Record the attribute number BEFORE we parse the type and flags.
 1606|       |	 *
 1607|       |	 *	This is needed for the DER dictionaries, and 'option'.
 1608|       |	 *
 1609|       |	 *	It can also be useful for other protocols, which may
 1610|       |	 *	have restrictions on the various fields.  It is
 1611|       |	 *	therefore useful to have all fields initialized before
 1612|       |	 *	the type/flag validation routines are called.
 1613|       |	 */
 1614|  1.43k|	if (unlikely(dict_attr_num_init(da, attr) < 0)) {
  ------------------
  |  |  397|  1.43k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.43k]
  |  |  ------------------
  ------------------
 1615|      0|	error:
 1616|      0|		talloc_free(da);
 1617|      0|		return -1;
 1618|      0|	}
 1619|       |
 1620|       |	/*
 1621|       |	 *	Check the attribute number against the allowed values.
 1622|       |	 */
 1623|  1.43k|	if (key) {
  ------------------
  |  Branch (1623:6): [True: 2, False: 1.42k]
  ------------------
 1624|      2|		fr_value_box_init(&box, FR_TYPE_UINT32, NULL, false);
  ------------------
  |  |  610|      2|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      2|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 1625|      2|		box.vb_uint32 = attr;
  ------------------
  |  |  274|      2|#define vb_uint32				datum.uint32
  ------------------
 1626|       |
 1627|      2|		if (fr_value_box_cast_in_place(da, &box, key->type, NULL) < 0) {
  ------------------
  |  Branch (1627:7): [True: 0, False: 2]
  ------------------
 1628|      0|			fr_strerror_printf_push("Invalid attribute number as key field %s has data type %s",
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1629|      0|						key->name, fr_type_to_str(key->type));
 1630|      0|			goto error;
 1631|      0|		}
 1632|      2|	}
 1633|       |
 1634|  1.43k|	if (dict_read_process_common(dctx, &da, parent, argv[0], argv[2],
  ------------------
  |  Branch (1634:6): [True: 0, False: 1.43k]
  ------------------
 1635|  1.43k|				     (argc > 3) ? argv[3] : NULL, base_flags) < 0) {
  ------------------
  |  Branch (1635:10): [True: 158, False: 1.27k]
  ------------------
 1636|      0|		goto error;
 1637|      0|	}
 1638|       |
 1639|  1.43k|	if (da_is_bit_field(da)) {
  ------------------
  |  |  171|  1.43k|#define da_is_bit_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_BIT_FIELD))
  |  |  ------------------
  |  |  |  Branch (171:31): [True: 2, False: 1.42k]
  |  |  |  Branch (171:53): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 1640|      0|		fr_strerror_const("Bit fields can only be defined as a MEMBER of data type 'struct'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1641|      0|		goto error;
 1642|      0|	}
 1643|       |
 1644|       |	/*
 1645|       |	 *	Unions need a key field.  And key fields can only appear inside of a struct.
 1646|       |	 */
 1647|  1.43k|	if (da->type == FR_TYPE_UNION) {
  ------------------
  |  Branch (1647:6): [True: 0, False: 1.43k]
  ------------------
 1648|      0|		fr_strerror_const("ATTRIBUTEs of type 'union' can only be defined as a MEMBER of data type 'struct'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1649|      0|		goto error;
 1650|      0|	}
 1651|       |
 1652|       |	/*
 1653|       |	 *	Cross-check fixed lengths.
 1654|       |	 */
 1655|  1.43k|	if (key && (parent->flags.is_known_width)) {
  ------------------
  |  Branch (1655:6): [True: 2, False: 1.42k]
  |  Branch (1655:13): [True: 0, False: 2]
  ------------------
 1656|      0|		if (!da->flags.is_known_width) {
  ------------------
  |  Branch (1656:7): [True: 0, False: 0]
  ------------------
 1657|      0|			da->flags.is_known_width = 1;
 1658|      0|			da->flags.length = parent->flags.length;
 1659|       |
 1660|      0|		} else if (da->flags.length != parent->flags.length) {
  ------------------
  |  Branch (1660:14): [True: 0, False: 0]
  ------------------
 1661|      0|			fr_strerror_printf("Invalid length %u for struct, the parent union %s has a different length %u",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1662|      0|					   da->flags.length, parent->name, parent->flags.length);
 1663|      0|			goto error;
 1664|      0|		}
 1665|      0|	}
 1666|       |
 1667|       |#ifdef WITH_DICTIONARY_WARNINGS
 1668|       |	/*
 1669|       |	 *	Hack to help us discover which vendors have illegal
 1670|       |	 *	attributes.
 1671|       |	 */
 1672|       |	if (!vendor && (attr < 256) &&
 1673|       |	    !strstr(fn, "rfc") && !strstr(fn, "illegal")) {
 1674|       |		fprintf(stderr, "WARNING: Illegal attribute %s in %s\n",
 1675|       |			argv[0], fn);
 1676|       |	}
 1677|       |#endif
 1678|       |
 1679|       |	/*
 1680|       |	 *	Set the attribute name
 1681|       |	 */
 1682|  1.43k|	if (unlikely(dict_attr_finalise(&da, argv[0]) < 0)) {
  ------------------
  |  |  397|  1.43k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.43k]
  |  |  ------------------
  ------------------
 1683|      0|		goto error;
 1684|      0|	}
 1685|       |
 1686|       |	/*
 1687|       |	 *	Check to see if this is a duplicate attribute
 1688|       |	 *	and whether we should ignore it or error out...
 1689|       |	 */
 1690|  1.43k|	switch (dict_attr_allow_dup(da)) {
 1691|  1.43k|	case 1:
  ------------------
  |  Branch (1691:2): [True: 1.43k, False: 0]
  ------------------
 1692|  1.43k|		break;
 1693|       |
 1694|      0|	case 0:
  ------------------
  |  Branch (1694:2): [True: 0, False: 1.43k]
  ------------------
 1695|      0|		talloc_free(da);
 1696|      0|		return 0;
 1697|       |
 1698|      0|	default:
  ------------------
  |  Branch (1698:2): [True: 0, False: 1.43k]
  ------------------
 1699|      0|		goto error;
 1700|  1.43k|	}
 1701|       |
 1702|       |	/*
 1703|       |	 *	Add the attribute we allocated earlier
 1704|       |	 */
 1705|  1.43k|	switch (dict_attr_add_or_fixup(&dctx->fixup, &da)) {
 1706|      0|	default:
  ------------------
  |  Branch (1706:2): [True: 0, False: 1.43k]
  ------------------
 1707|      0|		goto error;
 1708|       |
 1709|       |	/* New attribute, fixup stack */
 1710|  1.43k|	case 0:
  ------------------
  |  Branch (1710:2): [True: 1.43k, False: 0]
  ------------------
 1711|       |		/*
 1712|       |		 *	Dynamically define where VSAs go.  Note that we CANNOT
 1713|       |		 *	define VSAs until we define an attribute of type VSA!
 1714|       |		 */
 1715|  1.43k|		if (da->type == FR_TYPE_VSA) {
  ------------------
  |  Branch (1715:7): [True: 2, False: 1.42k]
  ------------------
 1716|      2|			if (parent->flags.is_root) dctx->dict->vsa_parent = attr;
  ------------------
  |  Branch (1716:8): [True: 2, False: 0]
  ------------------
 1717|       |
 1718|      2|			if (dict_fixup_vsa_enqueue(&dctx->fixup, da) < 0) {
  ------------------
  |  Branch (1718:8): [True: 0, False: 2]
  ------------------
 1719|      0|				return -1;	/* Leaves attr added */
 1720|      0|			}
 1721|      2|		}
 1722|       |
 1723|       |		/*
 1724|       |		 *	Add the VALUE to the key attribute, and ensure that
 1725|       |		 *	the VALUE also contains a pointer to the child struct.
 1726|       |		 */
 1727|  1.43k|		if (key && (dict_attr_enum_add_name(fr_dict_attr_unconst(key), da->name, &box, false, true, da) < 0)) {
  ------------------
  |  Branch (1727:7): [True: 2, False: 1.42k]
  |  Branch (1727:14): [True: 0, False: 2]
  ------------------
 1728|      0|			return -1;	/* Leaves attr added */
 1729|      0|		}
 1730|       |
 1731|       |		/*
 1732|       |		 *	Adding an attribute of type 'struct' is an implicit
 1733|       |		 *	BEGIN-STRUCT.
 1734|       |		 */
 1735|  1.43k|		if (da->type == FR_TYPE_STRUCT) {
  ------------------
  |  Branch (1735:7): [True: 34, False: 1.39k]
  ------------------
 1736|     34|			if (dict_dctx_push(dctx, da, NEST_NONE) < 0) return -1;
  ------------------
  |  Branch (1736:8): [True: 0, False: 34]
  ------------------
 1737|       |
 1738|     34|			CURRENT_FRAME(dctx)->finalise = dict_struct_finalise;
  ------------------
  |  |  108|     34|#define CURRENT_FRAME(_dctx)	(&(_dctx)->stack[(_dctx)->stack_depth])
  ------------------
 1739|     34|			dctx->value_attr = NULL;
 1740|  1.39k|		} else {
 1741|  1.39k|			dctx->value_attr = da;
 1742|  1.39k|		}
 1743|       |
 1744|  1.43k|		if (set_relative_attr) dctx->relative_attr = da;
  ------------------
  |  Branch (1744:7): [True: 34, False: 1.39k]
  ------------------
 1745|  1.43k|		break;
 1746|       |
 1747|       |	/* Deferred attribute, don't begin the TLV section automatically */
 1748|      0|	case 1:
  ------------------
  |  Branch (1748:2): [True: 0, False: 1.43k]
  ------------------
 1749|      0|		break;
 1750|  1.43k|	}
 1751|       |
 1752|       |	/*
 1753|       |	 *	While UNIONs are named, it's nicer to hide them.
 1754|       |	 *	Therefore we automatically add an ALIAS in the unions
 1755|       |	 *	parent, for the child in the union.
 1756|       |	 */
 1757|  1.43k|	if (parent->type == FR_TYPE_UNION) {
  ------------------
  |  Branch (1757:6): [True: 2, False: 1.42k]
  ------------------
 1758|      2|		fr_assert(parent->parent);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1759|       |
 1760|      2|		if (dict_attr_alias_add(parent->parent, da->name, da, false) < 0) {
  ------------------
  |  Branch (1760:7): [True: 0, False: 2]
  ------------------
 1761|      0|			return -1;	/* Leaves attr added */
 1762|      0|		}
 1763|      2|	}
 1764|       |
 1765|  1.43k|	return 0;
 1766|  1.43k|}
dict_tokenize.c:dict_dctx_unwind:
  226|  1.20k|{
  227|  1.20k|	return dict_dctx_unwind_until(dctx, NEST_ANY);
  ------------------
  |  |   61|  1.20k|#define NEST_ANY (NEST_TOP | NEST_PROTOCOL | NEST_VENDOR | NEST_ATTRIBUTE)
  ------------------
  228|  1.20k|}
dict_tokenize.c:dict_read_process_vendor:
 2798|     10|{
 2799|     10|	unsigned int			value;
 2800|     10|	int				type, length;
 2801|     10|	bool				continuation = false;
 2802|     10|	fr_dict_vendor_t const		*dv;
 2803|     10|	fr_dict_vendor_t		*mutable;
 2804|     10|	fr_dict_t			*dict = dctx->dict;
 2805|       |
 2806|     10|	dctx->value_attr = NULL;
 2807|     10|	dctx->relative_attr = NULL;
 2808|       |
 2809|     10|	if ((argc < 2) || (argc > 3)) {
  ------------------
  |  Branch (2809:6): [True: 0, False: 10]
  |  Branch (2809:20): [True: 0, False: 10]
  ------------------
 2810|      0|		fr_strerror_const("Invalid VENDOR syntax");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2811|      0|		return -1;
 2812|      0|	}
 2813|       |
 2814|       |	/*
 2815|       |	 *	 Validate all entries
 2816|       |	 */
 2817|     10|	if (!dict_read_sscanf_i(&value, argv[1])) {
  ------------------
  |  Branch (2817:6): [True: 0, False: 10]
  ------------------
 2818|      0|		fr_strerror_const("Invalid number in VENDOR");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2819|      0|		return -1;
 2820|      0|	}
 2821|       |
 2822|       |	/*
 2823|       |	 *	Look for a format statement.  Allow it to over-ride the hard-coded formats below.
 2824|       |	 */
 2825|     10|	if (argc == 3) {
  ------------------
  |  Branch (2825:6): [True: 0, False: 10]
  ------------------
 2826|      0|		if (dict_read_parse_format(argv[2], &type, &length, &continuation) < 0) return -1;
  ------------------
  |  Branch (2826:7): [True: 0, False: 0]
  ------------------
 2827|       |
 2828|     10|	} else {
 2829|     10|		type = length = 1;
 2830|     10|	}
 2831|       |
 2832|       |	/* Create a new VENDOR entry for the list */
 2833|     10|	if (dict_vendor_add(dict, argv[0], value) < 0) return -1;
  ------------------
  |  Branch (2833:6): [True: 0, False: 10]
  ------------------
 2834|       |
 2835|     10|	dv = fr_dict_vendor_by_num(dict, value);
 2836|     10|	if (!dv) {
  ------------------
  |  Branch (2836:6): [True: 0, False: 10]
  ------------------
 2837|      0|		fr_strerror_const("Failed adding format for VENDOR");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2838|      0|		return -1;
 2839|      0|	}
 2840|       |
 2841|     10|	mutable = UNCONST(fr_dict_vendor_t *, dv);
  ------------------
  |  |  186|     10|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 2842|     10|	mutable->type = type;
 2843|     10|	mutable->length = length;
 2844|     10|	mutable->continuation = continuation;
 2845|       |
 2846|     10|	return 0;
 2847|     10|}
dict_tokenize.c:dict_finalise:
  931|      6|{
  932|      6|	if (dict_fixup_apply(&dctx->fixup) < 0) return -1;
  ------------------
  |  Branch (932:6): [True: 0, False: 6]
  ------------------
  933|       |
  934|      6|	dctx->value_attr = NULL;
  935|      6|	dctx->relative_attr = NULL;
  936|       |
  937|      6|	return 0;
  938|      6|}

fr_dict_attr_unknown_free:
  234|  2.82k|{
  235|  2.82k|	if (!da || !*da) return;
  ------------------
  |  Branch (235:6): [True: 0, False: 2.82k]
  |  Branch (235:13): [True: 0, False: 2.82k]
  ------------------
  236|       |
  237|       |	/* Don't free real DAs */
  238|  2.82k|	if (!(*da)->flags.is_unknown) {
  ------------------
  |  Branch (238:6): [True: 102, False: 2.72k]
  ------------------
  239|    102|		return;
  240|    102|	}
  241|       |
  242|  2.72k|	talloc_const_free(*da);
  243|       |
  244|       |	*da = NULL;
  245|  2.72k|}
fr_dict_attr_unknown_alloc:
  251|  7.43k|{
  252|  7.43k|	fr_dict_attr_t		*n;
  253|  7.43k|	fr_dict_attr_t const	*parent;
  254|  7.43k|	fr_dict_attr_flags_t	flags = {};
  255|       |
  256|  7.43k|	fr_assert(!da->flags.is_root); /* cannot copy root attributes */
  ------------------
  |  |  194|  7.43k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  7.43k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 7.43k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  257|  7.43k|	fr_assert(da->parent);
  ------------------
  |  |  194|  7.43k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  7.43k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 7.43k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  258|       |
  259|  7.43k|	switch (type) {
  260|   111k|	case FR_TYPE_LEAF:
  ------------------
  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|      0|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|      0|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|      0|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|      0|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|      0|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|      0|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|      0|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|  7.42k|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|  7.42k|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 7.42k, False: 13]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|  7.42k|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|  7.42k|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|  7.42k|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|  7.42k|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|  7.42k|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|  7.42k|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|  7.42k|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|  7.42k|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|  7.42k|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|  7.42k|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|  7.42k|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|  7.42k|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|  7.42k|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|  7.42k|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|  7.42k|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|  7.42k|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  7.42k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|  7.42k|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  7.42k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|  7.42k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (260:2): [True: 0, False: 7.43k]
  ------------------
  261|   111k|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (261:2): [True: 0, False: 7.43k]
  ------------------
  262|  7.42k|	case FR_TYPE_TLV:
  ------------------
  |  Branch (262:2): [True: 0, False: 7.43k]
  ------------------
  263|  7.42k|	case FR_TYPE_VSA:
  ------------------
  |  Branch (263:2): [True: 0, False: 7.43k]
  ------------------
  264|  7.43k|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (264:2): [True: 13, False: 7.42k]
  ------------------
  265|  7.43k|		break;
  266|       |
  267|      0|	default:
  ------------------
  |  Branch (267:2): [True: 0, False: 7.43k]
  ------------------
  268|      0|		fr_strerror_printf("Invalid data type '%s' for unknown attribute", fr_type_to_str(type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  269|      0|		return NULL;
  270|  7.43k|	}
  271|       |
  272|  7.43k|	switch (da->type) {
  273|  81.2k|	case FR_TYPE_LEAF:
  ------------------
  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|      0|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|    976|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|      0|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|    544|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    544|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    544|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 544, False: 6.89k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|    849|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    849|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    849|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 305, False: 7.13k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|    976|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    976|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    976|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 127, False: 7.31k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|    976|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    976|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    976|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|  4.90k|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|  1.92k|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.92k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.92k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 948, False: 6.48k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|  4.90k|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  4.90k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  4.90k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2.98k, False: 4.45k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|  4.90k|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|  4.90k|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  4.90k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  4.90k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|  4.90k|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  4.90k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  4.90k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|  4.90k|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|  4.91k|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|  4.91k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|  4.91k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 7, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|  4.91k|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|  4.99k|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  4.99k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  4.99k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 76, False: 7.36k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|  5.00k|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.00k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.00k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 19, False: 7.41k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|  5.14k|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.14k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.14k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 132, False: 7.30k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|  5.14k|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.14k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.14k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|  5.14k|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.14k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.14k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|  5.14k|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.14k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.14k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|  5.14k|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.14k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.14k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|  5.14k|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.14k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.14k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|  5.18k|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.18k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.18k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 40, False: 7.39k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|  5.18k|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.18k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  5.18k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|  5.18k|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  5.18k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|  5.18k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (273:2): [True: 0, False: 7.43k]
  ------------------
  274|  81.2k|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|  6.39k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|  6.39k|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|  6.39k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|  6.39k|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|  6.39k|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|  6.39k|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  6.39k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  6.39k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|  7.32k|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  7.32k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  7.32k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 933, False: 6.50k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|  7.36k|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  7.36k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  7.36k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 38, False: 7.39k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  7.36k|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  7.36k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  7.36k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 7.43k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|  7.43k|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  7.43k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|  7.43k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (274:2): [True: 1.20k, False: 6.22k]
  ------------------
  275|  7.43k|		break;
  276|       |
  277|      0|	default:
  ------------------
  |  Branch (277:2): [True: 0, False: 7.43k]
  ------------------
  278|      0|		fr_strerror_printf("Cannot create unknown attribute from data type '%s'", fr_type_to_str(da->type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  279|      0|		return NULL;
  280|  7.43k|	}
  281|       |
  282|  7.43k|	if (dict_attr_unknown_init(da->parent, da, type, &flags)) return NULL;
  ------------------
  |  Branch (282:6): [True: 571, False: 6.86k]
  ------------------
  283|       |
  284|       |	/*
  285|       |	 *	Set the unknown flags.  Note that we don't copy any other flags, as they are all likely to be wrong.
  286|       |	 */
  287|  6.86k|	flags.is_raw = 1;
  288|       |
  289|       |	/*
  290|       |	 *	Allocate an attribute.
  291|       |	 */
  292|  6.86k|	n = dict_attr_alloc_null(ctx, da->dict->proto);
  293|  6.86k|	if (!n) return NULL;
  ------------------
  |  Branch (293:6): [True: 0, False: 6.86k]
  ------------------
  294|       |
  295|       |	/*
  296|       |	 *	We want to have parent / child relationships, AND to
  297|       |	 *	copy all unknown parents, AND to free the unknown
  298|       |	 *	parents when this 'da' is freed.  We therefore talloc
  299|       |	 *	the parent from the 'da'.
  300|       |	 */
  301|  6.86k|	if (da->parent->flags.is_unknown) {
  ------------------
  |  Branch (301:6): [True: 8, False: 6.85k]
  ------------------
  302|      8|		parent = fr_dict_attr_unknown_copy(n, da->parent);
  303|      8|		if (!parent) {
  ------------------
  |  Branch (303:7): [True: 0, False: 8]
  ------------------
  304|      0|		error:
  305|      0|			talloc_free(n);
  306|      0|			return NULL;
  307|      0|		}
  308|       |
  309|  6.85k|	} else {
  310|  6.85k|		parent = da->parent;
  311|  6.85k|	}
  312|       |
  313|       |	/*
  314|       |	 *	Initialize the rest of the fields.
  315|       |	 */
  316|  6.86k|	if (dict_attr_init(&n, parent, da->name, da->attr, type, &(dict_attr_args_t){ .flags = &flags }) < 0) {
  ------------------
  |  |  233|  6.86k|				       _dict_attr_init(__FILE__, __LINE__, _da_p, _parent, _name, _attr, _type, _args)
  ------------------
  |  Branch (316:6): [True: 0, False: 6.86k]
  ------------------
  317|      0|		goto error;
  318|      0|	}
  319|       |
  320|       |	/*
  321|       |	 *	Copy protocol-specific extents, and hope to heck that the protocol encoder knows what it's doing.
  322|       |	 */
  323|  6.86k|	if (fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC) &&
  ------------------
  |  Branch (323:6): [True: 6.86k, False: 0]
  ------------------
  324|  6.86k|	    !dict_attr_ext_copy(&n, da, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC)) {
  ------------------
  |  Branch (324:6): [True: 0, False: 6.86k]
  ------------------
  325|      0|		goto error;
  326|      0|	}
  327|       |
  328|       |	/*
  329|       |	 *	Do NOT copy extents.  The name and da_stack extents are already defined.  We do NOT copy
  330|       |	 *	existing children, references, keys, enumv, etc.  If the unknown attribute is a group, it's
  331|       |	 *	ref is already set to the root, or to a copy of the input DA.  If the unknown attribute is a
  332|       |	 *	TLV, then it cannot have known children.  If an unknown attribute is a leaf, then it cannot
  333|       |	 *	have known enums.
  334|       |	 */
  335|       |
  336|  6.86k|	DA_VERIFY(n);
  ------------------
  |  |   64|  6.86k|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
  337|       |
  338|  6.86k|	return n;
  339|  6.86k|}
fr_dict_attr_unknown_afrom_da:
  346|  4.14k|{
  347|  4.14k|	fr_type_t type = da->type;
  348|       |
  349|       |	/*
  350|       |	 *	VENDOR, etc. are logical containers, and can have
  351|       |	 *	unknown children, so they're left alone.  All other
  352|       |	 *	base types are mangled to OCTETs.
  353|       |	 *
  354|       |	 *	Note that we can't allocate an unknown STRUCT.  If the
  355|       |	 *	structure is malformed, then it's just a sequence of
  356|       |	 *	OCTETS.  Similarly, if a GROUP is malformed, then we
  357|       |	 *	have no idea what's inside of it, and we make it OCTETS.
  358|       |	 */
  359|  4.14k|	if (!da->flags.is_unknown) switch (type) {
  ------------------
  |  Branch (359:6): [True: 1.41k, False: 2.73k]
  ------------------
  360|      0|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (360:2): [True: 0, False: 1.41k]
  ------------------
  361|      0|		fr_assert(da->flags.type_size != 0);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  362|      0|		break;
  363|       |
  364|      0|	case FR_TYPE_TLV:
  ------------------
  |  Branch (364:2): [True: 0, False: 1.41k]
  ------------------
  365|      0|	case FR_TYPE_VSA:
  ------------------
  |  Branch (365:2): [True: 0, False: 1.41k]
  ------------------
  366|      0|		break;
  367|       |
  368|  1.41k|	default:
  ------------------
  |  Branch (368:2): [True: 1.41k, False: 0]
  ------------------
  369|  1.41k|		type = FR_TYPE_OCTETS;
  370|  1.41k|		break;
  371|  1.41k|	}
  372|       |
  373|  4.14k|	return fr_dict_attr_unknown_alloc(ctx, da, type);
  374|  4.14k|}
fr_dict_attr_unknown_typed_afrom_num_raw:
  388|  2.27k|{
  389|  2.27k|	fr_dict_attr_flags_t	flags = {
  390|  2.27k|					.is_raw = raw,
  391|  2.27k|				};
  392|  2.27k|	fr_dict_attr_t const	*da = NULL;
  393|       |
  394|  2.27k|	if (parent->flags.internal) {
  ------------------
  |  Branch (394:6): [True: 0, False: 2.27k]
  ------------------
  395|      0|		fr_strerror_printf("Cannot create 'raw' attribute from internal parent '%s' of data type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  396|      0|				   parent->name, fr_type_to_str(parent->type));
  397|      0|		return NULL;
  398|      0|	}
  399|       |
  400|  2.27k|	if (((parent->type == FR_TYPE_TLV) || (parent->type == FR_TYPE_VENDOR))) {
  ------------------
  |  Branch (400:7): [True: 2.19k, False: 83]
  |  Branch (400:40): [True: 4, False: 79]
  ------------------
  401|  2.19k|		if ((uint64_t) num >= ((uint64_t) 1 << (8 * parent->flags.type_size))) {
  ------------------
  |  Branch (401:7): [True: 0, False: 2.19k]
  ------------------
  402|      0|			fr_strerror_printf("Invalid attribute number '%u' - it must be no more than %u bits in size",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  403|      0|					   num, 8 * parent->flags.type_size);
  404|      0|			return NULL;
  405|      0|		}
  406|  2.19k|	}
  407|       |
  408|  2.27k|	switch (type) {
  409|      0|	default:
  ------------------
  |  Branch (409:2): [True: 0, False: 2.27k]
  ------------------
  410|      0|		fr_strerror_printf("Cannot allocate unknown attribute '%u' - invalid data type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  411|      0|				   num, fr_type_to_str(type));
  412|      0|		return NULL;
  413|       |
  414|     71|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (414:2): [True: 71, False: 2.20k]
  ------------------
  415|     71|		if (parent->type != FR_TYPE_VSA) goto fail;
  ------------------
  |  Branch (415:7): [True: 0, False: 71]
  ------------------
  416|       |
  417|     71|		if (parent->flags.is_unknown) goto fail;
  ------------------
  |  Branch (417:7): [True: 0, False: 71]
  ------------------
  418|     71|		break;
  419|       |
  420|  33.0k|	case FR_TYPE_LEAF:
  ------------------
  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|      0|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|      0|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|      0|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|      0|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|      0|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|      0|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|      0|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|  2.20k|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|  2.20k|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2.20k, False: 71]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|  2.20k|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|  2.20k|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|  2.20k|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|  2.20k|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|  2.20k|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|  2.20k|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|  2.20k|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|  2.20k|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|  2.20k|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|  2.20k|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|  2.20k|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|  2.20k|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|  2.20k|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|  2.20k|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|  2.20k|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|  2.20k|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|  2.20k|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.20k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|  2.20k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (420:2): [True: 0, False: 2.27k]
  ------------------
  421|  33.0k|	case FR_TYPE_TLV:
  ------------------
  |  Branch (421:2): [True: 0, False: 2.27k]
  ------------------
  422|  2.20k|	case FR_TYPE_VSA:
  ------------------
  |  Branch (422:2): [True: 0, False: 2.27k]
  ------------------
  423|  2.20k|		if (!fr_type_is_structural_except_vsa(parent->type)) {
  ------------------
  |  |  391|  2.20k|#define fr_type_is_structural_except_vsa(_x)	(fr_type_structural_except_vsa[_x])
  ------------------
  |  Branch (423:7): [True: 0, False: 2.20k]
  ------------------
  424|      0|		fail:
  425|      0|			fr_strerror_printf("Cannot allocate unknown attribute '%u' data type '%s' with parent %s data type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  426|      0|					   num, fr_type_to_str(type),
  427|      0|					   parent->name, fr_type_to_str(parent->type));
  428|      0|			return NULL;
  429|      0|		}
  430|       |
  431|       |		/*
  432|       |		 *	We can convert anything to 'octets'.
  433|       |		 */
  434|  2.20k|		if (type == FR_TYPE_OCTETS) break;
  ------------------
  |  Branch (434:7): [True: 2.20k, False: 0]
  ------------------
  435|       |
  436|       |		/*
  437|       |		 *	But we shouldn't be able to create a raw attribute which is a _different_ type than an
  438|       |		 *	existing one.
  439|       |		 */
  440|      0|		da = fr_dict_attr_child_by_num(parent, num);
  441|      0|		break;
  442|  2.27k|	}
  443|       |
  444|  2.27k|	if (dict_attr_unknown_init(parent, da, type, &flags)) return NULL;
  ------------------
  |  Branch (444:6): [True: 0, False: 2.27k]
  ------------------
  445|       |
  446|  2.27k|	return dict_attr_alloc(ctx, parent, NULL, num, type,
  ------------------
  |  |  257|  2.27k|				_dict_attr_alloc(__FILE__, __LINE__, _ctx, _parent, _name, _attr, _type, (_args))
  ------------------
  447|  2.27k|			       &(dict_attr_args_t){ .flags = &flags });
  448|  2.27k|}
dict_unknown.c:dict_attr_unknown_init:
   28|  9.71k|{
   29|  9.71k|	flags->is_unknown = true;
   30|       |
   31|  9.71k|	if (parent->flags.local) {
  ------------------
  |  Branch (31:6): [True: 0, False: 9.71k]
  ------------------
   32|      0|		fr_strerror_printf("Cannot create 'raw' attribute of data type '%s' which is a local variable",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   33|      0|				   fr_type_to_str(type));
   34|      0|		return -1;
   35|      0|	}
   36|       |
   37|  9.71k|	if (parent->flags.internal) {
  ------------------
  |  Branch (37:6): [True: 0, False: 9.71k]
  ------------------
   38|      0|		fr_strerror_printf("Cannot create 'raw' attribute of data type '%s' which is 'internal'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   39|      0|				   fr_type_to_str(type));
   40|      0|		return -1;
   41|      0|	}
   42|       |
   43|  9.71k|	if ((parent->type == FR_TYPE_UNION) && (type != FR_TYPE_OCTETS)) {
  ------------------
  |  Branch (43:6): [True: 24, False: 9.68k]
  |  Branch (43:41): [True: 0, False: 24]
  ------------------
   44|      0|		fr_strerror_printf("Cannot create 'raw' attribute of data type '%s' which has parent data type 'union'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   45|      0|				   fr_type_to_str(type));
   46|      0|		return -1;
   47|      0|	}
   48|       |
   49|  9.71k|	if (parent->depth >= FR_DICT_MAX_TLV_STACK) {
  ------------------
  |  |  517|  9.71k|#define FR_DICT_MAX_TLV_STACK		(FR_DICT_TLV_NEST_MAX + 5)
  |  |  ------------------
  |  |  |  |  505|  9.71k|#define FR_DICT_TLV_NEST_MAX		(24)
  |  |  ------------------
  ------------------
  |  Branch (49:6): [True: 0, False: 9.71k]
  ------------------
   50|      0|		fr_strerror_const("Attribute depth is too large");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
   51|      0|		return -1;
   52|      0|	}
   53|       |
   54|       |	/*
   55|       |	 *	If we are leveraging an existing attribute, then do some additional checks.
   56|       |	 */
   57|  9.71k|	if (da) {
  ------------------
  |  Branch (57:6): [True: 7.43k, False: 2.27k]
  ------------------
   58|  7.43k|		if (da->flags.internal) {
  ------------------
  |  Branch (58:7): [True: 0, False: 7.43k]
  ------------------
   59|      0|			fr_strerror_printf("Cannot create unknown attribute from internal attribute %s", da->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   60|      0|			return -1;
   61|      0|		}
   62|       |
   63|       |		/*
   64|       |		 *	@todo - do we actually care about this?
   65|       |		 *
   66|       |		 *	If we fix the unknown allocations to always use the raw number as the name, then it
   67|       |		 *	should be fine to change the data types.
   68|       |		 */
   69|  7.43k|		if (type != FR_TYPE_OCTETS) {
  ------------------
  |  Branch (69:7): [True: 13, False: 7.42k]
  ------------------
   70|     13|			if (da->type != type) {
  ------------------
  |  Branch (70:8): [True: 0, False: 13]
  ------------------
   71|      0|				fr_strerror_printf("Cannot allocate unknown attribute (%s) which changes data type from '%s' to '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   72|      0|					   da->name,
   73|      0|						   fr_type_to_str(da->type),
   74|      0|						   fr_type_to_str(type));
   75|      0|				return -1;
   76|      0|			}
   77|     13|		}
   78|  7.43k|	}
   79|       |
   80|       |	/*
   81|       |	 *	Ensure that raw members of a structure have the correct length.
   82|       |	 */
   83|  9.71k|	if (parent->type == FR_TYPE_STRUCT) {
  ------------------
  |  Branch (83:6): [True: 1.42k, False: 8.28k]
  ------------------
   84|  1.42k|		if (!da) {
  ------------------
  |  Branch (84:7): [True: 0, False: 1.42k]
  ------------------
   85|      0|			fr_strerror_printf("Cannot create 'raw' attribute of data type '%s' which has parent data type 'struct'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   86|      0|					   fr_type_to_str(type));
   87|      0|			return -1;
   88|      0|		}
   89|       |
   90|  1.42k|		if (fr_type_is_leaf(da->type)) {
  ------------------
  |  |  393|  1.42k|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 854, False: 571]
  |  |  ------------------
  ------------------
   91|    854|			if (fr_type_is_structural(type)) goto cannot_change_type;
  ------------------
  |  |  392|    854|#define fr_type_is_structural(_x)		(fr_type_structural[_x])
  |  |  ------------------
  |  |  |  Branch (392:36): [True: 0, False: 854]
  |  |  ------------------
  ------------------
   92|       |
   93|    854|			fr_assert(da->flags.is_known_width);
  ------------------
  |  |  194|    854|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|    854|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 854]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   94|       |
   95|    854|			flags->is_known_width = true;
   96|    854|			flags->length = da->flags.length;
   97|       |
   98|    854|		} else if (da->type != type) {
  ------------------
  |  Branch (98:14): [True: 571, False: 0]
  ------------------
   99|    571|		cannot_change_type:
  100|       |			/*
  101|       |			 *	@todo - why not?  So long as the size is the same...
  102|       |			 */
  103|    571|			fr_strerror_printf("Cannot create 'raw' attribute in 'struct' which changes data type from '%s' to '%s'",
  ------------------
  |  |   65|    571|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  104|    571|					   fr_type_to_str(da->type), fr_type_to_str(type));
  105|    571|			return -1;
  106|    571|		}
  107|  1.42k|	}
  108|       |
  109|  9.14k|	return 0;
  110|  9.71k|}

dict_attr_type_init:
  547|  10.8k|{
  548|  10.8k|	if (unlikely(((*da_p)->type != FR_TYPE_NULL) &&
  ------------------
  |  |  397|  10.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10.8k]
  |  |  |  Branch (397:43): [True: 0, False: 10.8k]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  549|  10.8k|		     ((*da_p)->type != type))) {
  550|      0|		fr_strerror_printf("Cannot set data type to '%s' - it is already set to '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  551|      0|				   fr_type_to_str(type), fr_type_to_str((*da_p)->type));
  552|      0|		return -1;
  553|      0|	}
  554|       |
  555|  10.8k|	if (unlikely((*da_p)->state.finalised == true)) {
  ------------------
  |  |  397|  10.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10.8k]
  |  |  ------------------
  ------------------
  556|      0|		fr_strerror_const("Can't perform type initialisation on finalised attribute");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  557|      0|		return -1;
  558|      0|	}
  559|       |
  560|       |	/*
  561|       |	 *	Structural types can have children
  562|       |	 *	so add the extension for them.
  563|       |	 */
  564|  10.8k|	switch (type) {
  565|    634|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      4|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      4|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      4|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      4|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      4|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     42|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|     42|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|     42|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 38, False: 10.8k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|     82|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|     82|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|     82|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 40, False: 10.8k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|    136|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|    136|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    136|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 54, False: 10.8k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|    140|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|    140|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    140|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 4, False: 10.8k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    234|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|    234|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|    234|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (565:2): [True: 4, False: 10.8k]
  ------------------
  566|       |		/*
  567|       |		 *	Groups don't have children or namespaces.  But
  568|       |		 *	they always have refs.  Either to the root of
  569|       |		 *	the current dictionary, or to another dictionary,
  570|       |		 *	via its top-level TLV.
  571|       |		 *
  572|       |		 *	Note that when multiple TLVs have the same
  573|       |		 *	children, the dictionary has to use "clone="
  574|       |		 *	instead of "ref=".  That's because the
  575|       |		 *	children of the TLVs all require the correct
  576|       |		 *	parentage.  Perhaps that can be changed when
  577|       |		 *	the encoders / decoders are updated.  It would be good to just reference the DAs instead of cloning an entire subtree.
  578|       |		 */
  579|    634|		if ((type == FR_TYPE_GROUP) && !fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_REF)) {
  ------------------
  |  Branch (579:7): [True: 38, False: 196]
  |  Branch (579:34): [True: 38, False: 0]
  ------------------
  580|     38|			if (dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_REF) == NULL) return -1;
  ------------------
  |  Branch (580:8): [True: 0, False: 38]
  ------------------
  581|     38|			break;
  582|     38|		}
  583|       |
  584|    196|		if (dict_attr_children_init(da_p) < 0) return -1;
  ------------------
  |  Branch (584:7): [True: 0, False: 196]
  ------------------
  585|    196|		if (dict_attr_namespace_init(da_p) < 0) return -1;	/* Needed for all TLV style attributes */
  ------------------
  |  Branch (585:7): [True: 0, False: 196]
  ------------------
  586|       |
  587|    196|		(*da_p)->last_child_attr = (1 << 24);	/* High enough not to conflict with protocol numbers */
  588|    196|		break;
  589|       |
  590|       |	/*
  591|       |	 *	Leaf types
  592|       |	 */
  593|  10.6k|	default:
  ------------------
  |  Branch (593:2): [True: 10.6k, False: 234]
  ------------------
  594|  10.6k|		if (dict_attr_enumv_init(da_p) < 0) return -1;
  ------------------
  |  Branch (594:7): [True: 0, False: 10.6k]
  ------------------
  595|  10.6k|		break;
  596|  10.8k|	}
  597|       |
  598|  10.8k|	(*da_p)->flags.is_known_width |= fr_type_fixed_size[type];
  599|       |
  600|       |	/*
  601|       |	 *	Set default type-based flags
  602|       |	 */
  603|  10.8k|	switch (type) {
  604|     50|	case FR_TYPE_DATE:
  ------------------
  |  Branch (604:2): [True: 50, False: 10.8k]
  ------------------
  605|     94|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (605:2): [True: 44, False: 10.8k]
  ------------------
  606|     94|		(*da_p)->flags.length = 4;
  607|     94|		(*da_p)->flags.flag_time_res = FR_TIME_RES_SEC;
  ------------------
  |  |  156|     94|#define flag_time_res type_size
  ------------------
  608|     94|		break;
  609|       |
  610|       |
  611|  9.36k|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (611:2): [True: 9.36k, False: 1.49k]
  ------------------
  612|  9.74k|	case FR_TYPE_STRING:
  ------------------
  |  Branch (612:2): [True: 384, False: 10.4k]
  ------------------
  613|  9.74k|		(*da_p)->flags.is_known_width = ((*da_p)->flags.length != 0);
  614|  9.74k|		break;
  615|       |
  616|  1.01k|	default:
  ------------------
  |  Branch (616:2): [True: 1.01k, False: 9.84k]
  ------------------
  617|  1.01k|		break;
  618|  10.8k|	}
  619|       |
  620|  10.8k|	(*da_p)->type = type;
  621|       |
  622|  10.8k|	return 0;
  623|  10.8k|}
dict_attr_parent_init:
  634|  10.8k|{
  635|  10.8k|	fr_dict_attr_t		  *da = *da_p;
  636|  10.8k|	fr_dict_t const		  *dict = parent->dict;
  637|  10.8k|	fr_dict_attr_ext_vendor_t *ext;
  638|       |
  639|  10.8k|	if (unlikely((*da_p)->type == FR_TYPE_NULL)) {
  ------------------
  |  |  397|  10.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10.8k]
  |  |  ------------------
  ------------------
  640|      0|		fr_strerror_const("Attribute type must be set before initialising parent.  Use dict_attr_type_init() first");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  641|      0|		return -1;
  642|      0|	}
  643|       |
  644|  10.8k|	if (unlikely(da->parent != NULL)) {
  ------------------
  |  |  397|  10.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10.8k]
  |  |  ------------------
  ------------------
  645|      0|		fr_strerror_printf("Attempting to set parent for '%s' to '%s', but parent already set to '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  646|      0|				   da->name, parent->name, da->parent->name);
  647|      0|		return -1;
  648|      0|	}
  649|       |
  650|  10.8k|	if (unlikely((*da_p)->state.finalised == true)) {
  ------------------
  |  |  397|  10.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10.8k]
  |  |  ------------------
  ------------------
  651|      0|		fr_strerror_printf("Attempting to set parent for '%s' to '%s', but attribute already finalised",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  652|      0|				   da->name, parent->name);
  653|      0|		return -1;
  654|      0|	}
  655|       |
  656|  10.8k|	da->parent = parent;
  657|  10.8k|	da->dict = parent->dict;
  658|  10.8k|	da->depth = parent->depth + 1;
  659|  10.8k|	da->flags.internal |= parent->flags.internal;
  660|       |
  661|       |	/*
  662|       |	 *	Point to the vendor definition.  Since ~90% of
  663|       |	 *	attributes are VSAs, caching this pointer will help.
  664|       |	 */
  665|  10.8k|	if (da->type == FR_TYPE_VENDOR) {
  ------------------
  |  Branch (665:6): [True: 94, False: 10.7k]
  ------------------
  666|     94|		da->flags.type_size = dict->root->flags.type_size;
  667|     94|		da->flags.length = dict->root->flags.type_size;
  668|       |
  669|     94|		if ((dict->root->attr == FR_DICT_PROTO_RADIUS) && (da->depth == 2)) {
  ------------------
  |  Branch (669:7): [True: 0, False: 94]
  |  Branch (669:53): [True: 0, False: 0]
  ------------------
  670|      0|			fr_dict_vendor_t const *dv;
  671|       |
  672|      0|			dv = fr_dict_vendor_by_num(dict, da->attr);
  673|      0|			if (dv) {
  ------------------
  |  Branch (673:8): [True: 0, False: 0]
  ------------------
  674|      0|				da->flags.type_size = dv->type;
  675|      0|				da->flags.length = dv->length;
  676|      0|			}
  677|      0|		}
  678|       |
  679|  10.7k|	} else if (da->type == FR_TYPE_TLV) {
  ------------------
  |  Branch (679:13): [True: 50, False: 10.7k]
  ------------------
  680|     50|		da->flags.type_size = dict->root->flags.type_size;
  681|     50|		da->flags.length = dict->root->flags.type_size;
  682|     50|	}
  683|       |
  684|  10.8k|	if (parent->type == FR_TYPE_VENDOR) {
  ------------------
  |  Branch (684:6): [True: 74, False: 10.7k]
  ------------------
  685|     74|		ext = dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_VENDOR);
  686|     74|		if (unlikely(!ext)) return -1;
  ------------------
  |  |  397|     74|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 74]
  |  |  ------------------
  ------------------
  687|       |
  688|     74|		ext->vendor = parent;
  689|       |
  690|  10.7k|	} else {
  691|  10.7k|		ext = dict_attr_ext_copy(da_p, parent, FR_DICT_ATTR_EXT_VENDOR); /* Noop if no vendor extension */
  692|  10.7k|	}
  693|       |
  694|  10.8k|	da = *da_p;
  695|       |
  696|  10.8k|	if (!ext || ((da->type != FR_TYPE_TLV) && (da->type != FR_TYPE_VENDOR))) return 0;
  ------------------
  |  Branch (696:6): [True: 10.7k, False: 74]
  |  Branch (696:15): [True: 74, False: 0]
  |  Branch (696:44): [True: 74, False: 0]
  ------------------
  697|       |
  698|      0|	da->flags.type_size = ext->vendor->flags.type_size;
  699|      0|	da->flags.length = ext->vendor->flags.type_size;
  700|       |
  701|      0|	return 0;
  702|  10.8k|}
dict_attr_num_init:
  710|  10.8k|{
  711|  10.8k|	if (da->state.attr_set) {
  ------------------
  |  Branch (711:6): [True: 0, False: 10.8k]
  ------------------
  712|      0|		fr_strerror_const("Attribute number already set");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  713|      0|		return -1;
  714|      0|	}
  715|  10.8k|	da->attr = num;
  716|  10.8k|	da->state.attr_set = true;
  717|       |
  718|  10.8k|	return 0;
  719|  10.8k|}
dict_attr_location_init:
  740|  9.24k|{
  741|  9.24k|	da->filename = filename;
  742|  9.24k|	da->line = line;
  743|  9.24k|}
dict_attr_finalise:
  754|  10.8k|{
  755|  10.8k|	fr_dict_attr_t		*da;
  756|       |
  757|       |	/*
  758|       |	*	Finalising the attribute allocates its
  759|       |	*	automatic number if its a name only attribute.
  760|       |	*/
  761|  10.8k|	da = *da_p;
  762|       |
  763|       |	/*
  764|       |	 *	Initialize the length field automatically if it's not been set already
  765|       |	 */
  766|  10.8k|	if (!da->flags.length && fr_type_is_leaf(da->type) && !fr_type_is_variable_size(da->type)) {
  ------------------
  |  |  393|  20.6k|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 9.68k, False: 92]
  |  |  ------------------
  ------------------
              	if (!da->flags.length && fr_type_is_leaf(da->type) && !fr_type_is_variable_size(da->type)) {
  ------------------
  |  |  388|  9.68k|#define fr_type_is_variable_size(_x)		(fr_type_variable_size[_x])
  ------------------
  |  Branch (766:6): [True: 9.77k, False: 1.08k]
  |  Branch (766:56): [True: 678, False: 9.00k]
  ------------------
  767|    678|		fr_value_box_t box;
  768|       |
  769|    678|		fr_value_box_init(&box, da->type, NULL, false);
  ------------------
  |  |  610|    678|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|    678|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
  770|    678|		da->flags.length = fr_value_box_network_length(&box);
  771|    678|	}
  772|       |
  773|  10.8k|	switch(da->type) {
  774|     40|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (774:2): [True: 40, False: 10.8k]
  ------------------
  775|     40|		da->flags.is_known_width |= da->flags.array;
  776|     40|		break;
  777|       |
  778|     38|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (778:2): [True: 38, False: 10.8k]
  ------------------
  779|     38|	{
  780|     38|		fr_dict_attr_ext_ref_t	*ext;
  781|       |		/*
  782|       |		*	If it's a group attribute, the default
  783|       |		*	reference goes to the root of the
  784|       |		*	dictionary as that's where the default
  785|       |		*	name/numberspace is.
  786|       |		*
  787|       |		*	This may be updated by the caller.
  788|       |		*/
  789|     38|		ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF);
  790|     38|		if (unlikely(ext == NULL)) {
  ------------------
  |  |  397|     38|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 38]
  |  |  ------------------
  ------------------
  791|      0|			fr_strerror_const("Missing ref extension");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  792|      0|			return -1;
  793|      0|		}
  794|       |
  795|       |		/*
  796|       |		 *	For groups, if a ref wasn't provided then
  797|       |		 *	set it to the dictionary root.
  798|       |		 */
  799|     38|		if ((ext->type == FR_DICT_ATTR_REF_NONE) &&
  ------------------
  |  Branch (799:7): [True: 38, False: 0]
  ------------------
  800|     38|		    (unlikely(dict_attr_ref_set(da, fr_dict_root(da->dict), FR_DICT_ATTR_REF_ALIAS) < 0))) {
  ------------------
  |  |  397|     38|#  define unlikely(_x)		__builtin_expect((_x), 0)
  ------------------
  |  Branch (800:7): [True: 0, False: 38]
  ------------------
  801|      0|			return -1;
  802|      0|		}
  803|     38|	}
  804|     38|		break;
  805|       |
  806|  10.7k|	default:
  ------------------
  |  Branch (806:2): [True: 10.7k, False: 78]
  ------------------
  807|  10.7k|		break;
  808|  10.8k|	}
  809|       |
  810|       |	/*
  811|       |	 *	Name is a separate talloc chunk.  We allocate
  812|       |	 *	it last because we cache the pointer value.
  813|       |	 */
  814|  10.8k|	if (dict_attr_name_set(da_p, name) < 0) return -1;
  ------------------
  |  Branch (814:6): [True: 0, False: 10.8k]
  ------------------
  815|       |
  816|  10.8k|	DA_VERIFY(*da_p);
  ------------------
  |  |   64|  10.8k|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
  817|       |
  818|  10.8k|	(*da_p)->state.finalised = true;
  819|       |
  820|  10.8k|	return 0;
  821|  10.8k|}
_dict_attr_init:
  890|  9.24k|{
  891|       |	/*
  892|       |	 *	We initialize the number first, as doing that doesn't have any other side effects.
  893|       |	 */
  894|  9.24k|	if (unlikely(dict_attr_num_init(*da_p, attr) < 0)) return -1;
  ------------------
  |  |  397|  9.24k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 9.24k]
  |  |  ------------------
  ------------------
  895|       |
  896|       |	/*
  897|       |	 *	This function then checks the number, for things like VSAs.
  898|       |	 */
  899|  9.24k|	if (unlikely(dict_attr_init_common(filename, line, da_p, parent, type, args) < 0)) return -1;
  ------------------
  |  |  397|  9.24k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 9.24k]
  |  |  ------------------
  ------------------
  900|       |
  901|  9.24k|	if (unlikely(dict_attr_finalise(da_p, name) < 0)) return -1;
  ------------------
  |  |  397|  9.24k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 9.24k]
  |  |  ------------------
  ------------------
  902|       |
  903|  9.24k|	return 0;
  904|  9.24k|}
dict_attr_alloc_null:
  985|  10.8k|{
  986|  10.8k|	fr_dict_attr_t *da;
  987|       |
  988|       |	/*
  989|       |	 *	Do not use talloc zero, the caller
  990|       |	 *	always initialises memory allocated
  991|       |	 *	here.
  992|       |	 */
  993|  10.8k|	da = talloc_zero(ctx, fr_dict_attr_t);
  994|  10.8k|	if (unlikely(!da)) return NULL;
  ------------------
  |  |  397|  10.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10.8k]
  |  |  ------------------
  ------------------
  995|       |
  996|       |	/*
  997|       |	 *	Allocate room for the protocol specific flags
  998|       |	 */
  999|  10.8k|	if (proto->attr.flags.len > 0) {
  ------------------
  |  Branch (999:6): [True: 9.97k, False: 882]
  ------------------
 1000|  9.97k|		if (unlikely(dict_attr_ext_alloc_size(&da, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC,
  ------------------
  |  |  397|  9.97k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 9.97k]
  |  |  ------------------
  ------------------
 1001|  9.97k|						      proto->attr.flags.len) == NULL)) {
 1002|      0|			talloc_free(da);
 1003|      0|			return NULL;
 1004|      0|		}
 1005|  9.97k|	}
 1006|  10.8k|	talloc_set_destructor(da, _dict_attr_free);
  ------------------
  |  Branch (1006:2): [Folded, False: 10.8k]
  ------------------
 1007|       |
 1008|  10.8k|	return da;
 1009|  10.8k|}
_dict_attr_alloc_root:
 1030|      4|{
 1031|      4|	fr_dict_attr_t	*n;
 1032|       |
 1033|      4|	n = dict_attr_alloc_null(ctx, dict->proto);
 1034|      4|	if (unlikely(!n)) return NULL;
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1035|       |
 1036|      4|	if (_dict_attr_init(filename, line, &n, NULL, name, proto_number, FR_TYPE_TLV, args) < 0) {
  ------------------
  |  Branch (1036:6): [True: 0, False: 4]
  ------------------
 1037|      0|		talloc_free(n);
 1038|      0|		return NULL;
 1039|      0|	}
 1040|       |
 1041|      4|	return n;
 1042|      4|}
_dict_attr_alloc:
 1064|  2.37k|{
 1065|  2.37k|	fr_dict_attr_t	*n;
 1066|       |
 1067|  2.37k|	n = dict_attr_alloc_null(ctx, parent->dict->proto);
 1068|  2.37k|	if (unlikely(!n)) return NULL;
  ------------------
  |  |  397|  2.37k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2.37k]
  |  |  ------------------
  ------------------
 1069|       |
 1070|  2.37k|	if (_dict_attr_init(filename, line, &n, parent, name, attr, type, args) < 0) {
  ------------------
  |  Branch (1070:6): [True: 0, False: 2.37k]
  ------------------
 1071|      0|		talloc_free(n);
 1072|      0|		return NULL;
 1073|      0|	}
 1074|       |
 1075|  2.37k|	return n;
 1076|  2.37k|}
dict_attr_acopy:
 1090|      4|{
 1091|      4|	fr_dict_attr_t		*n;
 1092|       |
 1093|      4|	if (in->flags.has_fixup) {
  ------------------
  |  Branch (1093:6): [True: 0, False: 4]
  ------------------
 1094|      0|		fr_strerror_printf("Cannot copy from %s - source attribute is waiting for additional definitions",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1095|      0|				   in->name);
 1096|      0|		return NULL;
 1097|      0|	}
 1098|       |
 1099|      4|	fr_assert(parent || name);
  ------------------
  |  |  194|      4|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  |  Branch (397:43): [True: 4, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1100|       |
 1101|      4|	n = dict_attr_alloc(ctx, parent ? parent : in->parent, name ? name : in->name,
  ------------------
  |  |  257|      8|				_dict_attr_alloc(__FILE__, __LINE__, _ctx, _parent, _name, _attr, _type, (_args))
  |  |  ------------------
  |  |  |  Branch (257:48): [True: 4, False: 0]
  |  |  |  Branch (257:57): [True: 4, False: 0]
  |  |  ------------------
  ------------------
 1102|      4|			    in->attr, in->type, &(dict_attr_args_t){ .flags = &in->flags });
 1103|      4|	if (unlikely(!n)) return NULL;
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1104|       |
 1105|       |	/*
 1106|       |	 *	This newly allocated attribute is not the target of a ref.
 1107|       |	 */
 1108|      4|	n->flags.is_ref_target = false;
 1109|       |
 1110|      4|	if (dict_attr_ext_copy_all(&n, in) < 0) {
  ------------------
  |  Branch (1110:6): [True: 0, False: 4]
  ------------------
 1111|      0|	error:
 1112|      0|		talloc_free(n);
 1113|      0|		return NULL;
 1114|      0|	}
 1115|      4|	DA_VERIFY(n);
  ------------------
  |  |   64|      4|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 1116|       |
 1117|      4|	if (fr_type_is_structural(in->type) && in->flags.has_alias) {
  ------------------
  |  |  392|      8|#define fr_type_is_structural(_x)		(fr_type_structural[_x])
  |  |  ------------------
  |  |  |  Branch (392:36): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  |  Branch (1117:41): [True: 0, False: 0]
  ------------------
 1118|      0|		if (dict_attr_acopy_aliases(n, in) < 0) goto error;
  ------------------
  |  Branch (1118:7): [True: 0, False: 0]
  ------------------
 1119|      0|	}
 1120|       |
 1121|      4|	return n;
 1122|      4|}
dict_attr_acopy_children:
 1187|      2|{
 1188|      2|	uint				child_num;
 1189|      2|	fr_dict_attr_t const		*child = NULL, *src_key = NULL;
 1190|      2|	fr_dict_attr_t			*dst_key;
 1191|       |
 1192|      2|	fr_assert(fr_dict_attr_has_ext(dst, FR_DICT_ATTR_EXT_CHILDREN));
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1193|      2|	fr_assert(dst->type == src->type);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1194|      2|	fr_assert(fr_dict_attr_is_key_field(src) == fr_dict_attr_is_key_field(dst));
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 2]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 2]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1195|       |
 1196|       |	/*
 1197|       |	 *	For non-struct parents, we can copy their children in any order.
 1198|       |	 */
 1199|      2|	if (likely(src->type != FR_TYPE_STRUCT)) {
  ------------------
  |  |  396|      2|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  ------------------
  |  |  |  Branch (396:23): [True: 2, False: 0]
  |  |  ------------------
  ------------------
 1200|      2|		for (child = fr_dict_attr_iterate_children(src, &child);
 1201|      6|		     child != NULL;
  ------------------
  |  Branch (1201:8): [True: 4, False: 2]
  ------------------
 1202|      4|		     child = fr_dict_attr_iterate_children(src, &child)) {
 1203|      4|			if (dict_attr_acopy_child(dict, dst, src, child) < 0) return -1;
  ------------------
  |  Branch (1203:8): [True: 0, False: 4]
  ------------------
 1204|      4|		}
 1205|       |
 1206|      2|		return 0;
 1207|      2|	}
 1208|       |
 1209|       |	/*
 1210|       |	 *	For structs, we copy the children in order.  This allows "key" fields to be copied before
 1211|       |	 *	fields which depend on them.
 1212|       |	 *
 1213|       |	 *	Note that due to the checks in the DEFINE and ATTRIBUTE parsers (but not the validate
 1214|       |	 *	routines), STRUCTs can only have children which are MEMBERs.  And MEMBERs are allocated in
 1215|       |	 *	order.
 1216|       |	 */
 1217|      0|	for (child_num = 1, child = fr_dict_attr_child_by_num(src, child_num);
 1218|      0|	     child != NULL;
  ------------------
  |  Branch (1218:7): [True: 0, False: 0]
  ------------------
 1219|      0|	     child_num++, child = fr_dict_attr_child_by_num(src, child_num)) {
 1220|       |		/*
 1221|       |		 *	If the key field has enums, then delay copying the enums until after we've copied all
 1222|       |		 *	of the other children.
 1223|       |		 *
 1224|       |		 *	For a UNION which is inside of a STRUCT, the UNION has a reference to the key field.
 1225|       |		 *	So the key field needs to be defined before we create the UNION.
 1226|       |		 *
 1227|       |		 *	But the key field also has a set of ENUMs, each of which has a key ref to the UNION
 1228|       |		 *	member which is associated with that key value.  This means that we have circular
 1229|       |		 *	dependencies.
 1230|       |		 *
 1231|       |		 *	The loop is resolved by creating the key first, and allocating room for an ENUM
 1232|       |		 *	extension.  This allows the UNION to reference the key.  Once the UNION is created, we
 1233|       |		 *	go back and copy all of the ENUMs over.  The ENUM copy routine will take care of
 1234|       |		 *	fixing up the refs.
 1235|       |		 */
 1236|      0|		if (unlikely(fr_dict_attr_is_key_field(child) && child->flags.has_value)) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1237|      0|			src_key = child;
 1238|       |
 1239|      0|			if (src_key->flags.has_fixup) {
  ------------------
  |  Branch (1239:8): [True: 0, False: 0]
  ------------------
 1240|      0|				fr_strerror_printf("Cannot copy from %s - source attribute is waiting for additional definitions",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1241|      0|						   src_key->name);
 1242|      0|				return -1;
 1243|      0|			}
 1244|       |
 1245|      0|			dst_key = dict_attr_alloc(dict, dst, src_key->name,
  ------------------
  |  |  257|      0|				_dict_attr_alloc(__FILE__, __LINE__, _ctx, _parent, _name, _attr, _type, (_args))
  ------------------
 1246|      0|						  src_key->attr, src_key->type, &(dict_attr_args_t){ .flags = &src_key->flags });
 1247|      0|			if (unlikely(!dst_key)) return -1;
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1248|       |
 1249|      0|			if (!dict_attr_ext_alloc(&dst_key, FR_DICT_ATTR_EXT_ENUMV)) return -1;
  ------------------
  |  Branch (1249:8): [True: 0, False: 0]
  ------------------
 1250|       |
 1251|      0|			fr_assert(dst_key->parent == dst);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1252|      0|			dst_key->depth = dst->depth + 1;
 1253|       |
 1254|      0|			if (dict_attr_child_add(dst, dst_key) < 0) return -1;
  ------------------
  |  Branch (1254:8): [True: 0, False: 0]
  ------------------
 1255|       |
 1256|      0|			if (dict_attr_add_to_namespace(dst, dst_key) < 0) return -1;
  ------------------
  |  Branch (1256:8): [True: 0, False: 0]
  ------------------
 1257|       |
 1258|      0|			continue;
 1259|      0|		}
 1260|       |
 1261|      0|		if (dict_attr_acopy_child(dict, dst, src, child) < 0) return -1;
  ------------------
  |  Branch (1261:7): [True: 0, False: 0]
  ------------------
 1262|       |
 1263|      0|		DA_VERIFY(child);
  ------------------
  |  |   64|      0|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 1264|      0|	}
 1265|       |
 1266|      0|	DA_VERIFY(dst);
  ------------------
  |  |   64|      0|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 1267|       |
 1268|      0|	if (!src_key) return 0;
  ------------------
  |  Branch (1268:6): [True: 0, False: 0]
  ------------------
 1269|       |
 1270|      0|	if (!dict_attr_ext_copy(&dst_key, src_key, FR_DICT_ATTR_EXT_ENUMV)) return -1;
  ------------------
  |  Branch (1270:6): [True: 0, False: 0]
  ------------------
 1271|       |
 1272|      0|	return 0;
 1273|      0|}
dict_attr_alias_add:
 1400|      6|{
 1401|      6|	fr_dict_attr_t const *da;
 1402|      6|	fr_dict_attr_t *self;
 1403|      6|	fr_hash_table_t *namespace;
 1404|       |
 1405|      6|	switch (parent->type) {
 1406|      2|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (1406:2): [True: 2, False: 4]
  ------------------
 1407|       |		/*
 1408|       |		 *	If we are a STRUCT, the reference an only be to children of a UNION.
 1409|       |		 */
 1410|      2|		fr_assert(ref->parent->type == FR_TYPE_UNION);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1411|       |
 1412|       |		/*
 1413|       |		 *	And the UNION must be a MEMBER of the STRUCT.
 1414|       |		 */
 1415|      2|		fr_assert(ref->parent->parent == parent);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1416|      2|		break;
 1417|       |
 1418|      4|	case FR_TYPE_TLV:
  ------------------
  |  Branch (1418:2): [True: 4, False: 2]
  ------------------
 1419|      4|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (1419:2): [True: 0, False: 6]
  ------------------
 1420|      4|	case FR_TYPE_VSA:
  ------------------
  |  Branch (1420:2): [True: 0, False: 6]
  ------------------
 1421|      4|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (1421:2): [True: 0, False: 6]
  ------------------
 1422|      4|		break;
 1423|       |
 1424|      0|	default:
  ------------------
  |  Branch (1424:2): [True: 0, False: 6]
  ------------------
 1425|      0|		fr_strerror_printf("Cannot add ALIAS to parent attribute %s of data type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1426|      0|				   parent->name, fr_type_to_str(parent->type));
 1427|      0|		return -1;
 1428|      6|	}
 1429|       |
 1430|      6|	if ((ref->type == FR_TYPE_UNION) || fr_dict_attr_is_key_field(ref)) {
  ------------------
  |  |  170|      6|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 0, False: 6]
  |  |  |  Branch (170:63): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1430:6): [True: 0, False: 6]
  ------------------
 1431|      0|		fr_strerror_printf("Cannot add ALIAS to target attribute %s of data type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1432|      0|				   ref->name, fr_type_to_str(ref->type));
 1433|      0|		return -1;
 1434|      0|	}
 1435|       |
 1436|      6|	da = dict_attr_by_name(NULL, parent, alias);
 1437|      6|	if (da) {
  ------------------
  |  Branch (1437:6): [True: 0, False: 6]
  ------------------
 1438|      0|		fr_strerror_printf("ALIAS '%s' conflicts with another attribute in namespace %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1439|      0|				   alias, parent->name);
 1440|      0|		return -1;
 1441|      0|	}
 1442|       |
 1443|       |	/*
 1444|       |	 *	ALIASes from the dictionaries, need to point to a child of the same parent.  ALIASes cannot go
 1445|       |	 *	back up the tree.
 1446|       |	 *
 1447|       |	 *	ALIASes added internally, they can break this restriction.
 1448|       |	 *
 1449|       |	 *	This restriction is here to prevent people from creating loops of ALIASes.
 1450|       |	 */
 1451|      6|	if (from_public && !fr_dict_attr_common_parent(parent, ref, true)) {
  ------------------
  |  Branch (1451:6): [True: 4, False: 2]
  |  Branch (1451:21): [True: 0, False: 4]
  ------------------
 1452|      0|		fr_strerror_printf("Invalid ALIAS to target attribute %s of data type '%s' - the attributes do not share a parent",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1453|      0|				   ref->name, fr_type_to_str(ref->type));
 1454|      0|		return -1;
 1455|      0|	}
 1456|       |
 1457|       |	/*
 1458|       |	 *	Note that we do NOT call fr_dict_attr_add() here.
 1459|       |	 *
 1460|       |	 *	When that function adds two equivalent attributes, the
 1461|       |	 *	second one is prioritized for printing.  For ALIASes,
 1462|       |	 *	we want the pre-existing one to be prioritized.
 1463|       |	 *
 1464|       |	 *	i.e. you can lookup the ALIAS by "name", but you
 1465|       |	 *	actually get returned "ref".
 1466|       |	 */
 1467|      6|	{
 1468|      6|		fr_dict_attr_flags_t flags = ref->flags;
 1469|       |
 1470|      6|		flags.is_alias = 1;	/* These get followed automatically by public functions */
 1471|       |
 1472|      6|		self = dict_attr_alloc(parent->dict->pool, parent, alias, ref->attr, FR_TYPE_VOID, (&(dict_attr_args_t){ .flags = &flags, .ref = ref }));
  ------------------
  |  |  257|      6|				_dict_attr_alloc(__FILE__, __LINE__, _ctx, _parent, _name, _attr, _type, (_args))
  ------------------
 1473|      6|		if (unlikely(!self)) return -1;
  ------------------
  |  |  397|      6|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 6]
  |  |  ------------------
  ------------------
 1474|      6|	}
 1475|       |
 1476|      6|	self->dict = parent->dict;
 1477|      6|	UNCONST(fr_dict_attr_t *, parent)->flags.has_alias = true;
  ------------------
  |  |  186|      6|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 1478|       |
 1479|      6|	fr_assert(fr_dict_attr_ref(self) == ref);
  ------------------
  |  |  194|      6|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      6|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 6]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1480|       |
 1481|      6|	namespace = dict_attr_namespace(parent);
 1482|      6|	if (!namespace) {
  ------------------
  |  Branch (1482:6): [True: 0, False: 6]
  ------------------
 1483|      0|		fr_strerror_printf("Attribute '%s' does not contain a namespace", parent->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1484|      0|	error:
 1485|      0|		talloc_free(self);
 1486|      0|		return -1;
 1487|      0|	}
 1488|       |
 1489|      6|	if (!fr_hash_table_insert(namespace, self)) {
  ------------------
  |  Branch (1489:6): [True: 0, False: 6]
  ------------------
 1490|      0|		fr_strerror_const("Internal error storing attribute");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1491|      0|		goto error;
 1492|      0|	}
 1493|       |
 1494|      6|	return 0;
 1495|      6|}
dict_protocol_add:
 1508|      2|{
 1509|      2|	if (!dict->root) return -1;	/* Should always have root */
  ------------------
  |  Branch (1509:6): [True: 0, False: 2]
  ------------------
 1510|       |
 1511|      2|	if (!fr_hash_table_insert(dict_gctx->protocol_by_name, dict)) {
  ------------------
  |  Branch (1511:6): [True: 0, False: 2]
  ------------------
 1512|      0|		fr_dict_t *old_proto;
 1513|       |
 1514|      0|		old_proto = fr_hash_table_find(dict_gctx->protocol_by_name, dict);
 1515|      0|		if (!old_proto) {
  ------------------
  |  Branch (1515:7): [True: 0, False: 0]
  ------------------
 1516|      0|			fr_strerror_printf("%s: Failed inserting protocol name %s", __FUNCTION__, dict->root->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1517|      0|			return -1;
 1518|      0|		}
 1519|       |
 1520|      0|		if ((strcmp(old_proto->root->name, dict->root->name) == 0) &&
  ------------------
  |  Branch (1520:7): [True: 0, False: 0]
  ------------------
 1521|      0|		    (old_proto->root->name == dict->root->name)) {
  ------------------
  |  Branch (1521:7): [True: 0, False: 0]
  ------------------
 1522|      0|			fr_strerror_printf("%s: Duplicate protocol name %s", __FUNCTION__, dict->root->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1523|      0|			return -1;
 1524|      0|		}
 1525|       |
 1526|      0|		return 0;
 1527|      0|	}
 1528|      2|	dict->in_protocol_by_name = true;
 1529|       |
 1530|      2|	if (!fr_hash_table_insert(dict_gctx->protocol_by_num, dict)) {
  ------------------
  |  Branch (1530:6): [True: 0, False: 2]
  ------------------
 1531|      0|		fr_strerror_printf("%s: Duplicate protocol number %u", __FUNCTION__, dict->root->attr);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1532|      0|		return -1;
 1533|      0|	}
 1534|      2|	dict->in_protocol_by_num = true;
 1535|       |
 1536|      2|	dict_dependent_add(dict, "global");
 1537|       |
 1538|       |	/*
 1539|       |	 *	Create and add sub-attributes which allow other
 1540|       |	 *	protocols to be encapsulated in the internal
 1541|       |	 *	namespace.
 1542|       |	 */
 1543|      2|	if (dict_gctx->internal && (dict != dict_gctx->internal)) {
  ------------------
  |  Branch (1543:6): [True: 2, False: 0]
  |  Branch (1543:29): [True: 2, False: 0]
  ------------------
 1544|      2|		fr_dict_attr_t const *da;
 1545|      2|		fr_dict_attr_flags_t flags = { 0 };
 1546|       |
 1547|      2|		if (!dict_gctx->attr_protocol_encapsulation) dict_gctx->attr_protocol_encapsulation = fr_dict_attr_by_name(NULL, dict_gctx->internal->root, "Proto");
  ------------------
  |  Branch (1547:7): [True: 2, False: 0]
  ------------------
 1548|      2|		fr_assert(dict_gctx->attr_protocol_encapsulation != NULL);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1549|       |
 1550|      2|		da = fr_dict_attr_child_by_num(dict_gctx->attr_protocol_encapsulation, dict->root->attr);
 1551|      2|		if (!da) {
  ------------------
  |  Branch (1551:7): [True: 2, False: 0]
  ------------------
 1552|      2|			if (fr_dict_attr_add(dict_gctx->internal, dict_gctx->attr_protocol_encapsulation,
  ------------------
  |  Branch (1552:8): [True: 0, False: 2]
  ------------------
 1553|      2|					     dict->root->name, dict->root->attr, FR_TYPE_GROUP, &flags) < 0) {
 1554|      0|				return -1;
 1555|      0|			}
 1556|       |
 1557|      2|			da = fr_dict_attr_child_by_num(dict_gctx->attr_protocol_encapsulation, dict->root->attr);
 1558|      2|			fr_assert(da != NULL);
  ------------------
  |  |  194|      2|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1559|      2|		}
 1560|       |
 1561|      2|		dict_attr_ref_set(da, dict->root, FR_DICT_ATTR_REF_ALIAS);
 1562|      2|	}
 1563|       |
 1564|      2|	return 0;
 1565|      2|}
dict_vendor_add:
 1581|     10|{
 1582|     10|	size_t			len;
 1583|     10|	fr_dict_vendor_t	*vendor;
 1584|       |
 1585|     10|	INTERNAL_IF_NULL(dict, -1);
  ------------------
  |  |   46|     10|	do { \
  |  |   47|     10|		if (!(_dict)) { \
  |  |  ------------------
  |  |  |  Branch (47:7): [True: 0, False: 10]
  |  |  ------------------
  |  |   48|      0|			_dict = dict_gctx ? dict_gctx->internal : NULL; \
  |  |  ------------------
  |  |  |  Branch (48:12): [True: 0, False: 0]
  |  |  ------------------
  |  |   49|      0|			if (unlikely(!(_dict))) { \
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      0|				fr_strerror_const("No dictionaries available for attribute resolution"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |   51|      0|				return (_ret); \
  |  |   52|      0|			} \
  |  |   53|      0|		} \
  |  |   54|     10|	} while (0)
  |  |  ------------------
  |  |  |  Branch (54:11): [Folded, False: 10]
  |  |  ------------------
  ------------------
 1586|       |
 1587|     10|	len = strlen(name);
 1588|     10|	if (len >= FR_DICT_VENDOR_MAX_NAME_LEN) {
  ------------------
  |  |  500|     10|#define FR_DICT_VENDOR_MAX_NAME_LEN	(128)				//!< Maximum length of a vendor name.
  ------------------
  |  Branch (1588:6): [True: 0, False: 10]
  ------------------
 1589|      0|		fr_strerror_printf("%s: Vendor name too long", __FUNCTION__);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1590|      0|		return -1;
 1591|      0|	}
 1592|       |
 1593|     10|	vendor = talloc_zero(dict, fr_dict_vendor_t);
 1594|     10|	if (!vendor) {
  ------------------
  |  Branch (1594:6): [True: 0, False: 10]
  ------------------
 1595|      0|	oom:
 1596|      0|		fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1597|      0|		return -1;
 1598|      0|	}
 1599|       |
 1600|     10|	vendor->name = talloc_strdup(vendor, name);
  ------------------
  |  |  149|     10|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
 1601|     10|	if (!vendor->name) {
  ------------------
  |  Branch (1601:6): [True: 0, False: 10]
  ------------------
 1602|      0|		talloc_free(vendor);
 1603|      0|		goto oom;
 1604|      0|	}
 1605|     10|	vendor->pen = num;
 1606|     10|	vendor->type = vendor->length = 1; /* defaults */
 1607|       |
 1608|     10|	if (!fr_hash_table_insert(dict->vendors_by_name, vendor)) {
  ------------------
  |  Branch (1608:6): [True: 0, False: 10]
  ------------------
 1609|      0|		fr_dict_vendor_t const *old_vendor;
 1610|       |
 1611|      0|		old_vendor = fr_hash_table_find(dict->vendors_by_name, vendor);
 1612|      0|		if (!old_vendor) {
  ------------------
  |  Branch (1612:7): [True: 0, False: 0]
  ------------------
 1613|      0|			fr_strerror_printf("%s: Failed inserting vendor name %s", __FUNCTION__, name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1614|      0|			return -1;
 1615|      0|		}
 1616|      0|		if ((strcmp(old_vendor->name, vendor->name) == 0) && (old_vendor->pen != vendor->pen)) {
  ------------------
  |  Branch (1616:7): [True: 0, False: 0]
  |  Branch (1616:56): [True: 0, False: 0]
  ------------------
 1617|      0|			fr_strerror_printf("%s: Duplicate vendor name %s", __FUNCTION__, name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1618|      0|			return -1;
 1619|      0|		}
 1620|       |
 1621|       |		/*
 1622|       |		 *	Already inserted.  Discard the duplicate entry.
 1623|       |		 */
 1624|      0|		talloc_free(vendor);
 1625|       |
 1626|      0|		return 0;
 1627|      0|	}
 1628|       |
 1629|       |	/*
 1630|       |	 *	Insert the SAME pointer (not free'd when this table is
 1631|       |	 *	deleted), into another table.
 1632|       |	 *
 1633|       |	 *	We want this behaviour because we want OLD names for
 1634|       |	 *	the attributes to be read from the configuration
 1635|       |	 *	files, but when we're printing them, (and looking up
 1636|       |	 *	by value) we want to use the NEW name.
 1637|       |	 */
 1638|     10|	if (fr_hash_table_replace(NULL, dict->vendors_by_num, vendor) < 0) {
  ------------------
  |  Branch (1638:6): [True: 0, False: 10]
  ------------------
 1639|      0|		fr_strerror_printf("%s: Failed inserting vendor %s", __FUNCTION__, name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1640|      0|		return -1;
 1641|      0|	}
 1642|       |
 1643|     10|	return 0;
 1644|     10|}
dict_attr_can_have_children:
 1651|  2.15k|{
 1652|  2.15k|	switch (da->type) {
 1653|  1.89k|	case FR_TYPE_TLV:
  ------------------
  |  Branch (1653:2): [True: 1.89k, False: 262]
  ------------------
 1654|  1.95k|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (1654:2): [True: 62, False: 2.09k]
  ------------------
 1655|  1.96k|	case FR_TYPE_VSA:
  ------------------
  |  Branch (1655:2): [True: 10, False: 2.14k]
  ------------------
 1656|  2.15k|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (1656:2): [True: 188, False: 1.96k]
  ------------------
 1657|  2.15k|	case FR_TYPE_UNION:
  ------------------
  |  Branch (1657:2): [True: 2, False: 2.15k]
  ------------------
 1658|  2.15k|		return true;
 1659|       |
 1660|      0|	default:
  ------------------
  |  Branch (1660:2): [True: 0, False: 2.15k]
  ------------------
 1661|      0|		break;
 1662|  2.15k|	}
 1663|       |
 1664|      0|	return false;
 1665|  2.15k|}
dict_attr_child_add:
 1676|  1.70k|{
 1677|  1.70k|	fr_dict_attr_t const * const *bin;
 1678|  1.70k|	fr_dict_attr_t **this;
 1679|  1.70k|	fr_dict_attr_t const **children;
 1680|       |
 1681|       |	/*
 1682|       |	 *	Setup fields in the child
 1683|       |	 */
 1684|  1.70k|	fr_assert(child->parent == parent);
  ------------------
  |  |  194|  1.70k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  1.70k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 1.70k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1685|       |
 1686|  1.70k|	DA_VERIFY(child);
  ------------------
  |  |   64|  1.70k|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 1687|       |
 1688|  1.70k|	if (fr_dict_attr_ref(parent)) {
  ------------------
  |  Branch (1688:6): [True: 0, False: 1.70k]
  ------------------
 1689|      0|		fr_strerror_printf("Cannot add children to attribute '%s' which has 'ref=%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1690|      0|				   parent->name, fr_dict_attr_ref(parent)->name);
 1691|      0|		return -1;
 1692|      0|	}
 1693|       |
 1694|  1.70k|	if (!dict_attr_can_have_children(parent)) {
  ------------------
  |  Branch (1694:6): [True: 0, False: 1.70k]
  ------------------
 1695|      0|		fr_strerror_printf("Cannot add children to attribute '%s' of type %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1696|      0|				   parent->name,
 1697|      0|				   fr_type_to_str(parent->type));
 1698|      0|		return -1;
 1699|      0|	}
 1700|       |
 1701|  1.70k|	if ((parent->type == FR_TYPE_VSA) && (child->type != FR_TYPE_VENDOR)) {
  ------------------
  |  Branch (1701:6): [True: 10, False: 1.69k]
  |  Branch (1701:39): [True: 0, False: 10]
  ------------------
 1702|      0|		fr_strerror_printf("Cannot add non-vendor children to attribute '%s' of type %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1703|      0|				   parent->name,
 1704|      0|				   fr_type_to_str(parent->type));
 1705|      0|		return -1;
 1706|      0|	}
 1707|       |
 1708|       |	/*
 1709|       |	 *	The parent has children by name only, not by number.  Don't even bother trying to track
 1710|       |	 *	numbers, except for VENDOR in root, and MEMBER of a struct.
 1711|       |	 */
 1712|  1.70k|	if (!parent->flags.is_root && parent->flags.name_only &&
  ------------------
  |  Branch (1712:6): [True: 638, False: 1.06k]
  |  Branch (1712:32): [True: 0, False: 638]
  ------------------
 1713|      0|	    (parent->type != FR_TYPE_STRUCT) && (parent->type != FR_TYPE_TLV)) {
  ------------------
  |  Branch (1713:6): [True: 0, False: 0]
  |  Branch (1713:42): [True: 0, False: 0]
  ------------------
 1714|      0|		return 0;
 1715|      0|	}
 1716|       |
 1717|       |	/*
 1718|       |	 *	We only allocate the pointer array *if* the parent has children.
 1719|       |	 */
 1720|  1.70k|	children = dict_attr_children(parent);
 1721|  1.70k|	if (!children) {
  ------------------
  |  Branch (1721:6): [True: 104, False: 1.59k]
  ------------------
 1722|    104|		children = talloc_zero_array(parent, fr_dict_attr_t const *, UINT8_MAX + 1);
 1723|    104|		if (!children) {
  ------------------
  |  Branch (1723:7): [True: 0, False: 104]
  ------------------
 1724|      0|			fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1725|      0|			return -1;
 1726|      0|		}
 1727|    104|		if (dict_attr_children_set(parent, children) < 0) return -1;
  ------------------
  |  Branch (1727:7): [True: 0, False: 104]
  ------------------
 1728|    104|	}
 1729|       |
 1730|       |	/*
 1731|       |	 *	Treat the array as a hash of 255 bins, with attributes
 1732|       |	 *	sorted into bins using num % 255.
 1733|       |	 *
 1734|       |	 *	Although the various protocols may define numbers higher than 255:
 1735|       |	 *
 1736|       |	 *	RADIUS/DHCPv4     - 1-255
 1737|       |	 *	Diameter/Internal - 1-4294967295
 1738|       |	 *	DHCPv6            - 1-65535
 1739|       |	 *
 1740|       |	 *	In reality very few will ever use attribute numbers > 500, so for
 1741|       |	 *	the majority of lookups we get O(1) performance.
 1742|       |	 *
 1743|       |	 *	Attributes are inserted into the bin in order of their attribute
 1744|       |	 *	numbers to allow slightly more efficient lookups.
 1745|       |	 */
 1746|  1.70k|	for (bin = &children[child->attr & 0xff]; *bin; bin = &(*bin)->next) {
  ------------------
  |  Branch (1746:44): [True: 310, False: 1.39k]
  ------------------
 1747|       |		/*
 1748|       |		 *	Workaround for vendors that overload the RFC space.
 1749|       |		 *	Structural attributes always take priority.
 1750|       |		 */
 1751|    310|		bool child_is_struct = fr_type_is_structural(child->type);
  ------------------
  |  |  392|    310|#define fr_type_is_structural(_x)		(fr_type_structural[_x])
  ------------------
 1752|    310|		bool bin_is_struct = fr_type_is_structural((*bin)->type);
  ------------------
  |  |  392|    310|#define fr_type_is_structural(_x)		(fr_type_structural[_x])
  ------------------
 1753|       |
 1754|    310|		if (child_is_struct && !bin_is_struct) break;
  ------------------
  |  Branch (1754:7): [True: 20, False: 290]
  |  Branch (1754:26): [True: 18, False: 2]
  ------------------
 1755|    292|		if (fr_dict_vendor_num_by_da(child) <= fr_dict_vendor_num_by_da(*bin)) break;	/* Prioritise RFC attributes */
  ------------------
  |  Branch (1755:7): [True: 292, False: 0]
  ------------------
 1756|      0|		if (child->attr <= (*bin)->attr) break;
  ------------------
  |  Branch (1756:7): [True: 0, False: 0]
  ------------------
 1757|      0|	}
 1758|       |
 1759|  1.70k|	memcpy(&this, &bin, sizeof(this));
 1760|  1.70k|	child->next = *this;
 1761|  1.70k|	*this = child;
 1762|       |
 1763|  1.70k|	return 0;
 1764|  1.70k|}
dict_attr_add_to_namespace:
 1775|  1.70k|{
 1776|  1.70k|	fr_hash_table_t		*namespace;
 1777|       |
 1778|  1.70k|	namespace = dict_attr_namespace(parent);
 1779|  1.70k|	if (unlikely(!namespace)) {
  ------------------
  |  |  397|  1.70k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.70k]
  |  |  ------------------
  ------------------
 1780|      0|		fr_strerror_printf("Parent \"%s\" has no namespace", parent->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1781|      0|	error:
 1782|      0|		return -1;
 1783|      0|	}
 1784|       |
 1785|       |	/*
 1786|       |	 *	Sanity check to stop children of vendors ending
 1787|       |	 *	up in the Vendor-Specific or root namespace.
 1788|       |	 */
 1789|  1.70k|	if ((fr_dict_vendor_num_by_da(da) != 0) && (da->type != FR_TYPE_VENDOR) &&
  ------------------
  |  Branch (1789:6): [True: 72, False: 1.63k]
  |  Branch (1789:45): [True: 62, False: 10]
  ------------------
 1790|     62|	    ((parent->type == FR_TYPE_VSA) || parent->flags.is_root)) {
  ------------------
  |  Branch (1790:7): [True: 0, False: 62]
  |  Branch (1790:40): [True: 0, False: 62]
  ------------------
 1791|      0|		fr_strerror_printf("Cannot insert attribute '%s' of type %s into %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1792|      0|				   da->name,
 1793|      0|				   fr_type_to_str(da->type),
 1794|      0|				   parent->name);
 1795|      0|		goto error;
 1796|      0|	}
 1797|       |
 1798|       |	/*
 1799|       |	 *	Insert the attribute, only if it's not a duplicate.
 1800|       |	 */
 1801|  1.70k|	if (!fr_hash_table_insert(namespace, da)) {
  ------------------
  |  Branch (1801:6): [True: 0, False: 1.70k]
  ------------------
 1802|      0|		fr_dict_attr_t *a;
 1803|       |
 1804|       |		/*
 1805|       |		 *	Find the old name.  If it's the same name and
 1806|       |		 *	but the parent, or number, or type are
 1807|       |		 *	different, that's an error.
 1808|       |		 */
 1809|      0|		a = fr_hash_table_find(namespace, da);
 1810|      0|		if (a && (strcasecmp(a->name, da->name) == 0)) {
  ------------------
  |  Branch (1810:7): [True: 0, False: 0]
  |  Branch (1810:12): [True: 0, False: 0]
  ------------------
 1811|      0|			if ((a->attr != da->attr) || (a->type != da->type) || (a->parent != da->parent)) {
  ------------------
  |  Branch (1811:8): [True: 0, False: 0]
  |  Branch (1811:33): [True: 0, False: 0]
  |  Branch (1811:58): [True: 0, False: 0]
  ------------------
 1812|      0|				fr_strerror_printf("Duplicate attribute name '%s' in namespace '%s'.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1813|      0|				   		   "Originally defined %s[%d]",
 1814|      0|						   da->name, parent->name,
 1815|      0|						   a->filename, a->line);
 1816|      0|				goto error;
 1817|      0|			}
 1818|      0|		}
 1819|       |
 1820|       |		/*
 1821|       |		 *	Otherwise the attribute has been redefined later
 1822|       |		 *	in the dictionary.
 1823|       |		 *
 1824|       |		 *	The original fr_dict_attr_t remains in the
 1825|       |		 *	dictionary but entry in the name hash table is
 1826|       |		 *	updated to point to the new definition.
 1827|       |		 */
 1828|      0|		if (fr_hash_table_replace(NULL, namespace, da) < 0) {
  ------------------
  |  Branch (1828:7): [True: 0, False: 0]
  ------------------
 1829|      0|			fr_strerror_const("Internal error storing attribute");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1830|      0|			goto error;
 1831|      0|		}
 1832|      0|	}
 1833|       |
 1834|  1.70k|	return 0;
 1835|  1.70k|}
fr_dict_attr_add_initialised:
 1841|  1.61k|{
 1842|  1.61k|	fr_dict_attr_t const	*exists;
 1843|       |
 1844|  1.61k|	if (unlikely(da->dict->read_only)) {
  ------------------
  |  |  397|  1.61k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.61k]
  |  |  ------------------
  ------------------
 1845|      0|		fr_strerror_printf("%s dictionary has been marked as read only", fr_dict_root(da->dict)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1846|      0|		return -1;
 1847|      0|	}
 1848|       |
 1849|  1.61k|	if (unlikely(da->state.finalised == false)) {
  ------------------
  |  |  397|  1.61k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.61k]
  |  |  ------------------
  ------------------
 1850|      0|		fr_strerror_const("Attribute has not been finalised");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1851|      0|		return -1;
 1852|      0|	}
 1853|       |
 1854|       |	/*
 1855|       |	 *	Check that the definition is valid.
 1856|       |	 */
 1857|  1.61k|	if (!dict_attr_valid(da)) return -1;
  ------------------
  |  Branch (1857:6): [True: 0, False: 1.61k]
  ------------------
 1858|       |
 1859|       |	/*
 1860|       |	 *	Don't allow duplicate names
 1861|       |	 *
 1862|       |	 *	Previously we allowed duplicate names, but only if the
 1863|       |	 *	attributes were compatible (we'd just ignore the operation).
 1864|       |	 *
 1865|       |	 *	But as attribute parsing may have generated fixups, which
 1866|       |	 *	we'd now need to unpick, it's easier just to error out
 1867|       |	 *	and have the user fix the duplicate.
 1868|       |	 */
 1869|  1.61k|	exists = fr_dict_attr_by_name(NULL, da->parent, da->name);
 1870|  1.61k|	if (exists) {
  ------------------
  |  Branch (1870:6): [True: 0, False: 1.61k]
  ------------------
 1871|      0|		fr_strerror_printf("Duplicate attribute name '%s' in namespace '%s'.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1872|      0|				   "Originally defined %s[%d]", da->name, da->parent->name,
 1873|      0|				   exists->filename, exists->line);
 1874|      0|		return -1;
 1875|      0|	}
 1876|       |
 1877|       |	/*
 1878|       |	 *	In some cases name_only attributes may have explicitly
 1879|       |	 *	assigned numbers. Ensure that there are no conflicts
 1880|       |	 *	between auto-assigned and explkicitly assigned.
 1881|       |	 */
 1882|  1.61k|	if (da->flags.name_only) {
  ------------------
  |  Branch (1882:6): [True: 0, False: 1.61k]
  ------------------
 1883|      0|		if (da->state.attr_set) {
  ------------------
  |  Branch (1883:7): [True: 0, False: 0]
  ------------------
 1884|      0|			fr_dict_attr_t *parent = fr_dict_attr_unconst(da->parent);
 1885|       |
 1886|      0|			if (da->attr > da->parent->last_child_attr) {
  ------------------
  |  Branch (1886:8): [True: 0, False: 0]
  ------------------
 1887|      0|				parent->last_child_attr = da->attr;
 1888|       |
 1889|       |				/*
 1890|       |				*	If the attribute is outside of the bounds of
 1891|       |				*	the type size, then it MUST be an internal
 1892|       |				*	attribute.  Set the flag in this attribute, so
 1893|       |				*	that the encoder doesn't have to do complex
 1894|       |				*	checks.
 1895|       |				*/
 1896|      0|				if ((da->attr >= (((uint64_t)1) << (8 * parent->flags.type_size)))) da->flags.internal = true;
  ------------------
  |  Branch (1896:9): [True: 0, False: 0]
  ------------------
 1897|      0|			}
 1898|      0|		} else if (unlikely(dict_attr_num_init_name_only(da)) < 0) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  ------------------
  |  Branch (1898:14): [True: 0, False: 0]
  ------------------
 1899|      0|			return -1;
 1900|      0|		}
 1901|      0|	}
 1902|       |
 1903|       |	/*
 1904|       |	 *	Attributes can also be indexed by number.  Ensure that
 1905|       |	 *	all attributes of the same number have the same
 1906|       |	 *	properties.
 1907|       |	 */
 1908|  1.61k|	exists = fr_dict_attr_child_by_num(da->parent, da->attr);
 1909|  1.61k|	if (exists) {
  ------------------
  |  Branch (1909:6): [True: 0, False: 1.61k]
  ------------------
 1910|      0|		fr_strerror_printf("Duplicate attribute number %u in namespace '%s'.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1911|      0|				   "Originally defined by '%s' at %s[%d]",
 1912|      0|				   da->attr, da->parent->name, exists->name, exists->filename, exists->line);
 1913|      0|		return -1;
 1914|      0|	}
 1915|       |
 1916|       |	/*
 1917|       |	 *	Add in by number
 1918|       |	 */
 1919|  1.61k|	if (dict_attr_child_add(UNCONST(fr_dict_attr_t *, da->parent), da) < 0) return -1;
  ------------------
  |  |  186|  1.61k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  |  Branch (1919:6): [True: 0, False: 1.61k]
  ------------------
 1920|       |
 1921|       |	/*
 1922|       |	 *	Add in by name
 1923|       |	 */
 1924|  1.61k|	if (dict_attr_add_to_namespace(da->parent, da) < 0) return -1;
  ------------------
  |  Branch (1924:6): [True: 0, False: 1.61k]
  ------------------
 1925|       |
 1926|  1.61k|#ifndef NDEBUG
 1927|  1.61k|	{
 1928|  1.61k|		fr_dict_attr_t const *found;
 1929|       |
 1930|       |		/*
 1931|       |		 *	Check if we added the attribute
 1932|       |		 */
 1933|  1.61k|		found = dict_attr_child_by_num(da->parent, da->attr);
 1934|  1.61k|		if (!found) {
  ------------------
  |  Branch (1934:7): [True: 0, False: 1.61k]
  ------------------
 1935|      0|			fr_strerror_printf("FATAL - Failed to find attribute number %u we just added to namespace '%s'", da->attr, da->parent->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1936|      0|			return -1;
 1937|      0|		}
 1938|       |
 1939|  1.61k|		if (!dict_attr_by_name(NULL, da->parent, da->name)) {
  ------------------
  |  Branch (1939:7): [True: 0, False: 1.61k]
  ------------------
 1940|      0|			fr_strerror_printf("FATAL - Failed to find attribute '%s' we just added to namespace '%s'", da->name, da->parent->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1941|      0|			return -1;
 1942|      0|		}
 1943|  1.61k|	}
 1944|  1.61k|#endif
 1945|       |
 1946|  1.61k|	return 0;
 1947|  1.61k|}
fr_dict_attr_add:
 1964|      2|{
 1965|      2|	fr_dict_attr_t *da;
 1966|       |
 1967|      2|	if (fr_dict_attr_ref(parent)) {
  ------------------
  |  Branch (1967:6): [True: 0, False: 2]
  ------------------
 1968|      0|		fr_strerror_printf("Cannot add children to attribute '%s' which has 'ref=%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1969|      0|				   parent->name, fr_dict_attr_ref(parent)->name);
 1970|      0|		return -1;
 1971|      0|	}
 1972|       |
 1973|      2|	if (!dict_attr_can_have_children(parent)) {
  ------------------
  |  Branch (1973:6): [True: 0, False: 2]
  ------------------
 1974|      0|		fr_strerror_printf("Cannot add children to attribute '%s' of type %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1975|      0|				   parent->name,
 1976|      0|				   fr_type_to_str(parent->type));
 1977|      0|		return -1;
 1978|      0|	}
 1979|       |
 1980|      2|	da = dict_attr_alloc_null(dict->pool, dict->proto);
 1981|      2|	if (unlikely(!da)) return -1;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 1982|       |
 1983|      2|	if (dict_attr_init(&da, parent, name,
  ------------------
  |  |  233|      2|				       _dict_attr_init(__FILE__, __LINE__, _da_p, _parent, _name, _attr, _type, _args)
  ------------------
  |  Branch (1983:6): [True: 0, False: 2]
  ------------------
 1984|      2|			   attr, type, &(dict_attr_args_t){ .flags = flags}) < 0) return -1;
 1985|       |
 1986|      2|	return fr_dict_attr_add_initialised(da);
 1987|      2|}
dict_attr_enum_add_name:
 2019|    804|{
 2020|    804|	size_t				len;
 2021|    804|	fr_dict_enum_value_t		*enumv = NULL;
 2022|    804|	fr_value_box_t			*enum_value = NULL;
 2023|    804|	fr_dict_attr_ext_enumv_t	*ext;
 2024|       |
 2025|    804|	if (!da) {
  ------------------
  |  Branch (2025:6): [True: 0, False: 804]
  ------------------
 2026|      0|		fr_strerror_printf("%s: Dictionary attribute not specified", __FUNCTION__);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2027|      0|		return -1;
 2028|      0|	}
 2029|       |
 2030|    804|	if (!*name) {
  ------------------
  |  Branch (2030:6): [True: 0, False: 804]
  ------------------
 2031|      0|		fr_strerror_printf("%s: Empty names are not permitted", __FUNCTION__);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2032|      0|		return -1;
 2033|      0|	}
 2034|       |
 2035|    804|	len = strlen(name);
 2036|    804|	if (len >= FR_DICT_ENUM_MAX_NAME_LEN) {
  ------------------
  |  |  499|    804|#define FR_DICT_ENUM_MAX_NAME_LEN	(128)				//!< Maximum length of a enum value.
  ------------------
  |  Branch (2036:6): [True: 0, False: 804]
  ------------------
 2037|      0|		fr_strerror_printf("VALUE name is too long");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2038|      0|		return -1;
 2039|      0|	}
 2040|       |
 2041|       |	/*
 2042|       |	 *	If the parent isn't a key field, then we CANNOT add a child struct.
 2043|       |	 */
 2044|    804|	if (!fr_dict_attr_is_key_field(da) && key_child_ref) {
  ------------------
  |  |  170|  1.60k|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 22, False: 782]
  |  |  |  Branch (170:63): [True: 2, False: 20]
  |  |  ------------------
  ------------------
  |  Branch (2044:40): [True: 0, False: 802]
  ------------------
 2045|      0|		fr_strerror_const("Child attributes cannot be defined for VALUEs which are not 'key' attributes");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2046|      0|		return -1;
 2047|      0|	}
 2048|       |
 2049|    804|	if (fr_type_is_structural(da->type) || (da->type == FR_TYPE_STRING)) {
  ------------------
  |  |  392|  1.60k|#define fr_type_is_structural(_x)		(fr_type_structural[_x])
  |  |  ------------------
  |  |  |  Branch (392:36): [True: 0, False: 804]
  |  |  ------------------
  ------------------
  |  Branch (2049:41): [True: 0, False: 804]
  ------------------
 2050|      0|		fr_strerror_printf("Enumeration names cannot be added for data type '%s'", fr_type_to_str(da->type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2051|      0|		return -1;
 2052|      0|	}
 2053|       |
 2054|    804|	if (da->flags.is_alias) {
  ------------------
  |  Branch (2054:6): [True: 0, False: 804]
  ------------------
 2055|      0|		fr_strerror_printf("Enumeration names cannot be added for ALIAS '%s'", da->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2056|      0|		return -1;
 2057|      0|	}
 2058|       |
 2059|    804|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_ENUMV);
 2060|    804|	if (!ext) {
  ------------------
  |  Branch (2060:6): [True: 0, False: 804]
  ------------------
 2061|      0|		fr_strerror_printf("VALUE cannot be defined for %s", da->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2062|      0|		return -1;
 2063|      0|	}
 2064|       |
 2065|       |	/*
 2066|       |	 *	Initialise enumv hash tables
 2067|       |	 */
 2068|    804|	if (!ext->value_by_name || !ext->name_by_value) {
  ------------------
  |  Branch (2068:6): [True: 82, False: 722]
  |  Branch (2068:29): [True: 0, False: 722]
  ------------------
 2069|     82|		ext->value_by_name = fr_hash_table_talloc_alloc(da, fr_dict_enum_value_t, dict_enum_name_hash,
  ------------------
  |  |   65|     82|		_fr_hash_table_alloc(_ctx, #_type, _hash_node, _cmp_node, _free_node)
  ------------------
 2070|     82|								dict_enum_name_cmp, NULL);
 2071|     82|		if (!ext->value_by_name) {
  ------------------
  |  Branch (2071:7): [True: 0, False: 82]
  ------------------
 2072|      0|			fr_strerror_printf("Failed allocating \"value_by_name\" table");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2073|      0|			return -1;
 2074|      0|		}
 2075|       |
 2076|     82|		ext->name_by_value = fr_hash_table_talloc_alloc(da, fr_dict_enum_value_t, dict_enum_value_hash,
  ------------------
  |  |   65|     82|		_fr_hash_table_alloc(_ctx, #_type, _hash_node, _cmp_node, _free_node)
  ------------------
 2077|     82|								dict_enum_value_cmp, NULL);
 2078|     82|		if (!ext->name_by_value) {
  ------------------
  |  Branch (2078:7): [True: 0, False: 82]
  ------------------
 2079|      0|			fr_strerror_printf("Failed allocating \"name_by_value\" table");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2080|      0|			return -1;
 2081|      0|		}
 2082|     82|	}
 2083|       |
 2084|       |	/*
 2085|       |	 *	Allocate a structure to map between
 2086|       |	 *	the name and value.
 2087|       |	 */
 2088|    804|	enumv = talloc_zero_size(da, sizeof(fr_dict_enum_value_t));
 2089|    804|	if (!enumv) {
  ------------------
  |  Branch (2089:6): [True: 0, False: 804]
  ------------------
 2090|      0|	oom:
 2091|      0|		fr_strerror_printf("%s: Out of memory", __FUNCTION__);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2092|      0|		return -1;
 2093|      0|	}
 2094|    804|	talloc_set_type(enumv, fr_dict_enum_value_t);
 2095|       |
 2096|    804|	enumv->name = talloc_strdup(enumv, name);
  ------------------
  |  |  149|    804|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
 2097|    804|	enumv->name_len = len;
 2098|       |
 2099|    804|	if (key_child_ref) {
  ------------------
  |  Branch (2099:6): [True: 2, False: 802]
  ------------------
 2100|      2|		fr_dict_enum_ext_attr_ref_t *ref;
 2101|       |
 2102|      2|		ref = dict_enum_ext_alloc(&enumv, FR_DICT_ENUM_EXT_ATTR_REF);
 2103|      2|		if (!ref) goto oom;
  ------------------
  |  Branch (2103:7): [True: 0, False: 2]
  ------------------
 2104|       |
 2105|      2|		ref->da = key_child_ref;
 2106|      2|	}
 2107|       |
 2108|    804|	enum_value = fr_value_box_alloc(enumv, da->type, NULL);
  ------------------
  |  |  644|    804|#define fr_value_box_alloc(_ctx, _type, _enumv) _fr_value_box_alloc(NDEBUG_LOCATION_EXP _ctx, _type, _enumv)
  |  |  ------------------
  |  |  |  |  285|    804|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 2109|    804|	if (!enum_value) goto oom;
  ------------------
  |  Branch (2109:6): [True: 0, False: 804]
  ------------------
 2110|       |
 2111|    804|	if (da->type != value->type) {
  ------------------
  |  Branch (2111:6): [True: 0, False: 804]
  ------------------
 2112|      0|		if (!coerce) {
  ------------------
  |  Branch (2112:7): [True: 0, False: 0]
  ------------------
 2113|      0|			fr_strerror_printf("Type mismatch between attribute (%s) and enum (%s)",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2114|      0|					   fr_type_to_str(da->type),
 2115|      0|					   fr_type_to_str(value->type));
 2116|      0|			return -1;
 2117|      0|		}
 2118|       |
 2119|      0|		if (fr_value_box_cast(enumv, enum_value, da->type, NULL, value) < 0) {
  ------------------
  |  Branch (2119:7): [True: 0, False: 0]
  ------------------
 2120|      0|			fr_strerror_printf_push("Failed coercing enum type (%s) to attribute type (%s)",
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2121|      0|					   	fr_type_to_str(value->type),
 2122|      0|					   	fr_type_to_str(da->type));
 2123|       |
 2124|      0|			return -1;
 2125|      0|		}
 2126|    804|	} else {
 2127|    804|		if (unlikely(fr_value_box_copy(enum_value, enum_value, value) < 0)) {
  ------------------
  |  |  397|    804|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 804]
  |  |  ------------------
  ------------------
 2128|      0|			fr_strerror_printf_push("%s: Failed copying value into enum", __FUNCTION__);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2129|      0|			return -1;
 2130|      0|		}
 2131|    804|	}
 2132|       |
 2133|    804|	enumv->value = enum_value;
 2134|       |
 2135|       |	/*
 2136|       |	 *	Add the value into the dictionary.
 2137|       |	 */
 2138|    804|	{
 2139|    804|		fr_dict_attr_t *tmp;
 2140|    804|		memcpy(&tmp, &enumv, sizeof(tmp));
 2141|       |
 2142|    804|		if (!fr_hash_table_insert(ext->value_by_name, tmp)) {
  ------------------
  |  Branch (2142:7): [True: 0, False: 804]
  ------------------
 2143|      0|			fr_dict_enum_value_t const *old;
 2144|       |
 2145|       |			/*
 2146|       |			 *	Suppress duplicates with the same
 2147|       |			 *	name and value.  There are lots in
 2148|       |			 *	dictionary.ascend.
 2149|       |			 */
 2150|      0|			old = fr_dict_enum_by_name(da, name, -1);
 2151|      0|			if (!fr_cond_assert(old)) return -1;
  ------------------
  |  |  131|      0|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|      0|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2151:8): [True: 0, False: 0]
  ------------------
 2152|       |
 2153|      0|			if (fr_value_box_cmp(old->value, enumv->value) == 0) {
  ------------------
  |  Branch (2153:8): [True: 0, False: 0]
  ------------------
 2154|      0|				talloc_free(enumv);
 2155|      0|				return 0;
 2156|      0|			}
 2157|       |
 2158|      0|			fr_strerror_printf("Duplicate VALUE name \"%s\" for Attribute '%s'. "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2159|      0|					   "Old value was \"%pV\", new value was \"%pV\"", name, da->name,
 2160|      0|					   old->value, enumv->value);
 2161|      0|			talloc_free(enumv);
 2162|      0|			return -1;
 2163|      0|		}
 2164|       |
 2165|    804|		if (enumv->name_len > ext->max_name_len) ext->max_name_len = enumv->name_len;
  ------------------
  |  Branch (2165:7): [True: 200, False: 604]
  ------------------
 2166|    804|	}
 2167|       |
 2168|       |	/*
 2169|       |	 *	There are multiple VALUE's, keyed by attribute, so we
 2170|       |	 *	take care of that here.
 2171|       |	 */
 2172|    804|	if (takes_precedence) {
  ------------------
  |  Branch (2172:6): [True: 728, False: 76]
  ------------------
 2173|    728|		if (fr_hash_table_replace(NULL, ext->name_by_value, enumv) < 0) {
  ------------------
  |  Branch (2173:7): [True: 0, False: 728]
  ------------------
 2174|      0|			fr_strerror_printf("%s: Failed inserting value %s", __FUNCTION__, name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2175|      0|			return -1;
 2176|      0|		}
 2177|    728|	} else {
 2178|     76|		(void) fr_hash_table_insert(ext->name_by_value, enumv);
 2179|     76|	}
 2180|       |
 2181|       |	/*
 2182|       |	 *	Mark the attribute up as having an enumv
 2183|       |	 */
 2184|    804|	UNCONST(fr_dict_attr_t *, da)->flags.has_value = 1;
  ------------------
  |  |  186|    804|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 2185|       |
 2186|    804|	return 0;
 2187|    804|}
fr_dict_enum_add_name:
 2215|    726|{
 2216|       |	return dict_attr_enum_add_name(da, name, value, coerce, takes_precedence, NULL);
 2217|    726|}
fr_dict_attr_common_parent:
 2309|     14|{
 2310|     14|	unsigned int i;
 2311|     14|	fr_dict_attr_t const *p_a, *p_b;
 2312|       |
 2313|     14|	if (!a || !b) return NULL;
  ------------------
  |  Branch (2313:6): [True: 0, False: 14]
  |  Branch (2313:12): [True: 0, False: 14]
  ------------------
 2314|       |
 2315|     14|	if (is_ancestor && (b->depth <= a->depth)) return NULL;	/* fast_path */
  ------------------
  |  Branch (2315:6): [True: 14, False: 0]
  |  Branch (2315:21): [True: 0, False: 14]
  ------------------
 2316|       |
 2317|       |	/*
 2318|       |	 *	Find a common depth to work back from
 2319|       |	 */
 2320|     14|	if (a->depth > b->depth) {
  ------------------
  |  Branch (2320:6): [True: 0, False: 14]
  ------------------
 2321|      0|		p_b = b;
 2322|      0|		for (p_a = a, i = a->depth - b->depth; p_a && (i > 0); p_a = p_a->parent, i--);
  ------------------
  |  Branch (2322:42): [True: 0, False: 0]
  |  Branch (2322:49): [True: 0, False: 0]
  ------------------
 2323|      0|		if (is_ancestor && (p_a != p_b)) return NULL;
  ------------------
  |  Branch (2323:7): [True: 0, False: 0]
  |  Branch (2323:22): [True: 0, False: 0]
  ------------------
 2324|     14|	} else if (a->depth < b->depth) {
  ------------------
  |  Branch (2324:13): [True: 14, False: 0]
  ------------------
 2325|     14|		p_a = a;
 2326|     30|		for (p_b = b, i = b->depth - a->depth; p_b && (i > 0); p_b = p_b->parent, i--);
  ------------------
  |  Branch (2326:42): [True: 30, False: 0]
  |  Branch (2326:49): [True: 16, False: 14]
  ------------------
 2327|     14|		if (is_ancestor && (p_a != p_b)) return NULL;
  ------------------
  |  Branch (2327:7): [True: 14, False: 0]
  |  Branch (2327:22): [True: 0, False: 14]
  ------------------
 2328|     14|	} else {
 2329|      0|		p_a = a;
 2330|      0|		p_b = b;
 2331|      0|	}
 2332|       |
 2333|     14|	while (p_a && p_b) {
  ------------------
  |  Branch (2333:9): [True: 14, False: 0]
  |  Branch (2333:16): [True: 14, False: 0]
  ------------------
 2334|     14|		if (p_a == p_b) return p_a;
  ------------------
  |  Branch (2334:7): [True: 14, False: 0]
  ------------------
 2335|       |
 2336|      0|		p_a = p_a->parent;
 2337|      0|		p_b = p_b->parent;
 2338|      0|	}
 2339|       |
 2340|      0|	return NULL;
 2341|     14|}
fr_dict_oid_component_legacy:
 2352|    352|{
 2353|    352|	char const *p = *oid;
 2354|    352|	char *q;
 2355|    352|	unsigned long num;
 2356|       |
 2357|    352|	*out = 0;
 2358|       |
 2359|    352|	num = strtoul(p, &q, 10);
 2360|    352|	if ((p == q) || (num == ULONG_MAX)) {
  ------------------
  |  Branch (2360:6): [True: 0, False: 352]
  |  Branch (2360:18): [True: 0, False: 352]
  ------------------
 2361|      0|		fr_strerror_printf("Invalid OID component \"%s\" (%lu)", p, num);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2362|      0|		return -1;
 2363|      0|	}
 2364|       |
 2365|    352|	switch (*q) {
 2366|    258|	case '\0':
  ------------------
  |  Branch (2366:2): [True: 258, False: 94]
  ------------------
 2367|    352|	case '.':
  ------------------
  |  Branch (2367:2): [True: 94, False: 258]
  ------------------
 2368|    352|		*oid = q;
 2369|    352|		*out = (unsigned int)num;
 2370|       |
 2371|    352|		return 0;
 2372|       |
 2373|      0|	default:
  ------------------
  |  Branch (2373:2): [True: 0, False: 352]
  ------------------
 2374|      0|		fr_strerror_const("Unexpected text after OID component");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2375|      0|		*out = 0;
 2376|      0|		return -1;
 2377|    352|	}
 2378|    352|}
fr_dict_attr_by_oid_legacy:
 2395|    352|{
 2396|    352|	char const		*p = oid;
 2397|    352|	unsigned int		num = 0;
 2398|    352|	ssize_t			slen;
 2399|       |
 2400|    352|	if (!*parent) return -1;
  ------------------
  |  Branch (2400:6): [True: 0, False: 352]
  ------------------
 2401|       |
 2402|       |	/*
 2403|       |	 *	It's a partial OID.  Grab it, and skip to the next bit.
 2404|       |	 */
 2405|    352|	if (p[0] == '.') {
  ------------------
  |  Branch (2405:6): [True: 226, False: 126]
  ------------------
 2406|    226|		p++;
 2407|    226|	}
 2408|       |
 2409|    352|	*attr = 0;
 2410|       |
 2411|    352|	if (fr_dict_oid_component_legacy(&num, &p) < 0) return oid - p;
  ------------------
  |  Branch (2411:6): [True: 0, False: 352]
  ------------------
 2412|       |
 2413|       |	/*
 2414|       |	 *	Record progress even if we error out.
 2415|       |	 *
 2416|       |	 *	Don't change this, you will break things.
 2417|       |	 */
 2418|    352|	*attr = num;
 2419|       |
 2420|       |	/*
 2421|       |	 *	Only a limited number of structural types can have children.  Specifically, groups cannot.
 2422|       |	 */
 2423|    352|	if (!dict_attr_can_have_children(*parent)) {
  ------------------
  |  Branch (2423:6): [True: 0, False: 352]
  ------------------
 2424|      0|		fr_strerror_printf("Attribute %s (%u) cannot contain a child attribute.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2425|      0|				   "Error at sub OID \"%s\"", (*parent)->name, (*parent)->attr, oid);
 2426|      0|		return 0;	/* We parsed nothing */
 2427|      0|	}
 2428|       |
 2429|    352|	switch (p[0]) {
 2430|       |	/*
 2431|       |	 *	We've not hit the leaf yet, so the attribute must be
 2432|       |	 *	defined already.
 2433|       |	 */
 2434|     94|	case '.':
  ------------------
  |  Branch (2434:2): [True: 94, False: 258]
  ------------------
 2435|     94|	{
 2436|     94|		fr_dict_attr_t const *child;
 2437|     94|		p++;
 2438|       |
 2439|     94|		child = dict_attr_child_by_num(*parent, num);
 2440|     94|		if (!child) {
  ------------------
  |  Branch (2440:7): [True: 0, False: 94]
  ------------------
 2441|      0|			fr_strerror_printf("Unknown attribute '%u' in OID string \"%s\" for parent %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2442|      0|					   num, oid, (*parent)->name);
 2443|      0|			return 0;	/* We parsed nothing */
 2444|      0|		}
 2445|       |
 2446|       |		/*
 2447|       |		 *	Record progress even if we error out.
 2448|       |		 *
 2449|       |		 *	Don't change this, you will break things.
 2450|       |		 */
 2451|     94|		*parent = child;
 2452|       |
 2453|     94|		slen = fr_dict_attr_by_oid_legacy(parent, attr, p);
 2454|     94|		if (slen <= 0) return slen - (p - oid);
  ------------------
  |  Branch (2454:7): [True: 0, False: 94]
  ------------------
 2455|     94|		return slen + (p - oid);
 2456|     94|	}
 2457|       |
 2458|       |	/*
 2459|       |	 *	Hit the leaf, this is the attribute we need to define.
 2460|       |	 */
 2461|    258|	case '\0':
  ------------------
  |  Branch (2461:2): [True: 258, False: 94]
  ------------------
 2462|    258|		*attr = num;
 2463|    258|		return p - oid;
 2464|       |
 2465|      0|	default:
  ------------------
  |  Branch (2465:2): [True: 0, False: 352]
  ------------------
 2466|      0|		fr_strerror_printf("Malformed OID string, got trailing garbage '%s'", p);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2467|      0|		return oid - p;
 2468|    352|	}
 2469|    352|}
fr_dict_oid_component:
 2488|     96|{
 2489|     96|	fr_sbuff_t		our_in = FR_SBUFF(in);
  ------------------
  |  |  451|     96|#define FR_SBUFF(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|     96|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|     96|((fr_sbuff_t){ \
  |  |  |  |  430|     96|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|     96|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|     96|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|     96|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  431|     96|	.start		= (_start), \
  |  |  |  |  432|     96|	.end		= (_end), \
  |  |  |  |  433|     96|	.p		= (_current), \
  |  |  |  |  434|     96|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  435|     96|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|     96|	.shifted	= 0, \
  |  |  |  |  437|     96|	.extend		= (_extend), \
  |  |  |  |  438|     96|	.eof		= (_eof), \
  |  |  |  |  439|     96|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  440|     96|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  441|     96|})
  |  |  ------------------
  |  |  452|     96|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  453|     96|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  454|     96|					     fr_sbuff_end(_sbuff_or_marker), \
  |  |  455|     96|					     fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  456|     96|					     fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  457|     96|					     0x00)
  ------------------
 2490|     96|	uint32_t		num = 0;
 2491|     96|	fr_sbuff_parse_error_t	sberr;
 2492|     96|	fr_dict_attr_t const	*child;
 2493|       |
 2494|     96|	if (err) *err = FR_DICT_ATTR_OK;
  ------------------
  |  Branch (2494:6): [True: 0, False: 96]
  ------------------
 2495|       |
 2496|     96|	*out = NULL;
 2497|       |
 2498|     96|	if (!dict_attr_can_have_children(parent)) {
  ------------------
  |  Branch (2498:6): [True: 0, False: 96]
  ------------------
 2499|      0|		fr_strerror_printf("Attribute '%s' is type %s and cannot contain child attributes.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2501|      0|				   parent->name,
  |  |  |  | 2502|      0|				   fr_type_to_str(parent->type),
  |  |  |  | 2503|      0|				   (int)fr_sbuff_remaining(&our_in),
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 2504|      0|				   fr_sbuff_current(&our_in));
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2500|      0|				   "Error at OID \"%.*s\"",
 2501|      0|				   parent->name,
 2502|      0|				   fr_type_to_str(parent->type),
 2503|      0|				   (int)fr_sbuff_remaining(&our_in),
 2504|      0|				   fr_sbuff_current(&our_in));
 2505|      0|		if (err) *err = FR_DICT_ATTR_NO_CHILDREN;
  ------------------
  |  Branch (2505:7): [True: 0, False: 0]
  ------------------
 2506|      0|		FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2507|      0|	}
 2508|       |
 2509|     96|	if (fr_dict_attr_by_name_substr(err, &child, parent, &our_in, tt) > 0) goto done;
  ------------------
  |  Branch (2509:6): [True: 94, False: 2]
  ------------------
 2510|       |
 2511|      2|	fr_sbuff_out(&sberr, &num, &our_in);
  ------------------
  |  | 1685|      2|	_Generic((_out), \
  |  | 1686|      2|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      2|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      2|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      2|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      2|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      2|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      2|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      2|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      2|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      2|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      2|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      2|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      2|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      2|	)
  ------------------
 2512|      2|	switch (sberr) {
 2513|       |	/*
 2514|       |	 *	Lookup by number
 2515|       |	 */
 2516|      0|	case FR_SBUFF_PARSE_OK:
  ------------------
  |  Branch (2516:2): [True: 0, False: 2]
  ------------------
 2517|      0|		if (!fr_sbuff_is_char(&our_in, '.') && !fr_sbuff_is_terminal(&our_in, tt)) {
  ------------------
  |  | 1797|      0|	_Generic((_sbuff_or_marker), \
  |  | 1798|      0|		 fr_sbuff_t *		: _fr_sbuff_is_char((fr_sbuff_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker), _c), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1799|      0|		 fr_sbuff_marker_t *	: _fr_marker_is_char((fr_sbuff_marker_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker), _c) \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1800|      0|	)
  ------------------
  |  Branch (2517:7): [True: 0, False: 0]
  |  Branch (2517:42): [True: 0, False: 0]
  ------------------
 2518|      0|			if (err) *err = FR_DICT_ATTR_PARSE_ERROR;
  ------------------
  |  Branch (2518:8): [True: 0, False: 0]
  ------------------
 2519|      0|			fr_strerror_printf("Invalid OID component (%s) \"%.*s\"",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2520|      0|					   fr_table_str_by_value(sbuff_parse_error_table, sberr, "<INVALID>"),
  |  |  |  |  ------------------
  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  ------------------
  |  |  |  | 2521|      0|					   (int)fr_sbuff_remaining(&our_in), fr_sbuff_current(&our_in));
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               					   (int)fr_sbuff_remaining(&our_in), fr_sbuff_current(&our_in));
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2520|      0|					   fr_table_str_by_value(sbuff_parse_error_table, sberr, "<INVALID>"),
 2521|      0|					   (int)fr_sbuff_remaining(&our_in), fr_sbuff_current(&our_in));
 2522|      0|			goto fail;
 2523|      0|		}
 2524|       |
 2525|      0|		child = dict_attr_child_by_num(parent, num);
 2526|      0|		if (!child) {
  ------------------
  |  Branch (2526:7): [True: 0, False: 0]
  ------------------
 2527|      0|			fr_sbuff_set_to_start(&our_in);
 2528|      0|			fr_strerror_printf("Failed resolving child %u in namespace '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2529|      0|					   num, parent->name);
 2530|      0|			if (err) *err = FR_DICT_ATTR_NOTFOUND;
  ------------------
  |  Branch (2530:8): [True: 0, False: 0]
  ------------------
 2531|      0|			FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2532|      0|		}
 2533|       |
 2534|      0|		if (err) *err = FR_DICT_ATTR_OK;
  ------------------
  |  Branch (2534:7): [True: 0, False: 0]
  ------------------
 2535|      0|		break;
 2536|       |
 2537|      0|	case FR_SBUFF_PARSE_ERROR_NUM_OVERFLOW:
  ------------------
  |  Branch (2537:2): [True: 0, False: 2]
  ------------------
 2538|      0|		if (err) *err = FR_DICT_ATTR_PARSE_ERROR;
  ------------------
  |  Branch (2538:7): [True: 0, False: 0]
  ------------------
 2539|       |
 2540|      0|		fr_sbuff_set_to_start(&our_in);
 2541|       |
 2542|      0|		{
 2543|      0|			fr_sbuff_marker_t c_start;
 2544|       |
 2545|      0|			fr_sbuff_marker(&c_start, &our_in);
 2546|      0|			fr_sbuff_adv_past_allowed(&our_in, FR_DICT_ATTR_MAX_NAME_LEN, fr_dict_attr_allowed_chars, NULL);
  ------------------
  |  |  501|      0|#define FR_DICT_ATTR_MAX_NAME_LEN	(128)				//!< Maximum length of a attribute name.
  ------------------
 2547|      0|			fr_strerror_printf("Invalid value \"%.*s\" - attribute numbers must be less than 2^32",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2548|      0|					   (int)fr_sbuff_behind(&c_start), fr_sbuff_current(&c_start));
  |  |  |  |  ------------------
  |  |  |  |  |  | 1011|      0|	(fr_sbuff_current(_sbuff_or_marker) > fr_sbuff_current((_sbuff_or_marker)->parent) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	(fr_sbuff_current(_sbuff_or_marker) > fr_sbuff_current((_sbuff_or_marker)->parent) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1011:3): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1012|      0|		0 : fr_sbuff_current((_sbuff_or_marker)->parent) - fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : fr_sbuff_current((_sbuff_or_marker)->parent) - fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               					   (int)fr_sbuff_behind(&c_start), fr_sbuff_current(&c_start));
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2548|      0|					   (int)fr_sbuff_behind(&c_start), fr_sbuff_current(&c_start));
 2549|      0|		}
 2550|      0|		FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2551|       |
 2552|      2|	default:
  ------------------
  |  Branch (2552:2): [True: 2, False: 0]
  ------------------
 2553|      2|	fail:
 2554|       |		/*
 2555|       |		 *	Leave *err from the call to fr_dict_attr_by_name_substr().
 2556|       |		 */
 2557|      2|		fr_sbuff_set_to_start(&our_in);
 2558|      2|		FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      2|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      2|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      2|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      2|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      2|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      2|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      2|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2559|      2|	}
 2560|       |
 2561|     94|done:
 2562|     94|	child = dict_attr_alias(err, child);
 2563|     94|	if (unlikely(!child)) FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  |  397|     94|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 94]
  |  |  ------------------
  ------------------
              	if (unlikely(!child)) FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2564|       |
 2565|     94|	*out = child;
 2566|       |
 2567|     94|	FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|     94|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|     94|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|     94|_Generic((_dst), \
  |  |  |  | 1164|     94|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|     94|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|     94|)(_dst, \
  |  |  |  | 1167|     94|_Generic((_src), \
  |  |  |  | 1168|     94|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|     94|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|     94|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|     94|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|     94|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|     94|	char *				: (char const *)(_src), \
  |  |  |  | 1174|     94|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|     94|))
  |  |  ------------------
  ------------------
 2568|     94|}
fr_dict_attr_by_oid_substr:
 2587|     90|{
 2588|     90|	fr_sbuff_t		our_in = FR_SBUFF(in);
  ------------------
  |  |  451|     90|#define FR_SBUFF(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|     90|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|     90|((fr_sbuff_t){ \
  |  |  |  |  430|     90|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|     90|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|     90|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|     90|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|     90|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|     90|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|     90|	)
  |  |  |  |  ------------------
  |  |  |  |  431|     90|	.start		= (_start), \
  |  |  |  |  432|     90|	.end		= (_end), \
  |  |  |  |  433|     90|	.p		= (_current), \
  |  |  |  |  434|     90|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     90|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     90|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     90|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     90|	)
  |  |  |  |  ------------------
  |  |  |  |  435|     90|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|     90|	.shifted	= 0, \
  |  |  |  |  437|     90|	.extend		= (_extend), \
  |  |  |  |  438|     90|	.eof		= (_eof), \
  |  |  |  |  439|     90|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     90|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     90|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     90|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     90|	)
  |  |  |  |  ------------------
  |  |  |  |  440|     90|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     90|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     90|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     90|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     90|	)
  |  |  |  |  ------------------
  |  |  |  |  441|     90|})
  |  |  ------------------
  |  |  452|     90|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  453|     90|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  454|     90|					     fr_sbuff_end(_sbuff_or_marker), \
  |  |  455|     90|					     fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  456|     90|					     fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  457|     90|					     0x00)
  ------------------
 2589|     90|	fr_sbuff_marker_t	m_c;
 2590|     90|	fr_dict_attr_t const	*our_parent = parent;
 2591|       |
 2592|     90|	fr_sbuff_marker(&m_c, &our_in);
 2593|       |
 2594|       |	/*
 2595|       |	 *	If the OID doesn't begin with '.' we
 2596|       |	 *	resolve it from the root.
 2597|       |	 */
 2598|       |#if 0
 2599|       |	if (!fr_sbuff_next_if_char(&our_in, '.')) our_parent = fr_dict_root(fr_dict_by_da(parent));
 2600|       |#else
 2601|     90|	(void) fr_sbuff_next_if_char(&our_in, '.');
 2602|     90|#endif
 2603|     90|	*out = NULL;
 2604|       |
 2605|     96|	for (;;) {
 2606|     96|		fr_dict_attr_t const	*child;
 2607|       |
 2608|     96|		if ((fr_dict_oid_component(err, &child, our_parent, &our_in, tt) < 0) || !child) {
  ------------------
  |  Branch (2608:7): [True: 2, False: 94]
  |  Branch (2608:76): [True: 0, False: 94]
  ------------------
 2609|      2|			*out = our_parent;
 2610|      2|			fr_sbuff_set(&our_in, &m_c);	/* Reset to the start of the last component */
  ------------------
  |  | 1162|      2|#define fr_sbuff_set(_dst, _src) \
  |  | 1163|      2|_Generic((_dst), \
  |  | 1164|      2|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  | 1165|      2|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  | 1166|      2|)(_dst, \
  |  | 1167|      2|_Generic((_src), \
  |  | 1168|      2|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      2|	))
  |  |  ------------------
  |  | 1169|      2|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      2|	))
  |  |  ------------------
  |  | 1170|      2|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      2|	))
  |  |  ------------------
  |  | 1171|      2|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      2|	))
  |  |  ------------------
  |  | 1172|      2|	char const *			: (char const *)(_src), \
  |  | 1173|      2|	char *				: (char const *)(_src), \
  |  | 1174|      2|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  828|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      2|	))
  |  |  ------------------
  |  | 1175|      2|))
  ------------------
 2611|      2|			break;	/* Resolved as much as we can */
 2612|      2|		}
 2613|       |
 2614|     94|		our_parent = child;
 2615|     94|		*out = child;
 2616|       |
 2617|     94|		fr_sbuff_set(&m_c, &our_in);
  ------------------
  |  | 1162|     94|#define fr_sbuff_set(_dst, _src) \
  |  | 1163|     94|_Generic((_dst), \
  |  | 1164|     94|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  | 1165|     94|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  | 1166|     94|)(_dst, \
  |  | 1167|     94|_Generic((_src), \
  |  | 1168|     94|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|     94|	))
  |  |  ------------------
  |  | 1169|     94|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|     94|	))
  |  |  ------------------
  |  | 1170|     94|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|     94|	))
  |  |  ------------------
  |  | 1171|     94|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|     94|	))
  |  |  ------------------
  |  | 1172|     94|	char const *			: (char const *)(_src), \
  |  | 1173|     94|	char *				: (char const *)(_src), \
  |  | 1174|     94|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  828|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|     94|	))
  |  |  ------------------
  |  | 1175|     94|))
  ------------------
 2618|     94|		if (!fr_sbuff_next_if_char(&our_in, '.')) break;
  ------------------
  |  Branch (2618:7): [True: 88, False: 6]
  ------------------
 2619|     94|	}
 2620|       |
 2621|     90|	FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|     90|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|     90|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|     90|_Generic((_dst), \
  |  |  |  | 1164|     90|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|     90|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|     90|)(_dst, \
  |  |  |  | 1167|     90|_Generic((_src), \
  |  |  |  | 1168|     90|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     90|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     90|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     90|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     90|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     90|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     90|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|     90|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     90|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     90|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     90|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     90|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     90|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     90|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|     90|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     90|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     90|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     90|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     90|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     90|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     90|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|     90|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     90|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     90|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     90|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     90|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     90|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     90|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|     90|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|     90|	char *				: (char const *)(_src), \
  |  |  |  | 1174|     90|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|     90|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|     90|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|     90|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|     90|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|     90|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|     90|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|     90|))
  |  |  ------------------
  ------------------
 2622|     90|}
fr_dict_attr_by_oid:
 2634|     86|{
 2635|     86|	fr_sbuff_t		sbuff = FR_SBUFF_IN(oid, strlen(oid));
  ------------------
  |  |  558|     86|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  559|     86|((fr_sbuff_t){ \
  |  |  560|     86|	.buff_i		= _start, \
  |  |  561|     86|	.start_i	= _Generic((_start), \
  |  |  562|     86|				char *		: _start, \
  |  |  563|     86|				char const *	: _start, \
  |  |  564|     86|				uint8_t *	: _start, \
  |  |  565|     86|				uint8_t const *	: _start \
  |  |  566|     86|			), \
  |  |  567|     86|	.end_i		= _Generic((_len_or_end), \
  |  |  568|     86|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  569|     86|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  570|     86|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  571|     86|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  572|     86|				char *		: (char const *)(_len_or_end), \
  |  |  573|     86|				char const *	: (char const *)(_len_or_end) \
  |  |  574|     86|			), \
  |  |  575|     86|	.p_i		= _start, \
  |  |  576|     86|	.is_const	= true, \
  |  |  577|     86|})
  ------------------
 2636|     86|	fr_dict_attr_t const	*da;
 2637|       |
 2638|     86|	if (fr_dict_attr_by_oid_substr(err, &da, parent, &sbuff, NULL) <= 0) return NULL;
  ------------------
  |  Branch (2638:6): [True: 2, False: 84]
  ------------------
 2639|     84|	if (err && *err != FR_DICT_ATTR_OK) return NULL;
  ------------------
  |  Branch (2639:6): [True: 0, False: 84]
  |  Branch (2639:13): [True: 0, False: 0]
  ------------------
 2640|       |
 2641|       |	/*
 2642|       |	 *	If we didn't parse the entire string, then the parsing stopped at an unknown child.
 2643|       |	 *	e.g. Vendor-Specific.Cisco.Foo.  In that case, the full attribute wasn't found.
 2644|       |	 */
 2645|     84|	if (fr_sbuff_remaining(&sbuff) > 0) {
  ------------------
  |  |  929|     84|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|     84|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|     84|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|     84|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|     84|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|     84|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|     84|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|     84|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|     84|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|     84|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|     84|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|     84|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|     84|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 84]
  |  |  ------------------
  |  |  930|     84|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|     84|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|     84|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|     84|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|     84|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|     84|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|     84|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|     84|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|     84|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|     84|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|     84|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|     84|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|     84|	))
  |  |  ------------------
  ------------------
  |  Branch (2645:6): [True: 0, False: 84]
  ------------------
 2646|      0|		if (err) *err = FR_DICT_ATTR_NOTFOUND;
  ------------------
  |  Branch (2646:7): [True: 0, False: 0]
  ------------------
 2647|      0|		return NULL;
 2648|      0|	}
 2649|       |
 2650|     84|	return da;
 2651|     84|}
fr_dict_root:
 2661|  2.75k|{
 2662|  2.75k|	return dict->root;
 2663|  2.75k|}
fr_dict_is_read_only:
 2666|  5.13k|{
 2667|  5.13k|	return dict->read_only;
 2668|  5.13k|}
dict_by_protocol_name:
 2769|      8|{
 2770|      8|	if (!dict_gctx || !name) return NULL;
  ------------------
  |  Branch (2770:6): [True: 0, False: 8]
  |  Branch (2770:20): [True: 0, False: 8]
  ------------------
 2771|       |
 2772|      8|	return fr_hash_table_find(dict_gctx->protocol_by_name,
 2773|      8|				  &(fr_dict_t){ .root = &(fr_dict_attr_t){ .name = name } });
 2774|      8|}
dict_by_protocol_num:
 2783|      2|{
 2784|      2|	if (!dict_gctx) return NULL;
  ------------------
  |  Branch (2784:6): [True: 0, False: 2]
  ------------------
 2785|       |
 2786|      2|	return fr_hash_table_find(dict_gctx->protocol_by_num,
 2787|      2|				  &(fr_dict_t) { .root = &(fr_dict_attr_t){ .attr = num } });
 2788|      2|}
dict_by_da:
 2797|  2.00k|{
 2798|  2.00k|#ifndef NDEBUG
 2799|  2.00k|	{
 2800|  2.00k|		fr_dict_attr_t const	*da_p = da;
 2801|  2.00k|		fr_dict_t const		*dict;
 2802|       |
 2803|  2.00k|		dict = da->dict;
 2804|  2.02k|		while (da_p->parent) {
  ------------------
  |  Branch (2804:10): [True: 22, False: 2.00k]
  ------------------
 2805|     22|			da_p = da_p->parent;
 2806|     22|			fr_cond_assert_msg(da_p->dict == dict, "Inconsistent dict membership.  "
  ------------------
  |  |  148|     22|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|     44|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 22, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2807|     22|					   "Expected %s, got %s",
 2808|     22|					   !da_p->dict ? "(null)" : fr_dict_root(da_p->dict)->name,
 2809|     22|					   !dict ? "(null)" : fr_dict_root(dict)->name);
 2810|     22|			DA_VERIFY(da_p);
  ------------------
  |  |   64|     22|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 2811|     22|		}
 2812|       |
 2813|  2.00k|		if (!da_p->flags.is_root) {
  ------------------
  |  Branch (2813:7): [True: 0, False: 2.00k]
  ------------------
 2814|      0|			fr_strerror_printf("%s: Attribute %s has not been inserted into a dictionary",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2815|      0|					   __FUNCTION__, da->name);
 2816|      0|			return NULL;
 2817|      0|		}
 2818|  2.00k|	}
 2819|  2.00k|#endif
 2820|       |
 2821|       |	/*
 2822|       |	 *	Parent of the root attribute must
 2823|       |	 *	be the dictionary.
 2824|       |	 */
 2825|  2.00k|	return talloc_get_type_abort(da->dict, fr_dict_t);
 2826|  2.00k|}
fr_dict_by_da:
 2867|  1.98k|{
 2868|  1.98k|	return dict_by_da(da);
 2869|  1.98k|}
fr_dict_vendor_by_name:
 2918|     20|{
 2919|     20|	fr_dict_vendor_t	*found;
 2920|       |
 2921|     20|	INTERNAL_IF_NULL(dict, NULL);
  ------------------
  |  |   46|     20|	do { \
  |  |   47|     20|		if (!(_dict)) { \
  |  |  ------------------
  |  |  |  Branch (47:7): [True: 0, False: 20]
  |  |  ------------------
  |  |   48|      0|			_dict = dict_gctx ? dict_gctx->internal : NULL; \
  |  |  ------------------
  |  |  |  Branch (48:12): [True: 0, False: 0]
  |  |  ------------------
  |  |   49|      0|			if (unlikely(!(_dict))) { \
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      0|				fr_strerror_const("No dictionaries available for attribute resolution"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |   51|      0|				return (_ret); \
  |  |   52|      0|			} \
  |  |   53|      0|		} \
  |  |   54|     20|	} while (0)
  |  |  ------------------
  |  |  |  Branch (54:11): [Folded, False: 20]
  |  |  ------------------
  ------------------
 2922|       |
 2923|     20|	if (!name) return NULL;
  ------------------
  |  Branch (2923:6): [True: 0, False: 20]
  ------------------
 2924|       |
 2925|     20|	found = fr_hash_table_find(dict->vendors_by_name, &(fr_dict_vendor_t) { .name = name });
 2926|     20|	if (!found) return NULL;
  ------------------
  |  Branch (2926:6): [True: 0, False: 20]
  ------------------
 2927|       |
 2928|     20|	return found;
 2929|     20|}
fr_dict_vendor_by_num:
 2941|     10|{
 2942|     10|	INTERNAL_IF_NULL(dict, NULL);
  ------------------
  |  |   46|     10|	do { \
  |  |   47|     10|		if (!(_dict)) { \
  |  |  ------------------
  |  |  |  Branch (47:7): [True: 0, False: 10]
  |  |  ------------------
  |  |   48|      0|			_dict = dict_gctx ? dict_gctx->internal : NULL; \
  |  |  ------------------
  |  |  |  Branch (48:12): [True: 0, False: 0]
  |  |  ------------------
  |  |   49|      0|			if (unlikely(!(_dict))) { \
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      0|				fr_strerror_const("No dictionaries available for attribute resolution"); \
  |  |  ------------------
  |  |  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  |  |  ------------------
  |  |   51|      0|				return (_ret); \
  |  |   52|      0|			} \
  |  |   53|      0|		} \
  |  |   54|     10|	} while (0)
  |  |  ------------------
  |  |  |  Branch (54:11): [Folded, False: 10]
  |  |  ------------------
  ------------------
 2943|       |
 2944|     10|	return fr_hash_table_find(dict->vendors_by_num, &(fr_dict_vendor_t) { .pen = vendor_pen });
 2945|     10|}
fr_dict_attr_by_name_substr:
 3394|     96|{
 3395|     96|	fr_dict_attr_t const	*da;
 3396|     96|	size_t			len;
 3397|     96|	fr_dict_attr_t const	*ref;
 3398|     96|	char const		*p;
 3399|     96|	char			buffer[FR_DICT_ATTR_MAX_NAME_LEN + 1 + 1];	/* +1 \0 +1 for "too long" */
 3400|     96|	fr_sbuff_t		our_name = FR_SBUFF(name);
  ------------------
  |  |  451|     96|#define FR_SBUFF(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|     96|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|     96|((fr_sbuff_t){ \
  |  |  |  |  430|     96|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|     96|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|     96|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|     96|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  431|     96|	.start		= (_start), \
  |  |  |  |  432|     96|	.end		= (_end), \
  |  |  |  |  433|     96|	.p		= (_current), \
  |  |  |  |  434|     96|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  435|     96|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|     96|	.shifted	= 0, \
  |  |  |  |  437|     96|	.extend		= (_extend), \
  |  |  |  |  438|     96|	.eof		= (_eof), \
  |  |  |  |  439|     96|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  440|     96|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  441|     96|})
  |  |  ------------------
  |  |  452|     96|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  453|     96|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  454|     96|					     fr_sbuff_end(_sbuff_or_marker), \
  |  |  455|     96|					     fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  456|     96|					     fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  457|     96|					     0x00)
  ------------------
 3401|     96|	fr_hash_table_t		*namespace;
 3402|       |
 3403|     96|	*out = NULL;
 3404|       |
 3405|       |#ifdef STATIC_ANALYZER
 3406|       |	memset(buffer, 0, sizeof(buffer));
 3407|       |#endif
 3408|       |
 3409|     96|	len = fr_sbuff_out_bstrncpy_allowed(&FR_SBUFF_OUT(buffer, sizeof(buffer)),
  ------------------
  |  |  531|     96|#define FR_SBUFF_OUT(_start, _len_or_end) \
  |  |  532|     96|((fr_sbuff_t){ \
  |  |  533|     96|	.buff_i		= _start, \
  |  |  534|     96|	.start_i	= _Generic((_start), \
  |  |  535|     96|				char *		: _start, \
  |  |  536|     96|				uint8_t *	: _start \
  |  |  537|     96|			), \
  |  |  538|     96|	.end_i		= _Generic((_len_or_end), \
  |  |  539|     96|				size_t		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  540|     96|				long		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  541|     96|				int		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  542|     96|				unsigned int	: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  543|     96|				char *		: (char const *)(_len_or_end), \
  |  |  544|     96|				char const *	: (char const *)(_len_or_end) \
  |  |  545|     96|			), \
  |  |  546|     96|	.p_i		= _start, \
  |  |  547|     96|	.is_const	= false, \
  |  |  548|     96|})
  ------------------
 3410|     96|					    &our_name, SIZE_MAX,
 3411|     96|					    fr_dict_attr_allowed_chars);
 3412|     96|	if (len == 0) {
  ------------------
  |  Branch (3412:6): [True: 0, False: 96]
  ------------------
 3413|      0|		fr_strerror_const("Zero length attribute name");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3414|      0|		if (err) *err = FR_DICT_ATTR_PARSE_ERROR;
  ------------------
  |  Branch (3414:7): [True: 0, False: 0]
  ------------------
 3415|      0|		FR_SBUFF_ERROR_RETURN(&our_name);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3416|      0|	}
 3417|     96|	if (len > FR_DICT_ATTR_MAX_NAME_LEN) {
  ------------------
  |  |  501|     96|#define FR_DICT_ATTR_MAX_NAME_LEN	(128)				//!< Maximum length of a attribute name.
  ------------------
  |  Branch (3417:6): [True: 0, False: 96]
  ------------------
 3418|      0|		fr_strerror_const("Attribute name too long");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3419|      0|		if (err) *err = FR_DICT_ATTR_PARSE_ERROR;
  ------------------
  |  Branch (3419:7): [True: 0, False: 0]
  ------------------
 3420|      0|		FR_SBUFF_ERROR_RETURN(&our_name);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3421|      0|	}
 3422|       |
 3423|       |	/*
 3424|       |	 *	Do a second pass, ensuring that the name has at least one alphanumeric character.
 3425|       |	 */
 3426|     96|	for (p = buffer; p < (buffer + len); p++) {
  ------------------
  |  Branch (3426:19): [True: 96, False: 0]
  ------------------
 3427|     96|		if (sbuff_char_alpha_num[(uint8_t) *p]) break;
  ------------------
  |  Branch (3427:7): [True: 96, False: 0]
  ------------------
 3428|     96|	}
 3429|       |
 3430|     96|	if ((size_t) (p - buffer) == len) {
  ------------------
  |  Branch (3430:6): [True: 0, False: 96]
  ------------------
 3431|      0|		fr_strerror_const("Invalid attribute name");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3432|      0|		if (err) *err = FR_DICT_ATTR_PARSE_ERROR;
  ------------------
  |  Branch (3432:7): [True: 0, False: 0]
  ------------------
 3433|      0|		FR_SBUFF_ERROR_RETURN(&our_name);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3434|      0|	}
 3435|       |
 3436|     96|	ref = fr_dict_attr_ref(parent);
 3437|     96|	if (ref) parent = ref;
  ------------------
  |  Branch (3437:6): [True: 0, False: 96]
  ------------------
 3438|       |
 3439|     96|redo:
 3440|     96|	namespace = dict_attr_namespace(parent);
 3441|     96|	if (!namespace) {
  ------------------
  |  Branch (3441:6): [True: 0, False: 96]
  ------------------
 3442|      0|		fr_strerror_printf("Attribute '%s' does not contain a namespace", parent->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3443|      0|		if (err) *err = FR_DICT_ATTR_NO_CHILDREN;
  ------------------
  |  Branch (3443:7): [True: 0, False: 0]
  ------------------
 3444|      0|		fr_sbuff_set_to_start(&our_name);
 3445|      0|		FR_SBUFF_ERROR_RETURN(&our_name);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3446|      0|	}
 3447|       |
 3448|     96|	da = fr_hash_table_find(namespace, &(fr_dict_attr_t){ .name = buffer });
 3449|     96|	if (!da) {
  ------------------
  |  Branch (3449:6): [True: 2, False: 94]
  ------------------
 3450|      2|		if (parent->flags.is_root) {
  ------------------
  |  Branch (3450:7): [True: 2, False: 0]
  ------------------
 3451|      2|			fr_dict_t const *dict = fr_dict_by_da(parent);
 3452|       |
 3453|      2|			if (dict->next) {
  ------------------
  |  Branch (3453:8): [True: 0, False: 2]
  ------------------
 3454|      0|				parent = dict->next->root;
 3455|      0|				goto redo;
 3456|      0|			}
 3457|      2|		}
 3458|       |
 3459|      2|		if (err) *err = FR_DICT_ATTR_NOTFOUND;
  ------------------
  |  Branch (3459:7): [True: 0, False: 2]
  ------------------
 3460|      2|		fr_strerror_printf("Attribute '%s' not found in namespace '%s'", buffer, parent->name);
  ------------------
  |  |   65|      2|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3461|      2|		fr_sbuff_set_to_start(&our_name);
 3462|      2|		FR_SBUFF_ERROR_RETURN(&our_name);
  ------------------
  |  | 1027|      2|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      2|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      2|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      2|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      2|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      2|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      2|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3463|      2|	}
 3464|       |
 3465|     94|	da = dict_attr_alias(err, da);
 3466|     94|	if (unlikely(!da)) FR_SBUFF_ERROR_RETURN(&our_name);
  ------------------
  |  |  397|     94|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 94]
  |  |  ------------------
  ------------------
              	if (unlikely(!da)) FR_SBUFF_ERROR_RETURN(&our_name);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3467|       |
 3468|     94|	*out = da;
 3469|     94|	if (err) *err = FR_DICT_ATTR_OK;
  ------------------
  |  Branch (3469:6): [True: 0, False: 94]
  ------------------
 3470|       |
 3471|     94|	FR_SBUFF_SET_RETURN(name, &our_name);
  ------------------
  |  | 1183|     94|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|     94|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|     94|_Generic((_dst), \
  |  |  |  | 1164|     94|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|     94|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|     94|)(_dst, \
  |  |  |  | 1167|     94|_Generic((_src), \
  |  |  |  | 1168|     94|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|     94|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|     94|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|     94|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|     94|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|     94|	char *				: (char const *)(_src), \
  |  |  |  | 1174|     94|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|     94|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|     94|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|     94|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|     94|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|     94|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|     94|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|     94|))
  |  |  ------------------
  ------------------
 3472|     94|}
dict_attr_by_name:
 3478|  4.84k|{
 3479|  4.84k|	fr_hash_table_t		*namespace;
 3480|  4.84k|	fr_dict_attr_t		*da;
 3481|       |
 3482|  4.84k|	DA_VERIFY(parent);
  ------------------
  |  |   64|  4.84k|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 3483|       |
 3484|  4.84k|redo:
 3485|  4.84k|	namespace = dict_attr_namespace(parent);
 3486|  4.84k|	if (!namespace) {
  ------------------
  |  Branch (3486:6): [True: 0, False: 4.84k]
  ------------------
 3487|      0|		fr_strerror_printf("Attribute '%s' does not contain a namespace", parent->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3488|      0|		if (err) *err = FR_DICT_ATTR_NO_CHILDREN;
  ------------------
  |  Branch (3488:7): [True: 0, False: 0]
  ------------------
 3489|      0|		return NULL;
 3490|      0|	}
 3491|       |
 3492|  4.84k|	da = fr_hash_table_find(namespace, &(fr_dict_attr_t) { .name = name });
 3493|  4.84k|	if (!da) {
  ------------------
  |  Branch (3493:6): [True: 3.22k, False: 1.61k]
  ------------------
 3494|  3.22k|		if (parent->flags.is_root) {
  ------------------
  |  Branch (3494:7): [True: 1.98k, False: 1.24k]
  ------------------
 3495|  1.98k|			fr_dict_t const *dict = fr_dict_by_da(parent);
 3496|       |
 3497|  1.98k|			if (dict->next) {
  ------------------
  |  Branch (3497:8): [True: 0, False: 1.98k]
  ------------------
 3498|      0|				parent = dict->next->root;
 3499|      0|				goto redo;
 3500|      0|			}
 3501|  1.98k|		}
 3502|       |
 3503|  3.22k|		if (err) *err = FR_DICT_ATTR_NOTFOUND;
  ------------------
  |  Branch (3503:7): [True: 0, False: 3.22k]
  ------------------
 3504|  3.22k|		fr_strerror_printf("Attribute '%s' not found in namespace '%s'", name, parent->name);
  ------------------
  |  |   65|  3.22k|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3505|  3.22k|		return NULL;
 3506|  3.22k|	}
 3507|       |
 3508|  1.61k|	if (err) *err = FR_DICT_ATTR_OK;
  ------------------
  |  Branch (3508:6): [True: 0, False: 1.61k]
  ------------------
 3509|       |
 3510|  1.61k|	return da;
 3511|  4.84k|}
fr_dict_attr_by_name:
 3524|  3.22k|{
 3525|  3.22k|	fr_dict_attr_t const *da;
 3526|       |
 3527|  3.22k|	DA_VERIFY(parent);
  ------------------
  |  |   64|  3.22k|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 3528|       |
 3529|  3.22k|	da = dict_attr_by_name(err, parent, name);
 3530|  3.22k|	if (!da) return NULL;
  ------------------
  |  Branch (3530:6): [True: 3.22k, False: 4]
  ------------------
 3531|       |
 3532|      4|	da = dict_attr_alias(err, da);
 3533|      4|	if (unlikely(!da)) return NULL;
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 3534|       |
 3535|      4|	return da;
 3536|      4|}
dict_attr_child_by_num:
 3542|  23.4k|{
 3543|  23.4k|	fr_dict_attr_t const *bin;
 3544|  23.4k|	fr_dict_attr_t const **children;
 3545|  23.4k|	fr_dict_attr_t const *ref;
 3546|       |
 3547|  23.4k|	DA_VERIFY(parent);
  ------------------
  |  |   64|  23.4k|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 3548|       |
 3549|       |	/*
 3550|       |	 *	Do any necessary dereferencing
 3551|       |	 */
 3552|  23.4k|	ref = fr_dict_attr_ref(parent);
 3553|  23.4k|	if (ref) parent = ref;
  ------------------
  |  Branch (3553:6): [True: 0, False: 23.4k]
  ------------------
 3554|       |
 3555|  23.4k|	children = dict_attr_children(parent);
 3556|  23.4k|	if (!children) return NULL;
  ------------------
  |  Branch (3556:6): [True: 206, False: 23.2k]
  ------------------
 3557|       |
 3558|       |	/*
 3559|       |	 *	Child arrays may be trimmed back to save memory.
 3560|       |	 *	Check that so we don't SEGV.
 3561|       |	 */
 3562|  23.2k|	if ((attr & 0xff) >= talloc_array_length(children)) return NULL;
  ------------------
  |  Branch (3562:6): [True: 0, False: 23.2k]
  ------------------
 3563|       |
 3564|  23.2k|	bin = children[attr & 0xff];
 3565|  25.3k|	for (;;) {
 3566|  25.3k|		if (!bin) return NULL;
  ------------------
  |  Branch (3566:7): [True: 5.54k, False: 19.8k]
  ------------------
 3567|  19.8k|		if (bin->attr == attr) {
  ------------------
  |  Branch (3567:7): [True: 17.7k, False: 2.06k]
  ------------------
 3568|  17.7k|			fr_dict_attr_t *out;
 3569|       |
 3570|  17.7k|			memcpy(&out, &bin, sizeof(bin));
 3571|       |
 3572|  17.7k|			return out;
 3573|  17.7k|		}
 3574|  2.06k|		bin = bin->next;
 3575|  2.06k|	}
 3576|       |
 3577|      0|	return NULL;
 3578|  23.2k|}
fr_dict_attr_child_by_num:
 3589|  21.6k|{
 3590|  21.6k|	fr_dict_attr_t const *da;
 3591|       |
 3592|  21.6k|	da = dict_attr_child_by_num(parent, attr);
 3593|  21.6k|	if (!da) return NULL;
  ------------------
  |  Branch (3593:6): [True: 5.74k, False: 15.8k]
  ------------------
 3594|       |
 3595|  15.8k|	da = dict_attr_alias(NULL, da);
 3596|  15.8k|	if (unlikely(!da)) return NULL;
  ------------------
  |  |  397|  15.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 15.8k]
  |  |  ------------------
  ------------------
 3597|       |
 3598|  15.8k|	return da;
 3599|  15.8k|}
fr_dict_enum_by_value:
 3651|    110|{
 3652|    110|	fr_dict_attr_ext_enumv_t	*ext;
 3653|       |
 3654|    110|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_ENUMV);
 3655|    110|	if (!ext) {
  ------------------
  |  Branch (3655:6): [True: 0, False: 110]
  ------------------
 3656|      0|		fr_strerror_printf("VALUE cannot be defined for %s attributes",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3657|      0|				   fr_type_to_str(da->type));
 3658|      0|		return NULL;
 3659|      0|	}
 3660|       |
 3661|       |	/*
 3662|       |	 *	No values associated with this attribute
 3663|       |	 */
 3664|    110|	if (!ext->name_by_value) return NULL;
  ------------------
  |  Branch (3664:6): [True: 0, False: 110]
  ------------------
 3665|       |
 3666|       |	/*
 3667|       |	 *	Could be NULL or an unknown attribute, in which case
 3668|       |	 *	we want to avoid the lookup gracefully...
 3669|       |	 */
 3670|    110|	if (value->type != da->type) return NULL;
  ------------------
  |  Branch (3670:6): [True: 0, False: 110]
  ------------------
 3671|       |
 3672|    110|	return fr_hash_table_find(ext->name_by_value, &(fr_dict_enum_value_t){ .value = value });
 3673|    110|}
fr_dict_enum_name_from_substr:
 3818|    726|{
 3819|    726|	fr_sbuff_t our_in = FR_SBUFF(in);
  ------------------
  |  |  451|    726|#define FR_SBUFF(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|    726|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|    726|((fr_sbuff_t){ \
  |  |  |  |  430|    726|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|    726|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|    726|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|    726|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  431|    726|	.start		= (_start), \
  |  |  |  |  432|    726|	.end		= (_end), \
  |  |  |  |  433|    726|	.p		= (_current), \
  |  |  |  |  434|    726|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    726|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  435|    726|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|    726|	.shifted	= 0, \
  |  |  |  |  437|    726|	.extend		= (_extend), \
  |  |  |  |  438|    726|	.eof		= (_eof), \
  |  |  |  |  439|    726|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    726|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  440|    726|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    726|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  441|    726|})
  |  |  ------------------
  |  |  452|    726|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  453|    726|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  454|    726|					     fr_sbuff_end(_sbuff_or_marker), \
  |  |  455|    726|					     fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  456|    726|					     fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  457|    726|					     0x00)
  ------------------
 3820|    726|	bool seen_alpha = false;
 3821|       |
 3822|  8.34k|	while (fr_sbuff_is_in_charset(&our_in, fr_dict_enum_allowed_chars)) {
  ------------------
  |  Branch (3822:9): [True: 7.62k, False: 726]
  ------------------
 3823|  7.62k|		if (fr_sbuff_is_alpha(&our_in)) seen_alpha = true;
  ------------------
  |  | 1834|  7.62k|	SBUFF_IS_GENERIC(_sbuff_or_marker, alpha)
  |  |  ------------------
  |  |  |  | 1815|  7.62k|	_Generic((_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1815:2): [True: 6.19k, False: 1.43k]
  |  |  |  |  ------------------
  |  |  |  | 1816|  7.62k|		 fr_sbuff_t *		: _fr_sbuff_is_ ## _name((fr_sbuff_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  ------------------
  |  |  |  | 1817|  7.62k|		 fr_sbuff_marker_t *	: _fr_marker_is_ ## _name((fr_sbuff_marker_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  7.62k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  7.62k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  7.62k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  7.62k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  7.62k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  7.62k|	))
  |  |  |  |  ------------------
  |  |  |  | 1818|  7.62k|	)
  |  |  ------------------
  ------------------
 3824|  7.62k|		fr_sbuff_next(&our_in);
 3825|  7.62k|	}
 3826|       |
 3827|    726|	if (!seen_alpha) {
  ------------------
  |  Branch (3827:6): [True: 0, False: 726]
  ------------------
 3828|      0|		if (fr_sbuff_used(&our_in) == 0) {
  ------------------
  |  |  940|      0|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (940:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  941|      0|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  ------------------
  |  Branch (3828:7): [True: 0, False: 0]
  ------------------
 3829|      0|			fr_strerror_const("VALUE name is empty");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3830|      0|			if (err) *err = FR_SBUFF_PARSE_ERROR_NOT_FOUND;
  ------------------
  |  Branch (3830:8): [True: 0, False: 0]
  ------------------
 3831|      0|			FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3832|      0|		}
 3833|       |
 3834|      0|		fr_strerror_const("VALUE name must contain at least one alpha character");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3835|      0|		if (err) *err = FR_SBUFF_PARSE_ERROR_FORMAT;
  ------------------
  |  Branch (3835:7): [True: 0, False: 0]
  ------------------
 3836|      0|		fr_sbuff_set_to_start(&our_in);	/* Marker should be at the start of the enum */
 3837|      0|		FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3838|      0|	}
 3839|       |
 3840|       |	/*
 3841|       |	 *	Check that the sequence is correctly terminated
 3842|       |	 */
 3843|    726|	if (tt && !fr_sbuff_is_terminal(&our_in, tt)) {
  ------------------
  |  Branch (3843:6): [True: 0, False: 726]
  |  Branch (3843:12): [True: 0, False: 0]
  ------------------
 3844|      0|		fr_strerror_const("VALUE name has trailing text");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3845|      0|		if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING;
  ------------------
  |  Branch (3845:7): [True: 0, False: 0]
  ------------------
 3846|      0|		FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3847|      0|	}
 3848|       |
 3849|    726|	if (out) return fr_sbuff_out_bstrncpy_exact(out, in, fr_sbuff_used(&our_in));
  ------------------
  |  |  940|      0|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (940:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  941|      0|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  ------------------
  |  Branch (3849:6): [True: 0, False: 726]
  ------------------
 3850|       |
 3851|    726|	if (err) *err = FR_SBUFF_PARSE_OK;
  ------------------
  |  Branch (3851:6): [True: 0, False: 726]
  ------------------
 3852|       |
 3853|    726|	FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|    726|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|    726|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|    726|_Generic((_dst), \
  |  |  |  | 1164|    726|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|    726|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|    726|)(_dst, \
  |  |  |  | 1167|    726|_Generic((_src), \
  |  |  |  | 1168|    726|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    726|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    726|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    726|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    726|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    726|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    726|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|    726|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    726|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    726|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    726|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    726|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    726|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    726|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|    726|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    726|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    726|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    726|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    726|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    726|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    726|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|    726|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    726|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    726|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    726|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    726|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    726|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    726|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|    726|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|    726|	char *				: (char const *)(_src), \
  |  |  |  | 1174|    726|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|    726|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|    726|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|    726|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|    726|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|    726|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|    726|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|    726|))
  |  |  ------------------
  ------------------
 3854|    726|}
dict_dlopen:
 3857|      4|{
 3858|      4|	char			*lib_name;
 3859|      4|	char			*sym_name;
 3860|      4|	fr_dict_protocol_t	*proto;
 3861|       |
 3862|      4|	if (!name) return 0;
  ------------------
  |  Branch (3862:6): [True: 0, False: 4]
  ------------------
 3863|       |
 3864|      4|	lib_name = talloc_typed_asprintf(NULL, "libfreeradius-%s", name);
 3865|      4|	if (unlikely(lib_name == NULL)) {
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 3866|      0|	oom:
 3867|      0|		fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3868|      0|		return -1;
 3869|      0|	}
 3870|      4|	talloc_bstr_tolower(lib_name);
 3871|       |
 3872|      4|	dict->dl = dl_by_name(dict_gctx->dict_loader, lib_name, NULL, false);
 3873|      4|	if (!dict->dl) {
  ------------------
  |  Branch (3873:6): [True: 0, False: 4]
  ------------------
 3874|      0|		fr_strerror_printf_push("Failed loading dictionary validation library \"%s\"", lib_name);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3875|      0|		talloc_free(lib_name);
 3876|      0|		return -1;
 3877|      0|	}
 3878|      4|	talloc_free(lib_name);
 3879|       |
 3880|       |	/*
 3881|       |	 *	The public symbol that contains per-protocol rules
 3882|       |	 *	and extensions.
 3883|       |	 *
 3884|       |	 *	It ends up being easier to do this using dlsym to
 3885|       |	 *	resolve the symbol and not use the autoloader
 3886|       |	 *	callbacks as theoretically multiple dictionaries
 3887|       |	 *	could use the same protocol library, and then the
 3888|       |	 *	autoloader callback would only run for the first
 3889|       |	 * 	dictionary which loaded the protocol.
 3890|       |	 */
 3891|      4|	sym_name = talloc_typed_asprintf(NULL, "libfreeradius_%s_dict_protocol", name);
 3892|      4|	if (unlikely(sym_name == NULL)) {
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 3893|      0|		goto oom;
 3894|      0|	}
 3895|      4|	talloc_bstr_tolower(sym_name);
 3896|       |
 3897|       |	/*
 3898|       |	 *	De-hyphenate the symbol name
 3899|       |	 */
 3900|      4|	{
 3901|      4|		char *p, *q;
 3902|       |
 3903|    144|		for (p = sym_name, q = p + (talloc_strlen(sym_name)); p < q; p++) *p = *p == '-' ? '_' : *p;
  ------------------
  |  Branch (3903:57): [True: 140, False: 4]
  |  Branch (3903:74): [True: 0, False: 140]
  ------------------
 3904|      4|	}
 3905|       |
 3906|      4|	proto = dlsym(dict->dl->handle, sym_name);
 3907|      4|	talloc_free(sym_name);
 3908|       |
 3909|       |	/*
 3910|       |	 *	Soft failure, not all protocol libraires provide
 3911|       |	 *	custom validation functions or flats.
 3912|       |	 */
 3913|      4|	if (!proto) return 0;
  ------------------
  |  Branch (3913:6): [True: 2, False: 2]
  ------------------
 3914|       |
 3915|       |	/*
 3916|       |	 *	Replace the default protocol with the custom one
 3917|       |	 *	if we have it...
 3918|       |	 */
 3919|      2|	dict->proto = proto;
 3920|       |
 3921|      2|	return 0;
 3922|      4|}
dict_dependent_add:
 3948|      8|{
 3949|      8|	fr_dict_dependent_t *found;
 3950|       |
 3951|      8|	found = fr_rb_find(dict->dependents, &(fr_dict_dependent_t){ .dependent = dependent } );
 3952|      8|	if (!found) {
  ------------------
  |  Branch (3952:6): [True: 8, False: 0]
  ------------------
 3953|      8|		fr_dict_dependent_t *new;
 3954|       |
 3955|      8|		new = talloc_zero(dict->dependents, fr_dict_dependent_t);
 3956|      8|		if (unlikely(!new)) return -1;
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  ------------------
  ------------------
 3957|       |
 3958|       |		/*
 3959|       |		 *	If the dependent is in a module that gets
 3960|       |		 *	unloaded, any strings in the text area also
 3961|       |		 *	get unloaded (including dependent locations).
 3962|       |		 *
 3963|       |		 *	Strdup the string here so we don't get
 3964|       |		 *	random segfaults if a module forgets to unload
 3965|       |		 *	a dictionary.
 3966|       |		 */
 3967|      8|		new->dependent = talloc_strdup(new, dependent);
  ------------------
  |  |  149|      8|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
 3968|      8|		fr_rb_insert(dict->dependents, new);
 3969|       |
 3970|      8|		new->count = 1;
 3971|       |
 3972|      8|		return 0;
 3973|      8|	}
 3974|       |
 3975|      0|	found->count++;	/* Increase ref count */
 3976|       |
 3977|      0|	return 0;
 3978|      8|}
dict_dependent_remove:
 4007|      8|{
 4008|      8|	fr_dict_dependent_t *found;
 4009|       |
 4010|      8|	found = fr_rb_find(dict->dependents, &(fr_dict_dependent_t){ .dependent = dependent } );
 4011|      8|	if (!found) {
  ------------------
  |  Branch (4011:6): [True: 0, False: 8]
  ------------------
 4012|      0|		fr_strerror_printf("Dependent \"%s\" not found in dictionary \"%s\"", dependent, dict->root->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4013|      0|		return -1;
 4014|      0|	}
 4015|       |
 4016|      8|	if (found->count == 0) {
  ------------------
  |  Branch (4016:6): [True: 0, False: 8]
  ------------------
 4017|      0|		fr_strerror_printf("Zero ref count invalid for dependent \"%s\", dictionary \"%s\"",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4018|      0|				   dependent, dict->root->name);
 4019|      0|		return -1;
 4020|      0|	}
 4021|       |
 4022|      8|	if (--found->count == 0) {
  ------------------
  |  Branch (4022:6): [True: 8, False: 0]
  ------------------
 4023|      8|		fr_rb_delete(dict->dependents, found);
 4024|      8|		talloc_free(found);
 4025|      8|		return 0;
 4026|      8|	}
 4027|       |
 4028|      0|	return 1;
 4029|      8|}
dict_has_dependents:
 4039|      8|{
 4040|      8|	return (fr_rb_num_elements(dict->dependents) > 0);
 4041|      8|}
dict_alloc:
 4173|      4|{
 4174|      4|	fr_dict_t *dict;
 4175|       |
 4176|      4|	if (!dict_gctx) {
  ------------------
  |  Branch (4176:6): [True: 0, False: 4]
  ------------------
 4177|      0|		fr_strerror_const("Initialise global dictionary ctx with fr_dict_global_ctx_init()");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4178|      0|		return NULL;
 4179|      0|	}
 4180|       |
 4181|      4|	dict = talloc_zero(ctx, fr_dict_t);
 4182|      4|	if (!dict) {
  ------------------
  |  Branch (4182:6): [True: 0, False: 4]
  ------------------
 4183|      0|		fr_strerror_const("Failed allocating memory for dictionary");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4184|      0|	error:
 4185|      0|		talloc_free(dict);
 4186|      0|		return NULL;
 4187|      0|	}
 4188|      4|	dict->gctx = dict_gctx;	/* Record which global context this was allocated in */
 4189|      4|	talloc_set_destructor(dict, _dict_free);
  ------------------
  |  Branch (4189:2): [Folded, False: 4]
  ------------------
 4190|       |
 4191|       |	/*
 4192|       |	 *	A list of all the files that constitute this dictionary
 4193|       |	 */
 4194|      4|	fr_dlist_talloc_init(&dict->filenames, fr_dict_filename_t, entry);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
 4195|       |
 4196|       |	/*
 4197|       |	 *	Pre-Allocate pool memory for rapid startup
 4198|       |	 *	As that's the working memory required during
 4199|       |	 *	dictionary initialisation.
 4200|       |	 */
 4201|      4|	dict->pool = talloc_pool(dict, DICT_POOL_SIZE);
  ------------------
  |  |   37|      4|#define DICT_POOL_SIZE		(1024 * 1024 * 2)
  ------------------
 4202|      4|	if (!dict->pool) {
  ------------------
  |  Branch (4202:6): [True: 0, False: 4]
  ------------------
 4203|      0|		fr_strerror_const("Failed allocating talloc pool for dictionary");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4204|      0|		goto error;
 4205|      0|	}
 4206|       |
 4207|       |	/*
 4208|       |	 *	Create the table of vendor by name.   There MAY NOT
 4209|       |	 *	be multiple vendors of the same name.
 4210|       |	 */
 4211|      4|	dict->vendors_by_name = fr_hash_table_alloc(dict, dict_vendor_name_hash, dict_vendor_name_cmp, NULL);
  ------------------
  |  |   62|      4|		_fr_hash_table_alloc(_ctx, NULL, _hash_node, _cmp_node, _free_node)
  ------------------
 4212|      4|	if (!dict->vendors_by_name) {
  ------------------
  |  Branch (4212:6): [True: 0, False: 4]
  ------------------
 4213|      0|		fr_strerror_printf("Failed allocating \"vendors_by_name\" table");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4214|      0|		goto error;
 4215|      0|	}
 4216|       |	/*
 4217|       |	 *	Create the table of vendors by value.  There MAY
 4218|       |	 *	be vendors of the same value.  If there are, we
 4219|       |	 *	pick the latest one.
 4220|       |	 */
 4221|      4|	dict->vendors_by_num = fr_hash_table_alloc(dict, dict_vendor_pen_hash, dict_vendor_pen_cmp, NULL);
  ------------------
  |  |   62|      4|		_fr_hash_table_alloc(_ctx, NULL, _hash_node, _cmp_node, _free_node)
  ------------------
 4222|      4|	if (!dict->vendors_by_num) {
  ------------------
  |  Branch (4222:6): [True: 0, False: 4]
  ------------------
 4223|      0|		fr_strerror_printf("Failed allocating \"vendors_by_num\" table");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4224|      0|		goto error;
 4225|      0|	}
 4226|       |
 4227|       |	/*
 4228|       |	 *	Inter-dictionary reference caching
 4229|       |	 */
 4230|      4|	dict->autoref = fr_hash_table_alloc(dict, dict_protocol_name_hash, dict_protocol_name_cmp, NULL);
  ------------------
  |  |   62|      4|		_fr_hash_table_alloc(_ctx, NULL, _hash_node, _cmp_node, _free_node)
  ------------------
 4231|      4|	if (!dict->autoref) {
  ------------------
  |  Branch (4231:6): [True: 0, False: 4]
  ------------------
 4232|      0|		fr_strerror_printf("Failed allocating \"autoref\" table");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4233|      0|		goto error;
 4234|      0|	}
 4235|       |
 4236|       |	/*
 4237|       |	 *	Who/what depends on this dictionary
 4238|       |	 */
 4239|      4|	dict->dependents = fr_rb_inline_alloc(dict, fr_dict_dependent_t, node, _dict_dependent_cmp, NULL);
  ------------------
  |  |  270|      4|		_Generic((((_type *)0)->_field), \
  |  |  271|      4|			fr_rb_node_t: _fr_rb_alloc(_ctx, offsetof(_type, _field), NULL, _data_cmp, _data_free) \
  |  |  272|      4|		)
  ------------------
 4240|       |
 4241|       |	/*
 4242|       |	 *	Set the default dictionary protocol, this can
 4243|       |	 *	be overriden by the protocol library.
 4244|       |	 */
 4245|      4|	dict->proto = &dict_proto_default;
 4246|       |
 4247|      4|	return dict;
 4248|      4|}
fr_dict_const_free:
 4309|      2|{
 4310|      2|	fr_dict_t **our_dict = UNCONST(fr_dict_t **, dict);
  ------------------
  |  |  186|      2|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 4311|       |
 4312|      2|	return fr_dict_free(our_dict, dependent);
 4313|      2|}
fr_dict_free:
 4325|      6|{
 4326|      6|	if (!*dict) return 0;
  ------------------
  |  Branch (4326:6): [True: 2, False: 4]
  ------------------
 4327|       |
 4328|      4|	switch (dict_dependent_remove(*dict, dependent)) {
 4329|      4|	case 0:		/* dependent has no more refs */
  ------------------
  |  Branch (4329:2): [True: 4, False: 0]
  ------------------
 4330|      4|		if (!dict_has_dependents(*dict)) {
  ------------------
  |  Branch (4330:7): [True: 2, False: 2]
  ------------------
 4331|      2|			talloc_free(*dict);
 4332|      2|			return 0;
 4333|      2|		}
 4334|      2|		FALL_THROUGH;
  ------------------
  |  |  341|      2|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      2|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
 4335|       |
 4336|      2|	case 1:		/* dependent has more refs */
  ------------------
  |  Branch (4336:2): [True: 0, False: 4]
  ------------------
 4337|      2|		return 1;
 4338|       |
 4339|      0|	default:	/* error */
  ------------------
  |  Branch (4339:2): [True: 0, False: 4]
  ------------------
 4340|      0|		return -1;
 4341|      4|	}
 4342|      4|}
fr_dict_attr_autoload:
 4391|      2|{
 4392|      2|	fr_dict_attr_t const		*da;
 4393|      2|	fr_dict_attr_autoload_t const	*p = to_load;
 4394|      2|	fr_dict_attr_t const		*root = NULL;
 4395|       |
 4396|     50|	for (p = to_load; p->out; p++) {
  ------------------
  |  Branch (4396:20): [True: 48, False: 2]
  ------------------
 4397|     48|		if (!p->dict) {
  ------------------
  |  Branch (4397:7): [True: 0, False: 48]
  ------------------
 4398|      0|			fr_strerror_printf("Invalid attribute autoload entry for \"%s\", missing dictionary pointer", p->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4399|      0|			return -1;
 4400|      0|		}
 4401|       |
 4402|     48|		if (!*p->dict) {
  ------------------
  |  Branch (4402:7): [True: 0, False: 48]
  ------------------
 4403|      0|			fr_strerror_printf("Autoloader autoloader can't resolve attribute \"%s\", dictionary not loaded", p->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4404|      0|			fr_strerror_printf_push("Check fr_dict_autoload_t struct has "
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4405|      0|						"an entry to load the dictionary \"%s\" is located in, and that "
 4406|      0|						"the fr_dict_autoload_t symbol name is correct", p->name);
 4407|      0|			return -1;
 4408|      0|		}
 4409|       |
 4410|     48|		if (!root || (root->dict != *p->dict) || (p->name[0] != '.')) {
  ------------------
  |  Branch (4410:7): [True: 2, False: 46]
  |  Branch (4410:16): [True: 0, False: 46]
  |  Branch (4410:44): [True: 46, False: 0]
  ------------------
 4411|     48|			root = (*p->dict)->root;
 4412|     48|		}
 4413|       |
 4414|     48|		if (p->name[0] == '.') {
  ------------------
  |  Branch (4414:7): [True: 0, False: 48]
  ------------------
 4415|      0|			da = fr_dict_attr_by_oid(NULL, root, p->name + 1);
 4416|      0|			if (!da) {
  ------------------
  |  Branch (4416:8): [True: 0, False: 0]
  ------------------
 4417|      0|				fr_strerror_printf("Autoloader attribute \"%s\" not found in \"%s\" dictionary under attribute %s", p->name,
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (65:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4418|      0|						   *p->dict ? (*p->dict)->root->name : "internal", root->name);
 4419|      0|				return -1;
 4420|      0|			}
 4421|     48|		} else {
 4422|     48|			da = fr_dict_attr_by_oid(NULL, fr_dict_root(*p->dict), p->name);
 4423|     48|			if (!da) {
  ------------------
  |  Branch (4423:8): [True: 0, False: 48]
  ------------------
 4424|      0|				fr_strerror_printf("Autoloader attribute \"%s\" not found in \"%s\" dictionary", p->name,
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (65:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4425|      0|						   *p->dict ? (*p->dict)->root->name : "internal");
 4426|      0|				return -1;
 4427|      0|			}
 4428|       |
 4429|     48|			if (fr_type_is_structural(da->type)) root = da;
  ------------------
  |  |  392|     48|#define fr_type_is_structural(_x)		(fr_type_structural[_x])
  |  |  ------------------
  |  |  |  Branch (392:36): [True: 2, False: 46]
  |  |  ------------------
  ------------------
 4430|     48|		}
 4431|       |
 4432|     48|		if (da->type != p->type) {
  ------------------
  |  Branch (4432:7): [True: 0, False: 48]
  ------------------
 4433|      0|			fr_strerror_printf("Autoloader attribute \"%s\" should be type %s, but defined as type %s", da->name,
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4434|      0|					   fr_type_to_str(p->type),
 4435|      0|					   fr_type_to_str(da->type));
 4436|      0|			return -1;
 4437|      0|		}
 4438|       |
 4439|     48|		DA_VERIFY(da);
  ------------------
  |  |   64|     48|#  define DA_VERIFY(_x)		fr_dict_attr_verify(__FILE__, __LINE__, _x)
  ------------------
 4440|       |
 4441|     48|		if (p->out) *(p->out) = da;
  ------------------
  |  Branch (4441:7): [True: 48, False: 0]
  ------------------
 4442|     48|	}
 4443|       |
 4444|      2|	return 0;
 4445|      2|}
_fr_dict_autoload:
 4456|      2|{
 4457|      2|	fr_dict_autoload_t const	*p;
 4458|       |
 4459|      4|	for (p = to_load; p->out; p++) {
  ------------------
  |  Branch (4459:20): [True: 2, False: 2]
  ------------------
 4460|      2|		fr_dict_t *dict = NULL;
 4461|       |
 4462|      2|		if (unlikely(!p->proto)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 4463|      0|			fr_strerror_const("autoload missing parameter proto");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4464|      0|			return -1;
 4465|      0|		}
 4466|       |
 4467|       |		/*
 4468|       |		 *	Load the internal dictionary
 4469|       |		 */
 4470|      2|		if (strcmp(p->proto, "freeradius") == 0) {
  ------------------
  |  Branch (4470:7): [True: 0, False: 2]
  ------------------
 4471|      0|			if (fr_dict_internal_afrom_file(&dict, p->proto, dependent) < 0) return -1;
  ------------------
  |  Branch (4471:8): [True: 0, False: 0]
  ------------------
 4472|      2|		} else {
 4473|      2|			if (fr_dict_protocol_afrom_file(&dict, p->proto, p->base_dir, dependent) < 0) return -1;
  ------------------
  |  Branch (4473:8): [True: 0, False: 2]
  ------------------
 4474|      2|		}
 4475|       |
 4476|      2|		*(p->out) = dict;
 4477|      2|	}
 4478|       |
 4479|      2|	return 0;
 4480|      2|}
_fr_dict_autofree:
 4489|      2|{
 4490|      2|	fr_dict_autoload_t const *p;
 4491|       |
 4492|      4|	for (p = to_free; p->out; p++) {
  ------------------
  |  Branch (4492:20): [True: 2, False: 2]
  ------------------
 4493|      2|		int ret;
 4494|       |
 4495|      2|		if (!*p->out) continue;
  ------------------
  |  Branch (4495:7): [True: 0, False: 2]
  ------------------
 4496|      2|		ret = fr_dict_const_free(p->out, dependent);
 4497|       |
 4498|      2|		if (ret == 0) *p->out = NULL;
  ------------------
  |  Branch (4498:7): [True: 2, False: 0]
  ------------------
 4499|      2|		if (ret < 0) return -1;
  ------------------
  |  Branch (4499:7): [True: 0, False: 2]
  ------------------
 4500|      2|	}
 4501|       |
 4502|      2|	return 0;
 4503|      2|}
fr_dict_global_ctx_init:
 4709|      4|{
 4710|      4|	fr_dict_gctx_t *new_ctx;
 4711|       |
 4712|      4|	new_ctx = talloc_zero(ctx, fr_dict_gctx_t);
 4713|      4|	if (!new_ctx) {
  ------------------
  |  Branch (4713:6): [True: 0, False: 4]
  ------------------
 4714|      0|		fr_strerror_const("Out of Memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4715|      0|		return NULL;
 4716|      0|	}
 4717|      4|	new_ctx->perm_check = true;	/* Check file permissions by default */
 4718|       |
 4719|      4|	new_ctx->protocol_by_name = fr_hash_table_alloc(new_ctx, dict_protocol_name_hash, dict_protocol_name_cmp, NULL);
  ------------------
  |  |   62|      4|		_fr_hash_table_alloc(_ctx, NULL, _hash_node, _cmp_node, _free_node)
  ------------------
 4720|      4|	if (!new_ctx->protocol_by_name) {
  ------------------
  |  Branch (4720:6): [True: 0, False: 4]
  ------------------
 4721|      0|		fr_strerror_const("Failed initializing protocol_by_name hash");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4722|      0|	error:
 4723|      0|		talloc_free(new_ctx);
 4724|      0|		return NULL;
 4725|      0|	}
 4726|       |
 4727|      4|	new_ctx->protocol_by_num = fr_hash_table_alloc(new_ctx, dict_protocol_num_hash, dict_protocol_num_cmp, NULL);
  ------------------
  |  |   62|      4|		_fr_hash_table_alloc(_ctx, NULL, _hash_node, _cmp_node, _free_node)
  ------------------
 4728|      4|	if (!new_ctx->protocol_by_num) {
  ------------------
  |  Branch (4728:6): [True: 0, False: 4]
  ------------------
 4729|      0|		fr_strerror_const("Failed initializing protocol_by_num hash");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4730|      0|		goto error;
 4731|      0|	}
 4732|       |
 4733|      4|	new_ctx->dict_dir_default = talloc_strdup(new_ctx, dict_dir);
  ------------------
  |  |  149|      4|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
 4734|      4|	if (!new_ctx->dict_dir_default) goto error;
  ------------------
  |  Branch (4734:6): [True: 0, False: 4]
  ------------------
 4735|       |
 4736|      4|	new_ctx->dict_loader = dl_loader_init(new_ctx, NULL, false, false);
 4737|      4|	if (!new_ctx->dict_loader) goto error;
  ------------------
  |  Branch (4737:6): [True: 0, False: 4]
  ------------------
 4738|       |
 4739|      4|	new_ctx->free_at_exit = free_at_exit;
 4740|       |
 4741|      4|	talloc_set_destructor(new_ctx, _dict_global_free);
  ------------------
  |  Branch (4741:2): [Folded, False: 4]
  ------------------
 4742|       |
 4743|      4|	if (!dict_gctx) dict_gctx = new_ctx;	/* Set as the default */
  ------------------
  |  Branch (4743:6): [True: 2, False: 2]
  ------------------
 4744|       |
 4745|      4|	if (free_at_exit) fr_atexit_global(_dict_global_free_at_exit, new_ctx);
  ------------------
  |  |   58|      2|#define fr_atexit_global(_func, _uctx) _atexit_global(__FILE__, __LINE__, _func, _uctx)
  ------------------
  |  Branch (4745:6): [True: 2, False: 2]
  ------------------
 4746|       |
 4747|      4|	return new_ctx;
 4748|      4|}
fr_dict_global_ctx_dir:
 4806|      4|{
 4807|      4|	return dict_gctx->dict_dir_default;
 4808|      4|}
fr_dict_unconst:
 4899|      8|{
 4900|      8|	if (unlikely(dict->read_only)) {
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  ------------------
  ------------------
 4901|      0|		fr_strerror_printf("%s dictionary has been marked as read only", fr_dict_root(dict)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4902|      0|		return NULL;
 4903|      0|	}
 4904|      8|	return UNCONST(fr_dict_t *, dict);
  ------------------
  |  |  186|      8|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 4905|      8|}
fr_dict_attr_unconst:
 4911|     20|{
 4912|     20|	fr_dict_t *dict;
 4913|       |
 4914|     20|	dict = dict_by_da(da);
 4915|     20|	if (unlikely(dict->read_only)) {
  ------------------
  |  |  397|     20|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 20]
  |  |  ------------------
  ------------------
 4916|      0|		fr_strerror_printf("%s dictionary has been marked as read only", fr_dict_root(dict)->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4917|      0|		return NULL;
 4918|      0|	}
 4919|       |
 4920|     20|	return UNCONST(fr_dict_attr_t *, da);
  ------------------
  |  |  186|     20|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 4921|     20|}
fr_dict_valid_name:
 4934|  1.61k|{
 4935|  1.61k|	char const *p = name, *end;
 4936|  1.61k|	bool unknown = false;
 4937|  1.61k|	bool alnum = false;
 4938|       |
 4939|  1.61k|	if (len < 0) len = strlen(name);
  ------------------
  |  Branch (4939:6): [True: 1.61k, False: 0]
  ------------------
 4940|       |
 4941|  1.61k|	if (len > FR_DICT_ATTR_MAX_NAME_LEN) {
  ------------------
  |  |  501|  1.61k|#define FR_DICT_ATTR_MAX_NAME_LEN	(128)				//!< Maximum length of a attribute name.
  ------------------
  |  Branch (4941:6): [True: 0, False: 1.61k]
  ------------------
 4942|      0|		fr_strerror_const("Attribute name is too long");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4943|      0|		return -1;
 4944|      0|	}
 4945|       |
 4946|  1.61k|	end = p + len;
 4947|       |
 4948|       |	/*
 4949|       |	 *	Unknown attributes can have '.' in their name.
 4950|       |	 */
 4951|  1.61k|	if ((len > 5) && (memcmp(name, "Attr-", 5) == 0)) unknown = true;
  ------------------
  |  Branch (4951:6): [True: 1.45k, False: 158]
  |  Branch (4951:19): [True: 0, False: 1.45k]
  ------------------
 4952|       |
 4953|  24.6k|	while (p < end) {
  ------------------
  |  Branch (4953:9): [True: 23.0k, False: 1.61k]
  ------------------
 4954|  23.0k|		if ((*p == '.') && unknown) p++;
  ------------------
  |  Branch (4954:7): [True: 0, False: 23.0k]
  |  Branch (4954:22): [True: 0, False: 0]
  ------------------
 4955|       |
 4956|  23.0k|		if (!fr_dict_attr_allowed_chars[(uint8_t)*p]) {
  ------------------
  |  Branch (4956:7): [True: 0, False: 23.0k]
  ------------------
 4957|      0|			fr_strerror_printf("Invalid character '%pV' in attribute name \"%pV\"",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 4958|      0|					   fr_box_strvalue_len(p, 1), fr_box_strvalue_len(name, len));
  |  |  |  |  ------------------
  |  |  |  |  |  |  309|      0|#define fr_box_strvalue_len(_val, _len)		_fr_box_with_len(FR_TYPE_STRING, .vb_strvalue, _val, _len)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  306|      0|#define _fr_box_with_len(_type, _field, _val, _len) &(fr_value_box_t){ .type = _type, _field = _val, .vb_length = _len, VALUE_BOX_NDEBUG_INITIALISER }
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  246|      0|#define VALUE_BOX_NDEBUG_INITIALISER .file = __FILE__, .line = __LINE__, .magic = FR_VALUE_BOX_MAGIC
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   91|      0|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   81|      0|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  206|      0|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  205|      0|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               					   fr_box_strvalue_len(p, 1), fr_box_strvalue_len(name, len));
  |  |  |  |  ------------------
  |  |  |  |  |  |  309|      0|#define fr_box_strvalue_len(_val, _len)		_fr_box_with_len(FR_TYPE_STRING, .vb_strvalue, _val, _len)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  306|      0|#define _fr_box_with_len(_type, _field, _val, _len) &(fr_value_box_t){ .type = _type, _field = _val, .vb_length = _len, VALUE_BOX_NDEBUG_INITIALISER }
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  246|      0|#define VALUE_BOX_NDEBUG_INITIALISER .file = __FILE__, .line = __LINE__, .magic = FR_VALUE_BOX_MAGIC
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   91|      0|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   81|      0|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  206|      0|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  205|      0|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4958|      0|					   fr_box_strvalue_len(p, 1), fr_box_strvalue_len(name, len));
 4959|       |
 4960|      0|			return -(p - name);
 4961|      0|		}
 4962|       |
 4963|  23.0k|		alnum |= sbuff_char_alpha_num[(uint8_t)*p];
 4964|       |
 4965|  23.0k|		p++;
 4966|  23.0k|	}
 4967|       |
 4968|  1.61k|	if (!alnum) {
  ------------------
  |  Branch (4968:6): [True: 0, False: 1.61k]
  ------------------
 4969|      0|		fr_strerror_const("Invalid attribute name");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4970|      0|		return -1;
 4971|      0|	}
 4972|       |
 4973|  1.61k|	return len;
 4974|  1.61k|}
fr_dict_attr_iterate_children:
 5010|      6|{
 5011|      6|	fr_dict_attr_t const * const *bin;
 5012|      6|	fr_dict_attr_t const **children;
 5013|      6|	fr_dict_attr_t const *ref;
 5014|      6|	size_t len, i, start;
 5015|       |
 5016|      6|	ref = fr_dict_attr_ref(parent);
 5017|      6|	if (ref) parent = ref;
  ------------------
  |  Branch (5017:6): [True: 0, False: 6]
  ------------------
 5018|       |
 5019|      6|	children = dict_attr_children(parent);
 5020|      6|	if (!children) return NULL;
  ------------------
  |  Branch (5020:6): [True: 0, False: 6]
  ------------------
 5021|       |
 5022|      6|	if (!*prev) {
  ------------------
  |  Branch (5022:6): [True: 2, False: 4]
  ------------------
 5023|      2|		start = 0;
 5024|       |
 5025|      4|	} else if ((*prev)->next) {
  ------------------
  |  Branch (5025:13): [True: 0, False: 4]
  ------------------
 5026|       |		/*
 5027|       |		 *	There are more children in this bin, return
 5028|       |		 *	the next one.
 5029|       |		 */
 5030|      0|		return (*prev)->next;
 5031|       |
 5032|      4|	} else {
 5033|       |		/*
 5034|       |		 *	Figure out which bin we were in.  If it was
 5035|       |		 *	the last one, we're done.
 5036|       |		 */
 5037|      4|		start = (*prev)->attr & 0xff;
 5038|      4|		if (start == 255) return NULL;
  ------------------
  |  Branch (5038:7): [True: 0, False: 4]
  ------------------
 5039|       |
 5040|       |		/*
 5041|       |		 *	Start at the next bin.
 5042|       |		 */
 5043|      4|		start++;
 5044|      4|	}
 5045|       |
 5046|       |	/*
 5047|       |	 *	Look for a non-empty bin, and return the first child
 5048|       |	 *	from there.
 5049|       |	 */
 5050|      6|	len = talloc_array_length(children);
 5051|    514|	for (i = start; i < len; i++) {
  ------------------
  |  Branch (5051:18): [True: 512, False: 2]
  ------------------
 5052|    512|		bin = &children[i & 0xff];
 5053|       |
 5054|    512|		if (*bin) return *bin;
  ------------------
  |  Branch (5054:7): [True: 4, False: 508]
  ------------------
 5055|    512|	}
 5056|       |
 5057|      2|	return NULL;
 5058|      6|}
fr_dict_attr_verify:
 5095|   302k|{
 5096|   302k|	int i;
 5097|   302k|	fr_dict_attr_t const *da_p;
 5098|       |
 5099|   302k|	(void) talloc_get_type_abort_const(da, fr_dict_attr_t);
  ------------------
  |  |  117|   302k|#  define talloc_get_type_abort_const talloc_get_type_abort
  ------------------
 5100|       |
 5101|   302k|	if ((!da->flags.is_root) && (da->depth == 0)) {
  ------------------
  |  Branch (5101:6): [True: 273k, False: 28.4k]
  |  Branch (5101:30): [True: 0, False: 273k]
  ------------------
 5102|      0|		fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_dict_attr_t %s vendor: %u, attr %u: "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 5103|      0|				     "Is not root, but depth is 0",
 5104|      0|				     file, line, da->name, fr_dict_vendor_num_by_da(da), da->attr);
 5105|      0|	}
 5106|       |
 5107|   302k|	if (da->depth > FR_DICT_MAX_TLV_STACK) {
  ------------------
  |  |  517|   302k|#define FR_DICT_MAX_TLV_STACK		(FR_DICT_TLV_NEST_MAX + 5)
  |  |  ------------------
  |  |  |  |  505|   302k|#define FR_DICT_TLV_NEST_MAX		(24)
  |  |  ------------------
  ------------------
  |  Branch (5107:6): [True: 0, False: 302k]
  ------------------
 5108|      0|		fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_dict_attr_t %s vendor: %u, attr %u: "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 5110|      0|				     file, line, da->name, fr_dict_vendor_num_by_da(da), da->attr,
  |  |  |  | 5111|      0|				     da->depth, FR_DICT_MAX_TLV_STACK);
  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|#define FR_DICT_MAX_TLV_STACK		(FR_DICT_TLV_NEST_MAX + 5)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  505|      0|#define FR_DICT_TLV_NEST_MAX		(24)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5109|      0|				     "Indicated depth (%u) greater than TLV stack depth (%d)",
 5110|      0|				     file, line, da->name, fr_dict_vendor_num_by_da(da), da->attr,
 5111|      0|				     da->depth, FR_DICT_MAX_TLV_STACK);
 5112|      0|	}
 5113|       |
 5114|   605k|	for (da_p = da; da_p; da_p = da_p->next) {
  ------------------
  |  Branch (5114:18): [True: 303k, False: 302k]
  ------------------
 5115|   303k|		(void) talloc_get_type_abort_const(da_p, fr_dict_attr_t);
  ------------------
  |  |  117|   303k|#  define talloc_get_type_abort_const talloc_get_type_abort
  ------------------
 5116|   303k|	}
 5117|       |
 5118|   897k|	for (i = da->depth, da_p = da; i >= 0; i--, da_p = da_p->parent) {
  ------------------
  |  Branch (5118:33): [True: 595k, False: 302k]
  ------------------
 5119|   595k|		if (!da_p) {
  ------------------
  |  Branch (5119:7): [True: 0, False: 595k]
  ------------------
 5120|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_dict_attr_t %s vendor: %u, attr %u: "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 5121|      0|					     "Depth indicated there should be a parent, but parent is NULL",
 5122|      0|					     file, line, da->name, fr_dict_vendor_num_by_da(da), da->attr);
 5123|      0|		}
 5124|   595k|		if (i != (int)da_p->depth) {
  ------------------
  |  Branch (5124:7): [True: 0, False: 595k]
  ------------------
 5125|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_dict_attr_t %s vendor: %u, attr %u: "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 5126|      0|					     "Depth out of sequence, expected %i, got %u",
 5127|      0|					     file, line, da->name, fr_dict_vendor_num_by_da(da), da->attr, i, da_p->depth);
 5128|      0|		}
 5129|       |
 5130|   595k|	}
 5131|       |
 5132|   302k|	if ((i + 1) < 0) {
  ------------------
  |  Branch (5132:6): [True: 0, False: 302k]
  ------------------
 5133|      0|		fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_dict_attr_t top of hierarchy was not at depth 0",
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 5134|      0|				     file, line);
 5135|      0|	}
 5136|       |
 5137|   302k|	if (da->parent && (da->parent->type == FR_TYPE_VENDOR) && !fr_dict_attr_has_ext(da, FR_DICT_ATTR_EXT_VENDOR)) {
  ------------------
  |  Branch (5137:6): [True: 273k, False: 28.4k]
  |  Branch (5137:20): [True: 144, False: 273k]
  |  Branch (5137:60): [True: 0, False: 144]
  ------------------
 5138|      0|		fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: VSA missing 'vendor' extension", file, line);
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 5139|      0|	}
 5140|       |
 5141|   302k|	switch (da->type) {
 5142|   143k|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|    519|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|    519|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|    519|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|    519|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|    519|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|    595|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|    595|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    595|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 76, False: 301k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|  11.4k|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  11.4k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  11.4k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 10.8k, False: 291k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|  43.5k|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  43.5k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  43.5k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 32.1k, False: 269k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  43.6k|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  43.6k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  43.6k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 102, False: 301k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|  44.3k|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  44.3k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|  44.3k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (5142:2): [True: 519, False: 301k]
  ------------------
 5143|   143k|	{
 5144|   143k|		fr_hash_table_t *ht;
 5145|       |
 5146|   143k|		if (da->type == FR_TYPE_GROUP) break;
  ------------------
  |  Branch (5146:7): [True: 76, False: 44.2k]
  ------------------
 5147|       |
 5148|  44.2k|		fr_assert_msg(fr_dict_attr_has_ext(da, FR_DICT_ATTR_EXT_CHILDREN),
  ------------------
  |  |  202|  44.2k|#  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|  44.2k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 44.2k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5149|  44.2k|			      "CONSISTENCY CHECK FAILED %s[%d]: %s missing 'children' extension",
 5150|  44.2k|			      file, line,
 5151|  44.2k|			      fr_type_to_str(da->type));
 5152|       |
 5153|  44.2k|		fr_assert_msg(fr_dict_attr_has_ext(da, FR_DICT_ATTR_EXT_NAMESPACE),
  ------------------
  |  |  202|  44.2k|#  define	fr_assert_msg(_x, _msg, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, _msg, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|  44.2k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 44.2k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5154|  44.2k|			      "CONSISTENCY CHECK FAILED %s[%d]: %s missing 'namespace' extension",
 5155|  44.2k|			      file, line,
 5156|  44.2k|			      fr_type_to_str(da->type));
 5157|       |
 5158|       |		/*
 5159|       |		 *	Check the namespace hash table is ok
 5160|       |		 */
 5161|  44.2k|		ht = dict_attr_namespace(da);
 5162|  44.2k|		if (unlikely(!ht)) break;
  ------------------
  |  |  397|  44.2k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 44.2k]
  |  |  ------------------
  ------------------
 5163|  44.2k|		fr_hash_table_verify(ht);
 5164|  44.2k|	}
 5165|      0|		break;
 5166|       |
 5167|   257k|	default:
  ------------------
  |  Branch (5167:2): [True: 257k, False: 44.3k]
  ------------------
 5168|   257k|		break;
 5169|   302k|	}
 5170|   302k|}
fr_dict_attr_can_contain:
 5185|  3.57k|{
 5186|       |	/*
 5187|       |	 *	This is the common case: child is from the parent.
 5188|       |	 */
 5189|  3.57k|	if (child->parent == parent) return true;
  ------------------
  |  Branch (5189:6): [True: 3.57k, False: 0]
  ------------------
 5190|       |
 5191|      0|	if (child->flags.is_raw) return true; /* let people do stupid things */
  ------------------
  |  Branch (5191:6): [True: 0, False: 0]
  ------------------
 5192|       |
 5193|       |	/*
 5194|       |	 *	Only structural types can have children.
 5195|       |	 */
 5196|      0|	if (!fr_type_structural[parent->type]) return false;
  ------------------
  |  Branch (5196:6): [True: 0, False: 0]
  ------------------
 5197|       |
 5198|       |	/*
 5199|       |	 *	An internal attribute can go into any other container.
 5200|       |	 *
 5201|       |	 *	Any other attribute can go into an internal structural
 5202|       |	 *	attribute, because why not?
 5203|       |	 */
 5204|      0|	if (dict_gctx) {
  ------------------
  |  Branch (5204:6): [True: 0, False: 0]
  ------------------
 5205|      0|		if (child->dict == dict_gctx->internal) return true;
  ------------------
  |  Branch (5205:7): [True: 0, False: 0]
  ------------------
 5206|       |
 5207|      0|		if (parent->dict == dict_gctx->internal) return true;
  ------------------
  |  Branch (5207:7): [True: 0, False: 0]
  ------------------
 5208|      0|	}
 5209|       |
 5210|       |	/*
 5211|       |	 *	Anything can go into internal groups.
 5212|       |	 */
 5213|      0|	if ((parent->type == FR_TYPE_GROUP) && parent->flags.internal) return true;
  ------------------
  |  Branch (5213:6): [True: 0, False: 0]
  |  Branch (5213:41): [True: 0, False: 0]
  ------------------
 5214|       |
 5215|       |	/*
 5216|       |	 *	Protocol attributes have to be in the same dictionary.
 5217|       |	 *
 5218|       |	 *	Unless they're a cross-protocol grouping attribute.
 5219|       |	 *	In which case we check if the ref is the same.
 5220|       |	 */
 5221|      0|	if (child->dict != parent->dict) {
  ------------------
  |  Branch (5221:6): [True: 0, False: 0]
  ------------------
 5222|      0|		fr_dict_attr_t const *ref;
 5223|       |
 5224|      0|		ref = fr_dict_attr_ref(parent);
 5225|       |
 5226|      0|		return (ref && (ref->dict == child->dict));
  ------------------
  |  Branch (5226:11): [True: 0, False: 0]
  |  Branch (5226:18): [True: 0, False: 0]
  ------------------
 5227|      0|	}
 5228|       |
 5229|       |	/*
 5230|       |	 *	Key fields can have children, but everyone else thinks
 5231|       |	 *	that the struct is the parent.  <sigh>
 5232|       |	 */
 5233|      0|	if ((parent->type == FR_TYPE_STRUCT) && child->parent->parent == parent) return true;
  ------------------
  |  Branch (5233:6): [True: 0, False: 0]
  |  Branch (5233:42): [True: 0, False: 0]
  ------------------
 5234|       |
 5235|       |	/*
 5236|       |	 *	We're in the same protocol dictionary, but the child
 5237|       |	 *	isn't directly from the parent.  Therefore the only
 5238|       |	 *	type of same-protocol structure it can go into is a
 5239|       |	 *	group.
 5240|       |	 */
 5241|      0|	return (parent->type == FR_TYPE_GROUP);
 5242|      0|}
fr_dict_protocol:
 5248|  13.7k|{
 5249|  13.7k|	return dict->proto;
 5250|  13.7k|}
dict_util.c:dict_attr_children_init:
  459|    196|{
  460|    196|	fr_dict_attr_ext_children_t	*ext;
  461|       |
  462|    196|	ext = dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_CHILDREN);
  463|    196|	if (unlikely(!ext)) return -1;
  ------------------
  |  |  397|    196|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 196]
  |  |  ------------------
  ------------------
  464|       |
  465|    196|	return 0;
  466|    196|}
dict_util.c:dict_attr_namespace_init:
  510|    196|{
  511|    196|	fr_dict_attr_ext_namespace_t	*ext;
  512|       |
  513|    196|	ext = dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_NAMESPACE);
  514|    196|	if (unlikely(!ext)) return -1;
  ------------------
  |  |  397|    196|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 196]
  |  |  ------------------
  ------------------
  515|       |
  516|       |	/*
  517|       |	 *	Create the table of attributes by name.
  518|       |	 *      There MAY NOT be multiple attributes of the same name.
  519|       |	 *
  520|       |	 *	If the attribute already has extensions
  521|       |	 *	then we don't want to leak the old
  522|       |	 *	namespace hash table.
  523|       |	 */
  524|    196|	if (!ext->namespace) {
  ------------------
  |  Branch (524:6): [True: 196, False: 0]
  ------------------
  525|    196|		ext->namespace = fr_hash_table_talloc_alloc(*da_p, fr_dict_attr_t,
  ------------------
  |  |   65|    196|		_fr_hash_table_alloc(_ctx, #_type, _hash_node, _cmp_node, _free_node)
  ------------------
  526|    196|							    dict_attr_name_hash, dict_attr_name_cmp, NULL);
  527|    196|		if (!ext->namespace) {
  ------------------
  |  Branch (527:7): [True: 0, False: 196]
  ------------------
  528|      0|			fr_strerror_printf("Failed allocating \"namespace\" table");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  529|      0|			return -1;
  530|      0|		}
  531|    196|	}
  532|       |
  533|    196|	return 0;
  534|    196|}
dict_util.c:dict_attr_name_hash:
  194|  6.64k|{
  195|  6.64k|	char const *name;
  196|       |
  197|  6.64k|	name = ((fr_dict_attr_t const *)data)->name;
  198|       |
  199|  6.64k|	return dict_hash_name(name, strlen(name));
  200|  6.64k|}
dict_util.c:dict_hash_name:
  124|  7.49k|{
  125|  7.49k|	uint32_t hash = FNV_MAGIC_INIT;
  ------------------
  |  |  113|  7.49k|#define FNV_MAGIC_INIT (0x811c9dc5)
  ------------------
  126|       |
  127|  7.49k|	char const *p = name, *q = name + len;
  128|       |
  129|   110k|	while (p < q) {
  ------------------
  |  Branch (129:9): [True: 103k, False: 7.49k]
  ------------------
  130|   103k|		int c = *(unsigned char const *)p;
  131|   103k|		if (isalpha(c)) c = tolower(c);
  ------------------
  |  Branch (131:7): [True: 88.3k, False: 15.0k]
  |  Branch (131:23): [True: 0, False: 0]
  |  Branch (131:23): [True: 0, False: 88.3k]
  |  Branch (131:23): [True: 88.3k, Folded]
  ------------------
  132|       |
  133|       |		/* coverity[overflow_const] */
  134|   103k|		hash *= FNV_MAGIC_PRIME;
  ------------------
  |  |  114|   103k|#define FNV_MAGIC_PRIME (0x01000193)
  ------------------
  135|   103k|		hash ^= (uint32_t)(c & 0xff);
  136|   103k|		p++;
  137|   103k|	}
  138|       |
  139|  7.49k|	return hash;
  140|  7.49k|}
dict_util.c:dict_attr_name_cmp:
  206|  1.71k|{
  207|  1.71k|	fr_dict_attr_t const *a = one, *b = two;
  208|  1.71k|	int ret;
  209|       |
  210|  1.71k|	ret = strcasecmp(a->name, b->name);
  211|  1.71k|	return CMP(ret, 0);
  ------------------
  |  |  113|  1.71k|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|  1.71k|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  212|  1.71k|}
dict_util.c:dict_attr_enumv_init:
  494|  10.6k|{
  495|  10.6k|	fr_dict_attr_ext_enumv_t	*ext;
  496|       |
  497|  10.6k|	ext = dict_attr_ext_alloc(da_p, FR_DICT_ATTR_EXT_ENUMV);
  498|  10.6k|	if (unlikely(!ext)) return -1;
  ------------------
  |  |  397|  10.6k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 10.6k]
  |  |  ------------------
  ------------------
  499|       |
  500|  10.6k|	return 0;
  501|  10.6k|}
dict_util.c:dict_attr_name_set:
  406|  10.8k|{
  407|  10.8k|	char		buffer[FR_DICT_ATTR_MAX_NAME_LEN + 1];
  408|  10.8k|	size_t		name_len;
  409|  10.8k|	char		*name_start, *name_end;
  410|  10.8k|	fr_dict_attr_t	*da = *da_p;
  411|       |
  412|       |	/*
  413|       |	 *	Generate a name if none is specified
  414|       |	 */
  415|  10.8k|	if (!name) {
  ------------------
  |  Branch (415:6): [True: 2.27k, False: 8.57k]
  ------------------
  416|  2.27k|		fr_sbuff_t unknown_name = FR_SBUFF_OUT(buffer, sizeof(buffer));
  ------------------
  |  |  531|  2.27k|#define FR_SBUFF_OUT(_start, _len_or_end) \
  |  |  532|  2.27k|((fr_sbuff_t){ \
  |  |  533|  2.27k|	.buff_i		= _start, \
  |  |  534|  2.27k|	.start_i	= _Generic((_start), \
  |  |  535|  2.27k|				char *		: _start, \
  |  |  536|  2.27k|				uint8_t *	: _start \
  |  |  537|  2.27k|			), \
  |  |  538|  2.27k|	.end_i		= _Generic((_len_or_end), \
  |  |  539|  2.27k|				size_t		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  540|  2.27k|				long		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  541|  2.27k|				int		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  542|  2.27k|				unsigned int	: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  543|  2.27k|				char *		: (char const *)(_len_or_end), \
  |  |  544|  2.27k|				char const *	: (char const *)(_len_or_end) \
  |  |  545|  2.27k|			), \
  |  |  546|  2.27k|	.p_i		= _start, \
  |  |  547|  2.27k|	.is_const	= false, \
  |  |  548|  2.27k|})
  ------------------
  417|       |
  418|       |
  419|  2.27k|		(void) fr_sbuff_in_sprintf(&unknown_name, "%u", da->attr);
  420|       |
  421|  2.27k|		name = fr_sbuff_buff(&unknown_name);
  ------------------
  |  |  812|  2.27k|	_Generic((_sbuff_or_marker), \
  |  |  813|  2.27k|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  814|  2.27k|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  815|  2.27k|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  816|  2.27k|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  817|  2.27k|	)
  ------------------
  422|  2.27k|		name_len = fr_sbuff_used(&unknown_name);
  ------------------
  |  |  940|  2.27k|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  828|  2.27k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|  2.27k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|  2.27k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|  2.27k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|  2.27k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|  2.27k|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|  2.27k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  2.27k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  2.27k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  2.27k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  2.27k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  2.27k|	))
  |  |  ------------------
  |  |  |  Branch (940:12): [True: 0, False: 2.27k]
  |  |  ------------------
  |  |  941|  2.27k|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|  2.27k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  2.27k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  2.27k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  2.27k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  2.27k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  2.27k|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  828|  2.27k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|  2.27k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|  2.27k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|  2.27k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|  2.27k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|  2.27k|	))
  |  |  ------------------
  ------------------
  423|  8.57k|	} else {
  424|  8.57k|		name_len = strlen(name);
  425|  8.57k|	}
  426|       |
  427|       |	/*
  428|       |	 *	Grow the structure to hold the name
  429|       |	 *
  430|       |	 *	We add the name as an extension because it makes
  431|       |	 *	the code less complex, and means the name value
  432|       |	 *	is copied automatically when if the fr_dict_attr_t
  433|       |	 *	is copied.
  434|       |	 *
  435|       |	 *	We do still need to fixup the da->name pointer
  436|       |	 *	though.
  437|       |	 */
  438|  10.8k|	name_start = dict_attr_ext_alloc_size(da_p, FR_DICT_ATTR_EXT_NAME, name_len + 1);
  439|  10.8k|	if (!name_start) return -1;
  ------------------
  |  Branch (439:6): [True: 0, False: 10.8k]
  ------------------
  440|       |
  441|  10.8k|	name_end = name_start + name_len;
  442|       |
  443|  10.8k|	memcpy(name_start, name, name_len);
  444|  10.8k|	*name_end = '\0';
  445|       |
  446|  10.8k|	(*da_p)->name = name_start;
  447|  10.8k|	(*da_p)->name_len = name_len;
  448|       |
  449|  10.8k|	return 0;
  450|  10.8k|}
dict_util.c:dict_attr_init_common:
  828|  9.24k|{
  829|  9.24k|	dict_attr_location_init((*da_p), filename, line);
  830|       |
  831|  9.24k|	if (unlikely(dict_attr_type_init(da_p, type) < 0)) return -1;
  ------------------
  |  |  397|  9.24k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 9.24k]
  |  |  ------------------
  ------------------
  832|       |
  833|  9.24k|	if (args->flags) (*da_p)->flags = *args->flags;
  ------------------
  |  Branch (833:6): [True: 9.24k, False: 0]
  ------------------
  834|       |
  835|  9.24k|	if (parent && (dict_attr_parent_init(da_p, parent) < 0)) return -1;
  ------------------
  |  Branch (835:6): [True: 9.24k, False: 4]
  |  Branch (835:16): [True: 0, False: 9.24k]
  ------------------
  836|       |
  837|  9.24k|	if (args->ref && (dict_attr_ref_aset(da_p, args->ref, FR_DICT_ATTR_REF_ALIAS) < 0)) return -1;
  ------------------
  |  Branch (837:6): [True: 6, False: 9.23k]
  |  Branch (837:19): [True: 0, False: 6]
  ------------------
  838|       |
  839|       |	/*
  840|       |	 *	Everything should be created correctly.
  841|       |	 */
  842|  9.24k|	if (!(*da_p)->flags.internal && !(*da_p)->flags.is_alias &&
  ------------------
  |  Branch (842:6): [True: 9.16k, False: 82]
  |  Branch (842:34): [True: 9.15k, False: 6]
  ------------------
  843|  9.15k|	    parent && ((parent->type == FR_TYPE_TLV) || (parent->type ==FR_TYPE_VENDOR))) {
  ------------------
  |  Branch (843:6): [True: 9.15k, False: 4]
  |  Branch (843:17): [True: 8.04k, False: 1.11k]
  |  Branch (843:50): [True: 12, False: 1.09k]
  ------------------
  844|  8.05k|		if (!parent->flags.type_size) {
  ------------------
  |  Branch (844:7): [True: 0, False: 8.05k]
  ------------------
  845|      0|			fr_strerror_printf("Parent %s has zero type_size", parent->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  846|      0|			return -1;
  847|      0|		}
  848|       |
  849|  8.05k|		if ((uint64_t) (*da_p)->attr >= ((uint64_t) 1 << (8 * parent->flags.type_size))) {
  ------------------
  |  Branch (849:7): [True: 0, False: 8.05k]
  ------------------
  850|      0|			fr_strerror_printf("Child of parent %s has invalid attribute number %u for type_size %u",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  851|      0|					   parent->name, (*da_p)->attr, parent->flags.type_size);
  852|      0|			return -1;
  853|      0|		}
  854|  8.05k|	}
  855|       |
  856|  9.24k|	return 0;
  857|  9.24k|}
dict_util.c:_dict_attr_free:
  951|  10.8k|{
  952|  10.8k|	fr_dict_attr_ext_enumv_t	*ext;
  953|       |
  954|       |#if 0
  955|       |#ifdef WITH_VERIFY_PTR
  956|       |	/*
  957|       |	 *	Check that any attribute we reference is still valid
  958|       |	 *	when we're being freed.
  959|       |	 */
  960|       |	fr_dict_attr_t const *ref = fr_dict_attr_ref(da);
  961|       |
  962|       |	if (ref) (void)talloc_get_type_abort_const(ref, fr_dict_attr_t);
  963|       |#endif
  964|       |#endif
  965|       |
  966|  10.8k|	ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_ENUMV);
  967|  10.8k|	if (ext) talloc_free(ext->value_by_name);		/* Ensure this is freed before the enumvs */
  ------------------
  |  Branch (967:6): [True: 10.6k, False: 234]
  ------------------
  968|       |
  969|  10.8k|	return 0;
  970|  10.8k|}
dict_util.c:dict_attr_acopy_child:
 1150|      4|{
 1151|      4|	fr_dict_attr_t			*copy;
 1152|       |
 1153|      4|	copy = dict_attr_acopy(dict->pool, dst, child, child->name);
 1154|      4|	if (!copy) return -1;
  ------------------
  |  Branch (1154:6): [True: 0, False: 4]
  ------------------
 1155|       |
 1156|      4|	fr_assert(copy->parent == dst);
  ------------------
  |  |  194|      4|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1157|      4|	copy->depth = copy->parent->depth + 1;
 1158|       |
 1159|      4|	if (dict_attr_child_add(dst, copy) < 0) return -1;
  ------------------
  |  Branch (1159:6): [True: 0, False: 4]
  ------------------
 1160|       |
 1161|      4|	if (dict_attr_add_to_namespace(dst, copy) < 0) return -1;
  ------------------
  |  Branch (1161:6): [True: 0, False: 4]
  ------------------
 1162|       |
 1163|      4|	if (!dict_attr_children(child)) return 0;
  ------------------
  |  Branch (1163:6): [True: 4, False: 0]
  ------------------
 1164|       |
 1165|      0|	if (dict_attr_acopy_children(dict, copy, child) < 0) return -1;
  ------------------
  |  Branch (1165:6): [True: 0, False: 0]
  ------------------
 1166|       |
 1167|       |	/*
 1168|       |	 *	Children of a UNION get an ALIAS added to the parent of the UNION.  This allows the UNION
 1169|       |	 *	attribute to be omitted from parsing and printing.
 1170|       |	 */
 1171|      0|	if (src->type != FR_TYPE_UNION) return 0;
  ------------------
  |  Branch (1171:6): [True: 0, False: 0]
  ------------------
 1172|       |
 1173|      0|	return dict_attr_alias_add(dst->parent, copy->name, copy, false);
 1174|      0|}
dict_util.c:dict_enum_name_hash:
  327|    804|{
  328|    804|	fr_dict_enum_value_t const *enumv = data;
  329|       |
  330|    804|	return dict_hash_name((void const *)enumv->name, enumv->name_len);
  331|    804|}
dict_util.c:dict_enum_value_hash:
  353|  1.62k|{
  354|  1.62k|	fr_dict_enum_value_t const *enumv = data;
  355|       |
  356|  1.62k|	return fr_value_box_hash(enumv->value);
  357|  1.62k|}
dict_util.c:dict_enum_value_cmp:
  363|    136|{
  364|    136|	fr_dict_enum_value_t const *a = one;
  365|    136|	fr_dict_enum_value_t const *b = two;
  366|    136|	int ret;
  367|       |
  368|    136|	ret = fr_value_box_cmp(a->value, b->value); /* not yet int8_t! */
  369|    136|	return CMP(ret, 0);
  ------------------
  |  |  113|    136|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|    136|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  370|    136|}
dict_util.c:dict_attr_alias:
  381|  16.0k|{
  382|  16.0k|	fr_dict_attr_t const *ref;
  383|       |
  384|  16.0k|	if (!da->flags.is_alias) return da;
  ------------------
  |  Branch (384:6): [True: 16.0k, False: 0]
  ------------------
  385|       |
  386|      0|	ref = fr_dict_attr_ref(da);
  387|      0|	if (unlikely(!ref)) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  388|      0|		fr_strerror_printf("ALIAS attribute '%s' missing reference", da->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  389|      0|		if (err) *err = FR_DICT_ATTR_INTERNAL_ERROR;
  ------------------
  |  Branch (389:7): [True: 0, False: 0]
  ------------------
  390|      0|		return NULL;
  391|      0|	} else {
  392|      0|		if (err) *err = FR_DICT_ATTR_OK;
  ------------------
  |  Branch (392:7): [True: 0, False: 0]
  ------------------
  393|      0|	}
  394|       |
  395|      0|	return ref;
  396|      0|}
dict_util.c:_dict_free:
 4090|      4|{
 4091|       |	/*
 4092|       |	 *	We don't necessarily control the order of freeing
 4093|       |	 *	children.
 4094|       |	 */
 4095|      4|	if (dict != dict->gctx->internal) {
  ------------------
  |  Branch (4095:6): [True: 2, False: 2]
  ------------------
 4096|      2|		fr_dict_attr_t const *da;
 4097|       |
 4098|      2|		if (dict->gctx->attr_protocol_encapsulation && dict->root) {
  ------------------
  |  Branch (4098:7): [True: 2, False: 0]
  |  Branch (4098:50): [True: 2, False: 0]
  ------------------
 4099|      2|			da = fr_dict_attr_child_by_num(dict->gctx->attr_protocol_encapsulation, dict->root->attr);
 4100|      2|			if (da && fr_dict_attr_ref(da)) dict_attr_ref_null(da);
  ------------------
  |  Branch (4100:8): [True: 2, False: 0]
  |  Branch (4100:14): [True: 2, False: 0]
  ------------------
 4101|      2|		}
 4102|      2|	}
 4103|       |
 4104|       |#ifdef STATIC_ANALYZER
 4105|       |	if (!dict->root) {
 4106|       |		fr_strerror_const("dict root is missing");
 4107|       |		return -1;
 4108|       |	}
 4109|       |#endif
 4110|       |
 4111|       |	/*
 4112|       |	 *	If we called init(), then call free()
 4113|       |	 */
 4114|      4|	if (dict->proto && dict->proto->free) {
  ------------------
  |  Branch (4114:6): [True: 4, False: 0]
  |  Branch (4114:21): [True: 2, False: 2]
  ------------------
 4115|      2|		dict->proto->free();
 4116|      2|	}
 4117|       |
 4118|      4|	if (!fr_cond_assert(!dict->in_protocol_by_name || fr_hash_table_delete(dict->gctx->protocol_by_name, dict))) {
  ------------------
  |  |  131|      4|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|     14|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 2, False: 2]
  |  |  |  |  |  Branch (396:41): [True: 2, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (4118:6): [True: 0, False: 4]
  ------------------
 4119|      0|		fr_strerror_printf("Failed removing dictionary from protocol hash \"%s\"", dict->root->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4120|      0|		return -1;
 4121|      0|	}
 4122|      4|	dict->in_protocol_by_name = false;
 4123|       |
 4124|      4|	if (!fr_cond_assert(!dict->in_protocol_by_num || fr_hash_table_delete(dict->gctx->protocol_by_num, dict))) {
  ------------------
  |  |  131|      4|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|     14|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 2, False: 2]
  |  |  |  |  |  Branch (396:41): [True: 2, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (4124:6): [True: 0, False: 4]
  ------------------
 4125|      0|		fr_strerror_printf("Failed removing dictionary from protocol number_hash \"%s\"", dict->root->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4126|      0|		return -1;
 4127|      0|	}
 4128|      4|	dict->in_protocol_by_num = false;
 4129|       |
 4130|      4|	if (dict_has_dependents(dict)) {
  ------------------
  |  Branch (4130:6): [True: 0, False: 4]
  ------------------
 4131|      0|		fr_rb_iter_inorder_t	iter;
 4132|      0|		fr_dict_dependent_t	*dep;
 4133|       |
 4134|      0|		fr_strerror_printf("Refusing to free dictionary \"%s\", still has dependents", dict->root->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4135|       |
 4136|      0|		for (dep = fr_rb_iter_init_inorder(dict->dependents, &iter);
 4137|      0|		     dep;
  ------------------
  |  Branch (4137:8): [True: 0, False: 0]
  ------------------
 4138|      0|		     dep = fr_rb_iter_next_inorder(dict->dependents, &iter)) {
 4139|      0|			fr_strerror_printf_push("%s (%d)", dep->dependent, dep->count);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4140|      0|		}
 4141|       |
 4142|      0|		return -1;
 4143|      0|	}
 4144|       |
 4145|       |	/*
 4146|       |	 *	Free the hash tables with free functions first
 4147|       |	 *	so that the things the hash tables reference
 4148|       |	 *	are still there.
 4149|       |	 */
 4150|      4|	talloc_free(dict->vendors_by_name);
 4151|       |
 4152|       |	/*
 4153|       |	 *	Decrease the reference count on the validation
 4154|       |	 *	library we loaded.
 4155|       |	 */
 4156|      4|	dl_free(dict->dl);
 4157|       |
 4158|      4|	if (dict == dict->gctx->internal) {
  ------------------
  |  Branch (4158:6): [True: 2, False: 2]
  ------------------
 4159|      2|		dict->gctx->internal = NULL;
 4160|      2|		dict->gctx->attr_protocol_encapsulation = NULL;
 4161|      2|	}
 4162|       |
 4163|      4|	return 0;
 4164|      4|}
dict_util.c:dict_vendor_name_hash:
  282|     30|{
  283|     30|	char const *name;
  284|       |
  285|     30|	name = ((fr_dict_vendor_t const *)data)->name;
  286|       |
  287|     30|	return dict_hash_name(name, strlen(name));
  288|     30|}
dict_util.c:dict_vendor_name_cmp:
  294|     20|{
  295|     20|	fr_dict_vendor_t const *a = one;
  296|     20|	fr_dict_vendor_t const *b = two;
  297|     20|	int ret;
  298|       |
  299|     20|	ret = strcasecmp(a->name, b->name);
  300|     20|	return CMP(ret, 0);
  ------------------
  |  |  113|     20|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|     20|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  301|     20|}
dict_util.c:dict_vendor_pen_hash:
  307|     30|{
  308|     30|	return fr_hash(&(((fr_dict_vendor_t const *)data)->pen),
  309|     30|		       sizeof(((fr_dict_vendor_t const *)data)->pen));
  310|     30|}
dict_util.c:dict_vendor_pen_cmp:
  316|     10|{
  317|     10|	fr_dict_vendor_t const *a = one;
  318|     10|	fr_dict_vendor_t const *b = two;
  319|       |
  320|     10|	return CMP(a->pen, b->pen);
  ------------------
  |  |  113|     10|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|     10|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  321|     10|}
dict_util.c:dict_protocol_name_hash:
  148|     12|{
  149|     12|	char const *name;
  150|       |
  151|     12|	name = ((fr_dict_t const *)data)->root->name;
  152|       |
  153|     12|	return dict_hash_name(name, strlen(name));
  154|     12|}
dict_util.c:dict_protocol_name_cmp:
  160|      6|{
  161|      6|	fr_dict_t const *a = one;
  162|      6|	fr_dict_t const *b = two;
  163|      6|	int ret;
  164|       |
  165|      6|	ret = strcasecmp(a->root->name, b->root->name);
  166|      6|	return CMP(ret, 0);
  ------------------
  |  |  113|      6|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|      6|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  167|      6|}
dict_util.c:_dict_dependent_cmp:
 3928|     28|{
 3929|     28|	fr_dict_dependent_t const *dep_a = a;
 3930|     28|	fr_dict_dependent_t const *dep_b = b;
 3931|     28|	int ret;
 3932|       |
 3933|     28|	ret = strcmp(dep_a->dependent, dep_b->dependent);
 3934|     28|	return CMP(ret, 0);
  ------------------
  |  |  113|     28|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|     28|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
 3935|     28|}
dict_util.c:dict_protocol_num_hash:
  173|      6|{
  174|      6|	return fr_hash(&(((fr_dict_t const *)data)->root->attr), sizeof(((fr_dict_t const *)data)->root->attr));
  175|      6|}
dict_util.c:dict_protocol_num_cmp:
  181|      2|{
  182|      2|	fr_dict_t const *a = one;
  183|      2|	fr_dict_t const *b = two;
  184|       |
  185|      2|	return CMP(a->root->attr, b->root->attr);
  ------------------
  |  |  113|      2|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|      2|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  186|      2|}
dict_util.c:_dict_global_free:
 4633|      2|{
 4634|      2|	fr_hash_iter_t	iter;
 4635|      2|	fr_dict_t	*dict;
 4636|      2|	bool		still_loaded = false;
 4637|       |
 4638|       |	/*
 4639|       |	 *	Make sure this doesn't fire later and mess
 4640|       |	 *	things up...
 4641|       |	 */
 4642|      2|	if (gctx->free_at_exit) fr_atexit_global_disarm(true, _dict_global_free_at_exit, gctx);
  ------------------
  |  Branch (4642:6): [True: 2, False: 0]
  ------------------
 4643|       |
 4644|       |	/*
 4645|       |	 *	Free up autorefs first, which will free up inter-dictionary dependencies.
 4646|       |	 */
 4647|      2|	for (dict = fr_hash_table_iter_init(gctx->protocol_by_name, &iter);
 4648|      4|	     dict;
  ------------------
  |  Branch (4648:7): [True: 2, False: 2]
  ------------------
 4649|      2|	     dict = fr_hash_table_iter_next(gctx->protocol_by_name, &iter)) {
 4650|      2|		(void)talloc_get_type_abort(dict, fr_dict_t);
 4651|       |
 4652|      2|		if (dict_autoref_free(dict) < 0) return -1;
  ------------------
  |  Branch (4652:7): [True: 0, False: 2]
  ------------------
 4653|      2|	}
 4654|       |
 4655|      2|	for (dict = fr_hash_table_iter_init(gctx->protocol_by_name, &iter);
 4656|      4|	     dict;
  ------------------
  |  Branch (4656:7): [True: 2, False: 2]
  ------------------
 4657|      2|	     dict = fr_hash_table_iter_next(gctx->protocol_by_name, &iter)) {
 4658|      2|	     	(void)talloc_get_type_abort(dict, fr_dict_t);
 4659|      2|	     	dict_dependent_remove(dict, "global");			/* remove our dependency */
 4660|       |
 4661|      2|		if (talloc_free(dict) < 0) {
  ------------------
  |  Branch (4661:7): [True: 0, False: 2]
  ------------------
 4662|      0|#ifndef NDEBUG
 4663|      0|			FR_FAULT_LOG("gctx failed to free dictionary %s - %s", dict->root->name, fr_strerror());
  ------------------
  |  |   50|      0|#define FR_FAULT_LOG(_fmt, ...)			fr_fault_log(_fmt "\n", ## __VA_ARGS__)
  ------------------
 4664|      0|#endif
 4665|      0|			still_loaded = true;
 4666|      0|		}
 4667|      2|	}
 4668|       |
 4669|       |	/*
 4670|       |	 *	Free the internal dictionary as the last step, after all of the protocol dictionaries and
 4671|       |	 *	libraries have freed their references to it.
 4672|       |	 */
 4673|      2|	if (gctx->internal) {
  ------------------
  |  Branch (4673:6): [True: 2, False: 0]
  ------------------
 4674|      2|		dict_dependent_remove(gctx->internal, "global");	/* remove our dependency */
 4675|       |
 4676|      2|		if (talloc_free(gctx->internal) < 0) still_loaded = true;
  ------------------
  |  Branch (4676:7): [True: 0, False: 2]
  ------------------
 4677|      2|	}
 4678|       |
 4679|      2|	if (still_loaded) {
  ------------------
  |  Branch (4679:6): [True: 0, False: 2]
  ------------------
 4680|      0|#ifndef NDEBUG
 4681|      0|		fr_dict_gctx_debug(stderr, gctx);
 4682|      0|#endif
 4683|      0|		return -1;
 4684|      0|	}
 4685|       |
 4686|       |	/*
 4687|       |	 *	Set this to NULL just in case the caller tries to use
 4688|       |	 *	dict_global_init() again.
 4689|       |	 */
 4690|      2|	if (gctx == dict_gctx) dict_gctx = NULL;	/* In case the active context isn't this one */
  ------------------
  |  Branch (4690:6): [True: 2, False: 0]
  ------------------
 4691|       |
 4692|      2|	return 0;
 4693|      2|}
dict_util.c:dict_autoref_free:
 4063|      2|{
 4064|      2|	fr_dict_t **refd_list;
 4065|      2|	unsigned int i;
 4066|       |
 4067|      2|	if (!dict->autoref) return 0;
  ------------------
  |  Branch (4067:6): [True: 0, False: 2]
  ------------------
 4068|       |
 4069|      2|	if (fr_hash_table_flatten(dict->autoref, (void ***)&refd_list, dict->autoref) < 0) {
  ------------------
  |  Branch (4069:6): [True: 0, False: 2]
  ------------------
 4070|      0|		fr_strerror_const("failed flattening autoref hash table");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4071|      0|		return -1;
 4072|      0|	}
 4073|       |
 4074|       |	/*
 4075|       |	 *	Free the dictionary.  It will call proto->free() if there's nothing more to do.
 4076|       |	 */
 4077|      2|	for (i = 0; i < talloc_array_length(refd_list); i++) {
  ------------------
  |  Branch (4077:14): [True: 0, False: 2]
  ------------------
 4078|      0|		if (fr_dict_free(&refd_list[i], dict->root->name) < 0) {
  ------------------
  |  Branch (4078:7): [True: 0, False: 0]
  ------------------
 4079|      0|			fr_strerror_printf("failed freeing autoloaded protocol %s", refd_list[i]->root->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4080|      0|			return -1;
 4081|      0|		}
 4082|      0|	}
 4083|       |
 4084|      2|	TALLOC_FREE(dict->autoref);
  ------------------
  |  Branch (4084:2): [True: 2, False: 0]
  |  Branch (4084:2): [Folded, False: 2]
  ------------------
 4085|       |
 4086|      2|	return 0;
 4087|      2|}
dict_util.c:_dict_global_free_at_exit:
 4628|      2|{
 4629|       |	return talloc_free(uctx);
 4630|      2|}

dict_attr_flags_valid:
   36|  1.61k|{
   37|  1.61k|	int bit;
   38|  1.61k|	uint32_t all_flags;
   39|  1.61k|	uint32_t shift_is_root, shift_internal;
   40|  1.61k|	uint32_t shift_array, shift_has_value;
   41|  1.61k|	uint32_t shift_subtype, shift_extra;
   42|  1.61k|	uint32_t shift_counter;
   43|  1.61k|	fr_dict_t		*dict = da->dict;
   44|  1.61k|	fr_dict_attr_t const	*parent = da->parent;
   45|  1.61k|	char const		*name = da->name;
   46|  1.61k|	int			attr = da->attr;
   47|  1.61k|	fr_type_t		type = da->type;
   48|  1.61k|	fr_dict_attr_flags_t	*flags = &da->flags;
   49|       |
   50|       |	/*
   51|       |	 *	Convert the 1-bit fields into bits numbers, so that we
   52|       |	 *	can check them in parallel.
   53|       |	 */
   54|  1.61k|	all_flags = 0;
   55|  1.61k|	bit = -1;
   56|       |
   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
   58|  1.61k|	SET_FLAG(is_root);
  ------------------
  |  |   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
  |  |  ------------------
  |  |  |  Branch (57:64): [True: 0, False: 1.61k]
  |  |  |  Branch (57:112): [Folded, False: 1.61k]
  |  |  ------------------
  ------------------
   59|  1.61k|	SET_FLAG(internal);
  ------------------
  |  |   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
  |  |  ------------------
  |  |  |  Branch (57:64): [True: 852, False: 760]
  |  |  |  Branch (57:112): [Folded, False: 1.61k]
  |  |  ------------------
  ------------------
   60|  1.61k|	SET_FLAG(array);
  ------------------
  |  |   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
  |  |  ------------------
  |  |  |  Branch (57:64): [True: 114, False: 1.49k]
  |  |  |  Branch (57:112): [Folded, False: 1.61k]
  |  |  ------------------
  ------------------
   61|  1.61k|	SET_FLAG(has_value);
  ------------------
  |  |   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
  |  |  ------------------
  |  |  |  Branch (57:64): [True: 0, False: 1.61k]
  |  |  |  Branch (57:112): [Folded, False: 1.61k]
  |  |  ------------------
  ------------------
   62|  1.61k|	SET_FLAG(extra);
  ------------------
  |  |   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
  |  |  ------------------
  |  |  |  Branch (57:64): [True: 116, False: 1.49k]
  |  |  |  Branch (57:112): [Folded, False: 1.61k]
  |  |  ------------------
  ------------------
   63|  1.61k|	SET_FLAG(counter);
  ------------------
  |  |   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
  |  |  ------------------
  |  |  |  Branch (57:64): [True: 0, False: 1.61k]
  |  |  |  Branch (57:112): [Folded, False: 1.61k]
  |  |  ------------------
  ------------------
   64|  1.61k|	SET_FLAG(subtype);
  ------------------
  |  |   57|  1.61k|#define SET_FLAG(_flag) do { shift_ ## _flag = 1 << ++bit; if (flags->_flag) all_flags |= (1 << bit); } while (0)
  |  |  ------------------
  |  |  |  Branch (57:64): [True: 116, False: 1.49k]
  |  |  |  Branch (57:112): [Folded, False: 1.61k]
  |  |  ------------------
  ------------------
   65|       |
   66|  1.61k|#define FORBID_OTHER_FLAGS(_flag, _allowed) \
   67|  1.61k|	do { \
   68|  1.61k|		if (all_flags & ~shift_ ## _flag & ~(_allowed)) { \
   69|  1.61k|			fr_strerror_printf("The '" STRINGIFY(_flag) "' flag cannot be used with any other flag (%u) %s[%d]", all_flags, da->filename, da->line); \
   70|  1.61k|			return false; \
   71|  1.61k|		} \
   72|  1.61k|	} while (0)
   73|       |
   74|  1.61k|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
   75|       |
   76|       |	// is_root
   77|       |	// is_unknown
   78|       |	// internal
   79|       |	// array
   80|       |	// has_value
   81|       |	// extra
   82|       |	// encrypt
   83|       |	// length
   84|       |	// type_size
   85|       |
   86|  1.61k|	if (flags->is_root) {
  ------------------
  |  Branch (86:6): [True: 0, False: 1.61k]
  ------------------
   87|      0|		FORBID_OTHER_FLAGS(is_root, 0);
  ------------------
  |  |   67|      0|	do { \
  |  |   68|      0|		if (all_flags & ~shift_ ## _flag & ~(_allowed)) { \
  |  |  ------------------
  |  |  |  Branch (68:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   69|      0|			fr_strerror_printf("The '" STRINGIFY(_flag) "' flag cannot be used with any other flag (%u) %s[%d]", all_flags, da->filename, da->line); \
  |  |  ------------------
  |  |  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |   70|      0|			return false; \
  |  |   71|      0|		} \
  |  |   72|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (72:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
   88|      0|	}
   89|       |
   90|  1.61k|	if (flags->is_unknown) {
  ------------------
  |  Branch (90:6): [True: 0, False: 1.61k]
  ------------------
   91|      0|		fr_strerror_const("The 'unknown' flag cannot be set for attributes in the dictionary.");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
   92|      0|		return false;
   93|      0|	}
   94|       |
   95|  1.61k|	if (flags->local != parent->flags.local) {
  ------------------
  |  Branch (95:6): [True: 0, False: 1.61k]
  ------------------
   96|      0|		fr_strerror_const("Cannot mix local variables with non-local attributes");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
   97|      0|		return false;
   98|      0|	}
   99|       |
  100|  1.61k|	if (flags->local && (flags->is_unknown || flags->is_raw)) {
  ------------------
  |  Branch (100:6): [True: 0, False: 1.61k]
  |  Branch (100:23): [True: 0, False: 0]
  |  Branch (100:44): [True: 0, False: 0]
  ------------------
  101|      0|		fr_strerror_const("Local variables cannot be 'raw' or unknown");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  102|      0|		return false;
  103|      0|	}
  104|       |
  105|       |	/*
  106|       |	 *	"flat" attributes can only go into a group.
  107|       |	 */
  108|  1.61k|	if ((flags->allow_flat) && (type != FR_TYPE_GROUP)) {
  ------------------
  |  Branch (108:6): [True: 2, False: 1.61k]
  |  Branch (108:29): [True: 0, False: 2]
  ------------------
  109|      0|		fr_strerror_printf("Cannot set the 'flat' flag for data type %s", fr_type_to_str(type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  110|      0|		return false;
  111|      0|	}
  112|       |
  113|       |	/*
  114|       |	 *	Only some data types can be in arrays, because we need
  115|       |	 *	to be able to decode the various array members.
  116|       |	 */
  117|  1.61k|	if (flags->array) {
  ------------------
  |  Branch (117:6): [True: 114, False: 1.49k]
  ------------------
  118|    114|		if (!flags->is_known_width) switch (type) {
  ------------------
  |  Branch (118:7): [True: 0, False: 114]
  ------------------
  119|      0|		default:
  ------------------
  |  Branch (119:3): [True: 0, False: 0]
  ------------------
  120|      0|			fr_strerror_printf("The 'array' flag cannot be used with attributes of type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  121|      0|					   fr_type_to_str(type));
  122|      0|			return false;
  123|       |
  124|      0|		case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (124:3): [True: 0, False: 0]
  ------------------
  125|      0|		case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (125:3): [True: 0, False: 0]
  ------------------
  126|      0|		case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (126:3): [True: 0, False: 0]
  ------------------
  127|      0|		case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (127:3): [True: 0, False: 0]
  ------------------
  128|      0|		case FR_TYPE_UINT8:
  ------------------
  |  Branch (128:3): [True: 0, False: 0]
  ------------------
  129|      0|		case FR_TYPE_UINT16:
  ------------------
  |  Branch (129:3): [True: 0, False: 0]
  ------------------
  130|      0|		case FR_TYPE_UINT32:
  ------------------
  |  Branch (130:3): [True: 0, False: 0]
  ------------------
  131|      0|		case FR_TYPE_DATE:
  ------------------
  |  Branch (131:3): [True: 0, False: 0]
  ------------------
  132|      0|		case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (132:3): [True: 0, False: 0]
  ------------------
  133|      0|			break;
  134|       |
  135|      0|		case FR_TYPE_ATTR:
  ------------------
  |  Branch (135:3): [True: 0, False: 0]
  ------------------
  136|      0|			flags->is_known_width = 1;
  137|      0|			break;
  138|       |
  139|      0|		case FR_TYPE_STRING:
  ------------------
  |  Branch (139:3): [True: 0, False: 0]
  ------------------
  140|      0|		case FR_TYPE_OCTETS:
  ------------------
  |  Branch (140:3): [True: 0, False: 0]
  ------------------
  141|      0|			if (!flags->length) {
  ------------------
  |  Branch (141:8): [True: 0, False: 0]
  ------------------
  142|      0|				fr_strerror_const("Variable length attributes cannot be marked as 'array'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  143|      0|				return false;
  144|      0|			}
  145|       |
  146|      0|			flags->is_known_width = 1;
  147|      0|			break;
  148|       |
  149|      0|		case FR_TYPE_STRUCT:
  ------------------
  |  Branch (149:3): [True: 0, False: 0]
  ------------------
  150|       |			/*
  151|       |			 *	If we have arrays of structs, then the structure MUST be known width.
  152|       |			 */
  153|      0|			flags->is_known_width = 1;
  154|      0|			break;
  155|      0|		}
  156|       |
  157|       |		/*
  158|       |		 *	DHCPv6 has arrays of string / octets, prefixed
  159|       |		 *	with a uint16 field of "length".  Also, arrays of dns_labels.
  160|       |		 */
  161|    114|		ALLOW_FLAG(extra);
  ------------------
  |  |   74|    114|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 114]
  |  |  ------------------
  ------------------
  162|    114|		ALLOW_FLAG(subtype);
  ------------------
  |  |   74|    114|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 114]
  |  |  ------------------
  ------------------
  163|       |
  164|    114|		FORBID_OTHER_FLAGS(array, 0);
  ------------------
  |  |   67|    114|	do { \
  |  |   68|    114|		if (all_flags & ~shift_ ## _flag & ~(_allowed)) { \
  |  |  ------------------
  |  |  |  Branch (68:7): [True: 0, False: 114]
  |  |  ------------------
  |  |   69|      0|			fr_strerror_printf("The '" STRINGIFY(_flag) "' flag cannot be used with any other flag (%u) %s[%d]", all_flags, da->filename, da->line); \
  |  |  ------------------
  |  |  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |   70|      0|			return false; \
  |  |   71|      0|		} \
  |  |   72|    114|	} while (0)
  |  |  ------------------
  |  |  |  Branch (72:11): [Folded, False: 114]
  |  |  ------------------
  ------------------
  165|    114|	}
  166|       |
  167|       |	/*
  168|       |	 *	'has_value' should only be set internally.  If the
  169|       |	 *	caller sets it, we still sanity check it.
  170|       |	 */
  171|  1.61k|	if (flags->has_value) {
  ------------------
  |  Branch (171:6): [True: 0, False: 1.61k]
  ------------------
  172|      0|		if (type != FR_TYPE_UINT32) {
  ------------------
  |  Branch (172:7): [True: 0, False: 0]
  ------------------
  173|      0|			fr_strerror_printf("The 'has_value' flag can only be used with attributes "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  174|      0|					   "of type 'integer'");
  175|      0|			return false;
  176|      0|		}
  177|       |
  178|      0|		FORBID_OTHER_FLAGS(has_value, shift_internal);
  ------------------
  |  |   67|      0|	do { \
  |  |   68|      0|		if (all_flags & ~shift_ ## _flag & ~(_allowed)) { \
  |  |  ------------------
  |  |  |  Branch (68:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   69|      0|			fr_strerror_printf("The '" STRINGIFY(_flag) "' flag cannot be used with any other flag (%u) %s[%d]", all_flags, da->filename, da->line); \
  |  |  ------------------
  |  |  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |   70|      0|			return false; \
  |  |   71|      0|		} \
  |  |   72|      0|	} while (0)
  |  |  ------------------
  |  |  |  Branch (72:11): [Folded, False: 0]
  |  |  ------------------
  ------------------
  179|      0|	}
  180|       |
  181|       |	/*
  182|       |	 *	Sanity check aliases.
  183|       |	 */
  184|  1.61k|	if (flags->is_alias) {
  ------------------
  |  Branch (184:6): [True: 0, False: 1.61k]
  ------------------
  185|      0|		fr_dict_attr_ext_ref_t *ext;
  186|       |
  187|      0|		ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF);
  188|      0|		if (!ext) {
  ------------------
  |  Branch (188:7): [True: 0, False: 0]
  ------------------
  189|      0|			fr_strerror_const("ALIAS is missing extension");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  190|      0|			return false;
  191|      0|		}
  192|       |
  193|      0|		if (!ext->ref) {
  ------------------
  |  Branch (193:7): [True: 0, False: 0]
  ------------------
  194|      0|			fr_strerror_const("ALIAS is missing ref");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  195|      0|			return false;
  196|      0|		}
  197|       |
  198|      0|		if (da->parent->type == FR_TYPE_STRUCT) {
  ------------------
  |  Branch (198:7): [True: 0, False: 0]
  ------------------
  199|      0|			fr_strerror_const("ALIAS cannot be added to a data type 'struct'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  200|      0|			return false;
  201|      0|		}
  202|       |
  203|      0|		fr_assert(!da->flags.is_unknown);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  204|      0|		fr_assert(!da->flags.is_raw);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|      0|		fr_assert(!da->flags.array);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|      0|		fr_assert(!da->flags.is_known_width);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|      0|		fr_assert(!da->flags.has_value);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|      0|		fr_assert(!da->flags.counter);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|      0|		fr_assert(!da->flags.secret);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|      0|		fr_assert(!da->flags.unsafe);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  211|      0|		fr_assert(!da->flags.is_ref_target);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  212|      0|		fr_assert(!da->flags.local);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|      0|		fr_assert(!da->flags.has_fixup);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  214|      0|	}
  215|       |
  216|       |	/*
  217|       |	 *	The "extra" flag is a grab-bag of stuff, depending on
  218|       |	 *	the data type.
  219|       |	 */
  220|  1.61k|	if (flags->extra) {
  ------------------
  |  Branch (220:6): [True: 116, False: 1.49k]
  ------------------
  221|    116|		if (!fr_dict_attr_is_key_field(da) && !da_is_length_field(da) && !da_is_bit_field(da)) {
  ------------------
  |  |  170|    232|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 116, False: 0]
  |  |  |  Branch (170:63): [True: 2, False: 114]
  |  |  ------------------
  ------------------
              		if (!fr_dict_attr_is_key_field(da) && !da_is_length_field(da) && !da_is_bit_field(da)) {
  ------------------
  |  |  172|    230|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 114, False: 0]
  |  |  |  Branch (172:57): [True: 18, False: 96]
  |  |  |  Branch (172:104): [True: 0, False: 96]
  |  |  ------------------
  ------------------
              		if (!fr_dict_attr_is_key_field(da) && !da_is_length_field(da) && !da_is_bit_field(da)) {
  ------------------
  |  |  171|     96|#define da_is_bit_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_BIT_FIELD))
  |  |  ------------------
  |  |  |  Branch (171:31): [True: 96, False: 0]
  |  |  |  Branch (171:53): [True: 96, False: 0]
  |  |  ------------------
  ------------------
  222|      0|			fr_strerror_const("The 'key' and 'length' flags cannot be used with any other flags.");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  223|      0|			return false;
  224|      0|		}
  225|       |
  226|    116|		switch (type) {
  227|     48|		case FR_TYPE_BOOL:
  ------------------
  |  Branch (227:3): [True: 48, False: 68]
  ------------------
  228|     78|		case FR_TYPE_UINT8:
  ------------------
  |  Branch (228:3): [True: 30, False: 86]
  ------------------
  229|     84|		case FR_TYPE_UINT16:
  ------------------
  |  Branch (229:3): [True: 6, False: 110]
  ------------------
  230|     90|		case FR_TYPE_UINT32:
  ------------------
  |  Branch (230:3): [True: 6, False: 110]
  ------------------
  231|     98|		case FR_TYPE_UINT64:
  ------------------
  |  Branch (231:3): [True: 8, False: 108]
  ------------------
  232|     98|			if ((flags->subtype != FLAG_KEY_FIELD) && (flags->subtype != FLAG_BIT_FIELD)) {
  ------------------
  |  Branch (232:8): [True: 96, False: 2]
  |  Branch (232:46): [True: 0, False: 96]
  ------------------
  233|      0|				fr_strerror_const("Invalid type (not 'key' field or 'bit' field) for extra flag.");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  234|      0|				return false;
  235|      0|			}
  236|       |
  237|     98|			if (parent->type != FR_TYPE_STRUCT) {
  ------------------
  |  Branch (237:8): [True: 0, False: 98]
  ------------------
  238|      0|				fr_strerror_const("The 'key' flag can only be used inside of a 'struct'.");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  239|      0|				return false;
  240|      0|			}
  241|       |
  242|     98|			ALLOW_FLAG(extra);
  ------------------
  |  |   74|     98|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 98]
  |  |  ------------------
  ------------------
  243|     98|			ALLOW_FLAG(subtype);
  ------------------
  |  |   74|     98|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 98]
  |  |  ------------------
  ------------------
  244|     98|			break;
  245|       |
  246|      0|		case FR_TYPE_OCTETS:
  ------------------
  |  Branch (246:3): [True: 0, False: 116]
  ------------------
  247|     16|		case FR_TYPE_STRING:
  ------------------
  |  Branch (247:3): [True: 16, False: 100]
  ------------------
  248|     16|			if (flags->length != 0) {
  ------------------
  |  Branch (248:8): [True: 0, False: 16]
  ------------------
  249|      0|				fr_strerror_const("Cannot use [..] and length=uint...");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  250|      0|				return false;
  251|      0|			}
  252|       |
  253|       |			/*
  254|       |			 *	We can do arrays of variable-length types, so long as they have a "length="
  255|       |			 *	modifier.
  256|       |			 *
  257|       |			 *	But any other modifier is foridden, including the use of "length=" outside of
  258|       |			 *	the context of arrays.
  259|       |			 */
  260|     16|			if (flags->array) {
  ------------------
  |  Branch (260:8): [True: 16, False: 0]
  ------------------
  261|     16|				ALLOW_FLAG(array);
  ------------------
  |  |   74|     16|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 16]
  |  |  ------------------
  ------------------
  262|       |
  263|     16|				if (!da_is_length_field(da)) {
  ------------------
  |  |  172|     16|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 16, False: 0]
  |  |  |  Branch (172:57): [True: 16, False: 0]
  |  |  |  Branch (172:104): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  264|      0|					goto invalid_extra;
  265|      0|				}
  266|       |
  267|     16|			} else if (da_is_length_field(da)) {
  ------------------
  |  |  172|      0|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 0, False: 0]
  |  |  |  Branch (172:57): [True: 0, False: 0]
  |  |  |  Branch (172:104): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  268|       |				/* this is allowed */
  269|       |
  270|      0|			} else if (flags->subtype) {
  ------------------
  |  Branch (270:15): [True: 0, False: 0]
  ------------------
  271|      0|			invalid_extra:
  272|      0|				fr_strerror_const("Invalid type (not 'length=...') for extra flag.");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  273|      0|				return false;
  274|      0|			}
  275|       |
  276|     16|			ALLOW_FLAG(extra);
  ------------------
  |  |   74|     16|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 16]
  |  |  ------------------
  ------------------
  277|     16|			ALLOW_FLAG(subtype);
  ------------------
  |  |   74|     16|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 16]
  |  |  ------------------
  ------------------
  278|     16|			break;
  279|       |
  280|      2|		case FR_TYPE_STRUCT:
  ------------------
  |  Branch (280:3): [True: 2, False: 114]
  ------------------
  281|      2|			if (!da_is_length_field(da)) {
  ------------------
  |  |  172|      2|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 2, False: 0]
  |  |  |  Branch (172:57): [True: 2, False: 0]
  |  |  |  Branch (172:104): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  282|      0|				fr_strerror_const("Invalid type (not 'length=...') for extra flag.");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  283|      0|				return false;
  284|      0|			}
  285|       |
  286|      2|			ALLOW_FLAG(extra);
  ------------------
  |  |   74|      2|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 2]
  |  |  ------------------
  ------------------
  287|      2|			ALLOW_FLAG(subtype);
  ------------------
  |  |   74|      2|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 2]
  |  |  ------------------
  ------------------
  288|      2|			ALLOW_FLAG(array);
  ------------------
  |  |   74|      2|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 2]
  |  |  ------------------
  ------------------
  289|      2|			break;
  290|       |
  291|      0|		case FR_TYPE_TLV:
  ------------------
  |  Branch (291:3): [True: 0, False: 116]
  ------------------
  292|      0|			ALLOW_FLAG(extra);
  ------------------
  |  |   74|      0|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 0]
  |  |  ------------------
  ------------------
  293|       |			/* @todo - allow arrays of struct? */
  294|      0|			ALLOW_FLAG(subtype);
  ------------------
  |  |   74|      0|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 0]
  |  |  ------------------
  ------------------
  295|      0|			break;
  296|       |
  297|      0|		default:
  ------------------
  |  Branch (297:3): [True: 0, False: 116]
  ------------------
  298|      0|			fr_strerror_printf("Type %s cannot hold extra flags",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  299|      0|					   fr_type_to_str(type));
  300|      0|			return false;
  301|    116|		}
  302|       |
  303|    116|		if (da_is_length_field(da) &&
  ------------------
  |  |  172|    232|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 116, False: 0]
  |  |  |  Branch (172:57): [True: 18, False: 98]
  |  |  |  Branch (172:104): [True: 0, False: 98]
  |  |  ------------------
  ------------------
  304|     18|		    ((type != FR_TYPE_STRING) && (type != FR_TYPE_OCTETS) && (type != FR_TYPE_STRUCT))) {
  ------------------
  |  Branch (304:8): [True: 2, False: 16]
  |  Branch (304:36): [True: 2, False: 0]
  |  Branch (304:64): [True: 0, False: 2]
  ------------------
  305|      0|			fr_strerror_printf("The 'length' flag cannot be used with type %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  306|      0|					   fr_type_to_str(type));
  307|      0|			return false;
  308|      0|		}
  309|       |
  310|    116|		FORBID_OTHER_FLAGS(extra, 0);
  ------------------
  |  |   67|    116|	do { \
  |  |   68|    116|		if (all_flags & ~shift_ ## _flag & ~(_allowed)) { \
  |  |  ------------------
  |  |  |  Branch (68:7): [True: 0, False: 116]
  |  |  ------------------
  |  |   69|      0|			fr_strerror_printf("The '" STRINGIFY(_flag) "' flag cannot be used with any other flag (%u) %s[%d]", all_flags, da->filename, da->line); \
  |  |  ------------------
  |  |  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |   70|      0|			return false; \
  |  |   71|      0|		} \
  |  |   72|    116|	} while (0)
  |  |  ------------------
  |  |  |  Branch (72:11): [Folded, False: 116]
  |  |  ------------------
  ------------------
  311|    116|	}
  312|       |
  313|       |	/*
  314|       |	 *	Force "length" for fixed-size data types which aren't
  315|       |	 *	bit fields.  Check / set "length" and "type_size" for
  316|       |	 *	other types.
  317|       |	 */
  318|  1.61k|	if (!flags->extra || (flags->subtype != FLAG_BIT_FIELD)) switch (type) {
  ------------------
  |  Branch (318:6): [True: 1.49k, False: 116]
  |  Branch (318:23): [True: 20, False: 96]
  |  Branch (318:67): [True: 1.51k, False: 0]
  ------------------
  319|      0|	case FR_TYPE_INT8:
  ------------------
  |  Branch (319:2): [True: 0, False: 1.51k]
  ------------------
  320|     78|	case FR_TYPE_UINT8:
  ------------------
  |  Branch (320:2): [True: 78, False: 1.43k]
  ------------------
  321|    142|	case FR_TYPE_BOOL:
  ------------------
  |  Branch (321:2): [True: 64, False: 1.45k]
  ------------------
  322|    142|		flags->length = 1;
  323|    142|		break;
  324|       |
  325|      0|	case FR_TYPE_INT16:
  ------------------
  |  Branch (325:2): [True: 0, False: 1.51k]
  ------------------
  326|     42|	case FR_TYPE_UINT16:
  ------------------
  |  Branch (326:2): [True: 42, False: 1.47k]
  ------------------
  327|     42|		flags->length = 2;
  328|     42|		break;
  329|       |
  330|     48|	case FR_TYPE_DATE:
  ------------------
  |  Branch (330:2): [True: 48, False: 1.46k]
  ------------------
  331|     90|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (331:2): [True: 42, False: 1.47k]
  ------------------
  332|     90|		if (!flags->length) flags->length = 4;
  ------------------
  |  Branch (332:7): [True: 0, False: 90]
  ------------------
  333|       |
  334|     90|		if ((flags->length != 2) && (flags->length != 4) && (flags->length != 8)) {
  ------------------
  |  Branch (334:7): [True: 90, False: 0]
  |  Branch (334:31): [True: 0, False: 90]
  |  Branch (334:55): [True: 0, False: 0]
  ------------------
  335|      0|			fr_strerror_printf("Invalid length %u for attribute of type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  336|      0|					   flags->length, fr_type_to_str(type));
  337|      0|			return false;
  338|      0|		}
  339|     90|		break;
  340|       |
  341|    158|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (341:2): [True: 158, False: 1.35k]
  ------------------
  342|    182|	case FR_TYPE_INT32:
  ------------------
  |  Branch (342:2): [True: 24, False: 1.49k]
  ------------------
  343|    320|	case FR_TYPE_UINT32:
  ------------------
  |  Branch (343:2): [True: 138, False: 1.37k]
  ------------------
  344|    340|	case FR_TYPE_FLOAT32:
  ------------------
  |  Branch (344:2): [True: 20, False: 1.49k]
  ------------------
  345|    340|		flags->length = 4;
  346|    340|		break;
  347|       |
  348|     20|	case FR_TYPE_INT64:
  ------------------
  |  Branch (348:2): [True: 20, False: 1.49k]
  ------------------
  349|     48|	case FR_TYPE_UINT64:
  ------------------
  |  Branch (349:2): [True: 28, False: 1.48k]
  ------------------
  350|     48|	case FR_TYPE_FLOAT64:
  ------------------
  |  Branch (350:2): [True: 0, False: 1.51k]
  ------------------
  351|     48|		flags->length = 8;
  352|     48|		break;
  353|       |
  354|      0|	case FR_TYPE_SIZE:
  ------------------
  |  Branch (354:2): [True: 0, False: 1.51k]
  ------------------
  355|      0|		flags->length = sizeof(size_t);
  356|      0|		break;
  357|       |
  358|     22|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (358:2): [True: 22, False: 1.49k]
  ------------------
  359|     22|		flags->length = 6;
  360|     22|		break;
  361|       |
  362|      0|	case FR_TYPE_IFID:
  ------------------
  |  Branch (362:2): [True: 0, False: 1.51k]
  ------------------
  363|      0|		flags->length = 8;
  364|      0|		break;
  365|       |
  366|      8|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (366:2): [True: 8, False: 1.50k]
  ------------------
  367|     10|	case FR_TYPE_COMBO_IP_ADDR:
  ------------------
  |  Branch (367:2): [True: 2, False: 1.51k]
  ------------------
  368|     10|		flags->length = 16;
  369|     10|		break;
  370|       |
  371|      2|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (371:2): [True: 2, False: 1.51k]
  ------------------
  372|      2|	case FR_TYPE_COMBO_IP_PREFIX:
  ------------------
  |  Branch (372:2): [True: 0, False: 1.51k]
  ------------------
  373|      2|		flags->length = 17;
  374|      2|		break;
  375|       |
  376|     38|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (376:2): [True: 38, False: 1.47k]
  ------------------
  377|     38|		ALLOW_FLAG(internal);
  ------------------
  |  |   74|     38|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 38]
  |  |  ------------------
  ------------------
  378|     38|		ALLOW_FLAG(array);
  ------------------
  |  |   74|     38|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 38]
  |  |  ------------------
  ------------------
  379|     38|		if (all_flags) {
  ------------------
  |  Branch (379:7): [True: 0, False: 38]
  ------------------
  380|      0|			fr_strerror_const("Invalid flag for attribute of type 'struct'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  381|      0|			return false;
  382|      0|		}
  383|     38|		break;
  384|       |
  385|     38|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (385:2): [True: 0, False: 1.51k]
  ------------------
  386|      0|		if (dict->string_based) break;
  ------------------
  |  Branch (386:7): [True: 0, False: 0]
  ------------------
  387|       |
  388|      0|		if (parent->type != FR_TYPE_VSA) {
  ------------------
  |  Branch (388:7): [True: 0, False: 0]
  ------------------
  389|      0|			fr_strerror_printf("Attributes of type 'vendor' MUST have a parent of type 'vsa' "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  390|      0|					   "instead of '%s'",
  391|      0|					   fr_type_to_str(parent->type));
  392|      0|			return false;
  393|      0|		}
  394|       |
  395|      0|		if ((flags->length != 1) &&
  ------------------
  |  Branch (395:7): [True: 0, False: 0]
  ------------------
  396|      0|		    (flags->length != 2) &&
  ------------------
  |  Branch (396:7): [True: 0, False: 0]
  ------------------
  397|      0|		    (flags->length != 4)) {
  ------------------
  |  Branch (397:7): [True: 0, False: 0]
  ------------------
  398|      0|			fr_strerror_const("The 'length' flag can only be used for attributes of type 'vendor' with lengths of 1,2 or 4");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  399|      0|			return false;
  400|      0|		}
  401|      0|		break;
  402|       |
  403|     48|	case FR_TYPE_TLV:
  ------------------
  |  Branch (403:2): [True: 48, False: 1.46k]
  ------------------
  404|     48|		if ((flags->length != 1) &&
  ------------------
  |  Branch (404:7): [True: 30, False: 18]
  ------------------
  405|     30|		    (flags->length != 2) &&
  ------------------
  |  Branch (405:7): [True: 0, False: 30]
  ------------------
  406|      0|		    (flags->length != 4)) {
  ------------------
  |  Branch (406:7): [True: 0, False: 0]
  ------------------
  407|      0|			fr_strerror_const("The 'length' flag can only be used for attributes of type 'tlv' with lengths of 1,2 or 4");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  408|      0|			return false;
  409|      0|		}
  410|     48|		break;
  411|       |
  412|       |		/*
  413|       |		 *	'octets[n]' can only be used in a few limited situations.
  414|       |		 */
  415|    302|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (415:2): [True: 302, False: 1.21k]
  ------------------
  416|    302|		if (flags->length) {
  ------------------
  |  Branch (416:7): [True: 14, False: 288]
  ------------------
  417|       |			/*
  418|       |			 *	Internal attributes can use octets[n]
  419|       |			 *	MS-MPPE-Keys use octets[18],encrypt=User-Password
  420|       |			 *	EAP-SIM-RAND uses array
  421|       |			 */
  422|     14|			ALLOW_FLAG(internal);
  ------------------
  |  |   74|     14|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 14]
  |  |  ------------------
  ------------------
  423|     14|			ALLOW_FLAG(subtype);
  ------------------
  |  |   74|     14|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 14]
  |  |  ------------------
  ------------------
  424|     14|			ALLOW_FLAG(array);
  ------------------
  |  |   74|     14|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 14]
  |  |  ------------------
  ------------------
  425|       |
  426|     14|			if (all_flags) {
  ------------------
  |  Branch (426:8): [True: 0, False: 14]
  ------------------
  427|      0|				fr_strerror_const("The 'octets[...]' syntax cannot be used any other flag");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  428|      0|				return false;
  429|      0|			}
  430|       |
  431|     14|			if (flags->length > 253) {
  ------------------
  |  Branch (431:8): [True: 0, False: 14]
  ------------------
  432|      0|				fr_strerror_printf("Invalid length %d", flags->length);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  433|      0|				return false;
  434|      0|			}
  435|     14|		}
  436|    302|		break;
  437|       |
  438|    302|	case FR_TYPE_UNION:
  ------------------
  |  Branch (438:2): [True: 2, False: 1.51k]
  ------------------
  439|      2|		if (parent->type != FR_TYPE_STRUCT) {
  ------------------
  |  Branch (439:7): [True: 0, False: 2]
  ------------------
  440|      0|			fr_strerror_printf("Attributes of type 'union' must have a parent of type 'struct', not of type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  441|      0|					   fr_type_to_str(parent->type));
  442|      0|			return false;
  443|      0|		}
  444|       |
  445|       |		/*
  446|       |		 *	If the UNION is missing a key extension, then the children of the UNION cannot find
  447|       |		 *	the key field in the parent STRUCT.
  448|       |		 */
  449|      2|		if (!fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_KEY)) {
  ------------------
  |  Branch (449:7): [True: 0, False: 2]
  ------------------
  450|      0|			fr_strerror_const("Attribute of type 'union' is missing 'key=...'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  451|      0|			return false;
  452|      0|		}
  453|      2|		break;
  454|       |
  455|      2|	case FR_TYPE_NULL:
  ------------------
  |  Branch (455:2): [True: 0, False: 1.51k]
  ------------------
  456|      0|	case FR_TYPE_INTERNAL:
  ------------------
  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  274|      0|	_beg(FR_TYPE_VALUE_BOX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  275|      0|	_mid(FR_TYPE_VOID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.51k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  276|      0|	_mid(FR_TYPE_VALUE_BOX_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.51k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  277|      0|	_mid(FR_TYPE_PAIR_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.51k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  278|      0|	_end(FR_TYPE_MAX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (456:2): [True: 0, False: 1.51k]
  ------------------
  457|      0|		fr_strerror_printf("Attributes of type '%s' cannot be used in dictionaries",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  458|      0|				   fr_type_to_str(type));
  459|      0|		return false;
  460|       |
  461|       |		/*
  462|       |		 *	These types are encoded differently in each protocol.
  463|       |		 */
  464|      8|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (464:2): [True: 8, False: 1.50k]
  ------------------
  465|     10|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (465:2): [True: 2, False: 1.51k]
  ------------------
  466|    392|	case FR_TYPE_STRING:
  ------------------
  |  Branch (466:2): [True: 382, False: 1.13k]
  ------------------
  467|    394|	case FR_TYPE_VSA:
  ------------------
  |  Branch (467:2): [True: 2, False: 1.51k]
  ------------------
  468|    430|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (468:2): [True: 36, False: 1.48k]
  ------------------
  469|    430|		break;
  470|  1.51k|	}
  471|       |
  472|       |	/*
  473|       |	 *	type_size is used to limit the maximum attribute number, so it's checked first.
  474|       |	 */
  475|  1.61k|	if (flags->type_size) {
  ------------------
  |  Branch (475:6): [True: 138, False: 1.47k]
  ------------------
  476|    138|		if ((type == FR_TYPE_DATE) || (type == FR_TYPE_TIME_DELTA)) {
  ------------------
  |  Branch (476:7): [True: 0, False: 138]
  |  Branch (476:33): [True: 20, False: 118]
  ------------------
  477|       |			/*
  478|       |			 *	Allow all time res here
  479|       |			 */
  480|    118|		} else if (!flags->extra) {
  ------------------
  |  Branch (480:14): [True: 48, False: 70]
  ------------------
  481|     48|			if ((type != FR_TYPE_TLV) && (type != FR_TYPE_VENDOR)) {
  ------------------
  |  Branch (481:8): [True: 0, False: 48]
  |  Branch (481:33): [True: 0, False: 0]
  ------------------
  482|      0|				fr_strerror_printf("The 'format=' flag can only be used with attributes of type 'tlv', and not type '%s'", fr_type_to_str(type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  483|      0|				return false;
  484|      0|			}
  485|       |
  486|     48|			if ((flags->type_size != 1) &&
  ------------------
  |  Branch (486:8): [True: 30, False: 18]
  ------------------
  487|     30|			    (flags->type_size != 2) &&
  ------------------
  |  Branch (487:8): [True: 0, False: 30]
  ------------------
  488|      0|			    (flags->type_size != 4)) {
  ------------------
  |  Branch (488:8): [True: 0, False: 0]
  ------------------
  489|      0|				fr_strerror_printf("The 'format=' flag can only be used with attributes of type size 1,2 or 4, not %i", flags->type_size);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  490|      0|				return false;
  491|      0|			}
  492|     48|		}
  493|    138|	}
  494|       |
  495|       |	/*
  496|       |	 *	Counters can be time deltas, or unsigned integers.
  497|       |	 *	For other data types, we don't know how to
  498|       |	 *	automatically add two counters.
  499|       |	 */
  500|  1.61k|	if (flags->counter) {
  ------------------
  |  Branch (500:6): [True: 0, False: 1.61k]
  ------------------
  501|      0|		if ((type == FR_TYPE_TIME_DELTA) || (fr_type_is_integer(type) && !fr_type_is_signed(type))) {
  ------------------
  |  |  381|      0|#define fr_type_is_integer(_x)			(fr_type_integer[_x])
  |  |  ------------------
  |  |  |  Branch (381:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
              		if ((type == FR_TYPE_TIME_DELTA) || (fr_type_is_integer(type) && !fr_type_is_signed(type))) {
  ------------------
  |  |  383|      0|#define fr_type_is_signed(_x)			(fr_type_signed[_x])
  ------------------
  |  Branch (501:7): [True: 0, False: 0]
  |  Branch (501:68): [True: 0, False: 0]
  ------------------
  502|      0|			ALLOW_FLAG(counter);
  ------------------
  |  |   74|      0|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 0]
  |  |  ------------------
  ------------------
  503|      0|		} else {
  504|      0|			fr_strerror_printf("The 'counter' flag cannot be used with '%s'", fr_type_to_str(type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  505|      0|			return false;
  506|      0|		}
  507|      0|	}
  508|       |
  509|       |	/*
  510|       |	 *	Check flags against the parent attribute.
  511|       |	 */
  512|  1.61k|	switch (parent->type) {
  513|    180|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (513:2): [True: 180, False: 1.43k]
  ------------------
  514|    180|		ALLOW_FLAG(extra);
  ------------------
  |  |   74|    180|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 180]
  |  |  ------------------
  ------------------
  515|    180|		ALLOW_FLAG(subtype);
  ------------------
  |  |   74|    180|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 180]
  |  |  ------------------
  ------------------
  516|       |
  517|       |		/*
  518|       |		 *	If our parent is known width, then the children have to be known width, UNLESS
  519|       |		 *	either this child or its parent has a "length" prefix.
  520|       |		 */
  521|    180|		if (parent->flags.is_known_width && !flags->is_known_width && !flags->length &&
  ------------------
  |  Branch (521:7): [True: 6, False: 174]
  |  Branch (521:39): [True: 0, False: 6]
  |  Branch (521:65): [True: 0, False: 0]
  ------------------
  522|      0|		    !da_is_length_field(da) && !da_is_length_field(parent)) {
  ------------------
  |  |  172|    180|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 0, False: 0]
  |  |  |  Branch (172:57): [True: 0, False: 0]
  |  |  |  Branch (172:104): [True: 0, False: 0]
  |  |  ------------------
  ------------------
              		    !da_is_length_field(da) && !da_is_length_field(parent)) {
  ------------------
  |  |  172|      0|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 0, False: 0]
  |  |  |  Branch (172:57): [True: 0, False: 0]
  |  |  |  Branch (172:104): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  523|      0|			fr_strerror_const("Variable-sized fields cannot be used within a 'struct' which is 'array'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  524|      0|			return false;
  525|      0|		}
  526|       |
  527|    180|		if (flags->array) {
  ------------------
  |  Branch (527:7): [True: 12, False: 168]
  ------------------
  528|     12|			switch (type) {
  529|      6|			case FR_TYPE_FIXED_SIZE:
  ------------------
  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  182|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  183|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  184|      6|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 6, False: 6]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  185|      6|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  186|      6|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      6|	_mid(FR_TYPE_IPV6_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  188|      6|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|      6|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|      6|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|      6|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|      6|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|      6|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|      6|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|      6|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|      6|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|      6|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|      6|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|      6|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|      6|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|      6|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|      6|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|      6|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      6|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 12]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|      6|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|      6|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|      6|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (529:4): [True: 0, False: 12]
  ------------------
  530|      6|				ALLOW_FLAG(array);
  ------------------
  |  |   74|      6|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 6]
  |  |  ------------------
  ------------------
  531|      6|				break;
  532|       |
  533|      6|			default:
  ------------------
  |  Branch (533:4): [True: 6, False: 6]
  ------------------
  534|      6|				if (flags->is_known_width) ALLOW_FLAG(array);
  ------------------
  |  |   74|      6|#define ALLOW_FLAG(_flag) do { all_flags &= ~shift_ ## _flag; } while (0)
  |  |  ------------------
  |  |  |  Branch (74:72): [Folded, False: 6]
  |  |  ------------------
  ------------------
  |  Branch (534:9): [True: 6, False: 0]
  ------------------
  535|      6|				break;
  536|     12|			}
  537|     12|		}
  538|       |
  539|    180|		if (all_flags) {
  ------------------
  |  Branch (539:7): [True: 0, False: 180]
  ------------------
  540|      0|			fr_strerror_const("Invalid flag for attribute inside of a 'struct'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  541|      0|			return false;
  542|      0|		}
  543|       |
  544|    180|		if (!attr) break;
  ------------------
  |  Branch (544:7): [True: 0, False: 180]
  ------------------
  545|       |
  546|       |		/*
  547|       |		 *	If we have keyed structs, then the first
  548|       |		 *	member can be variable length.
  549|       |		 *
  550|       |		 *	For subsequent children, have each one check
  551|       |		 *	the previous child.
  552|       |		 */
  553|    180|		if (attr != 1) {
  ------------------
  |  Branch (553:7): [True: 142, False: 38]
  ------------------
  554|    142|			int i;
  555|    142|			fr_dict_attr_t const *sibling;
  556|       |
  557|    142|			sibling = fr_dict_attr_child_by_num(parent, (attr) - 1);
  558|       |
  559|       |			/*
  560|       |			 *	sibling might not exist, if it's a deferred 'tlv clone=...'
  561|       |			 */
  562|       |
  563|       |			/*
  564|       |			 *	Variable sized elements cannot have anything after them in a struct.
  565|       |			 */
  566|    142|			if (sibling && !sibling->flags.length && !sibling->flags.is_known_width) {
  ------------------
  |  Branch (566:8): [True: 142, False: 0]
  |  Branch (566:19): [True: 0, False: 142]
  |  Branch (566:45): [True: 0, False: 0]
  ------------------
  567|      0|				fr_strerror_const("No other field can follow a struct MEMBER which is variable sized");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  568|      0|				return false;
  569|      0|			}
  570|       |
  571|       |			/*
  572|       |			 *	The same goes for arrays.
  573|       |			 */
  574|    142|			if (sibling && sibling->flags.array) {
  ------------------
  |  Branch (574:8): [True: 142, False: 0]
  |  Branch (574:19): [True: 0, False: 142]
  ------------------
  575|      0|				fr_strerror_const("No other field can follow a struct MEMBER which is 'array'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  576|      0|				return false;
  577|      0|			}
  578|       |
  579|       |			/*
  580|       |			 *	Check for bad key fields, or multiple
  581|       |			 *	key fields.  Yes, this is O(N^2), but
  582|       |			 *	the structs are small.
  583|       |			 */
  584|    142|			if (fr_dict_attr_is_key_field(da)) {
  ------------------
  |  |  170|    142|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 92, False: 50]
  |  |  |  Branch (170:63): [True: 2, False: 90]
  |  |  ------------------
  ------------------
  585|      4|				for (i = 1; i < attr; i++) {
  ------------------
  |  Branch (585:17): [True: 2, False: 2]
  ------------------
  586|      2|					sibling = fr_dict_attr_child_by_num(parent, i);
  587|      2|					if (!sibling) {
  ------------------
  |  Branch (587:10): [True: 0, False: 2]
  ------------------
  588|      0|						fr_strerror_printf("Child %d of 'struct' type attribute %s does not exist.",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  589|      0|								   i, parent->name);
  590|      0|						return false;
  591|      0|					}
  592|       |
  593|      2|					if (!fr_dict_attr_is_key_field(sibling)) continue;
  ------------------
  |  |  170|      2|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 0, False: 2]
  |  |  |  Branch (170:63): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  594|       |
  595|      0|					fr_strerror_printf("Duplicate key attributes '%s' and '%s' in 'struct' type attribute %s are forbidden",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  596|      0|							   name, sibling->name, parent->name);
  597|      0|					return false;
  598|      2|				}
  599|      2|			}
  600|    142|		}
  601|    180|		break;
  602|       |
  603|    180|	case FR_TYPE_VSA:
  ------------------
  |  Branch (603:2): [True: 0, False: 1.61k]
  ------------------
  604|      0|		if ((type != FR_TYPE_VENDOR) && !flags->internal) {
  ------------------
  |  Branch (604:7): [True: 0, False: 0]
  |  Branch (604:35): [True: 0, False: 0]
  ------------------
  605|      0|			fr_strerror_printf("Attributes of type '%s' cannot be children of the 'vsa' type",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  606|      0|					   fr_type_to_str(type));
  607|      0|			return false;
  608|      0|		}
  609|      0|		break;
  610|       |
  611|  1.36k|	case FR_TYPE_TLV:
  ------------------
  |  Branch (611:2): [True: 1.36k, False: 244]
  ------------------
  612|  1.43k|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (612:2): [True: 62, False: 1.55k]
  ------------------
  613|  1.43k|		break;
  614|       |
  615|      2|	case FR_TYPE_UNION:
  ------------------
  |  Branch (615:2): [True: 2, False: 1.61k]
  ------------------
  616|      2|		if (!((da->type == FR_TYPE_STRUCT) || (da->type == FR_TYPE_TLV) || fr_type_is_leaf(da->type))) {
  ------------------
  |  |  393|      0|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (616:9): [True: 2, False: 0]
  |  Branch (616:41): [True: 0, False: 0]
  ------------------
  617|      0|			fr_strerror_printf("Attributes of type '%s' cannot be children of the 'union' type",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  618|      0|					   fr_type_to_str(type));
  619|      0|			return false;
  620|      0|		}
  621|      2|		break;
  622|       |
  623|      2|	default:
  ------------------
  |  Branch (623:2): [True: 0, False: 1.61k]
  ------------------
  624|      0|		fr_strerror_printf("Attributes of type '%s' cannot have child attributes",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  625|      0|				   fr_type_to_str(parent->type));
  626|      0|		return false;
  627|  1.61k|	}
  628|       |
  629|  1.61k|	return true;
  630|  1.61k|}
dict_attr_valid:
  643|  1.61k|{
  644|  1.61k|	if (!fr_cond_assert(da->parent)) return false;
  ------------------
  |  |  131|  1.61k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  3.22k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 1.61k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (644:6): [True: 0, False: 1.61k]
  ------------------
  645|       |
  646|  1.61k|	if (fr_dict_valid_name(da->name, -1) <= 0) return false;
  ------------------
  |  Branch (646:6): [True: 0, False: 1.61k]
  ------------------
  647|       |
  648|       |	/*
  649|       |	 *	Run protocol-specific validation functions, BEFORE we
  650|       |	 *	do the rest of the checks.
  651|       |	 */
  652|  1.61k|	if (da->dict->proto->attr.valid && !da->dict->proto->attr.valid(da)) return false;
  ------------------
  |  Branch (652:6): [True: 812, False: 800]
  |  Branch (652:37): [True: 0, False: 812]
  ------------------
  653|       |
  654|       |	/*
  655|       |	 *	Check the flags, data types, and parent data types and flags.
  656|       |	 */
  657|  1.61k|	if (!dict_attr_flags_valid(da)) return false;
  ------------------
  |  Branch (657:6): [True: 0, False: 1.61k]
  ------------------
  658|       |
  659|  1.61k|	return true;
  660|  1.61k|}

dl_symbol_init:
  234|      4|{
  235|      4|	dl_symbol_init_t	*init = NULL;
  236|      4|	void			*sym = NULL;
  237|      4|	char			buffer[256];
  238|       |
  239|      4|	while ((init = fr_dlist_next(&dl_loader->sym_init, init))) {
  ------------------
  |  Branch (239:9): [True: 0, False: 4]
  ------------------
  240|      0|		if (init->symbol) {
  ------------------
  |  Branch (240:7): [True: 0, False: 0]
  ------------------
  241|      0|			char *p;
  242|       |
  243|      0|			snprintf(buffer, sizeof(buffer), "%s_%s", dl->name, init->symbol);
  244|       |
  245|       |			/*
  246|       |			 *	'-' is not a valid symbol character in
  247|       |			 *	C.  But "libfreeradius-radius" is a
  248|       |			 *	valid library name.  So we hash things together.
  249|       |			 */
  250|      0|			for (p = buffer; *p != '\0'; p++) {
  ------------------
  |  Branch (250:21): [True: 0, False: 0]
  ------------------
  251|      0|				if (*p == '-') *p = '_';
  ------------------
  |  Branch (251:9): [True: 0, False: 0]
  ------------------
  252|      0|			}
  253|       |
  254|      0|			sym = dlsym(dl->handle, buffer);
  255|      0|			if (!sym) {
  ------------------
  |  Branch (255:8): [True: 0, False: 0]
  ------------------
  256|      0|				continue;
  257|      0|			}
  258|      0|		}
  259|       |
  260|      0|		if (init->func(dl, sym, init->uctx) < 0) {
  ------------------
  |  Branch (260:7): [True: 0, False: 0]
  ------------------
  261|      0|			fr_strerror_printf("Initialiser failed for %s", dl->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  262|      0|			return -1;
  263|      0|		}
  264|      0|	}
  265|       |
  266|      4|	return 0;
  267|      4|}
dl_by_name:
  471|      4|{
  472|      4|	int		flags = RTLD_NOW;
  473|      4|	void		*handle = NULL;
  474|      4|	char const	*search_path;
  475|      4|	dl_t		*dl;
  476|       |
  477|       |	/*
  478|       |	 *	There's already something in the tree,
  479|       |	 *	just return that instead.
  480|       |	 */
  481|      4|	dl = fr_rb_find(dl_loader->tree, &(dl_t){ .name = name });
  482|      4|	if (dl) {
  ------------------
  |  Branch (482:6): [True: 0, False: 4]
  ------------------
  483|      0|		talloc_increase_ref_count(dl);
  484|      0|		return dl;
  485|      0|	}
  486|       |
  487|       |	/*
  488|       |	 *	Get a reference to the internal RTLD_HANDLE,
  489|       |	 *	which is used to search through all current loaded
  490|       |	 *	modules.
  491|       |	 *
  492|       |	 *	This is useful for static builds which don't actually
  493|       |	 *	want to dlopen anything, and just want to look at the
  494|       |	 *	current global symbol table to load everything
  495|       |	 *	from there.
  496|       |	 */
  497|      4|	if (dl_loader->do_static) {
  ------------------
  |  Branch (497:6): [True: 0, False: 4]
  ------------------
  498|      0|		handle = dlopen(NULL, 0);
  499|      0|		if (!handle) {
  ------------------
  |  Branch (499:7): [True: 0, False: 0]
  ------------------
  500|      0|			fr_strerror_printf("Failed opening RTLD_DEFAULT handle - %s", dlerror());
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  501|      0|			return NULL;
  502|      0|		}
  503|      0|		goto do_symbol_check;
  504|      0|	}
  505|       |
  506|      4|	flags |= RTLD_LOCAL;
  507|       |
  508|       |	/*
  509|       |	 *	Forces dlopened libraries to resolve symbols within
  510|       |	 *	their local symbol tables instead of the global symbol
  511|       |	 *	table.
  512|       |	 *
  513|       |	 *	May help resolve issues with symbol conflicts.
  514|       |	 */
  515|       |#if defined(RTLD_DEEPBIND) && !defined(__SANITIZE_ADDRESS__)
  516|       |	flags |= RTLD_DEEPBIND;
  517|       |#endif
  518|       |
  519|      4|	fr_strerror_clear();	/* clear error buffer */
  520|       |
  521|       |	/*
  522|       |	 *	Bind all the symbols *NOW* so we don't hit errors later
  523|       |	 */
  524|      4|	flags |= RTLD_NOW;
  525|       |
  526|      4|	search_path = dl_search_path(dl_loader);
  527|       |
  528|       |	/*
  529|       |	 *	Prefer loading our libraries by absolute path.
  530|       |	 */
  531|      4|	if (search_path) {
  ------------------
  |  Branch (531:6): [True: 4, False: 0]
  ------------------
  532|      4|		char *ctx, *paths, *path;
  533|      4|		char *p;
  534|      4|		char *dlerror_txt = NULL;
  535|       |
  536|      4|		fr_strerror_clear();
  537|       |
  538|      4|		ctx = paths = talloc_strdup(NULL, search_path);
  ------------------
  |  |  149|      4|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  539|      4|		while ((path = strsep(&paths, ":")) != NULL) {
  ------------------
  |  Branch (539:10): [True: 4, False: 0]
  ------------------
  540|      4|			char *fullpath;
  541|       |
  542|       |			/*
  543|       |			 *	Trim the trailing slash
  544|       |			 */
  545|      4|			p = strrchr(path, '/');
  546|      4|			if (p && ((p[1] == '\0') || (p[1] == ':'))) *p = '\0';
  ------------------
  |  Branch (546:8): [True: 4, False: 0]
  |  Branch (546:14): [True: 0, False: 4]
  |  Branch (546:32): [True: 0, False: 4]
  ------------------
  547|       |
  548|      4|			fullpath = talloc_typed_asprintf(ctx, "%s/%s%s", path, name, DL_EXTENSION);
  ------------------
  |  |   57|      4|#  define DL_EXTENSION ".so"
  ------------------
  549|      4|			handle = dlopen(fullpath, flags);
  550|      4|			talloc_free(fullpath);
  551|      4|			if (handle) break;
  ------------------
  |  Branch (551:8): [True: 4, False: 0]
  ------------------
  552|       |
  553|       |			/*
  554|       |			 *	There's no dlopenat(), so one can't use it and later
  555|       |			 *	check acessatat() to avoid toctou.
  556|       |			 *
  557|       |			 *	The only indication of why dlopen() failed is thus the
  558|       |			 *	contents of the string dlerror() returns, but all the
  559|       |			 *	man page says about that is that it's "human readable",
  560|       |			 *	NUL-terminated, and doesn't end with a newline.
  561|       |			 *
  562|       |			 *	The following attempts to use the dlerror() output to
  563|       |			 *	determine whether dlopen() failed because path doesn't
  564|       |			 *	exist. This goes beyond what the API specifies (Hyrum's
  565|       |			 *	Law strikes again!), but the alternatives are
  566|       |			 *
  567|       |			 *	1. looking into the data structure dlerror() uses
  568|       |			 *	2. let the toctou remain
  569|       |			 *
  570|       |			 *	both of which seem worse.
  571|       |			 */
  572|       |
  573|       |			/*
  574|       |			 *	If the file doesn't exist, continue with the next element
  575|       |			 *	of  "path". Otherwise, stop looking for more libraries
  576|       |			 *	and instead complain about access permissions.
  577|       |			 */
  578|      0|			dlerror_txt = dlerror();
  579|      0|			if (!dlerror_txt) {
  ------------------
  |  Branch (579:8): [True: 0, False: 0]
  ------------------
  580|      0|				fr_strerror_printf_push("Unknown error when trying directory %s", path);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  581|      0|				continue;
  582|      0|			}
  583|       |
  584|       |			/*
  585|       |			 *	Yes, this really is the only way of getting the errno
  586|       |			 *	from the dlopen API.
  587|       |			 */
  588|      0|			if (strstr(dlerror_txt, fr_syserror_simple(ENOENT)) != NULL) {
  ------------------
  |  Branch (588:8): [True: 0, False: 0]
  ------------------
  589|       |#ifndef __linux__
  590|       |				int access_mode = R_OK | X_OK;
  591|       |
  592|       |#  ifdef AT_ACCESS
  593|       |				access_mode |= AT_ACCESS;
  594|       |#  endif
  595|       |				if ((access(path, access_mode) < 0) && (errno == ENOENT)) continue;
  596|       |#endif
  597|      0|				fr_strerror_printf_push("Access check failed: %s", dlerror_txt);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  598|      0|				break;
  599|      0|			}
  600|       |
  601|       |			/*
  602|       |			 *	We're reliant on dlerror_txt from the loop,
  603|       |			 *	because once dlerror() is called the error
  604|       |			 *	is cleared.
  605|       |			 *
  606|       |			 *	We need to push every error because we
  607|       |			 *	don't know which one would be useful
  608|       |			 *	in diagnosing the underlying cause of the
  609|       |			 *	load failure.
  610|       |			 *
  611|       |			 *	However, OSX doesn't clear the error,
  612|       |			 *	it simply appends to it.  We don't
  613|       |			 *	want endless amounts of duplication,
  614|       |			 *	so we tidy it up here.
  615|       |			 */
  616|      0|#ifndef __APPLE__
  617|      0|			fr_strerror_const_push(dlerror_txt);
  ------------------
  |  |  227|      0|#define		fr_strerror_const_push(_msg) _fr_strerror_const_push(__FILE__, __LINE__, _msg)
  ------------------
  618|       |#else
  619|       |			fr_strerror_const(dlerror_txt);
  620|       |#endif
  621|      0|		}
  622|       |
  623|       |		/*
  624|       |		 *	No element of "path" had the library.  Return
  625|       |		 *	the error from the last dlopen().
  626|       |		 */
  627|      4|		if (!handle) {
  ------------------
  |  Branch (627:7): [True: 0, False: 4]
  ------------------
  628|      0|			talloc_free(ctx);
  629|      0|			return NULL;
  630|      0|		}
  631|       |
  632|      4|		fr_strerror_clear();	/* Don't leave spurious errors in the buffer */
  633|       |
  634|      4|		talloc_free(ctx);
  635|      4|	} else {
  636|      0|		char	buffer[2048];
  637|       |
  638|      0|		strlcpy(buffer, name, sizeof(buffer));
  639|       |		/*
  640|       |		 *	FIXME: Make this configurable...
  641|       |		 */
  642|      0|		strlcat(buffer, DL_EXTENSION, sizeof(buffer));
  ------------------
  |  |   57|      0|#  define DL_EXTENSION ".so"
  ------------------
  643|       |
  644|      0|		handle = dlopen(buffer, flags);
  645|      0|		if (!handle) {
  ------------------
  |  Branch (645:7): [True: 0, False: 0]
  ------------------
  646|      0|			char *error = dlerror();
  647|       |
  648|       |			/*
  649|       |			 *	Append the error
  650|       |			 */
  651|      0|			fr_strerror_printf_push("%s", error);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  652|      0|			return NULL;
  653|      0|		}
  654|      0|	}
  655|       |
  656|      4|do_symbol_check:
  657|      4|	dl = talloc(dl_loader, dl_t);
  658|      4|	if (unlikely(!dl)) {
  ------------------
  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  659|      0|		dlclose(handle);
  660|      0|		return NULL;
  661|      0|	}
  662|      4|	*dl = (dl_t){
  663|      4|		.name = talloc_strdup(dl, name),
  ------------------
  |  |  149|      4|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  664|      4|		.handle = handle,
  665|      4|		.loader = dl_loader,
  666|      4|		.uctx = uctx,
  667|      4|		.uctx_free = uctx_free
  668|      4|	};
  669|      4|	talloc_set_destructor(dl, _dl_free);
  ------------------
  |  Branch (669:2): [Folded, False: 4]
  ------------------
  670|       |
  671|      4|	dl->in_tree = fr_rb_insert(dl_loader->tree, dl);
  672|      4|	if (!dl->in_tree) {
  ------------------
  |  Branch (672:6): [True: 0, False: 4]
  ------------------
  673|      0|		talloc_free(dl);
  674|      0|		return NULL;
  675|      0|	}
  676|       |
  677|      4|	if (!dl_loader->defer_symbol_init) dl_symbol_init(dl_loader, dl);
  ------------------
  |  Branch (677:6): [True: 4, False: 0]
  ------------------
  678|       |
  679|      4|	return dl;
  680|      4|}
dl_free:
  694|      4|{
  695|      4|	if (!dl) return 0;
  ------------------
  |  Branch (695:6): [True: 0, False: 4]
  ------------------
  696|       |
  697|      4|	return talloc_decrease_ref_count(talloc_get_type_abort_const(dl, dl_t));
  ------------------
  |  |  117|      4|#  define talloc_get_type_abort_const talloc_get_type_abort
  ------------------
  698|      4|}
dl_search_path:
  745|      4|{
  746|      4|	char		*env;
  747|      4|	fr_sbuff_t	*search_path = NULL;
  748|       |
  749|       |	/*
  750|       |	 * The search path in this order [env:][global:]dl_loader->lib_dir
  751|       |	 */
  752|       |
  753|       |	/*
  754|       |	 *	Create a thread-local extensible buffer to
  755|       |	 *	store library search_path data.
  756|       |	 *
  757|       |	 *	This is created once per-thread (the first time
  758|       |	 *	this function is called), and freed when the
  759|       |	 *	thread exits.
  760|       |	 */
  761|      4|	FR_SBUFF_TALLOC_THREAD_LOCAL(&search_path, 16, PATH_MAX);
  ------------------
  |  |  600|      4|#define FR_SBUFF_TALLOC_THREAD_LOCAL(_out, _init, _max) \
  |  |  601|      4|do { \
  |  |  602|      4|	static _Thread_local fr_sbuff_thread_local_t *_sbuff_t_local; \
  |  |  603|      4|	if (!_sbuff_t_local) { \
  |  |  ------------------
  |  |  |  Branch (603:6): [True: 2, False: 2]
  |  |  ------------------
  |  |  604|      2|		fr_sbuff_thread_local_t *sbtl = talloc_zero(NULL, fr_sbuff_thread_local_t); \
  |  |  605|      2|		fr_sbuff_init_talloc(sbtl, &sbtl->sbuff, &sbtl->tctx, _init, _max); \
  |  |  606|      2|		fr_atexit_thread_local(_sbuff_t_local, _sbuff_thread_local_free, sbtl); \
  |  |  ------------------
  |  |  |  |  185|      2|#  define fr_atexit_thread_local(_name, _free, _uctx) \
  |  |  |  |  186|      2|do { \
  |  |  |  |  187|      2|	void *_our_uctx = _uctx; /* stop _uctx being evaluated multiple times, it may be a call to malloc() */ \
  |  |  |  |  188|      2|	_fr_atexit_thread_local(__FILE__, __LINE__, _free, _our_uctx); \
  |  |  |  |  189|      2|	_name = _our_uctx; \
  |  |  |  |  190|      2|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (190:10): [Folded, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  607|      2|		*(_out) = &_sbuff_t_local->sbuff; \
  |  |  608|      2|	} else { \
  |  |  609|      2|		fr_sbuff_reset_talloc(&_sbuff_t_local->sbuff); \
  |  |  610|      2|		*(_out) = &_sbuff_t_local->sbuff; \
  |  |  611|      2|	} \
  |  |  612|      4|} while (0)
  |  |  ------------------
  |  |  |  Branch (612:10): [Folded, False: 4]
  |  |  ------------------
  ------------------
  762|       |
  763|       |	/*
  764|       |	 * Apple removed support for DYLD_LIBRARY_PATH in rootless mode.
  765|       |	 */
  766|      4|	env = getenv("FR_LIBRARY_PATH");
  767|      4|	if (env && fr_sbuff_in_sprintf(search_path, "%s:", env) < 0) return NULL;
  ------------------
  |  Branch (767:6): [True: 0, False: 4]
  |  Branch (767:13): [True: 0, False: 0]
  ------------------
  768|       |
  769|      4|	if (dl_global_libdir && fr_sbuff_in_sprintf(search_path, "%s:", dl_global_libdir) < 0) return NULL;
  ------------------
  |  Branch (769:6): [True: 4, False: 0]
  |  Branch (769:26): [True: 0, False: 4]
  ------------------
  770|       |
  771|      4|	if (fr_sbuff_in_strcpy(search_path, dl_loader->lib_dir) < 0) return NULL;
  ------------------
  |  Branch (771:6): [True: 0, False: 4]
  ------------------
  772|       |
  773|      4|	return fr_sbuff_start(search_path);
  ------------------
  |  |  828|      4|	(_Generic((_sbuff_or_marker), \
  |  |  829|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  830|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  831|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  832|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  833|      4|	))
  ------------------
  774|      4|}
dl_search_global_path_set:
  784|      4|{
  785|      4|	if (dl_global_libdir) TALLOC_FREE(dl_global_libdir);
  ------------------
  |  Branch (785:6): [True: 0, False: 4]
  |  Branch (785:24): [True: 0, False: 0]
  |  Branch (785:24): [Folded, False: 0]
  ------------------
  786|       |
  787|      4|	dl_global_libdir = talloc_strdup(NULL, lib_dir);
  ------------------
  |  |  149|      4|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  788|      4|	if (!dl_global_libdir) {
  ------------------
  |  Branch (788:6): [True: 0, False: 4]
  ------------------
  789|      0|		fr_strerror_const("Failed allocating memory for global dl search path");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  790|      0|		return -1;
  791|      0|	}
  792|       |
  793|      4|	fr_atexit_global_once(NULL, fr_atexit_talloc_free, dl_global_libdir);
  ------------------
  |  |  170|      4|	fr_atexit_global_once_ret(&(int){ 0 }, _init, _free, _uctx)
  |  |  ------------------
  |  |  |  |  130|      4|#define fr_atexit_global_once_ret(_ret, _init, _free, _uctx) \
  |  |  |  |  131|      4|do { \
  |  |  |  |  132|      4|	static atomic_bool	_init_done = false; \
  |  |  |  |  133|      4|	static pthread_mutex_t	_init_mutex = PTHREAD_MUTEX_INITIALIZER; \
  |  |  |  |  134|      4|	void *_our_uctx = _uctx; /* stop _uctx being evaluated multiple times, it may be a call to malloc() */ \
  |  |  |  |  135|      4|	*(_ret) = 0; \
  |  |  |  |  136|      4|	if (unlikely(!atomic_load(&_init_done))) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 4, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  137|      4|		pthread_mutex_lock(&_init_mutex); \
  |  |  |  |  138|      4|		if (!atomic_load(&_init_done)) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (138:7): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  139|      4|			if (_fr_atexit_global_once_funcs(_init, _free, _our_uctx) < 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (139:8): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  |  |  140|      0|				*(_ret) = -1; \
  |  |  |  |  141|      0|			} \
  |  |  |  |  142|      4|			atomic_store(&_init_done, true); \
  |  |  |  |  143|      4|		} \
  |  |  |  |  144|      4|		pthread_mutex_unlock(&_init_mutex); \
  |  |  |  |  145|      4|	} \
  |  |  |  |  146|      4|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (146:10): [Folded, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  794|       |
  795|      4|	return 0;
  796|      4|}
dl_loader_init:
  901|      4|{
  902|      4|	dl_loader_t *dl_loader;
  903|       |
  904|      4|	dl_loader = talloc_zero(NULL, dl_loader_t);
  905|      4|	if (!dl_loader) {
  ------------------
  |  Branch (905:6): [True: 0, False: 4]
  ------------------
  906|      0|		fr_strerror_const("Failed allocating dl_loader");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  907|      0|		return NULL;
  908|      0|	}
  909|       |
  910|      4|	dl_loader->tree = fr_rb_inline_talloc_alloc(dl_loader, dl_t, node, dl_handle_cmp, NULL);
  ------------------
  |  |  245|      4|		_Generic((((_type *)0)->_field), \
  |  |  246|      4|			fr_rb_node_t: _fr_rb_alloc(_ctx, offsetof(_type, _field), #_type, _data_cmp, _data_free) \
  |  |  247|      4|		)
  ------------------
  911|      4|	if (!dl_loader->tree) {
  ------------------
  |  Branch (911:6): [True: 0, False: 4]
  ------------------
  912|      0|		fr_strerror_const("Failed initialising dl->tree");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  913|      0|	error:
  914|      0|		TALLOC_FREE(dl_loader);
  ------------------
  |  Branch (914:3): [True: 0, False: 0]
  |  Branch (914:3): [Folded, False: 0]
  ------------------
  915|      0|		return NULL;
  916|      0|	}
  917|       |
  918|      4|	talloc_link_ctx(ctx, dl_loader);
  919|       |
  920|      4|	dl_loader->lib_dir = talloc_strdup(dl_loader, fr_path_default_lib_dir());
  ------------------
  |  |  149|      4|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  921|      4|	if (!dl_loader->lib_dir) {
  ------------------
  |  Branch (921:6): [True: 0, False: 4]
  ------------------
  922|      0|		fr_strerror_const("Failed allocating memory for dl search path");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  923|      0|		goto error;
  924|      0|	}
  925|       |
  926|      4|	talloc_set_destructor(dl_loader, _dl_loader_free);
  ------------------
  |  Branch (926:2): [Folded, False: 4]
  ------------------
  927|       |
  928|       |	/*
  929|       |	 *	Run this now to avoid bizarre issues
  930|       |	 *	with the talloc atexit handlers firing
  931|       |	 *	in the child, and that causing issues.
  932|       |	 */
  933|      4|	dl_loader->do_dlclose = (!RUNNING_ON_VALGRIND && (fr_get_lsan_state() != 1));
  ------------------
  |  |   40|      8|#  define RUNNING_ON_VALGRIND 0
  ------------------
  |  Branch (933:27): [True: 4, Folded]
  |  Branch (933:51): [True: 0, False: 4]
  ------------------
  934|      4|	dl_loader->uctx = uctx;
  935|      4|	dl_loader->uctx_free = uctx_free;
  936|      4|	dl_loader->defer_symbol_init = defer_symbol_init;
  937|       |
  938|       |	/*
  939|       |	 *	It's not clear yet whether we still want
  940|       |	 *	some dynamic loading capability in
  941|       |	 *	emscripten, so keep this as a potentially
  942|       |	 *	runtime toggle for now.
  943|       |	 */
  944|       |#ifdef __EMSCRIPTEN__
  945|       |	dl_loader->do_static = true;
  946|       |#else
  947|      4|	dl_loader->do_static = false;
  948|      4|#endif
  949|      4|	fr_dlist_init(&dl_loader->sym_init, dl_symbol_init_t, entry);
  ------------------
  |  |  243|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), NULL))
  ------------------
  950|      4|	fr_dlist_init(&dl_loader->sym_free, dl_symbol_free_t, entry);
  ------------------
  |  |  243|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), NULL))
  ------------------
  951|       |
  952|      4|	return dl_loader;
  953|      4|}
dl.c:_dl_free:
  438|      4|{
  439|      4|	dl = talloc_get_type_abort(dl, dl_t);
  440|       |
  441|      4|	dl_symbol_free(dl->loader, dl);
  442|       |
  443|       |	/*
  444|       |	 *	Only dlclose() handle if we're *NOT* running under valgrind
  445|       |	 *	as it unloads the symbols valgrind needs.
  446|       |	 */
  447|      4|	if (dl->loader->do_dlclose) dlclose(dl->handle);        /* ignore any errors */
  ------------------
  |  Branch (447:6): [True: 0, False: 4]
  ------------------
  448|       |
  449|      4|	dl->handle = NULL;
  450|       |
  451|      4|	if (dl->in_tree) fr_rb_delete(dl->loader->tree, dl);
  ------------------
  |  Branch (451:6): [True: 4, False: 0]
  ------------------
  452|       |
  453|      4|	return 0;
  454|      4|}
dl.c:dl_symbol_free:
  280|      4|{
  281|      4|	dl_symbol_free_t	*free = NULL;
  282|      4|	void			*sym = NULL;
  283|       |
  284|      4|	while ((free = fr_dlist_next(&dl_loader->sym_free, free))) {
  ------------------
  |  Branch (284:9): [True: 0, False: 4]
  ------------------
  285|      0|		if (free->symbol) {
  ------------------
  |  Branch (285:7): [True: 0, False: 0]
  ------------------
  286|      0|			char *sym_name = NULL;
  287|       |
  288|      0|			sym_name = talloc_typed_asprintf(NULL, "%s_%s", dl->name, free->symbol);
  289|      0|			if (!sym_name) return -1;
  ------------------
  |  Branch (289:8): [True: 0, False: 0]
  ------------------
  290|       |
  291|      0|			sym = dlsym(dl->handle, sym_name);
  292|      0|			talloc_free(sym_name);
  293|       |
  294|      0|			if (!sym) continue;
  ------------------
  |  Branch (294:8): [True: 0, False: 0]
  ------------------
  295|      0|		}
  296|       |
  297|      0|		free->func(dl, sym, free->uctx);
  298|      0|	}
  299|       |
  300|      4|	return 0;
  301|      4|}
dl.c:dl_handle_cmp:
  169|     12|{
  170|     12|	int ret;
  171|       |
  172|     12|	ret = strcmp(((dl_t const *)one)->name, ((dl_t const *)two)->name);
  173|     12|	return CMP(ret, 0);
  ------------------
  |  |  113|     12|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|     12|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  174|     12|}
dl.c:_dl_loader_free:
  701|      2|{
  702|      2|	int ret = 0;
  703|       |
  704|      2|	if (dl_loader->uctx_free) {
  ------------------
  |  Branch (704:6): [True: 0, False: 2]
  ------------------
  705|      0|		ret = talloc_free(dl_loader->uctx);
  706|      0|		if (ret != 0) goto finish;
  ------------------
  |  Branch (706:7): [True: 0, False: 0]
  ------------------
  707|      0|	}
  708|       |
  709|       |	/*
  710|       |	 *	Prevent freeing if we still have dls loaded
  711|       |	 *	We do reference counting, we know exactly what
  712|       |	 *	should still be active.
  713|       |	 */
  714|      2|	if (fr_rb_num_elements(dl_loader->tree) > 0) {
  ------------------
  |  Branch (714:6): [True: 0, False: 2]
  ------------------
  715|      0|#ifndef NDEBUG
  716|      0|		fr_rb_iter_inorder_t	iter;
  717|      0|		void				*data;
  718|       |
  719|       |		/*
  720|       |		 *	Yes, this is the correct call order
  721|       |		 */
  722|      0|		for (data = fr_rb_iter_init_inorder(dl_loader->tree, &iter);
  723|      0|		     data;
  ------------------
  |  Branch (723:8): [True: 0, False: 0]
  ------------------
  724|      0|		     data = fr_rb_iter_next_inorder(dl_loader->tree, &iter)) {
  725|      0|			dl_t *dl = talloc_get_type_abort(data, dl_t);
  726|       |
  727|      0|			fr_strerror_printf_push("  %s (%zu)", dl->name, talloc_reference_count(dl));
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  728|      0|		}
  729|       |
  730|      0|		fr_strerror_printf_push("Refusing to cleanup dl loader, the following dynamically loaded "
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  731|      0|					"libraries are still in use:");
  732|      0|#endif
  733|      0|		ret = -1;
  734|      0|		goto finish;
  735|      0|	}
  736|       |
  737|      2|finish:
  738|      2|	return ret;
  739|      2|}

fr_dns_label_uncompressed_length:
  884|  1.45k|{
  885|  1.45k|	uint8_t const *p, *q, *end, *label_end;
  886|  1.45k|	uint8_t const *current, *start;
  887|  1.45k|	size_t length;
  888|  1.45k|	bool at_first_label, already_set_next;
  889|       |
  890|  1.45k|	if (!packet || !buf || (buf_len == 0) || !next) {
  ------------------
  |  Branch (890:6): [True: 0, False: 1.45k]
  |  Branch (890:17): [True: 0, False: 1.45k]
  |  Branch (890:25): [True: 16, False: 1.43k]
  |  Branch (890:43): [True: 0, False: 1.43k]
  ------------------
  891|     16|		fr_strerror_printf("Invalid argument");
  ------------------
  |  |   65|     16|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  892|     16|		return 0;
  893|     16|	}
  894|       |
  895|  1.43k|	start = *next;
  896|       |
  897|       |	/*
  898|       |	 *	Don't allow stupidities
  899|       |	 */
  900|  1.43k|	if (!((start >= packet) && (start < (buf + buf_len)))) {
  ------------------
  |  Branch (900:8): [True: 1.43k, False: 0]
  |  Branch (900:29): [True: 1.43k, False: 0]
  ------------------
  901|      0|		fr_strerror_printf("Label is not within the buffer");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  902|      0|		return 0;
  903|      0|	}
  904|       |
  905|  1.43k|	end = buf + buf_len;
  906|  1.43k|	p = current = start;
  907|  1.43k|	length = 0;
  908|  1.43k|	at_first_label = true;
  909|  1.43k|	already_set_next = false;
  910|       |
  911|       |	/*
  912|       |	 *	We silently accept labels *without* a trailing 0x00,
  913|       |	 *	so long as they end at the end of the input buffer.
  914|       |	 */
  915|  1.65k|	while (p < end) {
  ------------------
  |  Branch (915:9): [True: 1.60k, False: 48]
  ------------------
  916|       |		/*
  917|       |		 *	End of label byte.  Skip it.
  918|       |		 *
  919|       |		 *	Empty labels are length 1, to account for the
  920|       |		 *	'.'.  The caller has to take care of this
  921|       |		 *	manually.
  922|       |		 */
  923|  1.60k|		if (*p == 0x00) {
  ------------------
  |  Branch (923:7): [True: 850, False: 752]
  ------------------
  924|    850|			p++;
  925|    850|			if (at_first_label) length++;
  ------------------
  |  Branch (925:8): [True: 848, False: 2]
  ------------------
  926|       |
  927|       |			/*
  928|       |			 *	We're still processing the first
  929|       |			 *	label, tell the caller where the next
  930|       |			 *	one is located.
  931|       |			 */
  932|    850|			if (current == start) {
  ------------------
  |  Branch (932:8): [True: 850, False: 0]
  ------------------
  933|    850|				*next = p;
  934|    850|				already_set_next = true;
  935|    850|			}
  936|       |
  937|    850|			break;
  938|    850|		}
  939|       |
  940|       |		/*
  941|       |		 *	If there's only one byte in the packet, then
  942|       |		 *	it MUST be 0x00.  If it's not, then the label
  943|       |		 *	overflows the buffer.
  944|       |		 */
  945|    752|		if ((p + 1) >= end) goto overflow;
  ------------------
  |  Branch (945:7): [True: 179, False: 573]
  ------------------
  946|       |
  947|       |		/*
  948|       |		 *	0b01 and 0b10 are forbidden
  949|       |		 */
  950|    573|		if ((*p > 63) && (*p < 0xc0)) {
  ------------------
  |  Branch (950:7): [True: 163, False: 410]
  |  Branch (950:20): [True: 17, False: 146]
  ------------------
  951|     17|			fr_strerror_const("Data with invalid high bits");
  ------------------
  |  |  223|     17|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  952|     17|			return -(p - packet);
  953|     17|		}
  954|       |
  955|       |		/*
  956|       |		 *	Maybe it's a compressed pointer.
  957|       |		 */
  958|    556|		if (*p > 63) {
  ------------------
  |  Branch (958:7): [True: 146, False: 410]
  ------------------
  959|    146|			uint16_t offset;
  960|       |
  961|    146|			if ((p + 2) > end) {
  ------------------
  |  Branch (961:8): [True: 0, False: 146]
  ------------------
  962|    198|			overflow:
  963|    198|				fr_strerror_const("Label overflows buffer");
  ------------------
  |  |  223|    198|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  964|    198|				return -(p - packet);
  965|      0|			}
  966|       |
  967|    146|			offset = p[1];
  968|    146|			offset += ((*p & ~0xc0) << 8);
  969|       |
  970|       |			/*
  971|       |			 *	Forward references are forbidden,
  972|       |			 *	including self-references.
  973|       |			 *
  974|       |			 *	This requirement follows RFC 1035
  975|       |			 *	Section 4.1.4, which says:
  976|       |			 *
  977|       |			 *	... an entire domain name or a list of
  978|       |			 *	labels at the end of a domain name is
  979|       |			 *	replaced with a pointer to a prior
  980|       |			 *	occurrence of the same name.
  981|       |			 *	...
  982|       |			 *
  983|       |			 *	Note the key word PRIOR.  If we
  984|       |			 *	enforce that the pointer is backwards,
  985|       |			 *	and do various other enforcements,
  986|       |			 *	then it is very difficult for
  987|       |			 *	attackers to create malicious DNS
  988|       |			 *	packets which will cause the decoder
  989|       |			 *	to do bad things.
  990|       |			 */
  991|    146|			if (offset >= (p - packet)) {
  ------------------
  |  Branch (991:8): [True: 22, False: 124]
  ------------------
  992|     22|				fr_strerror_printf("Pointer %04x at offset %04x is an invalid forward reference",
  ------------------
  |  |   65|     22|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  993|     22|						   offset, (unsigned int) (p - packet));
  994|     22|				return -(p - packet);
  995|     22|			}
  996|       |
  997|    124|			q = packet + offset;
  998|       |
  999|       |			/*
 1000|       |			 *	As an additional sanity check, the
 1001|       |			 *	pointer MUST NOT point to something
 1002|       |			 *	within the label we're parsing.  If
 1003|       |			 *	that happens, we have a loop.
 1004|       |			 *
 1005|       |			 *	i.e. the pointer must point backwards
 1006|       |			 *	to *before* our current label.  When
 1007|       |			 *	that limitation is enforced, pointer
 1008|       |			 *	loops are impossible.
 1009|       |			 */
 1010|    124|			if (q >= current) {
  ------------------
  |  Branch (1010:8): [True: 124, False: 0]
  ------------------
 1011|    124|				fr_strerror_printf("Pointer %04x at offset %04x creates a loop within a label",
  ------------------
  |  |   65|    124|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1012|    124|						   offset, (unsigned int) (p - packet));
 1013|    124|				return -(p - packet);
 1014|    124|			}
 1015|       |
 1016|       |			/*
 1017|       |			 *	If we're tracking which labels are
 1018|       |			 *	valid, then check the pointer, too.
 1019|       |			 */
 1020|      0|			if (!dns_pointer_valid(lb, offset)) {
  ------------------
  |  Branch (1020:8): [True: 0, False: 0]
  ------------------
 1021|      0|				fr_strerror_printf("Pointer %04x at offset %04x does not point to a DNS label",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1022|      0|						   offset, (unsigned int) (p - packet));
 1023|      0|				return -(p - packet);
 1024|      0|			}
 1025|       |
 1026|       |			/*
 1027|       |			 *	The pointer MUST point to a valid
 1028|       |			 *	length field, and not to another
 1029|       |			 *	pointer.
 1030|       |			 */
 1031|      0|			if (*q > 63) {
  ------------------
  |  Branch (1031:8): [True: 0, False: 0]
  ------------------
 1032|      0|				fr_strerror_printf("Pointer %04x at offset %04x does not point to the start of a label",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1033|      0|						   offset, (unsigned int) (p - packet));
 1034|      0|				return -(p - packet);
 1035|      0|			}
 1036|       |
 1037|       |			/*
 1038|       |			 *	The pointer MUST NOT point to an end of label field.
 1039|       |			 */
 1040|      0|			if (!*q) {
  ------------------
  |  Branch (1040:8): [True: 0, False: 0]
  ------------------
 1041|      0|				fr_strerror_printf("Pointer %04x at offset %04x refers to an invalid field", offset,
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1042|      0|						   (unsigned int) (p - packet));
 1043|      0|				return -(p - packet);
 1044|      0|			}
 1045|       |
 1046|       |			/*
 1047|       |			 *	If we're jumping away from the label
 1048|       |			 *	we started with, tell the caller where
 1049|       |			 *	the next label is in the network
 1050|       |			 *	buffer.
 1051|       |			 */
 1052|      0|			if (current == start) {
  ------------------
  |  Branch (1052:8): [True: 0, False: 0]
  ------------------
 1053|      0|				*next = p + 2;
 1054|      0|				already_set_next = true;
 1055|      0|			}
 1056|       |
 1057|      0|			p = current = q;
 1058|      0|			continue;
 1059|      0|		}
 1060|       |
 1061|       |		/*
 1062|       |		 *	Else it's an uncompressed label
 1063|       |		 */
 1064|    410|		if ((p + *p + 1) > end) goto overflow;
  ------------------
  |  Branch (1064:7): [True: 19, False: 391]
  ------------------
 1065|       |
 1066|       |		/*
 1067|       |		 *	It's a valid label.  Mark it as such.
 1068|       |		 */
 1069|    391|		dns_label_mark(lb, p);
 1070|       |
 1071|       |		/*
 1072|       |		 *	Account for the '.' on every label after the
 1073|       |		 *	first one.
 1074|       |		 */
 1075|    391|		if (!at_first_label) length++;
  ------------------
  |  Branch (1075:7): [True: 30, False: 361]
  ------------------
 1076|    391|		at_first_label = false;
 1077|    391|		length += *p;
 1078|       |
 1079|       |		/*
 1080|       |		 *	DNS names can be no more than 255 octets.
 1081|       |		 */
 1082|    391|		if (length > 255) {
  ------------------
  |  Branch (1082:7): [True: 0, False: 391]
  ------------------
 1083|      0|			fr_strerror_const("Total length of labels is > 255");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1084|      0|			return -(p - packet);
 1085|      0|		}
 1086|       |
 1087|    391|		q = p + 1;
 1088|    391|		label_end = q + *p;
 1089|       |
 1090|       |		/*
 1091|       |		 *	Allow for underscore at the beginning of a
 1092|       |		 *	label.
 1093|       |		 */
 1094|    391|		if (*q == '_') q++;
  ------------------
  |  Branch (1094:7): [True: 26, False: 365]
  ------------------
 1095|       |
 1096|       |		/*
 1097|       |		 *	Verify that the contents of the label are OK.
 1098|       |		 */
 1099|  2.18k|		while (q < label_end) {
  ------------------
  |  Branch (1099:10): [True: 1.97k, False: 216]
  ------------------
 1100|  1.97k|			if (!((*q == '-') || ((*q >= '0') && (*q <= '9')) ||
  ------------------
  |  Branch (1100:10): [True: 319, False: 1.65k]
  |  Branch (1100:26): [True: 1.50k, False: 144]
  |  Branch (1100:41): [True: 1.30k, False: 203]
  ------------------
 1101|    347|			      ((*q >= 'A') && (*q <= 'Z')) || ((*q >= 'a') && (*q <= 'z')))) {
  ------------------
  |  Branch (1101:11): [True: 196, False: 151]
  |  Branch (1101:26): [True: 93, False: 103]
  |  Branch (1101:43): [True: 98, False: 156]
  |  Branch (1101:58): [True: 79, False: 19]
  ------------------
 1102|    175|				fr_strerror_printf("Invalid character 0x%02x in label", *q);
  ------------------
  |  |   65|    175|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1103|    175|				return -(q - packet);
 1104|    175|			}
 1105|       |
 1106|  1.79k|			q++;
 1107|  1.79k|		}
 1108|       |
 1109|    216|		p += *p + 1;
 1110|    216|	}
 1111|       |
 1112|       |	/*
 1113|       |	 *	Return the length of this label.
 1114|       |	 */
 1115|    898|	if (!already_set_next) *next = p; /* should be <='end' */
  ------------------
  |  Branch (1115:6): [True: 48, False: 850]
  ------------------
 1116|       |
 1117|       |	/*
 1118|       |	 *	Add the label, only if we're not using the markup field.
 1119|       |	 */
 1120|    898|	if (lb && !lb->mark) (void) dns_label_add(lb, start, *next);
  ------------------
  |  Branch (1120:6): [True: 0, False: 898]
  |  Branch (1120:12): [True: 0, False: 0]
  ------------------
 1121|       |
 1122|    898|	return length;
 1123|  1.43k|}
fr_dns_labels_network_verify:
 1137|  1.12k|{
 1138|  1.12k|	ssize_t slen;
 1139|  1.12k|	uint8_t const *label = start;
 1140|  1.12k|	uint8_t const *end = buf + buf_len;
 1141|       |
 1142|  1.12k|	while (label < end) {
  ------------------
  |  Branch (1142:9): [True: 969, False: 160]
  ------------------
 1143|    969|		if (*label == 0x00) {
  ------------------
  |  Branch (1143:7): [True: 554, False: 415]
  ------------------
 1144|    554|			label++;
 1145|    554|			break;
 1146|    554|		}
 1147|       |
 1148|    415|		slen = fr_dns_label_uncompressed_length(packet, buf, buf_len, &label, lb);
 1149|    415|		if (slen <= 0) return slen; /* already is offset from 'buf' and not 'label' */
  ------------------
  |  Branch (1149:7): [True: 413, False: 2]
  ------------------
 1150|    415|	}
 1151|       |
 1152|    714|	return label - buf;
 1153|  1.12k|}
fr_dns_label_to_value_box:
 1227|    722|{
 1228|    722|	ssize_t slen;
 1229|    722|	uint8_t const *after = label;
 1230|    722|	uint8_t const *current, *next = NULL;
 1231|    722|	uint8_t const *packet = src;
 1232|    722|	uint8_t const *end = packet + len;
 1233|    722|	uint8_t *p;
 1234|    722|	char *q;
 1235|       |
 1236|    722|	if (!len) return -1;
  ------------------
  |  Branch (1236:6): [True: 0, False: 722]
  ------------------
 1237|       |
 1238|       |	/*
 1239|       |	 *	The label must be within the current buffer we're
 1240|       |	 *	passed.
 1241|       |	 */
 1242|    722|	if ((label < src) || (label >= end)) return -1;
  ------------------
  |  Branch (1242:6): [True: 0, False: 722]
  |  Branch (1242:23): [True: 0, False: 722]
  ------------------
 1243|       |
 1244|       |	/*
 1245|       |	 *	The actual packet might start earlier than the buffer,
 1246|       |	 *	so reset it if necessary.
 1247|       |	 */
 1248|    722|	if (lb) packet = lb->start;
  ------------------
  |  Branch (1248:6): [True: 0, False: 722]
  ------------------
 1249|       |
 1250|       |	/*
 1251|       |	 *	Get the uncompressed length of the label, and the
 1252|       |	 *	label after this one.
 1253|       |	 */
 1254|    722|	slen = fr_dns_label_uncompressed_length(packet, src, len, &after, lb);
 1255|    722|	if (slen <= 0) {
  ------------------
  |  Branch (1255:6): [True: 0, False: 722]
  ------------------
 1256|      0|		FR_PROTO_TRACE("dns_label_to_value_box - Failed getting length");
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1257|      0|		return slen;
 1258|      0|	}
 1259|       |
 1260|    722|	fr_value_box_init_null(dst);
  ------------------
  |  |  616|    722|#define fr_value_box_init_null(_vb) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, FR_TYPE_NULL, NULL, false)
  |  |  ------------------
  |  |  |  |  285|    722|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 1261|       |
 1262|       |	/*
 1263|       |	 *	An empty label is a 0x00 byte.  Just create an empty
 1264|       |	 *	string.
 1265|       |	 */
 1266|    722|	if (slen == 1) {
  ------------------
  |  Branch (1266:6): [True: 716, False: 6]
  ------------------
 1267|    716|		if (fr_value_box_bstr_alloc(ctx, &q, dst, NULL, 1, tainted) < 0) return -1;
  ------------------
  |  Branch (1267:7): [True: 0, False: 716]
  ------------------
 1268|    716|		q[0] = '.';
 1269|    716|		return after - label;
 1270|    716|	}
 1271|       |
 1272|       |	/*
 1273|       |	 *	Allocate the string and set up the value_box
 1274|       |	 */
 1275|      6|	if (fr_value_box_bstr_alloc(ctx, &q, dst, NULL, slen, tainted) < 0) return -1;
  ------------------
  |  Branch (1275:6): [True: 0, False: 6]
  ------------------
 1276|       |
 1277|      6|	current = label;
 1278|      6|	p = (uint8_t *) q;
 1279|      6|	q += slen;
 1280|       |
 1281|     25|	while (current && (current < after) && (*current != 0x00)) {
  ------------------
  |  Branch (1281:9): [True: 25, False: 0]
  |  Branch (1281:20): [True: 19, False: 6]
  |  Branch (1281:41): [True: 19, False: 0]
  ------------------
 1282|       |		/*
 1283|       |		 *	Get how many bytes this label has, and where
 1284|       |		 *	we will go to obtain the next label.
 1285|       |		 */
 1286|     19|		slen = dns_label_decode(packet, end, &current, &next);
 1287|     19|		if (slen < 0) return slen;
  ------------------
  |  Branch (1287:7): [True: 0, False: 19]
  ------------------
 1288|       |
 1289|       |		/*
 1290|       |		 *	As a sanity check, ensure we don't have a
 1291|       |		 *	buffer overflow.
 1292|       |		 */
 1293|     19|		if ((p + slen) > (uint8_t *) q) {
  ------------------
  |  Branch (1293:7): [True: 0, False: 19]
  ------------------
 1294|      0|			FR_PROTO_TRACE("dns_label_to_value_box - length %zd Failed at %d", slen, __LINE__);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 1294|      0|			FR_PROTO_TRACE("dns_label_to_value_box - length %zd Failed at %d", slen, __LINE__);
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1295|       |
 1296|      0|		fail:
 1297|      0|			fr_value_box_clear(dst);
 1298|      0|			return -1;
 1299|      0|		}
 1300|       |
 1301|       |		/*
 1302|       |		 *	Add '.' before the label, but only for the
 1303|       |		 *	second and subsequent labels.
 1304|       |		 */
 1305|     19|		if (p != (uint8_t const *) dst->vb_strvalue) {
  ------------------
  |  |  258|     19|#define vb_strvalue				datum.strvalue
  ------------------
  |  Branch (1305:7): [True: 13, False: 6]
  ------------------
 1306|     13|			*(p++) = '.';
 1307|     13|		}
 1308|       |
 1309|       |		/*
 1310|       |		 *	Copy the raw bytes from the network.
 1311|       |		 */
 1312|     19|		memcpy(p, current + 1, slen);
 1313|       |
 1314|       |		/*
 1315|       |		 *	Go ahead in the output string, and go to the
 1316|       |		 *	next label for decoding.
 1317|       |		 */
 1318|     19|		p += slen;
 1319|     19|		current = next;
 1320|     19|	}
 1321|       |
 1322|       |	/*
 1323|       |	 *	As a last sanity check, ensure that we've filled the
 1324|       |	 *	buffer exactly.
 1325|       |	 */
 1326|      6|	if (p != (uint8_t *) q) {
  ------------------
  |  Branch (1326:6): [True: 0, False: 6]
  ------------------
 1327|      0|		FR_PROTO_TRACE("dns_label_to_value_box - Failed at %d", __LINE__);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 1327|       |		FR_PROTO_TRACE("dns_label_to_value_box - Failed at %d", __LINE__);
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1328|      0|		goto fail;
 1329|      0|	}
 1330|       |
 1331|      6|	*p = '\0';
 1332|       |
 1333|       |	/*
 1334|       |	 *	Return the number of network bytes used to parse this
 1335|       |	 *	part of the label.
 1336|       |	 */
 1337|      6|	return after - label;
 1338|      6|}
dns.c:dns_label_mark:
   99|    391|{
  100|    391|	if (!lb || !lb->mark) return;
  ------------------
  |  Branch (100:6): [True: 391, False: 0]
  |  Branch (100:13): [True: 0, False: 0]
  ------------------
  101|       |
  102|      0|	fr_assert(p >= (lb->start + 12)); /* can't point to the packet header */
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  103|      0|	fr_assert(!lb->end || (p < lb->end));
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  104|       |
  105|      0|	lb->mark[p - lb->start] = 1;
  106|      0|}
dns.c:dns_label_decode:
 1156|     19|{
 1157|     19|	uint8_t const *p, *q;
 1158|       |
 1159|     19|	p = *start;
 1160|       |
 1161|     19|	if (end == packet) return -1;
  ------------------
  |  Branch (1161:6): [True: 0, False: 19]
  ------------------
 1162|       |
 1163|     19|	if (*p == 0x00) {
  ------------------
  |  Branch (1163:6): [True: 0, False: 19]
  ------------------
 1164|      0|		*next = p + 1;
 1165|      0|		return 0;
 1166|      0|	}
 1167|       |
 1168|       |	/*
 1169|       |	 *	Pointer, which points somewhere in the packet.
 1170|       |	 */
 1171|     19|	if (*p >= 0xc0) {
  ------------------
  |  Branch (1171:6): [True: 0, False: 19]
  ------------------
 1172|      0|		uint16_t offset;
 1173|       |
 1174|      0|		if ((end - p) < 2) {
  ------------------
  |  Branch (1174:7): [True: 0, False: 0]
  ------------------
 1175|      0|			return -(p - packet);
 1176|      0|		}
 1177|       |
 1178|      0|		offset = p[1];
 1179|      0|		offset += ((*p & ~0xc0) << 8);
 1180|       |
 1181|      0|		q = packet + offset;
 1182|      0|		if (q >= p) {
  ------------------
  |  Branch (1182:7): [True: 0, False: 0]
  ------------------
 1183|      0|			return -(p - packet);
 1184|      0|		}
 1185|      0|		p = q;
 1186|      0|	}
 1187|       |
 1188|       |	/*
 1189|       |	 *	0b01 and 0b10 are forbidden, and pointers can't point to other pointers.
 1190|       |	 */
 1191|     19|	if (*p > 63) return -(p - packet);
  ------------------
  |  Branch (1191:6): [True: 0, False: 19]
  ------------------
 1192|       |
 1193|     19|	if ((p + *p + 1) > end) {
  ------------------
  |  Branch (1193:6): [True: 0, False: 19]
  ------------------
 1194|      0|		return -(p - packet);
 1195|      0|	}
 1196|       |
 1197|       |	/*
 1198|       |	 *	Tell the caller where the actual label is located.
 1199|       |	 */
 1200|     19|	*start = p;
 1201|     19|	*next = p + *p + 1;
 1202|     19|	return *p;
 1203|     19|}

fr_ext_alloc_size:
   56|  31.9k|{
   57|  31.9k|	size_t			aligned_len = ROUND_UP_POW2(ext_len, FR_EXT_ALIGNMENT);
  ------------------
  |  |  202|  31.9k|#define ROUND_UP_POW2(_num, _mul)	(((_num) + ((_mul) - 1)) & ~((_mul) - 1))
  ------------------
   58|  31.9k|	size_t			chunk_len;
   59|  31.9k|	size_t			hdr_len = 0;
   60|       |
   61|  31.9k|	size_t			offset;
   62|       |
   63|  31.9k|	fr_ext_info_t const	*info = &def->info[ext];
   64|  31.9k|	void			*n_chunk, *chunk = *chunk_p;
   65|  31.9k|	uint8_t			*ext_offsets;
   66|  31.9k|	uint8_t			*ext_ptr;
   67|  31.9k|	char const		*type;
   68|       |
   69|  31.9k|	fr_assert(chunk != NULL);
  ------------------
  |  |  194|  31.9k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  31.9k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 31.9k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|  31.9k|	fr_assert(talloc_parent(chunk) != NULL);
  ------------------
  |  |  194|  31.9k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  31.9k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 31.9k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   71|       |
   72|  31.9k|	ext_offsets = fr_ext_offsets(def, *chunk_p);
   73|  31.9k|	if (ext_offsets[ext]) return fr_ext_ptr(*chunk_p, ext_offsets[ext], info->has_hdr);
  ------------------
  |  Branch (73:6): [True: 4, False: 31.9k]
  ------------------
   74|       |
   75|  31.9k|	if (info->has_hdr) hdr_len = sizeof(fr_ext_hdr_t);	/* Add space for a length prefix */
  ------------------
  |  Branch (75:6): [True: 20.8k, False: 11.1k]
  ------------------
   76|       |
   77|       |	/*
   78|       |	 *	Packing the offsets into a uint8_t array
   79|       |	 *	means the offset address of the final
   80|       |	 *	extension must be less than or equal to
   81|       |	 *	UINT8_MAX * FR_EXT_ALIGNMENT.
   82|       |	 */
   83|  31.9k|	chunk_len = talloc_get_size(chunk);
   84|  31.9k|	offset = ROUND_UP_DIV(chunk_len, FR_EXT_ALIGNMENT);
  ------------------
  |  |  211|  31.9k|#define ROUND_UP_DIV(_x, _y)		(1 + (((_x) - 1) / (_y)))
  ------------------
   85|  31.9k|	if (unlikely(offset > UINT8_MAX)) {
  ------------------
  |  |  397|  31.9k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 31.9k]
  |  |  ------------------
  ------------------
   86|      0|		fr_strerror_const("Insufficient space remaining for extensions");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
   87|      0|		return NULL;
   88|      0|	}
   89|       |
   90|       |	/*
   91|       |	 *	talloc_realloc_size unhelpfully forgets
   92|       |	 *	the name of the chunk, so we need to
   93|       |	 *	record it and set it back again.
   94|       |	 */
   95|  31.9k|	type = talloc_get_name(chunk);
   96|  31.9k|	n_chunk = talloc_realloc_size(NULL, chunk, (offset * FR_EXT_ALIGNMENT) + hdr_len + aligned_len);
   97|  31.9k|	if (!n_chunk) {
  ------------------
  |  Branch (97:6): [True: 0, False: 31.9k]
  ------------------
   98|      0|		fr_strerror_printf("Failed reallocing %s (%s).  Tried to realloc %zu bytes -> %zu bytes",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   99|      0|				   type, fr_syserror(errno), chunk_len, chunk_len + aligned_len);
  |  |  ------------------
  ------------------
   99|      0|				   type, fr_syserror(errno), chunk_len, chunk_len + aligned_len);
  100|      0|		return NULL;
  101|      0|	}
  102|  31.9k|	talloc_set_name_const(n_chunk, type);
  103|       |
  104|  31.9k|	ext_offsets = fr_ext_offsets(def, n_chunk);
  105|  31.9k|	ext_offsets[ext] = (uint8_t)offset;
  106|       |
  107|  31.9k|	ext_ptr = ((uint8_t *)n_chunk) + chunk_len;
  108|  31.9k|	memset(ext_ptr, 0, hdr_len + aligned_len);
  109|       |
  110|  31.9k|	*chunk_p = n_chunk;
  111|       |
  112|  31.9k|	if (info->has_hdr) {
  ------------------
  |  Branch (112:6): [True: 20.8k, False: 11.1k]
  ------------------
  113|  20.8k|		fr_ext_hdr_t *ext_hdr = (fr_ext_hdr_t *)ext_ptr;
  114|       |
  115|  20.8k|		ext_hdr->len = ext_len;		/* Record the real size */
  116|  20.8k|		return &ext_hdr->data;		/* Pointer to the data portion */
  117|  20.8k|	}
  118|       |
  119|  11.1k|	return ext_ptr;
  120|  31.9k|}
fr_ext_len:
  132|  13.7k|{
  133|  13.7k|	uint8_t			offset;
  134|  13.7k|	fr_ext_info_t const	*info;
  135|  13.7k|	fr_ext_hdr_t		*ext_hdr;
  136|  13.7k|	uint8_t			*ext_offsets;
  137|       |
  138|  13.7k|	ext_offsets = fr_ext_offsets(def, chunk);
  139|  13.7k|	offset = ext_offsets[ext];
  140|  13.7k|	if (!offset) return 0;
  ------------------
  |  Branch (140:6): [True: 0, False: 13.7k]
  ------------------
  141|       |
  142|  13.7k|	info = &def->info[ext];
  143|  13.7k|	if (!info->has_hdr) return info->min;		/* Fixed size */
  ------------------
  |  Branch (143:6): [True: 12, False: 13.7k]
  ------------------
  144|       |
  145|  13.7k|	ext_hdr = fr_ext_ptr(chunk, offset, false);	/* false as we're getting the header */
  146|  13.7k|	return ext_hdr->len;
  147|  13.7k|}
fr_ext_copy:
  164|  17.6k|{
  165|  17.6k|	int			i;
  166|  17.6k|	uint8_t			*ext_src_offsets = fr_ext_offsets(def, chunk_src);
  167|  17.6k|	uint8_t			*ext_dst_offsets = fr_ext_offsets(def, *chunk_dst);
  168|  17.6k|	void			*ext_src_ptr, *ext_dst_ptr;
  169|  17.6k|	fr_ext_info_t const	*info = &def->info[ext];
  170|       |
  171|  17.6k|	if (!info->can_copy) {
  ------------------
  |  Branch (171:6): [True: 0, False: 17.6k]
  ------------------
  172|      0|		fr_strerror_const("Extension cannot be copied");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  173|      0|		return NULL;
  174|      0|	}
  175|       |
  176|  17.6k|	if (!ext_src_offsets[ext]) return NULL;
  ------------------
  |  Branch (176:6): [True: 10.7k, False: 6.86k]
  ------------------
  177|       |
  178|  6.86k|	ext_src_ptr = fr_ext_ptr(chunk_src, ext_src_offsets[ext], info->has_hdr);
  179|       |
  180|       |	/*
  181|       |	 *	Only alloc if the extension doesn't
  182|       |	 *	already exist.
  183|       |	 */
  184|  6.86k|	if (!ext_dst_offsets[ext]) {
  ------------------
  |  Branch (184:6): [True: 0, False: 6.86k]
  ------------------
  185|      0|		if (info->alloc) {
  ------------------
  |  Branch (185:7): [True: 0, False: 0]
  ------------------
  186|      0|			ext_dst_ptr = info->alloc(def, chunk_dst, ext,
  187|      0|						  ext_src_ptr,
  188|      0|						  fr_ext_len(def, chunk_src, ext));
  189|       |		/*
  190|       |		 *	If there's no special alloc function
  191|       |		 *	we just allocate a chunk of the same
  192|       |		 *	size.
  193|       |		 */
  194|      0|		} else {
  195|      0|			ext_dst_ptr = fr_ext_alloc_size(def, chunk_dst, ext,
  196|      0|							fr_ext_len(def, chunk_src, ext));
  197|      0|		}
  198|  6.86k|	} else {
  199|  6.86k|		ext_dst_ptr = fr_ext_ptr(*chunk_dst, ext_dst_offsets[ext], info->has_hdr);
  200|  6.86k|	}
  201|       |
  202|  6.86k|	if (info->copy) {
  ------------------
  |  Branch (202:6): [True: 6.86k, False: 0]
  ------------------
  203|  6.86k|		info->copy(ext,
  204|  6.86k|			   *chunk_dst,
  205|  6.86k|			   ext_dst_ptr, fr_ext_len(def, *chunk_dst, ext),
  206|  6.86k|			   chunk_src,
  207|  6.86k|			   ext_src_ptr, fr_ext_len(def, chunk_src, ext));
  208|       |	/*
  209|       |	 *	If there's no special copy function
  210|       |	 *	we just copy the data from the old
  211|       |	 *	extension to the new one.
  212|       |	 */
  213|  6.86k|	} else {
  214|      0|		memcpy(ext_dst_ptr, ext_src_ptr, fr_ext_len(def, *chunk_dst, ext));
  215|      0|	}
  216|       |
  217|       |	/*
  218|       |	 *	Call any fixup functions
  219|       |	 */
  220|  6.86k|	ext_dst_offsets = fr_ext_offsets(def, *chunk_dst);
  221|  61.7k|	for (i = 0; i < def->max; i++) {
  ------------------
  |  Branch (221:14): [True: 54.9k, False: 6.86k]
  ------------------
  222|  54.9k|		if (i == ext) continue;
  ------------------
  |  Branch (222:7): [True: 6.86k, False: 48.0k]
  ------------------
  223|       |
  224|  48.0k|		if (!ext_dst_offsets[i]) continue;
  ------------------
  |  Branch (224:7): [True: 34.3k, False: 13.7k]
  ------------------
  225|       |
  226|  13.7k|		if (info->fixup &&
  ------------------
  |  Branch (226:7): [True: 0, False: 13.7k]
  ------------------
  227|      0|		    info->fixup(i, *chunk_dst,
  ------------------
  |  Branch (227:7): [True: 0, False: 0]
  ------------------
  228|      0|				fr_ext_ptr(*chunk_dst, ext_dst_offsets[i], info->has_hdr),
  229|      0|				fr_ext_len(def, *chunk_dst, i)) < 0) return NULL;
  230|  13.7k|	}
  231|       |
  232|  6.86k|	return ext_dst_ptr;
  233|  6.86k|}
fr_ext_copy_all:
  249|      4|{
  250|      4|	int	i;
  251|      4|	uint8_t	*ext_src_offsets = fr_ext_offsets(def, chunk_src);	/* old chunk array */
  252|      4|	uint8_t *ext_dst_offsets = fr_ext_offsets(def, *chunk_dst);	/* new chunk array */
  253|      4|	bool	ext_new_alloc[def->max];
  254|       |
  255|       |	/*
  256|       |	 *	Do the operation in two phases.
  257|       |	 *
  258|       |	 *	Phase 1 allocates space for all the extensions.
  259|       |	 */
  260|     36|	for (i = 0; i < def->max; i++) {
  ------------------
  |  Branch (260:14): [True: 32, False: 4]
  ------------------
  261|     32|		fr_ext_info_t const *info = &def->info[i];
  262|       |
  263|     32|		if (!ext_src_offsets[i] || !info->can_copy) {
  ------------------
  |  Branch (263:7): [True: 24, False: 8]
  |  Branch (263:30): [True: 4, False: 4]
  ------------------
  264|     28|		no_copy:
  265|     28|			ext_new_alloc[i] = false;
  266|     28|			continue;
  267|     28|		}
  268|       |
  269|      4|		if (info->alloc) {
  ------------------
  |  Branch (269:7): [True: 0, False: 4]
  ------------------
  270|      0|			if (!info->alloc(def, chunk_dst, i,
  ------------------
  |  Branch (270:8): [True: 0, False: 0]
  ------------------
  271|      0|				    	 fr_ext_ptr(chunk_src, ext_src_offsets[i], info->has_hdr),
  272|      0|				    	 fr_ext_len(def, chunk_src, i))) goto no_copy;
  273|       |		/*
  274|       |		 *	If there's no special alloc function
  275|       |		 *	we just allocate a chunk of the same
  276|       |		 *	size.
  277|       |		 */
  278|      4|		} else {
  279|      4|			fr_ext_alloc_size(def, chunk_dst, i, fr_ext_len(def, chunk_src, i));
  280|      4|		}
  281|      4|		ext_new_alloc[i] = true;
  282|      4|		ext_dst_offsets = fr_ext_offsets(def, *chunk_dst);	/* Grab new offsets, chunk might have changed */
  283|      4|	}
  284|       |
  285|       |	/*
  286|       |	 *	Phase 2 populates the extension memory.
  287|       |	 *
  288|       |	 *	We do this in two phases to avoid invalidating
  289|       |	 *	any pointers from extensions back to the extended
  290|       |	 *	talloc chunk.
  291|       |	 */
  292|     36|	for (i = 0; i < def->max; i++) {
  ------------------
  |  Branch (292:14): [True: 32, False: 4]
  ------------------
  293|     32|		fr_ext_info_t const *info = &def->info[i];
  294|       |
  295|     32|		if (!ext_src_offsets[i] || !ext_dst_offsets[i]) continue;
  ------------------
  |  Branch (295:7): [True: 24, False: 8]
  |  Branch (295:30): [True: 0, False: 8]
  ------------------
  296|       |
  297|      8|		if (!ext_new_alloc[i]) {
  ------------------
  |  Branch (297:7): [True: 4, False: 4]
  ------------------
  298|      4|			if (info->fixup &&
  ------------------
  |  Branch (298:8): [True: 4, False: 0]
  ------------------
  299|      4|			    info->fixup(i, *chunk_dst,
  ------------------
  |  Branch (299:8): [True: 0, False: 4]
  ------------------
  300|      4|					fr_ext_ptr(*chunk_dst, ext_dst_offsets[i], info->has_hdr),
  301|      4|					fr_ext_len(def, *chunk_dst, i)) < 0) return -1;
  302|      4|			continue;
  303|      4|		}
  304|      4|		if (!info->can_copy) continue;
  ------------------
  |  Branch (304:7): [True: 0, False: 4]
  ------------------
  305|       |
  306|      4|		if (info->copy) {
  ------------------
  |  Branch (306:7): [True: 4, False: 0]
  ------------------
  307|      4|			if (info->copy(i,
  ------------------
  |  Branch (307:8): [True: 0, False: 4]
  ------------------
  308|      4|				       *chunk_dst,
  309|      4|				       fr_ext_ptr(*chunk_dst, ext_dst_offsets[i], info->has_hdr),
  310|      4|				       fr_ext_len(def, *chunk_dst, i),
  311|      4|				       chunk_src,
  312|      4|				       fr_ext_ptr(chunk_src, ext_src_offsets[i], info->has_hdr),
  313|      4|				       fr_ext_len(def, chunk_src, i)) < 0) return -1;
  314|       |		/*
  315|       |		 *	If there's no special copy function
  316|       |		 *	we just copy the data from the old
  317|       |		 *	extension to the new one.
  318|       |		 */
  319|      4|		} else {
  320|      0|			memcpy(fr_ext_ptr(*chunk_dst, ext_dst_offsets[i], info->has_hdr),
  321|      0|			       fr_ext_ptr(chunk_src, ext_src_offsets[i], info->has_hdr),
  322|      0|			       fr_ext_len(def, *chunk_dst, i));
  323|      0|		}
  324|      4|	}
  325|       |
  326|      4|	return 0;
  327|      4|}

fr_globdir_iter_init:
  694|    114|{
  695|    114|	char const *p;
  696|    114|	char const *to_open;
  697|       |
  698|       |	/*
  699|       |	 *	Default to files, which is the most common case.
  700|       |	 */
  701|    114|	*iter = (fr_globdir_iter_t) {
  702|    114|		.type= FR_GLOBDIR_FILE,
  703|    114|	};
  704|       |
  705|       |	/*
  706|       |	 *	Figure out what kind of thing we're opening.
  707|       |	 */
  708|  2.38k|	for (p = pattern; *p != '\0'; p++) {
  ------------------
  |  Branch (708:20): [True: 2.27k, False: 114]
  ------------------
  709|       |		/*
  710|       |		 *	foo/ - read the entire directory.
  711|       |		 */
  712|  2.27k|		if (*p == '/') {
  ------------------
  |  Branch (712:7): [True: 0, False: 2.27k]
  ------------------
  713|      0|			if (p[1]) continue;
  ------------------
  |  Branch (713:8): [True: 0, False: 0]
  ------------------
  714|       |
  715|      0|#ifdef HAVE_DIRENT_H
  716|      0|			iter->type = FR_GLOBDIR_DIR;
  717|      0|			break;
  718|       |#else
  719|       |			errno = ENOENT;
  720|       |			return -1;
  721|       |#endif
  722|      0|		}
  723|       |
  724|       |		/*
  725|       |		 *	foo*.txt
  726|       |		 *	foo?.txt
  727|       |		 *	foo.[ch]
  728|       |		 *
  729|       |		 *	- file globbing.
  730|       |		 *
  731|       |		 *	File globbing is either full path, or a path relative to CWD.  It is most notably NOT
  732|       |		 *	relative to the input "dir".  So if there are globs, we need a full path.
  733|       |		 */
  734|  2.27k|		if ((*p == '*') || (*p == '?') || (*p == '[')) {
  ------------------
  |  Branch (734:7): [True: 0, False: 2.27k]
  |  Branch (734:22): [True: 0, False: 2.27k]
  |  Branch (734:37): [True: 0, False: 2.27k]
  ------------------
  735|      0|#ifdef HAVE_GLOB_H
  736|       |			/*
  737|       |			 *	@todo - call realpath() to get the canonical filename?
  738|       |			 */
  739|      0|			if ((pattern[0] != '/') && (dir[0] != '/')) {
  ------------------
  |  Branch (739:8): [True: 0, False: 0]
  |  Branch (739:31): [True: 0, False: 0]
  ------------------
  740|      0|				errno = ENOENT;
  741|      0|				return -1;
  742|      0|			}
  743|       |
  744|      0|			iter->type = FR_GLOBDIR_GLOB;
  745|      0|			break;
  746|       |#else
  747|       |			errno = ENOENT;
  748|       |			return -1;
  749|       |#endif
  750|      0|		}
  751|  2.27k|	}
  752|       |
  753|       |	/*
  754|       |	 *	The pattern is an absolute path, we just use that as-is.
  755|       |	 */
  756|    114|	if (pattern[0] == '/') {
  ------------------
  |  Branch (756:6): [True: 0, False: 114]
  ------------------
  757|      0|		to_open = pattern;
  758|       |
  759|    114|	} else if (iter->type == FR_GLOBDIR_FILE) {
  ------------------
  |  Branch (759:13): [True: 114, False: 0]
  ------------------
  760|       |		/*
  761|       |		 *	Short-circuit the common case for files.  We're just opening a file, and the file is
  762|       |		 *	relative to the directory which was passed in.
  763|       |		 */
  764|    114|		*filename = pattern;
  765|    114|		return 1;
  766|       |
  767|    114|	} else {
  768|       |		/*
  769|       |		 *	Either dir is absolute and pattern is relative, or they're both relative.  Merge dir +
  770|       |		 *	pattern into a path.
  771|       |		 *
  772|       |		 *	Note that globs are relative to CWD, so relative globs must be passed in correctly
  773|       |		 *	(that's an @todo), otherwise they won't work.
  774|       |		 */
  775|      0|		if (fr_globdir_get_path(dir, pattern, iter) < 0) {
  ------------------
  |  Branch (775:7): [True: 0, False: 0]
  ------------------
  776|      0|			return -1;
  777|      0|		}
  778|       |
  779|      0|		to_open = iter->path;
  780|      0|	}
  781|       |
  782|       |	/*
  783|       |	 *	Now that we know what type of thing it is, go do the
  784|       |	 *	right thing.
  785|       |	 */
  786|      0|	switch (iter->type) {
  ------------------
  |  Branch (786:10): [True: 0, False: 0]
  ------------------
  787|      0|	case FR_GLOBDIR_INVALID:
  ------------------
  |  Branch (787:2): [True: 0, False: 0]
  ------------------
  788|      0|		(void) fr_globdir_iter_free(iter);
  789|      0|		errno = ENOENT;
  790|      0|		return -1;
  791|       |
  792|      0|	case FR_GLOBDIR_FILE:
  ------------------
  |  Branch (792:2): [True: 0, False: 0]
  ------------------
  793|      0|		*filename = iter->path;
  794|      0|		break;
  795|       |
  796|      0|#ifdef HAVE_DIRENT_H
  797|      0|	case FR_GLOBDIR_DIR:
  ------------------
  |  Branch (797:2): [True: 0, False: 0]
  ------------------
  798|       |		/*
  799|       |		 *	No directory means no file.  The caller then decides if the file is required.
  800|       |		 */
  801|      0|		iter->dir = opendir(to_open);
  802|      0|		if (!iter->dir) {
  ------------------
  |  Branch (802:7): [True: 0, False: 0]
  ------------------
  803|      0|			(void) fr_globdir_iter_free(iter);
  804|      0|			return 0;
  805|      0|		}
  806|       |
  807|      0|		if (fr_globdir_dir_next(filename, iter) < 0) {
  ------------------
  |  Branch (807:7): [True: 0, False: 0]
  ------------------
  808|      0|			(void) fr_globdir_iter_free(iter);
  809|      0|			return -1;
  810|      0|		}
  811|      0|		break;
  812|      0|#endif
  813|       |
  814|      0|#ifdef HAVE_GLOB_H
  815|      0|	case FR_GLOBDIR_GLOB:
  ------------------
  |  Branch (815:2): [True: 0, False: 0]
  ------------------
  816|      0|		if (glob(to_open, GLOB_NOESCAPE | GLOB_ERR, NULL, &iter->glob) < 0) {
  ------------------
  |  Branch (816:7): [True: 0, False: 0]
  ------------------
  817|      0|			(void) fr_globdir_iter_free(iter);
  818|      0|			return -1;
  819|      0|		}
  820|       |
  821|      0|		if (iter->glob.gl_pathc == 0) {
  ------------------
  |  Branch (821:7): [True: 0, False: 0]
  ------------------
  822|      0|			*filename = NULL;
  823|      0|		} else {
  824|      0|			iter->gl_current = 0;
  825|       |
  826|       |			/*
  827|       |			 *	@todo - check the filenames using fr_globdir_file_ok()
  828|       |			 */
  829|      0|			*filename = iter->glob.gl_pathv[iter->gl_current];
  830|      0|		}
  831|      0|		break;
  832|      0|#endif
  833|      0|	}
  834|       |
  835|      0|	return 0 + (*filename != NULL);
  836|      0|}
fr_globdir_iter_next:
  852|    114|{
  853|    114|	switch (iter->type) {
  ------------------
  |  Branch (853:10): [True: 114, False: 0]
  ------------------
  854|      0|	case FR_GLOBDIR_INVALID:
  ------------------
  |  Branch (854:2): [True: 0, False: 114]
  ------------------
  855|      0|		break;
  856|       |
  857|    114|	case FR_GLOBDIR_FILE:
  ------------------
  |  Branch (857:2): [True: 114, False: 0]
  ------------------
  858|    114|		*filename = NULL;
  859|    114|		return 0;
  860|       |
  861|      0|#ifdef HAVE_DIRENT_H
  862|      0|	case FR_GLOBDIR_DIR:
  ------------------
  |  Branch (862:2): [True: 0, False: 114]
  ------------------
  863|      0|		if (fr_globdir_dir_next(filename, iter) < 0) return -1;
  ------------------
  |  Branch (863:7): [True: 0, False: 0]
  ------------------
  864|       |
  865|      0|		return 0 + (*filename != NULL);
  866|      0|#endif
  867|       |
  868|      0|#ifdef HAVE_GLOB_H
  869|      0|	case FR_GLOBDIR_GLOB:
  ------------------
  |  Branch (869:2): [True: 0, False: 114]
  ------------------
  870|      0|		iter->gl_current++;
  871|      0|		if (iter->gl_current >= iter->glob.gl_pathc) {
  ------------------
  |  Branch (871:7): [True: 0, False: 0]
  ------------------
  872|      0|			return 0;
  873|      0|		}
  874|       |
  875|      0|		*filename = iter->glob.gl_pathv[iter->gl_current];
  876|      0|		fr_assert(*filename != NULL);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  877|       |
  878|      0|		return 1;
  879|    114|#endif
  880|    114|	}
  881|       |
  882|      0|	return -1;
  883|    114|}
fr_globdir_iter_free:
  886|    114|{
  887|    114|	if (iter->path) {
  ------------------
  |  Branch (887:6): [True: 0, False: 114]
  ------------------
  888|      0|		free(iter->path);
  889|      0|		iter->path = NULL;
  890|      0|	}
  891|       |
  892|    114|	switch (iter->type) {
  ------------------
  |  Branch (892:10): [True: 114, False: 0]
  ------------------
  893|      0|	case FR_GLOBDIR_INVALID:
  ------------------
  |  Branch (893:2): [True: 0, False: 114]
  ------------------
  894|      0|		return -1;
  895|       |
  896|    114|	case FR_GLOBDIR_FILE:
  ------------------
  |  Branch (896:2): [True: 114, False: 0]
  ------------------
  897|    114|		break;
  898|       |
  899|      0|#ifdef HAVE_DIRENT_H
  900|      0|	case FR_GLOBDIR_DIR:
  ------------------
  |  Branch (900:2): [True: 0, False: 114]
  ------------------
  901|      0|		if (!iter->dir) return 0;
  ------------------
  |  Branch (901:7): [True: 0, False: 0]
  ------------------
  902|       |
  903|      0|		return closedir(iter->dir);
  904|      0|#endif
  905|       |
  906|      0|#ifdef HAVE_GLOB_H
  907|      0|	case FR_GLOBDIR_GLOB:
  ------------------
  |  Branch (907:2): [True: 0, False: 114]
  ------------------
  908|      0|		globfree(&iter->glob);
  909|      0|		break;
  910|    114|#endif
  911|    114|	}
  912|       |
  913|    114|	return 0;
  914|    114|}

_fr_hash_table_alloc:
  289|    380|{
  290|    380|	fr_hash_table_t *ht;
  291|       |
  292|    380|	ht = talloc(ctx, fr_hash_table_t);
  293|    380|	if (!ht) return NULL;
  ------------------
  |  Branch (293:6): [True: 0, False: 380]
  ------------------
  294|    380|	talloc_set_destructor(ht, _fr_hash_table_free);
  ------------------
  |  Branch (294:2): [Folded, False: 380]
  ------------------
  295|       |
  296|    380|	*ht = (fr_hash_table_t){
  297|    380|		.type = type,
  298|    380|		.free = free_func,
  299|    380|		.hash = hash_func,
  300|    380|		.cmp = cmp_func,
  301|    380|		.num_buckets = FR_HASH_NUM_BUCKETS,
  ------------------
  |  |   41|    380|#define FR_HASH_NUM_BUCKETS (64)
  ------------------
  302|    380|		.mask = FR_HASH_NUM_BUCKETS - 1,
  ------------------
  |  |   41|    380|#define FR_HASH_NUM_BUCKETS (64)
  ------------------
  303|       |
  304|       |		/*
  305|       |		 *	Have a default load factor of 2.5.  In practice this
  306|       |		 *	means that the average load will hit 3 before the
  307|       |		 *	table grows.
  308|       |		 */
  309|    380|		.next_grow = (FR_HASH_NUM_BUCKETS << 1) + (FR_HASH_NUM_BUCKETS >> 1),
  ------------------
  |  |   41|    380|#define FR_HASH_NUM_BUCKETS (64)
  ------------------
              		.next_grow = (FR_HASH_NUM_BUCKETS << 1) + (FR_HASH_NUM_BUCKETS >> 1),
  ------------------
  |  |   41|    380|#define FR_HASH_NUM_BUCKETS (64)
  ------------------
  310|    380|		.buckets = talloc_zero_array(ht, fr_hash_entry_t *, FR_HASH_NUM_BUCKETS)
  311|    380|	};
  312|    380|	if (unlikely(!ht->buckets)) {
  ------------------
  |  |  397|    380|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 380]
  |  |  ------------------
  ------------------
  313|      0|		talloc_free(ht);
  314|      0|		return NULL;
  315|      0|	}
  316|       |
  317|    380|	ht->null.reversed = ~0;
  318|    380|	ht->null.key = ~0;
  319|    380|	ht->null.next = &ht->null;
  320|    380|	ht->buckets[0] = &ht->null;
  321|       |
  322|    380|	return ht;
  323|    380|}
fr_hash_table_find:
  451|  5.09k|{
  452|  5.09k|	fr_hash_entry_t *node;
  453|       |
  454|  5.09k|	node = hash_table_find(ht, ht->hash(data), data);
  455|  5.09k|	if (!node) return NULL;
  ------------------
  |  Branch (455:6): [True: 3.24k, False: 1.84k]
  ------------------
  456|       |
  457|  1.84k|	return UNCONST(void *, node->data);
  ------------------
  |  |  186|  1.84k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  458|  5.09k|}
fr_hash_table_insert:
  490|  3.32k|{
  491|  3.32k|	uint32_t		key;
  492|  3.32k|	uint32_t		entry;
  493|  3.32k|	uint32_t		reversed;
  494|  3.32k|	fr_hash_entry_t		*node;
  495|       |
  496|  3.32k|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  497|  3.32k|	if (ht->type) (void)_talloc_get_type_abort(data, ht->type, __location__);
  ------------------
  |  Branch (497:6): [True: 3.29k, False: 24]
  ------------------
  498|  3.32k|#endif
  499|       |
  500|  3.32k|	if (ht->num_elements >= TABLE_MAX) return false;
  ------------------
  |  |  387|  3.32k|#define TABLE_MAX ((uint32_t) 0x20000000)
  ------------------
  |  Branch (500:6): [True: 0, False: 3.32k]
  ------------------
  501|       |
  502|  3.32k|	key = ht->hash(data);
  503|  3.32k|	entry = key & ht->mask;
  504|  3.32k|	reversed = reverse(key);
  505|       |
  506|  3.32k|	if (!ht->buckets[entry]) fr_hash_table_fixup(ht, entry);
  ------------------
  |  Branch (506:6): [True: 640, False: 2.68k]
  ------------------
  507|       |
  508|       |	/*
  509|       |	 *	If we try to do our own memory allocation here, the
  510|       |	 *	speedup is only ~15% or so, which isn't worth it.
  511|       |	 */
  512|  3.32k|	node = talloc_zero(ht, fr_hash_entry_t);
  513|  3.32k|	if (unlikely(!node)) return false;
  ------------------
  |  |  397|  3.32k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 3.32k]
  |  |  ------------------
  ------------------
  514|       |
  515|  3.32k|	node->next = &ht->null;
  516|  3.32k|	node->reversed = reversed;
  517|  3.32k|	node->key = key;
  518|  3.32k|	node->data = UNCONST(void *, data);
  ------------------
  |  |  186|  3.32k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  519|       |
  520|       |	/* already in the table, can't insert it */
  521|  3.32k|	if (!list_insert(ht, &ht->buckets[entry], node)) {
  ------------------
  |  Branch (521:6): [True: 16, False: 3.30k]
  ------------------
  522|     16|		talloc_free(node);
  523|     16|		return false;
  524|     16|	}
  525|       |
  526|       |	/*
  527|       |	 *	Check the load factor, and grow the table if
  528|       |	 *	necessary.
  529|       |	 */
  530|  3.30k|	ht->num_elements++;
  531|  3.30k|	if (ht->num_elements >= ht->next_grow) fr_hash_table_grow(ht);
  ------------------
  |  Branch (531:6): [True: 6, False: 3.30k]
  ------------------
  532|       |
  533|  3.30k|	return true;
  534|  3.32k|}
fr_hash_table_replace:
  552|    738|{
  553|    738|	fr_hash_entry_t *node;
  554|       |
  555|    738|	node = hash_table_find(ht, ht->hash(data), data);
  556|    738|	if (!node) {
  ------------------
  |  Branch (556:6): [True: 720, False: 18]
  ------------------
  557|    720|		if (old) *old = NULL;
  ------------------
  |  Branch (557:7): [True: 0, False: 720]
  ------------------
  558|    720|		return fr_hash_table_insert(ht, data) ? 1 : -1;
  ------------------
  |  Branch (558:10): [True: 720, False: 0]
  ------------------
  559|    720|	}
  560|       |
  561|     18|	if (old) {
  ------------------
  |  Branch (561:6): [True: 0, False: 18]
  ------------------
  562|      0|		*old = node->data;
  563|     18|	} else if (ht->free) {
  ------------------
  |  Branch (563:13): [True: 0, False: 18]
  ------------------
  564|      0|		ht->free(node->data);
  565|      0|	}
  566|       |
  567|     18|	node->data = UNCONST(void *, data);
  ------------------
  |  |  186|     18|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  568|       |
  569|     18|	return 0;
  570|    738|}
fr_hash_table_remove:
  583|      4|{
  584|      4|	uint32_t		key;
  585|      4|	uint32_t		entry;
  586|      4|	uint32_t		reversed;
  587|      4|	void			*old;
  588|      4|	fr_hash_entry_t		*node;
  589|       |
  590|      4|	key = ht->hash(data);
  591|      4|	entry = key & ht->mask;
  592|      4|	reversed = reverse(key);
  593|       |
  594|      4|	if (!ht->buckets[entry]) fr_hash_table_fixup(ht, entry);
  ------------------
  |  Branch (594:6): [True: 0, False: 4]
  ------------------
  595|       |
  596|      4|	node = list_find(ht, ht->buckets[entry], reversed, data);
  597|      4|	if (!node) return NULL;
  ------------------
  |  Branch (597:6): [True: 0, False: 4]
  ------------------
  598|       |
  599|      4|	list_delete(ht, &ht->buckets[entry], node);
  600|      4|	ht->num_elements--;
  601|       |
  602|      4|	old = node->data;
  603|      4|	talloc_free(node);
  604|       |
  605|      4|	return old;
  606|      4|}
fr_hash_table_delete:
  618|      4|{
  619|      4|	void *old;
  620|       |
  621|      4|	old = fr_hash_table_remove(ht, data);
  622|      4|	if (!old) return false;
  ------------------
  |  Branch (622:6): [True: 0, False: 4]
  ------------------
  623|       |
  624|      4|	if (ht->free) ht->free(old);
  ------------------
  |  Branch (624:6): [True: 0, False: 4]
  ------------------
  625|       |
  626|      4|	return true;
  627|      4|}
fr_hash_table_num_elements:
  634|      2|{
  635|      2|	return ht->num_elements;
  636|      2|}
fr_hash_table_iter_next:
  650|  5.38M|{
  651|  5.38M|	fr_hash_entry_t *node;
  652|  5.38M|	uint32_t	i;
  653|       |
  654|       |	/*
  655|       |	 *	Return the next element in the bucket.
  656|       |	 */
  657|  5.38M|	if (iter->next != &ht->null) {
  ------------------
  |  Branch (657:6): [True: 2.55M, False: 2.83M]
  ------------------
  658|  2.55M|		node = iter->next;
  659|  2.55M|		iter->next = node->next;
  660|       |
  661|  2.55M|		return node->data;
  662|  2.55M|	}
  663|       |
  664|       |	/*
  665|       |	 *	We've wrapped around to bucket 0 again.  That means we're done.
  666|       |	 */
  667|  2.83M|	if (iter->bucket == 0) return NULL;
  ------------------
  |  Branch (667:6): [True: 26.8k, False: 2.80M]
  ------------------
  668|       |
  669|       |	/*
  670|       |	 *	We might have to go through multiple empty
  671|       |	 *	buckets to find one that contains something
  672|       |	 *	we should return
  673|       |	 */
  674|  2.80M|	i = iter->bucket - 1;
  675|  4.32M|	for (;;) {
  676|  4.32M|		if (!ht->buckets[i]) fr_hash_table_fixup(ht, i);
  ------------------
  |  Branch (676:7): [True: 6.95k, False: 4.31M]
  ------------------
  677|       |
  678|  4.32M|		node = ht->buckets[i];
  679|  4.32M|		if (node == &ht->null) {
  ------------------
  |  Branch (679:7): [True: 1.53M, False: 2.79M]
  ------------------
  680|  1.53M|			if (i == 0) break;
  ------------------
  |  Branch (680:8): [True: 17.4k, False: 1.51M]
  ------------------
  681|  1.51M|			i--;
  682|  1.51M|			continue;	/* This bucket was empty too... */
  683|  1.53M|		}
  684|       |
  685|  2.79M|		iter->next = node->next;		/* Store the next one to examine */
  686|  2.79M|		iter->bucket = i;
  687|  2.79M|		return node->data;
  688|  4.32M|	}
  689|  17.4k|	iter->bucket = i;
  690|       |
  691|       |	return NULL;
  692|  2.80M|}
fr_hash_table_iter_init:
  705|  44.2k|{
  706|  44.2k|	iter->bucket = ht->num_buckets;
  707|  44.2k|	iter->next = &ht->null;
  708|       |
  709|  44.2k|	return fr_hash_table_iter_next(ht, iter);
  710|  44.2k|}
fr_hash_table_flatten:
  722|      2|{
  723|      2|	uint64_t	num = fr_hash_table_num_elements(ht), i;
  724|      2|	fr_hash_iter_t	iter;
  725|      2|	void		*item, **list;
  726|       |
  727|      2|	if (unlikely(!(list = talloc_array(ctx, void *, num)))) return -1;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  728|       |
  729|      2|	for (item = fr_hash_table_iter_init(ht, &iter), i = 0;
  730|      2|	     item;
  ------------------
  |  Branch (730:7): [True: 0, False: 2]
  ------------------
  731|      2|	     item = fr_hash_table_iter_next(ht, &iter), i++) list[i] = item;
  732|       |
  733|      2|	*out = list;
  734|       |
  735|      2|	return 0;
  736|      2|}
fr_hash:
  848|  1.66k|{
  849|  1.66k|	uint8_t const *p = data;
  850|  1.66k|	uint8_t const *q = p + size;
  851|  1.66k|	uint32_t      hash = FNV_MAGIC_INIT;
  ------------------
  |  |  836|  1.66k|#define FNV_MAGIC_INIT (0x811c9dc5)
  ------------------
  852|       |
  853|       |	/*
  854|       |	 *	FNV-1 hash each octet in the buffer
  855|       |	 */
  856|  5.31k|	while (p != q) {
  ------------------
  |  Branch (856:9): [True: 3.65k, False: 1.66k]
  ------------------
  857|       |		/*
  858|       |		 *	XOR the 8-bit quantity into the bottom of
  859|       |		 *	the hash.
  860|       |		 */
  861|  3.65k|		hash ^= (uint32_t) (*p++);
  862|       |
  863|       |		/*
  864|       |		 *	Multiply by 32-bit magic FNV prime, mod 2^32
  865|       |		 */
  866|  3.65k|		hash *= FNV_MAGIC_PRIME;
  ------------------
  |  |  837|  3.65k|#define FNV_MAGIC_PRIME (0x01000193)
  ------------------
  867|       |#if 0
  868|       |		/*
  869|       |		 *	Potential optimization.
  870|       |		 */
  871|       |		hash += (hash<<1) + (hash<<4) + (hash<<7) + (hash<<8) + (hash<<24);
  872|       |#endif
  873|  3.65k|	}
  874|       |
  875|  1.66k|	return hash;
  876|  1.66k|}
fr_hash_table_verify:
  988|  44.2k|{
  989|  44.2k|	fr_hash_iter_t	iter;
  990|  44.2k|	void		*ptr;
  991|       |
  992|  44.2k|	(void)talloc_get_type_abort(ht, fr_hash_table_t);
  993|  44.2k|	(void)talloc_get_type_abort(ht->buckets, fr_hash_entry_t *);
  994|       |
  995|  44.2k|	fr_assert(talloc_array_length(ht->buckets) == ht->num_buckets);
  ------------------
  |  |  194|  44.2k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  44.2k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 44.2k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  996|       |
  997|       |	/*
  998|       |	 *	Check talloc headers on all data
  999|       |	 */
 1000|  44.2k|	if (ht->type) {
  ------------------
  |  Branch (1000:6): [True: 44.2k, False: 0]
  ------------------
 1001|  44.2k|		for (ptr = fr_hash_table_iter_init(ht, &iter);
 1002|  5.38M|		     ptr;
  ------------------
  |  Branch (1002:8): [True: 5.34M, False: 44.2k]
  ------------------
 1003|  5.34M|		     ptr = fr_hash_table_iter_next(ht, &iter)) {
 1004|       |			(void)_talloc_get_type_abort(ptr, ht->type, __location__);
 1005|  5.34M|		}
 1006|  44.2k|	}
 1007|  44.2k|}
hash.c:_fr_hash_table_free:
  259|    376|{
  260|    376|	uint32_t i;
  261|    376|	fr_hash_entry_t *node, *next;
  262|       |
  263|    376|	if (ht->free) {
  ------------------
  |  Branch (263:6): [True: 0, False: 376]
  ------------------
  264|      0|		for (i = 0; i < ht->num_buckets; i++) {
  ------------------
  |  Branch (264:15): [True: 0, False: 0]
  ------------------
  265|      0|			if (ht->buckets[i]) for (node = ht->buckets[i];
  ------------------
  |  Branch (265:8): [True: 0, False: 0]
  ------------------
  266|      0|						 node != &ht->null;
  ------------------
  |  Branch (266:8): [True: 0, False: 0]
  ------------------
  267|      0|						 node = next) {
  268|      0|				next = node->next;
  269|      0|				if (!node->data) continue; /* dummy entry */
  ------------------
  |  Branch (269:9): [True: 0, False: 0]
  ------------------
  270|       |
  271|      0|				ht->free(node->data);
  272|      0|			}
  273|      0|		}
  274|      0|	}
  275|       |
  276|    376|	return 0;
  277|    376|}
hash.c:hash_table_find:
  428|  5.82k|{
  429|  5.82k|	uint32_t entry;
  430|  5.82k|	uint32_t reversed;
  431|       |
  432|  5.82k|	entry = key & ht->mask;
  433|  5.82k|	reversed = reverse(key);
  434|       |
  435|  5.82k|	if (!ht->buckets[entry]) fr_hash_table_fixup(ht, entry);
  ------------------
  |  Branch (435:6): [True: 578, False: 5.25k]
  ------------------
  436|       |
  437|  5.82k|	return list_find(ht, ht->buckets[entry], reversed, data);
  438|  5.82k|}
hash.c:reverse:
  152|  9.15k|{
  153|       |	/*
  154|       |	 *	Cast to uint32_t is required because the
  155|       |	 *	default type of of the expression is an
  156|       |	 *	int and ubsan correctly complains that
  157|       |	 *	the result of 0xff << 24 won't fit in a
  158|       |	 *	signed 32bit integer.
  159|       |	 */
  160|  9.15k|	return (((uint32_t)reversed_byte[key & 0xff] << 24) |
  161|  9.15k|		((uint32_t)reversed_byte[(key >> 8) & 0xff] << 16) |
  162|  9.15k|		((uint32_t)reversed_byte[(key >> 16) & 0xff] << 8) |
  163|  9.15k|		((uint32_t)reversed_byte[(key >> 24) & 0xff]));
  164|  9.15k|}
hash.c:fr_hash_table_fixup:
  337|  15.7k|{
  338|  15.7k|	uint32_t parent_entry;
  339|  15.7k|	fr_hash_entry_t **last, *cur;
  340|  15.7k|	uint32_t this;
  341|       |
  342|  15.7k|	parent_entry = parent_of(entry);
  343|       |
  344|       |	/* parent_entry == entry if and only if entry == 0 */
  345|       |
  346|  15.7k|	if (!ht->buckets[parent_entry]) {
  ------------------
  |  Branch (346:6): [True: 7.54k, False: 8.17k]
  ------------------
  347|  7.54k|		fr_hash_table_fixup(ht, parent_entry);
  348|  7.54k|	}
  349|       |
  350|       |	/*
  351|       |	 *	Keep walking down cur, trying to find entries that
  352|       |	 *	don't belong here any more.  There may be multiple
  353|       |	 *	ones, so we can't have a naive algorithm...
  354|       |	 */
  355|  15.7k|	last = &ht->buckets[parent_entry];
  356|  15.7k|	this = parent_entry;
  357|       |
  358|  17.2k|	for (cur = *last; cur != &ht->null; cur = cur->next) {
  ------------------
  |  Branch (358:20): [True: 1.56k, False: 15.7k]
  ------------------
  359|  1.56k|		uint32_t real_entry;
  360|       |
  361|  1.56k|		real_entry = cur->key & ht->mask;
  362|  1.56k|		if (real_entry != this) { /* ht->buckets[real_entry] == NULL */
  ------------------
  |  Branch (362:7): [True: 382, False: 1.18k]
  ------------------
  363|    382|			*last = &ht->null;
  364|    382|			ht->buckets[real_entry] = cur;
  365|    382|			this = real_entry;
  366|    382|		}
  367|       |
  368|  1.56k|		last = &(cur->next);
  369|  1.56k|	}
  370|       |
  371|       |	/*
  372|       |	 *	We may NOT have initialized this bucket, so do it now.
  373|       |	 */
  374|  15.7k|	if (!ht->buckets[entry]) ht->buckets[entry] = &ht->null;
  ------------------
  |  Branch (374:6): [True: 15.3k, False: 382]
  ------------------
  375|  15.7k|}
hash.c:parent_of:
  170|  15.7k|{
  171|  15.7k|	if (key > 0x00ffffff)
  ------------------
  |  Branch (171:6): [True: 0, False: 15.7k]
  ------------------
  172|      0|		return (key & 0x00ffffff) | (parent_byte[key >> 24] << 24);
  173|       |
  174|  15.7k|	if (key > 0x0000ffff)
  ------------------
  |  Branch (174:6): [True: 0, False: 15.7k]
  ------------------
  175|      0|		return (key & 0x0000ffff) | (parent_byte[key >> 16] << 16);
  176|       |
  177|  15.7k|	if (key > 0x000000ff)
  ------------------
  |  Branch (177:6): [True: 0, False: 15.7k]
  ------------------
  178|      0|		return (key & 0x000000ff) | (parent_byte[key >> 8] << 8);
  179|       |
  180|  15.7k|	return parent_byte[key];
  181|  15.7k|}
hash.c:list_insert:
  212|  3.32k|{
  213|  3.32k|	fr_hash_entry_t **last, *cur;
  214|       |
  215|  3.32k|	last = head;
  216|       |
  217|  4.34k|	for (cur = *head; cur != &ht->null; last = &(cur->next), cur = cur->next) {
  ------------------
  |  Branch (217:20): [True: 1.70k, False: 2.64k]
  ------------------
  218|  1.70k|		if (cur->reversed > node->reversed) break;
  ------------------
  |  Branch (218:7): [True: 660, False: 1.04k]
  ------------------
  219|       |
  220|  1.04k|		if (cur->reversed == node->reversed) {
  ------------------
  |  Branch (220:7): [True: 16, False: 1.02k]
  ------------------
  221|     16|			if (ht->cmp) {
  ------------------
  |  Branch (221:8): [True: 16, False: 0]
  ------------------
  222|     16|				int8_t cmp = ht->cmp(node->data, cur->data);
  223|     16|				if (cmp > 0) break;
  ------------------
  |  Branch (223:9): [True: 0, False: 16]
  ------------------
  224|     16|				if (cmp < 0) continue;
  ------------------
  |  Branch (224:9): [True: 0, False: 16]
  ------------------
  225|     16|			}
  226|     16|			return false;
  227|     16|		}
  228|  1.04k|	}
  229|       |
  230|  3.30k|	node->next = *last;
  231|  3.30k|	*last = node;
  232|       |
  233|  3.30k|	return true;
  234|  3.32k|}
hash.c:fr_hash_table_grow:
  393|      6|{
  394|      6|	fr_hash_entry_t **buckets;
  395|      6|	size_t existing = talloc_get_size(ht->buckets);
  396|      6|	size_t expanded;
  397|       |
  398|       |	/*
  399|       |	 *	Cap the growth, because we need to be able to set a
  400|       |	 *	mask, etc.
  401|       |	 */
  402|      6|	if (ht->num_buckets >= TABLE_MAX) return;
  ------------------
  |  |  387|      6|#define TABLE_MAX ((uint32_t) 0x20000000)
  ------------------
  |  Branch (402:6): [True: 0, False: 6]
  ------------------
  403|       |
  404|      6|	expanded = GROW_FACTOR * ht->num_buckets;
  ------------------
  |  |  381|      6|#define GROW_FACTOR (2)
  ------------------
  405|      6|	if (expanded > TABLE_MAX) expanded = TABLE_MAX;
  ------------------
  |  |  387|      6|#define TABLE_MAX ((uint32_t) 0x20000000)
  ------------------
              	if (expanded > TABLE_MAX) expanded = TABLE_MAX;
  ------------------
  |  |  387|      0|#define TABLE_MAX ((uint32_t) 0x20000000)
  ------------------
  |  Branch (405:6): [True: 0, False: 6]
  ------------------
  406|       |
  407|      6|	buckets = talloc_realloc(ht, ht->buckets, fr_hash_entry_t *, expanded);
  408|      6|	if (!buckets) return;
  ------------------
  |  Branch (408:6): [True: 0, False: 6]
  ------------------
  409|       |
  410|      6|	memset(((uint8_t *)buckets) + existing, 0, talloc_get_size(buckets) - existing);
  411|       |
  412|      6|	ht->buckets = buckets;
  413|      6|	ht->num_buckets = expanded;
  414|      6|	ht->mask = ht->num_buckets - 1;
  415|      6|	ht->next_grow *= GROW_FACTOR;
  ------------------
  |  |  381|      6|#define GROW_FACTOR (2)
  ------------------
  416|       |
  417|       |#ifdef TESTING
  418|       |	grow = 1;
  419|       |	fprintf(stderr, "GROW TO %d\n", ht->num_buckets);
  420|       |#endif
  421|      6|}
hash.c:list_find:
  187|  5.83k|{
  188|  5.83k|	fr_hash_entry_t *cur;
  189|       |
  190|  8.34k|	for (cur = head; cur != &ht->null; cur = cur->next) {
  ------------------
  |  Branch (190:19): [True: 5.43k, False: 2.91k]
  ------------------
  191|  5.43k|		if (cur->reversed == reversed) {
  ------------------
  |  Branch (191:7): [True: 1.86k, False: 3.56k]
  ------------------
  192|  1.86k|			if (ht->cmp) {
  ------------------
  |  Branch (192:8): [True: 1.86k, False: 0]
  ------------------
  193|  1.86k|				int cmp = ht->cmp(data, cur->data);
  194|  1.86k|				if (cmp > 0) break;
  ------------------
  |  Branch (194:9): [True: 0, False: 1.86k]
  ------------------
  195|  1.86k|				if (cmp < 0) continue;
  ------------------
  |  Branch (195:9): [True: 0, False: 1.86k]
  ------------------
  196|  1.86k|			}
  197|  1.86k|			return cur;
  198|  1.86k|		}
  199|  3.56k|		if (cur->reversed > reversed) break;
  ------------------
  |  Branch (199:7): [True: 1.05k, False: 2.51k]
  ------------------
  200|  3.56k|	}
  201|       |
  202|  3.96k|	return NULL;
  203|  5.83k|}
hash.c:list_delete:
  242|      4|{
  243|      4|	fr_hash_entry_t **last, *cur;
  244|       |
  245|      4|	last = head;
  246|       |
  247|      4|	for (cur = *head; cur != &ht->null; cur = cur->next) {
  ------------------
  |  Branch (247:20): [True: 4, False: 0]
  ------------------
  248|      4|		if (cur == node) {
  ------------------
  |  Branch (248:7): [True: 4, False: 0]
  ------------------
  249|      4|			*last = node->next;
  250|      4|			return;
  251|      4|		}
  252|      0|		last = &(cur->next);
  253|      0|	}
  254|       |
  255|      0|	fr_assert(0);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|      0|}

fr_ipaddr_mask:
  219|     93|{
  220|       |
  221|     93|	switch (addr->af) {
  222|      0|	case AF_INET:
  ------------------
  |  Branch (222:2): [True: 0, False: 93]
  ------------------
  223|      0|		addr->addr.v4 = fr_inaddr_mask(&addr->addr.v4, prefix);
  224|      0|		break;
  225|       |
  226|     93|	case AF_INET6:
  ------------------
  |  Branch (226:2): [True: 93, False: 0]
  ------------------
  227|     93|		addr->addr.v6 = fr_in6addr_mask(&addr->addr.v6, prefix);
  228|     93|		break;
  229|       |
  230|      0|	default:
  ------------------
  |  Branch (230:2): [True: 0, False: 93]
  ------------------
  231|      0|		return;
  232|     93|	}
  233|     93|	addr->prefix = prefix;
  234|     93|}
inet.c:fr_in6addr_mask:
  169|     93|{
  170|     93|	uint64_t addr;					/* Needed for alignment */
  171|     93|	uint64_t ret[2], *o = ret;
  172|     93|	uint8_t i = 0;
  173|       |
  174|     93|	if (prefix > 128) prefix = 128;
  ------------------
  |  Branch (174:6): [True: 0, False: 93]
  ------------------
  175|       |
  176|       |	/* Short circuit */
  177|     93|	if (prefix == 128) return *ipaddr;
  ------------------
  |  Branch (177:6): [True: 93, False: 0]
  ------------------
  178|       |
  179|      0|	if (prefix >= 64) {
  ------------------
  |  Branch (179:6): [True: 0, False: 0]
  ------------------
  180|      0|		prefix -= 64;
  181|      0|		addr = (uint64_t)ipaddr->s6_addr[i] |
  182|      0|			((uint64_t)ipaddr->s6_addr[i + 1] << 8) |
  183|      0|			((uint64_t)ipaddr->s6_addr[i + 2] << 16) |
  184|      0|			((uint64_t)ipaddr->s6_addr[i + 3] << 24) |
  185|      0|			((uint64_t)ipaddr->s6_addr[i + 4] << 32) |
  186|      0|			((uint64_t)ipaddr->s6_addr[i + 5] << 40) |
  187|      0|			((uint64_t)ipaddr->s6_addr[i + 6] << 48) |
  188|      0|			((uint64_t)ipaddr->s6_addr[i + 7] << 56);
  189|      0|		*o++ = 0xffffffffffffffffULL & addr;	/* lhs portion masked */
  190|      0|		i += 8;
  191|      0|	} else {
  192|      0|		ret[1] = 0;				/* rhs portion zeroed */
  193|      0|	}
  194|       |
  195|       |	/* Max left shift is 63 else we get overflow */
  196|      0|	if (prefix > 0) {
  ------------------
  |  Branch (196:6): [True: 0, False: 0]
  ------------------
  197|      0|		addr = (uint64_t)ipaddr->s6_addr[i] |
  198|      0|			((uint64_t)ipaddr->s6_addr[i + 1] << 8) |
  199|      0|			((uint64_t)ipaddr->s6_addr[i + 2] << 16) |
  200|      0|			((uint64_t)ipaddr->s6_addr[i + 3] << 24) |
  201|      0|			((uint64_t)ipaddr->s6_addr[i + 4] << 32) |
  202|      0|			((uint64_t)ipaddr->s6_addr[i + 5] << 40) |
  203|      0|			((uint64_t)ipaddr->s6_addr[i + 6] << 48) |
  204|      0|			((uint64_t)ipaddr->s6_addr[i + 7] << 56);
  205|      0|		*o = htonll(~((uint64_t)(0x0000000000000001ULL << (64 - prefix)) - 1)) & addr;
  ------------------
  |  |  502|      0|#  define htonll(x) ntohll(x)
  |  |  ------------------
  |  |  |  |  495|      0|#      define ntohll(x) ((uint64_t)__builtin_bswap64(x))
  |  |  ------------------
  ------------------
  206|      0|	} else {
  207|      0|		*o = 0;
  208|      0|	}
  209|       |
  210|      0|	return *(struct in6_addr *) &ret;
  211|     93|}

fr_set_signal:
   48|     10|{
   49|     10|#ifdef HAVE_SIGACTION
   50|     10|	struct sigaction act;
   51|       |
   52|     10|	memset(&act, 0, sizeof(act));
   53|     10|	act.sa_flags = 0;
   54|     10|	sigemptyset(&act.sa_mask);
   55|     10|	act.sa_handler = func;
   56|       |
   57|     10|	if (sigaction(sig, &act, NULL) < 0) {
  ------------------
  |  Branch (57:6): [True: 0, False: 10]
  ------------------
   58|      0|		fr_strerror_printf("Failed setting signal %i handler via sigaction(): %s", sig, fr_syserror(errno));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   58|      0|		fr_strerror_printf("Failed setting signal %i handler via sigaction(): %s", sig, fr_syserror(errno));
  |  |  ------------------
  ------------------
   59|      0|		return -1;
   60|      0|	}
   61|       |#else
   62|       |	if (signal(sig, func) < 0) {
   63|       |		fr_strerror_printf("Failed setting signal %i handler via signal(): %s", sig, fr_syserror(errno));
   64|       |		return -1;
   65|       |	}
   66|       |#endif
   67|     10|	return 0;
   68|     10|}

fr_pair_list_init:
   47|  11.0k|{
   48|       |	/*
   49|       |	 *	Initialises the order list.  This
   50|       |	 *	maintains the overall order of attributes
   51|       |	 *	in the list and allows us to iterate over
   52|       |	 *	all of them.
   53|       |	 */
   54|  11.0k|	fr_pair_order_list_talloc_init(&list->order);
   55|       |
   56|  11.0k|#ifdef WITH_VERIFY_PTR
   57|  11.0k|	list->verified = true;
   58|  11.0k|#endif
   59|  11.0k|	list->is_child = false;
   60|  11.0k|}
fr_pair_alloc_null:
  170|  24.8k|{
  171|  24.8k|	fr_pair_t *vp;
  172|       |
  173|  24.8k|	vp = talloc_zero(ctx, fr_pair_t);
  174|  24.8k|	if (!vp) {
  ------------------
  |  Branch (174:6): [True: 0, False: 24.8k]
  ------------------
  175|      0|		fr_strerror_printf("Out of memory");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  176|      0|		return NULL;
  177|      0|	}
  178|  24.8k|	talloc_set_destructor(vp, _fr_pair_free);
  ------------------
  |  Branch (178:2): [Folded, False: 24.8k]
  ------------------
  179|       |
  180|  24.8k|	PAIR_ALLOCED(vp);
  ------------------
  |  |  174|  24.8k|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 24.8k]
  |  |  ------------------
  ------------------
  181|  24.8k|	pair_init_null(vp);
  182|       |
  183|  24.8k|	return vp;
  184|  24.8k|}
fr_pair_afrom_da:
  291|  24.8k|{
  292|  24.8k|	fr_pair_t *vp;
  293|       |
  294|  24.8k|	vp = fr_pair_alloc_null(ctx);
  295|  24.8k|	if (!vp) {
  ------------------
  |  Branch (295:6): [True: 0, False: 24.8k]
  ------------------
  296|      0|	oom:
  297|      0|		fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  298|      0|		return NULL;
  299|      0|	}
  300|       |
  301|       |	/*
  302|       |	 *	If we get passed an unknown da, we need to ensure that
  303|       |	 *	it's parented by "vp".
  304|       |	 */
  305|  24.8k|	if (da->flags.is_unknown) {
  ------------------
  |  Branch (305:6): [True: 2.72k, False: 22.1k]
  ------------------
  306|  2.72k|		fr_dict_attr_t const *unknown;
  307|       |
  308|  2.72k|		unknown = fr_dict_attr_unknown_copy(vp, da);
  309|  2.72k|		if (!unknown) {
  ------------------
  |  Branch (309:7): [True: 0, False: 2.72k]
  ------------------
  310|      0|			talloc_free(vp);
  311|      0|			goto oom;
  312|      0|		}
  313|  2.72k|		da = unknown;
  314|  2.72k|	}
  315|       |
  316|  24.8k|	PAIR_ALLOCED(vp);
  ------------------
  |  |  174|  24.8k|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 24.8k]
  |  |  ------------------
  ------------------
  317|  24.8k|	pair_init_from_da(vp, da);
  318|       |
  319|  24.8k|	return vp;
  320|  24.8k|}
fr_pair_raw_afrom_pair:
  610|  1.41k|{
  611|  1.41k|	fr_dict_attr_t *unknown;
  612|       |
  613|  1.41k|	PAIR_VERIFY(vp);
  ------------------
  |  |  167|  1.41k|#  define PAIR_VERIFY(_x)		fr_pair_verify(__FILE__, __LINE__, NULL, NULL, _x, true)
  ------------------
  614|       |
  615|  1.41k|	if (!fr_cond_assert(vp->da->flags.is_unknown == false)) return -1;
  ------------------
  |  |  131|  1.41k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  2.83k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 1.41k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (615:6): [True: 0, False: 1.41k]
  ------------------
  616|       |
  617|  1.41k|	if (!fr_cond_assert(vp->da->parent != NULL)) return -1;
  ------------------
  |  |  131|  1.41k|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|  2.83k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 1.41k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (617:6): [True: 0, False: 1.41k]
  ------------------
  618|       |
  619|  1.41k|	unknown = fr_dict_attr_unknown_afrom_da(vp, vp->da);
  620|  1.41k|	if (!unknown) return -1;
  ------------------
  |  Branch (620:6): [True: 0, False: 1.41k]
  ------------------
  621|       |
  622|  1.41k|	fr_value_box_clear(&vp->data);
  623|       |
  624|  1.41k|	vp->da = unknown;
  625|  1.41k|	fr_assert(vp->da->type == FR_TYPE_OCTETS);
  ------------------
  |  |  194|  1.41k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  1.41k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 1.41k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  626|       |
  627|       |	return fr_value_box_memdup(vp, &vp->data, NULL, data, data_len, true);
  628|  1.41k|}
fr_pair_find_by_da:
  708|  2.27k|{
  709|  2.27k|	fr_pair_t *vp = UNCONST(fr_pair_t *, prev);
  ------------------
  |  |  186|  2.27k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  710|       |
  711|  2.27k|	if (fr_pair_list_empty(list)) return NULL;
  ------------------
  |  Branch (711:6): [True: 1, False: 2.27k]
  ------------------
  712|       |
  713|  2.27k|	PAIR_LIST_VERIFY(list);
  ------------------
  |  |  169|  2.27k|#  define PAIR_LIST_VERIFY(_x)	fr_pair_list_verify(__FILE__, __LINE__, NULL, _x, true)
  ------------------
  714|       |
  715|   144k|	while ((vp = fr_pair_list_next(list, vp))) if (da == vp->da) return vp;
  ------------------
  |  Branch (715:9): [True: 142k, False: 1.60k]
  |  Branch (715:49): [True: 675, False: 141k]
  ------------------
  716|       |
  717|  1.60k|	return NULL;
  718|  2.27k|}
fr_pair_find_by_da_nested:
  785|    125|{
  786|    125|	fr_pair_t		*vp;
  787|    125|	fr_dict_attr_t const	**find;		/* DA currently being looked for */
  788|    125|	fr_pair_list_t const	*cur_list;	/* Current list being searched */
  789|    125|	fr_da_stack_t		da_stack;
  790|       |
  791|    125|	if (fr_pair_list_empty(list)) return NULL;
  ------------------
  |  Branch (791:6): [True: 0, False: 125]
  ------------------
  792|       |
  793|       |	/*
  794|       |	 *	In the common case, we're looking for attributes in
  795|       |	 *	the root (at level 1), so we just skip to a special
  796|       |	 *	function for that
  797|       |	 */
  798|    125|	if (da->depth <= 1) return fr_pair_find_by_da(list, prev, da);
  ------------------
  |  Branch (798:6): [True: 0, False: 125]
  ------------------
  799|       |
  800|    125|	fr_proto_da_stack_build(&da_stack, da);
  801|       |
  802|       |	/*
  803|       |	 *	Find the relevant starting point for `prev`
  804|       |	 */
  805|    125|	if (prev) {
  ------------------
  |  Branch (805:6): [True: 0, False: 125]
  ------------------
  806|      0|		cur_list = fr_pair_parent_list(prev);
  807|      0|		find = &da_stack.da[prev->da->depth - 1];
  808|      0|		vp = UNCONST(fr_pair_t *, prev);
  ------------------
  |  |  186|      0|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  809|    125|	} else {
  810|    125|		cur_list = list;
  811|    125|		find = &da_stack.da[0];
  812|    125|		vp = NULL;
  813|    125|	}
  814|       |
  815|       |	/*
  816|       |	 *	Loop over the list at each level until we find a matching da.
  817|       |	 */
  818|    183|	while (true) {
  ------------------
  |  Branch (818:9): [True: 183, Folded]
  ------------------
  819|    183|		fr_pair_t	*next;
  820|       |
  821|    183|		fr_assert((*find)->depth <= da->depth);
  ------------------
  |  |  194|    183|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|    183|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 183]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  822|       |
  823|       |		/*
  824|       |		 *	Find a vp which matches a given da.  If found,
  825|       |		 *	recurse into the child list to find the child
  826|       |		 *	attribute.
  827|       |		 *
  828|       |		 */
  829|    183|		next = fr_pair_find_by_da(cur_list, vp, *find);
  830|    183|		if (next) {
  ------------------
  |  Branch (830:7): [True: 29, False: 154]
  ------------------
  831|       |			/*
  832|       |			 *	We've found a match for the requested
  833|       |			 *	da - return it.
  834|       |			 */
  835|     29|			if ((*find) == da) return next;
  ------------------
  |  Branch (835:8): [True: 0, False: 29]
  ------------------
  836|       |
  837|       |			/*
  838|       |			 *	Prepare to search the next level.
  839|       |			 */
  840|     29|			cur_list = &next->vp_group;
  ------------------
  |  |  144|     29|#define vp_group		children
  ------------------
  841|     29|			find++;
  842|     29|			vp = NULL;
  843|     29|			continue;
  844|     29|		}
  845|       |
  846|       |		/*
  847|       |		 *	We hit the end of the top-level list.  Therefore we found nothing.
  848|       |		 */
  849|    154|		if (cur_list == list) break;
  ------------------
  |  Branch (849:7): [True: 125, False: 29]
  ------------------
  850|       |
  851|       |		/*
  852|       |		 *	We hit the end of *A* list.  Go to the parent
  853|       |		 *	VP, and then find its list.
  854|       |		 *
  855|       |		 *	We still then have to go to the next attribute
  856|       |		 *	in the parent list, as we've checked all of the
  857|       |		 *	children of this VP.
  858|       |		 */
  859|     29|		find--;
  860|     29|		vp = fr_pair_list_parent(cur_list);
  861|     29|		cur_list = fr_pair_parent_list(vp);
  862|     29|	}
  863|       |
  864|       |	/*
  865|       |	 *	Compatibility with flat attributes
  866|       |	 */
  867|    125|	if (fr_pair_parent_list(prev) != list) prev = NULL;
  ------------------
  |  Branch (867:6): [True: 125, False: 0]
  ------------------
  868|    125|	return fr_pair_find_by_da(list, prev, da);
  869|    125|}
fr_pair_parent_list:
  942|   128k|{
  943|   128k|	FR_TLIST_HEAD(fr_pair_order_list) *parent;
  ------------------
  |  |  769|   128k|#define FR_TLIST_HEAD(_name) _name ## _head_t
  ------------------
  944|       |
  945|   128k|	if (!vp) return NULL;
  ------------------
  |  Branch (945:6): [True: 125, False: 128k]
  ------------------
  946|       |
  947|   128k|	parent = fr_pair_order_list_parent(vp);
  948|   128k|	if (!parent) return NULL;
  ------------------
  |  Branch (948:6): [True: 1.73k, False: 126k]
  ------------------
  949|       |
  950|   126k|	return (fr_pair_list_t *) (UNCONST(uint8_t *, parent) - offsetof(fr_pair_list_t, order));
  ------------------
  |  |  186|   126k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  951|   128k|}
fr_pair_parent:
  957|   128k|{
  958|   128k|	fr_pair_list_t *list = fr_pair_parent_list(vp);
  959|       |
  960|   128k|	if (!list) return NULL;
  ------------------
  |  Branch (960:6): [True: 1.73k, False: 126k]
  ------------------
  961|       |
  962|   126k|	if (!list->is_child) return NULL;
  ------------------
  |  Branch (962:6): [True: 122k, False: 3.72k]
  ------------------
  963|       |
  964|  3.72k|	return (fr_pair_t *) (UNCONST(uint8_t *, list) - offsetof(fr_pair_t, vp_group));
  ------------------
  |  |  186|  3.72k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  965|   126k|}
fr_pair_list_parent:
  971|     29|{
  972|     29|	if (!list) return NULL;
  ------------------
  |  Branch (972:6): [True: 0, False: 29]
  ------------------
  973|       |
  974|     29|	if (!list->is_child) return NULL;
  ------------------
  |  Branch (974:6): [True: 0, False: 29]
  ------------------
  975|       |
  976|     29|	return (fr_pair_t *) (UNCONST(uint8_t *, list) - offsetof(fr_pair_t, vp_group));
  ------------------
  |  |  186|     29|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  977|     29|}
fr_pair_append:
 1353|  22.9k|{
 1354|  22.9k|#ifdef WITH_VERIFY_PTR
 1355|  22.9k|	fr_assert(!fr_pair_order_list_in_a_list(to_add));
  ------------------
  |  |  194|  22.9k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  22.9k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 22.9k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1356|  22.9k|	list->verified = false;
 1357|  22.9k|#endif
 1358|       |
 1359|  22.9k|	if (fr_pair_order_list_in_a_list(to_add)) {
  ------------------
  |  Branch (1359:6): [True: 0, False: 22.9k]
  ------------------
 1360|      0|		fr_strerror_printf(IN_A_LIST_MSG, to_add);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1361|      0|		return -1;
 1362|      0|	}
 1363|       |
 1364|  22.9k|	fr_pair_order_list_insert_tail(&list->order, to_add);
 1365|       |
 1366|  22.9k|	return 0;
 1367|  22.9k|}
fr_pair_delete_by_da:
 1697|    154|{
 1698|    154|	int		cnt = 0;
 1699|       |
 1700|  19.4k|	fr_pair_list_foreach(list, vp) {
  ------------------
  |  |  280|  19.5k|	for (fr_pair_t *JOIN(_next,_iter), *_iter = fr_pair_list_head(_list_head); JOIN(_next,_iter) = fr_pair_list_next(_list_head, _iter), _iter != NULL; _iter = JOIN(_next,_iter))
  |  |  ------------------
  |  |  |  |  224|  19.5k|#define JOIN(x,y)	_JOIN(x,y)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  19.5k|#define _JOIN(x,y)	x ## y
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	for (fr_pair_t *JOIN(_next,_iter), *_iter = fr_pair_list_head(_list_head); JOIN(_next,_iter) = fr_pair_list_next(_list_head, _iter), _iter != NULL; _iter = JOIN(_next,_iter))
  |  |  ------------------
  |  |  |  |  224|  19.4k|#define JOIN(x,y)	_JOIN(x,y)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  19.4k|#define _JOIN(x,y)	x ## y
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (280:77): [True: 19.4k, False: 154]
  |  |  ------------------
  ------------------
 1701|  19.4k|		if (da == vp->da) {
  ------------------
  |  Branch (1701:7): [True: 133, False: 19.2k]
  ------------------
 1702|    133|			if (fr_pair_immutable(vp)) continue;
  ------------------
  |  Branch (1702:8): [True: 0, False: 133]
  ------------------
 1703|       |
 1704|    133|			cnt++;
 1705|    133|			fr_pair_delete(list, vp);
 1706|    133|		}
 1707|  19.4k|	}
 1708|       |
 1709|    154|	return cnt;
 1710|    154|}
fr_pair_delete:
 1834|    133|{
 1835|    133|	fr_pair_remove(list, vp);
 1836|       |	return talloc_free(vp);
 1837|    133|}
fr_pair_immutable:
 2284|    133|{
 2285|    133|	if (fr_type_is_leaf(vp->vp_type)) return vp->vp_immutable;
  ------------------
  |  |  393|    133|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 133, False: 0]
  |  |  ------------------
  ------------------
              	if (fr_type_is_leaf(vp->vp_type)) return vp->vp_immutable;
  ------------------
  |  |  151|    133|#define vp_immutable		data.immutable
  ------------------
 2286|       |
 2287|      0|	fr_assert(fr_type_is_structural(vp->vp_type));
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2288|       |
 2289|      0|	fr_pair_list_foreach(&vp->vp_group, child) {
  ------------------
  |  |  280|      0|	for (fr_pair_t *JOIN(_next,_iter), *_iter = fr_pair_list_head(_list_head); JOIN(_next,_iter) = fr_pair_list_next(_list_head, _iter), _iter != NULL; _iter = JOIN(_next,_iter))
  |  |  ------------------
  |  |  |  |  224|      0|#define JOIN(x,y)	_JOIN(x,y)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|#define _JOIN(x,y)	x ## y
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	for (fr_pair_t *JOIN(_next,_iter), *_iter = fr_pair_list_head(_list_head); JOIN(_next,_iter) = fr_pair_list_next(_list_head, _iter), _iter != NULL; _iter = JOIN(_next,_iter))
  |  |  ------------------
  |  |  |  |  224|      0|#define JOIN(x,y)	_JOIN(x,y)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|#define _JOIN(x,y)	x ## y
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (280:77): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2290|      0|		if (fr_type_is_leaf(child->vp_type)) {
  ------------------
  |  |  393|      0|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2291|      0|			if (child->vp_immutable) return true;
  ------------------
  |  |  151|      0|#define vp_immutable		data.immutable
  ------------------
  |  Branch (2291:8): [True: 0, False: 0]
  ------------------
 2292|       |
 2293|      0|			continue;
 2294|      0|		}
 2295|       |
 2296|      0|		fr_assert(fr_type_is_structural(child->vp_type));
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2297|       |
 2298|      0|		if (fr_pair_immutable(child)) return true;
  ------------------
  |  Branch (2298:7): [True: 0, False: 0]
  ------------------
 2299|      0|	}
 2300|       |
 2301|      0|	return false;
 2302|      0|}
fr_pair_value_bstrndup:
 2813|    323|{
 2814|    323|	int ret;
 2815|       |
 2816|    323|	if (!fr_cond_assert(vp->vp_type == FR_TYPE_STRING)) return -1;
  ------------------
  |  |  131|    323|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|    646|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 323, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2816:6): [True: 0, False: 323]
  ------------------
 2817|       |
 2818|    323|	fr_value_box_clear(&vp->data);
 2819|    323|	ret = fr_value_box_bstrndup(vp, &vp->data, vp->da, src, len, tainted);
 2820|    323|	if (ret == 0) {
  ------------------
  |  Branch (2820:6): [True: 323, False: 0]
  ------------------
 2821|    323|		PAIR_VERIFY(vp);
  ------------------
  |  |  167|    323|#  define PAIR_VERIFY(_x)		fr_pair_verify(__FILE__, __LINE__, NULL, NULL, _x, true)
  ------------------
 2822|    323|	}
 2823|       |
 2824|    323|	return ret;
 2825|    323|}
fr_pair_verify:
 3112|   128k|{
 3113|   128k|	(void) talloc_get_type_abort_const(vp, fr_pair_t);
  ------------------
  |  |  117|   128k|#  define talloc_get_type_abort_const talloc_get_type_abort
  ------------------
 3114|       |
 3115|   128k|	if (!vp->da) {
  ------------------
  |  Branch (3115:6): [True: 0, False: 128k]
  ------------------
 3116|      0|		fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t da pointer was NULL", file, line);
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 3117|      0|	}
 3118|       |
 3119|   128k|	fr_dict_attr_verify(file, line, vp->da);
 3120|       |
 3121|       |
 3122|       |	/*
 3123|       |	 *	Enforce correct parentage.  If the parent exists, AND it's not a group (because groups break
 3124|       |	 *	the strict hierarchy), then check parentage.
 3125|       |	 *
 3126|       |	 *	We also ignore parentage if either the expected parent or the vp is raw / unknown.  We may
 3127|       |	 *	want to tighten that a little bit, as there are cases where we create raw / unknown
 3128|       |	 *	attributes, and the parent is also raw / unknown.  In which case the parent_da _should_ be the
 3129|       |	 *	same as vp->da->parent.
 3130|       |	 */
 3131|   128k|	if (parent_da && (parent_da->type != FR_TYPE_GROUP) &&
  ------------------
  |  Branch (3131:6): [True: 0, False: 128k]
  |  Branch (3131:19): [True: 0, False: 0]
  ------------------
 3132|      0|	    !parent_da->flags.is_raw && !parent_da->flags.is_unknown &&
  ------------------
  |  Branch (3132:6): [True: 0, False: 0]
  |  Branch (3132:34): [True: 0, False: 0]
  ------------------
 3133|      0|	    !vp->da->flags.is_raw && !vp->da->flags.is_unknown) {
  ------------------
  |  Branch (3133:6): [True: 0, False: 0]
  |  Branch (3133:31): [True: 0, False: 0]
  ------------------
 3134|      0|		fr_fatal_assert_msg(vp->da->parent == parent_da,
  ------------------
  |  |  176|      0|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3135|      0|				    "CONSISTENCY CHECK FAILED %s[%d]:  pair %s does not have the correct parentage - "
 3136|      0|				    "expected parent %s, found different parent %s",
 3137|      0|				    file, line, vp->da->name, parent_da->name, vp->da->parent->name);
 3138|      0|	}
 3139|       |
 3140|   128k|	if (list) {
  ------------------
  |  Branch (3140:6): [True: 126k, False: 1.73k]
  ------------------
 3141|   126k|		fr_fatal_assert_msg(fr_pair_order_list_parent(vp) == &list->order,
  ------------------
  |  |  176|   126k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|   126k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 126k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3142|   126k|				    "CONSISTENCY CHECK FAILED %s[%d]:  pair does not have the correct parentage "
 3143|   126k|				    "at \"%s\"",
 3144|   126k|				    file, line, vp->da->name);
 3145|   126k|	}
 3146|       |
 3147|       |	/*
 3148|       |	 *	This field is only valid for non-structural pairs
 3149|       |	 */
 3150|   128k|	if (!fr_type_is_structural(vp->vp_type)) {
  ------------------
  |  |  392|   128k|#define fr_type_is_structural(_x)		(fr_type_structural[_x])
  ------------------
  |  Branch (3150:6): [True: 125k, False: 3.21k]
  ------------------
 3151|   125k|		fr_pair_t *parent = fr_pair_parent(vp);
 3152|       |
 3153|   125k|		if (vp->data.enumv) fr_dict_attr_verify(file, line, vp->data.enumv);
  ------------------
  |  Branch (3153:7): [True: 122k, False: 2.42k]
  ------------------
 3154|       |
 3155|   125k|		if (parent && !fr_dict_attr_can_contain(parent->da, vp->da)) {
  ------------------
  |  Branch (3155:7): [True: 3.57k, False: 121k]
  |  Branch (3155:17): [True: 0, False: 3.57k]
  ------------------
 3156|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" should be parented by %s, but is parented by %s",
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 3157|      0|					     file, line, vp->da->name, vp->da->parent->name, parent->da->name);
 3158|      0|		}
 3159|       |
 3160|       |		/*
 3161|       |		 *	The data types have to agree, except for comb-ip and combo-ipaddr.
 3162|       |		 */
 3163|   125k|		if (vp->vp_type != vp->da->type) switch (vp->da->type) {
  ------------------
  |  |  149|   125k|#define vp_type			data.type
  ------------------
  |  Branch (3163:7): [True: 0, False: 125k]
  ------------------
 3164|      0|		case FR_TYPE_COMBO_IP_ADDR:
  ------------------
  |  Branch (3164:3): [True: 0, False: 0]
  ------------------
 3165|      0|			if ((vp->vp_type == FR_TYPE_IPV4_ADDR) ||
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
  |  Branch (3165:8): [True: 0, False: 0]
  ------------------
 3166|      0|			    (vp->vp_type == FR_TYPE_IPV6_ADDR)) {
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
  |  Branch (3166:8): [True: 0, False: 0]
  ------------------
 3167|      0|				    break;
 3168|      0|			    }
 3169|      0|			goto failed_type;
 3170|       |
 3171|      0|		case FR_TYPE_COMBO_IP_PREFIX:
  ------------------
  |  Branch (3171:3): [True: 0, False: 0]
  ------------------
 3172|      0|			if ((vp->vp_type == FR_TYPE_IPV4_PREFIX) ||
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
  |  Branch (3172:8): [True: 0, False: 0]
  ------------------
 3173|      0|			    (vp->vp_type == FR_TYPE_IPV6_PREFIX)) {
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
  |  Branch (3173:8): [True: 0, False: 0]
  ------------------
 3174|      0|				break;
 3175|      0|			}
 3176|      0|			FALL_THROUGH;
  ------------------
  |  |  341|      0|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      0|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
 3177|       |
 3178|      0|		default:
  ------------------
  |  Branch (3178:3): [True: 0, False: 0]
  ------------------
 3179|      0|			failed_type:
 3180|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" has value of data type '%s', which disagrees with the dictionary data type '%s'",
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3181|      0|					     file, line, vp->da->name, fr_type_to_str(vp->vp_type), fr_type_to_str(vp->da->type));
  |  |  |  |  ------------------
  |  |  |  |  |  |  149|      0|#define vp_type			data.type
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3181|      0|					     file, line, vp->da->name, fr_type_to_str(vp->vp_type), fr_type_to_str(vp->da->type));
 3182|      0|		}
 3183|       |
 3184|       |		/*
 3185|       |		 *	We would like to enable this, but there's a
 3186|       |		 *	lot of code like fr_pair_append_by_da() which
 3187|       |		 *	creates the #fr_pair_t with no value.
 3188|       |		 */
 3189|   125k|		if (verify_values) fr_value_box_verify(file, line, &vp->data);
  ------------------
  |  Branch (3189:7): [True: 125k, False: 0]
  ------------------
 3190|       |
 3191|   125k|	} else {
 3192|  3.21k|		fr_pair_t *parent = fr_pair_parent(vp);
 3193|       |
 3194|  3.21k|		if (parent && (parent->vp_type != FR_TYPE_GROUP) && (parent->da == vp->da)) {
  ------------------
  |  |  149|    157|#define vp_type			data.type
  ------------------
  |  Branch (3194:7): [True: 157, False: 3.06k]
  |  Branch (3194:17): [True: 157, False: 0]
  |  Branch (3194:55): [True: 0, False: 157]
  ------------------
 3195|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" structural (non-group) type contains itself",
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 3196|      0|					     file, line, vp->da->name);
 3197|      0|		}
 3198|       |
 3199|  3.21k|		fr_pair_list_verify(file, line, vp, &vp->vp_group, verify_values);
  ------------------
  |  |  144|  3.21k|#define vp_group		children
  ------------------
 3200|  3.21k|	}
 3201|       |
 3202|   128k|	switch (vp->vp_type) {
  ------------------
  |  |  149|   128k|#define vp_type			data.type
  ------------------
 3203|  85.4k|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (3203:2): [True: 85.4k, False: 42.8k]
  ------------------
 3204|  85.4k|	{
 3205|  85.4k|		size_t len;
 3206|  85.4k|		TALLOC_CTX *parent;
 3207|       |
 3208|  85.4k|		if (!vp->vp_octets) break;	/* We might be in the middle of initialisation */
  ------------------
  |  |  115|  85.4k|#define vp_octets		data.vb_octets
  |  |  ------------------
  |  |  |  |  259|  85.4k|#define vb_octets				datum.octets
  |  |  ------------------
  ------------------
  |  Branch (3208:7): [True: 82.5k, False: 2.89k]
  ------------------
 3209|       |
 3210|  2.89k|		if (!talloc_get_type(vp->vp_ptr, uint8_t)) {
  ------------------
  |  Branch (3210:7): [True: 0, False: 2.89k]
  ------------------
 3211|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" data buffer type should be "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3212|      0|					     "uint8_t but is %s", file, line, vp->da->name, talloc_get_name(vp->vp_ptr));
  |  |  |  |  ------------------
  |  |  |  |  |  |  116|      0|#define vp_ptr			data.datum.ptr			//!< Either octets or strvalue
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3212|      0|					     "uint8_t but is %s", file, line, vp->da->name, talloc_get_name(vp->vp_ptr));
 3213|      0|		}
 3214|       |
 3215|  2.89k|		len = talloc_array_length(vp->vp_octets);
 3216|  2.89k|		if (vp->vp_length > len) {
  ------------------
  |  |  117|  2.89k|#define vp_length		data.vb_length
  |  |  ------------------
  |  |  |  |  292|  2.89k|#define vb_length				datum.length
  |  |  ------------------
  ------------------
  |  Branch (3216:7): [True: 0, False: 2.89k]
  ------------------
 3217|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" length %zu is greater than "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3218|      0|					     "uint8_t data buffer length %zu", file, line, vp->da->name, vp->vp_length, len);
  |  |  |  |  ------------------
  |  |  |  |  |  |  117|      0|#define vp_length		data.vb_length
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3218|      0|					     "uint8_t data buffer length %zu", file, line, vp->da->name, vp->vp_length, len);
 3219|      0|		}
 3220|       |
 3221|  2.89k|		parent = talloc_parent(vp->vp_ptr);
  ------------------
  |  |  116|  2.89k|#define vp_ptr			data.datum.ptr			//!< Either octets or strvalue
  ------------------
 3222|  2.89k|		if (parent != vp) {
  ------------------
  |  Branch (3222:7): [True: 0, False: 2.89k]
  ------------------
 3223|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" char buffer is not "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (183:98): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3224|      0|					     "parented by fr_pair_t %p, instead parented by %p (%s)",
 3225|      0|					     file, line, vp->da->name,
 3226|      0|					     vp, parent, parent ? talloc_get_name(parent) : "NULL");
 3227|      0|		}
 3228|  2.89k|	}
 3229|      0|		break;
 3230|       |
 3231|  6.41k|	case FR_TYPE_STRING:
  ------------------
  |  Branch (3231:2): [True: 6.41k, False: 121k]
  ------------------
 3232|  6.41k|	{
 3233|  6.41k|		size_t len;
 3234|  6.41k|		TALLOC_CTX *parent;
 3235|       |
 3236|  6.41k|		if (!vp->vp_octets) break;	/* We might be in the middle of initialisation */
  ------------------
  |  |  115|  6.41k|#define vp_octets		data.vb_octets
  |  |  ------------------
  |  |  |  |  259|  6.41k|#define vb_octets				datum.octets
  |  |  ------------------
  ------------------
  |  Branch (3236:7): [True: 323, False: 6.09k]
  ------------------
 3237|       |
 3238|  6.09k|		if (!talloc_get_type(vp->vp_ptr, char)) {
  ------------------
  |  Branch (3238:7): [True: 0, False: 6.09k]
  ------------------
 3239|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" data buffer type should be "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3240|      0|					     "char but is %s", file, line, vp->da->name, talloc_get_name(vp->vp_ptr));
  |  |  |  |  ------------------
  |  |  |  |  |  |  116|      0|#define vp_ptr			data.datum.ptr			//!< Either octets or strvalue
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3240|      0|					     "char but is %s", file, line, vp->da->name, talloc_get_name(vp->vp_ptr));
 3241|      0|		}
 3242|       |
 3243|  6.09k|		len = (talloc_strlen(vp->vp_strvalue));
  ------------------
  |  |  114|  6.09k|#define vp_strvalue		data.vb_strvalue
  |  |  ------------------
  |  |  |  |  258|  6.09k|#define vb_strvalue				datum.strvalue
  |  |  ------------------
  ------------------
 3244|  6.09k|		if (vp->vp_length > len) {
  ------------------
  |  |  117|  6.09k|#define vp_length		data.vb_length
  |  |  ------------------
  |  |  |  |  292|  6.09k|#define vb_length				datum.length
  |  |  ------------------
  ------------------
  |  Branch (3244:7): [True: 0, False: 6.09k]
  ------------------
 3245|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" length %zu is greater than "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3246|      0|					     "char buffer length %zu", file, line, vp->da->name, vp->vp_length, len);
  |  |  |  |  ------------------
  |  |  |  |  |  |  117|      0|#define vp_length		data.vb_length
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3246|      0|					     "char buffer length %zu", file, line, vp->da->name, vp->vp_length, len);
 3247|      0|		}
 3248|       |
 3249|  6.09k|		if (vp->vp_strvalue[vp->vp_length] != '\0') {
  ------------------
  |  |  114|  6.09k|#define vp_strvalue		data.vb_strvalue
  |  |  ------------------
  |  |  |  |  258|  6.09k|#define vb_strvalue				datum.strvalue
  |  |  ------------------
  ------------------
              		if (vp->vp_strvalue[vp->vp_length] != '\0') {
  ------------------
  |  |  117|  6.09k|#define vp_length		data.vb_length
  |  |  ------------------
  |  |  |  |  292|  6.09k|#define vb_length				datum.length
  |  |  ------------------
  ------------------
  |  Branch (3249:7): [True: 0, False: 6.09k]
  ------------------
 3250|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" char buffer not \\0 "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 3251|      0|					     "terminated", file, line, vp->da->name);
 3252|      0|		}
 3253|       |
 3254|  6.09k|		parent = talloc_parent(vp->vp_ptr);
  ------------------
  |  |  116|  6.09k|#define vp_ptr			data.datum.ptr			//!< Either octets or strvalue
  ------------------
 3255|  6.09k|		if (parent != vp) {
  ------------------
  |  Branch (3255:7): [True: 0, False: 6.09k]
  ------------------
 3256|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" char buffer is not "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (183:98): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3257|      0|					     "parented by fr_pair_t %p, instead parented by %p (%s)",
 3258|      0|					     file, line, vp->da->name,
 3259|      0|					     vp, parent, parent ? talloc_get_name(parent) : "NULL");
 3260|      0|		}
 3261|  6.09k|	}
 3262|      0|		break;
 3263|       |
 3264|  6.88k|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (3264:2): [True: 6.88k, False: 121k]
  ------------------
 3265|  6.88k|		if (vp->vp_ip.af != AF_INET) {
  ------------------
  |  |  121|  6.88k|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|  6.88k|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  |  Branch (3265:7): [True: 0, False: 6.88k]
  ------------------
 3266|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" address family is not "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3268|      0|					     file, line, vp->da->name,
  |  |  |  | 3269|      0|					     AF_INET, vp->vp_ip.af);
  |  |  |  |  ------------------
  |  |  |  |  |  |  121|      0|#define vp_ip			data.vb_ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3267|      0|					     "set correctly for IPv4 address.  Expected %i got %i",
 3268|      0|					     file, line, vp->da->name,
 3269|      0|					     AF_INET, vp->vp_ip.af);
 3270|      0|		}
 3271|  6.88k|		if (vp->vp_ip.prefix != 32) {
  ------------------
  |  |  121|  6.88k|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|  6.88k|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  |  Branch (3271:7): [True: 0, False: 6.88k]
  ------------------
 3272|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" address prefix "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3274|      0|					     file, line, vp->da->name,
  |  |  |  | 3275|      0|					     32, vp->vp_ip.prefix);
  |  |  |  |  ------------------
  |  |  |  |  |  |  121|      0|#define vp_ip			data.vb_ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3273|      0|					     "not set correctly for IPv4 address.  Expected %i got %i",
 3274|      0|					     file, line, vp->da->name,
 3275|      0|					     32, vp->vp_ip.prefix);
 3276|      0|		}
 3277|  6.88k|		break;
 3278|       |
 3279|    251|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (3279:2): [True: 251, False: 128k]
  ------------------
 3280|    251|		if (vp->vp_ip.af != AF_INET6) {
  ------------------
  |  |  121|    251|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|    251|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  |  Branch (3280:7): [True: 0, False: 251]
  ------------------
 3281|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" address family is not "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3283|      0|					     file, line, vp->da->name,
  |  |  |  | 3284|      0|					     AF_INET6, vp->vp_ip.af);
  |  |  |  |  ------------------
  |  |  |  |  |  |  121|      0|#define vp_ip			data.vb_ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3282|      0|					     "set correctly for IPv6 address.  Expected %i got %i",
 3283|      0|					     file, line, vp->da->name,
 3284|      0|					     AF_INET6, vp->vp_ip.af);
 3285|      0|		}
 3286|    251|		if (vp->vp_ip.prefix != 128) {
  ------------------
  |  |  121|    251|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|    251|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  |  Branch (3286:7): [True: 0, False: 251]
  ------------------
 3287|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" address prefix "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3289|      0|					     file, line, vp->da->name,
  |  |  |  | 3290|      0|					     128, vp->vp_ip.prefix);
  |  |  |  |  ------------------
  |  |  |  |  |  |  121|      0|#define vp_ip			data.vb_ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3288|      0|					     "set correctly for IPv6 address.  Expected %i got %i",
 3289|      0|					     file, line, vp->da->name,
 3290|      0|					     128, vp->vp_ip.prefix);
 3291|      0|		}
 3292|    251|		break;
 3293|       |
 3294|  9.11k|       case FR_TYPE_ATTR:
  ------------------
  |  Branch (3294:8): [True: 9.11k, False: 119k]
  ------------------
 3295|  9.11k|		if (!vp->vp_attr) {
  ------------------
  |  |  139|  9.11k|#define vp_attr			data.vb_attr
  |  |  ------------------
  |  |  |  |  262|  9.11k|#define vb_attr					datum.da
  |  |  ------------------
  ------------------
  |  Branch (3295:7): [True: 0, False: 9.11k]
  ------------------
 3296|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" attribute pointer is NULL",
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 3297|      0|					     file, line, vp->da->name);
 3298|      0|		}
 3299|  9.11k|		break;
 3300|       |
 3301|  12.9k|       case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|    417|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|    417|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|    417|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|    417|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|    417|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|    417|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|    417|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    417|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 128k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|  3.02k|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  3.02k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  3.02k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2.61k, False: 125k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|  3.12k|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  3.12k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  3.12k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 102, False: 128k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  3.20k|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  3.20k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  3.20k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 78, False: 128k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|  3.21k|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  3.21k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|  3.21k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (3301:8): [True: 417, False: 127k]
  ------------------
 3302|  12.9k|       {
 3303|  12.9k|	       if (vp->vp_group.verified) break;
  ------------------
  |  |  144|  3.21k|#define vp_group		children
  ------------------
  |  Branch (3303:13): [True: 3.21k, False: 0]
  ------------------
 3304|       |
 3305|      0|	       fr_pair_list_foreach(&vp->vp_group, child) {
  ------------------
  |  |  280|      0|	for (fr_pair_t *JOIN(_next,_iter), *_iter = fr_pair_list_head(_list_head); JOIN(_next,_iter) = fr_pair_list_next(_list_head, _iter), _iter != NULL; _iter = JOIN(_next,_iter))
  |  |  ------------------
  |  |  |  |  224|      0|#define JOIN(x,y)	_JOIN(x,y)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|#define _JOIN(x,y)	x ## y
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	for (fr_pair_t *JOIN(_next,_iter), *_iter = fr_pair_list_head(_list_head); JOIN(_next,_iter) = fr_pair_list_next(_list_head, _iter), _iter != NULL; _iter = JOIN(_next,_iter))
  |  |  ------------------
  |  |  |  |  224|      0|#define JOIN(x,y)	_JOIN(x,y)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|#define _JOIN(x,y)	x ## y
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (280:77): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3306|      0|			TALLOC_CTX *parent = talloc_parent(child);
 3307|       |
 3308|      0|			fr_fatal_assert_msg(parent == vp,
  ------------------
  |  |  176|      0|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3309|      0|					    "CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" should be parented "
 3310|      0|					    "by fr_pair_t \"%s\".  Expected talloc parent %p (%s) got %p (%s)",
 3311|      0|					    file, line,
 3312|      0|					    child->da->name, vp->da->name,
 3313|      0|					    vp, talloc_get_name(vp),
 3314|      0|					    parent, talloc_get_name(parent));
 3315|       |
 3316|       |			/*
 3317|       |			 *	Check if the child can be in the parent.
 3318|       |			 */
 3319|      0|			fr_fatal_assert_msg(fr_dict_attr_can_contain(vp->da, child->da),
  ------------------
  |  |  176|      0|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3320|      0|					    "CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t \"%s\" should be parented "
 3321|      0|					    "by fr_pair_t \"%s\", but it is instead parented by \"%s\"",
 3322|      0|					    file, line,
 3323|      0|					    child->da->name, child->da->parent->name, vp->da->name);
 3324|       |
 3325|      0|			fr_pair_verify(file, line, vp->da, &vp->vp_group, child, verify_values);
  ------------------
  |  |  144|      0|#define vp_group		children
  ------------------
 3326|      0|		}
 3327|       |
 3328|      0|	       UNCONST(fr_pair_t *, vp)->vp_group.verified = true;
  ------------------
  |  |  186|      0|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
              	       UNCONST(fr_pair_t *, vp)->vp_group.verified = true;
  ------------------
  |  |  144|      0|#define vp_group		children
  ------------------
 3329|      0|	}
 3330|      0|	       break;
 3331|       |
 3332|  16.9k|	default:
  ------------------
  |  Branch (3332:2): [True: 16.9k, False: 111k]
  ------------------
 3333|  16.9k|		break;
 3334|   128k|	}
 3335|       |
 3336|   128k|	if (vp->da->flags.is_unknown || vp->vp_raw) {
  ------------------
  |  |  153|  43.8k|#define vp_raw			da->flags.is_raw
  ------------------
  |  Branch (3336:6): [True: 84.4k, False: 43.8k]
  |  Branch (3336:34): [True: 0, False: 43.8k]
  ------------------
 3337|  84.4k|		(void) talloc_get_type_abort_const(vp->da, fr_dict_attr_t);
  ------------------
  |  |  117|  84.4k|#  define talloc_get_type_abort_const talloc_get_type_abort
  ------------------
 3338|       |
 3339|       |		/*
 3340|       |		 *	Raw or unknown attributes can have specific data types.  See DER and CBOR.
 3341|       |		 */
 3342|       |
 3343|  84.4k|	} else if (fr_type_is_leaf(vp->vp_type) && (vp->vp_type != vp->da->type) &&
  ------------------
  |  |  393|  87.6k|#define fr_type_is_leaf(_x)			(fr_type_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (393:31): [True: 40.6k, False: 3.21k]
  |  |  ------------------
  ------------------
              	} else if (fr_type_is_leaf(vp->vp_type) && (vp->vp_type != vp->da->type) &&
  ------------------
  |  |  149|  40.6k|#define vp_type			data.type
  ------------------
  |  Branch (3343:45): [True: 0, False: 40.6k]
  ------------------
 3344|      0|		   !((vp->da->type == FR_TYPE_COMBO_IP_ADDR) && ((vp->vp_type == FR_TYPE_IPV4_ADDR) || (vp->vp_type == FR_TYPE_IPV6_ADDR))) &&
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
              		   !((vp->da->type == FR_TYPE_COMBO_IP_ADDR) && ((vp->vp_type == FR_TYPE_IPV4_ADDR) || (vp->vp_type == FR_TYPE_IPV6_ADDR))) &&
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
  |  Branch (3344:8): [True: 0, False: 0]
  |  Branch (3344:52): [True: 0, False: 0]
  |  Branch (3344:90): [True: 0, False: 0]
  ------------------
 3345|      0|		   !((vp->da->type == FR_TYPE_COMBO_IP_PREFIX) && ((vp->vp_type == FR_TYPE_IPV4_PREFIX) || (vp->vp_type == FR_TYPE_IPV6_PREFIX)))) {
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
              		   !((vp->da->type == FR_TYPE_COMBO_IP_PREFIX) && ((vp->vp_type == FR_TYPE_IPV4_PREFIX) || (vp->vp_type == FR_TYPE_IPV6_PREFIX)))) {
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
  |  Branch (3345:8): [True: 0, False: 0]
  |  Branch (3345:54): [True: 0, False: 0]
  |  Branch (3345:94): [True: 0, False: 0]
  ------------------
 3346|      0|		char data_type_int[10], da_type_int[10];
 3347|       |
 3348|      0|		snprintf(data_type_int, sizeof(data_type_int), "%u", vp->vp_type);
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
 3349|      0|		snprintf(da_type_int, sizeof(da_type_int), "%u", vp->da->type);
 3350|       |
 3351|      0|		fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: fr_pair_t attribute %p \"%s\" "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3353|      0|				     file, line, vp->da, vp->da->name,
  |  |  |  | 3354|      0|				     fr_table_str_by_value(fr_type_table, vp->vp_type, data_type_int),
  |  |  |  |  ------------------
  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  ------------------
  |  |  |  | 3355|      0|				     fr_table_str_by_value(fr_type_table, vp->da->type, da_type_int));
  |  |  |  |  ------------------
  |  |  |  |  |  |  772|      0|#define fr_table_str_by_value(_table, _number, _def) \
  |  |  |  |  |  |  773|      0|_Generic((_table), \
  |  |  |  |  |  |  774|      0|	 fr_table_num_sorted_t const *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  775|      0|	 fr_table_num_ordered_t const *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  776|      0|	 fr_table_num_sorted_t *		: fr_table_sorted_str_by_num,			\
  |  |  |  |  |  |  777|      0|	 fr_table_num_ordered_t *		: fr_table_ordered_str_by_num,			\
  |  |  |  |  |  |  778|      0|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  779|      0|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  780|      0|	 fr_table_ptr_sorted_t *		: fr_table_sorted_str_by_ptr,			\
  |  |  |  |  |  |  781|      0|	 fr_table_ptr_ordered_t *		: fr_table_ordered_str_by_ptr,			\
  |  |  |  |  |  |  782|      0|	 fr_table_num_indexed_bit_pos_t *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  783|      0|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_indexed_str_by_bit_field, 		\
  |  |  |  |  |  |  784|      0|	 fr_table_num_indexed_t *		: fr_table_indexed_str_by_num, 			\
  |  |  |  |  |  |  785|      0|	 fr_table_num_indexed_t const *		: fr_table_indexed_str_by_num 			\
  |  |  |  |  |  |  786|      0|)(_table, _table ## _len, _number, _def)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3352|      0|				     "data type (%s) does not match da type (%s)",
 3353|      0|				     file, line, vp->da, vp->da->name,
 3354|      0|				     fr_table_str_by_value(fr_type_table, vp->vp_type, data_type_int),
 3355|      0|				     fr_table_str_by_value(fr_type_table, vp->da->type, da_type_int));
 3356|      0|	}
 3357|   128k|}
fr_pair_list_verify:
 3368|  5.62k|{
 3369|  5.62k|	fr_pair_t		*slow, *fast;
 3370|  5.62k|	TALLOC_CTX		*parent;
 3371|       |
 3372|  5.62k|	if (fr_pair_list_empty(list)) return;	/* Fast path */
  ------------------
  |  Branch (3372:6): [True: 33, False: 5.58k]
  ------------------
 3373|       |
 3374|       |	/*
 3375|       |	 *	Only verify the list if it has been modified.
 3376|       |	 */
 3377|  5.58k|	if (list->verified) return;
  ------------------
  |  Branch (3377:6): [True: 3.48k, False: 2.09k]
  ------------------
 3378|       |
 3379|  2.09k|	for (slow = fr_pair_list_head(list), fast = fr_pair_list_head(list);
 3380|  96.9k|	     slow && fast;
  ------------------
  |  Branch (3380:7): [True: 95.8k, False: 1.09k]
  |  Branch (3380:15): [True: 94.8k, False: 1.00k]
  ------------------
 3381|  94.8k|	     slow = fr_pair_list_next(list, slow), fast = fr_pair_list_next(list, fast)) {
 3382|  94.8k|		fr_pair_verify(__FILE__, __LINE__, NULL, list, slow, verify_values);
 3383|       |
 3384|       |		/*
 3385|       |		 *	Advances twice as fast as slow...
 3386|       |		 */
 3387|  94.8k|		fast = fr_pair_list_next(list, fast);
 3388|  94.8k|		fr_fatal_assert_msg(fast != slow,
  ------------------
  |  |  176|  94.8k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|  94.8k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 94.8k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3389|  94.8k|				    "CONSISTENCY CHECK FAILED %s[%d]:  Looping list found.  Fast pointer hit "
 3390|  94.8k|				    "slow pointer at \"%s\"",
 3391|  94.8k|				    file, line, slow->da->name);
 3392|       |
 3393|  94.8k|		parent = talloc_parent(slow);
 3394|  94.8k|		if (expected && (parent != expected)) {
  ------------------
  |  Branch (3394:7): [True: 2.87k, False: 91.9k]
  |  Branch (3394:19): [True: 0, False: 2.87k]
  ------------------
 3395|      0|		bad_parent:
 3396|      0|			fr_log_talloc_report(expected);
 3397|      0|			if (parent) fr_log_talloc_report(parent);
  ------------------
  |  Branch (3397:8): [True: 0, False: 0]
  ------------------
 3398|       |
 3399|      0|			fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: Expected fr_pair_t \"%s\" to be parented "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (183:98): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3400|      0|					     "by %p (%s), instead parented by %p (%s)\n",
 3401|      0|					     file, line, slow->da->name,
 3402|      0|					     expected, talloc_get_name(expected),
 3403|      0|					     parent, parent ? talloc_get_name(parent) : "NULL");
 3404|      0|		}
 3405|  94.8k|	}
 3406|       |
 3407|       |	/*
 3408|       |	 *	Check the remaining pairs
 3409|       |	 */
 3410|  33.8k|	for (; slow; slow = fr_pair_list_next(list, slow)) {
  ------------------
  |  Branch (3410:9): [True: 31.7k, False: 2.09k]
  ------------------
 3411|  31.7k|		fr_pair_verify(__FILE__, __LINE__, NULL, list, slow, verify_values);
 3412|       |
 3413|  31.7k|		parent = talloc_parent(slow);
 3414|  31.7k|		if (expected && (parent != expected)) goto bad_parent;
  ------------------
  |  Branch (3414:7): [True: 850, False: 30.8k]
  |  Branch (3414:19): [True: 0, False: 850]
  ------------------
 3415|  31.7k|	}
 3416|       |
 3417|  2.09k|	UNCONST(fr_pair_list_t *, list)->verified = true;
  ------------------
  |  |  186|  2.09k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
 3418|  2.09k|}
pair.c:pair_init_null:
  136|  24.8k|{
  137|  24.8k|	fr_pair_order_list_entry_init(vp);
  138|       |
  139|       |	/*
  140|       |	 *	Legacy cruft
  141|       |	 */
  142|  24.8k|	vp->op = T_OP_EQ;
  143|  24.8k|}
pair.c:_fr_pair_free:
   70|  24.8k|{
   71|       |#ifdef TALLOC_DEBUG
   72|       |	talloc_report_depth_cb(NULL, 0, -1, fr_talloc_verify_cb, NULL);
   73|       |#endif
   74|       |
   75|       |#if 0
   76|       |	/*
   77|       |	 *	We would like to enforce that a VP must be removed from a list before it's freed.  However, we
   78|       |	 *	free pair_lists via talloc_free().  And the talloc code just frees things in (essentially) a
   79|       |	 *	random order.  So this guarantee can't be enforced.
   80|       |	 */
   81|       |	fr_assert(fr_pair_order_list_parent(vp) == NULL);
   82|       |#endif
   83|       |
   84|       |	/*
   85|       |	 *	Pairs with children have the children
   86|       |	 *	freed explicitly.
   87|       |	 */
   88|  24.8k|	if (likely(vp->da != NULL)) switch (vp->vp_type) {
  ------------------
  |  |  396|  24.8k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  ------------------
  |  |  |  Branch (396:23): [True: 24.8k, False: 0]
  |  |  ------------------
  ------------------
              	if (likely(vp->da != NULL)) switch (vp->vp_type) {
  ------------------
  |  |  149|  24.8k|#define vp_type			data.type
  ------------------
   89|  3.09k|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|    811|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|    811|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|    811|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|    811|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|    811|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|    811|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|    811|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    811|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 24.8k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|  2.92k|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  2.92k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  2.92k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2.11k, False: 22.7k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|  2.97k|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  2.97k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  2.97k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 54, False: 24.8k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  3.08k|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  3.08k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  3.08k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 110, False: 24.7k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|  3.09k|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|  3.09k|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|  3.09k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (89:2): [True: 811, False: 24.0k]
  ------------------
   90|  3.09k|		fr_pair_list_free(&vp->vp_group);
  ------------------
  |  |  144|  3.09k|#define vp_group		children
  ------------------
   91|  3.09k|		break;
   92|       |
   93|  2.30k|	case FR_TYPE_STRING:
  ------------------
  |  Branch (93:2): [True: 2.30k, False: 22.5k]
  ------------------
   94|  6.63k|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (94:2): [True: 4.32k, False: 20.5k]
  ------------------
   95|  6.63k|		fr_assert(!vp->vp_edit);
  ------------------
  |  |  194|  6.63k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  6.63k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 6.63k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|  6.63k|		if (vp->data.secret) memset_explicit(vp->vp_ptr, 0, vp->vp_length);
  ------------------
  |  |  116|      0|#define vp_ptr			data.datum.ptr			//!< Either octets or strvalue
  ------------------
              		if (vp->data.secret) memset_explicit(vp->vp_ptr, 0, vp->vp_length);
  ------------------
  |  |  117|      0|#define vp_length		data.vb_length
  |  |  ------------------
  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  ------------------
  ------------------
  |  Branch (96:7): [True: 0, False: 6.63k]
  ------------------
   97|  6.63k|		break;
   98|       |
   99|  15.1k|	default:
  ------------------
  |  Branch (99:2): [True: 15.1k, False: 9.72k]
  ------------------
  100|  15.1k|		fr_assert(!vp->vp_edit);
  ------------------
  |  |  194|  15.1k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  15.1k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 15.1k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|  15.1k|		if (vp->data.secret) memset_explicit(&vp->data, 0, sizeof(vp->data));
  ------------------
  |  Branch (101:7): [True: 0, False: 15.1k]
  ------------------
  102|  15.1k|		break;
  103|  24.8k|	}
  104|       |
  105|  24.8k|#ifndef NDEBUG
  106|  24.8k|	memset(vp, 0, sizeof(*vp));
  107|  24.8k|#endif
  108|       |
  109|  24.8k|	return 0;
  110|  24.8k|}
pair.c:pair_init_from_da:
  191|  24.8k|{
  192|       |	/*
  193|       |	 *	Use the 'da' to initialize more fields.
  194|       |	 */
  195|  24.8k|	vp->da = da;
  196|       |
  197|  24.8k|	if (likely(fr_type_is_leaf(da->type))) {
  ------------------
  |  |  396|  24.8k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  ------------------
  |  |  |  Branch (396:23): [True: 21.7k, False: 3.09k]
  |  |  ------------------
  ------------------
  198|  21.7k|		fr_value_box_init(&vp->data, da->type, da, false);
  ------------------
  |  |  610|  21.7k|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|  21.7k|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
  199|  21.7k|	} else {
  200|  3.09k|#ifndef NDEBUG
  201|       |		/*
  202|       |		 *	Make it very obvious if we failed
  203|       |		 *	to initialise something.
  204|       |		 * 	Given the definition of fr_value_box_t, this entails
  205|       |		 * 	writing const-qualified fields. The compiler allows it,
  206|       |		 * 	but Coverity points it out as a defect, so it is annotated.
  207|       |		 */
  208|       |		/* coverity[store_writes_const_field] */
  209|  3.09k|		memset(&vp->data, 0xff, sizeof(vp->data));
  210|  3.09k|#endif
  211|       |
  212|  3.09k|		fr_assert(fr_type_is_structural(da->type));
  ------------------
  |  |  194|  3.09k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  3.09k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 3.09k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|       |
  214|       |		/*
  215|       |		 *	Make sure that the pad field is initialized.
  216|       |		 */
  217|  3.09k|		if (sizeof(vp->pad)) memset(vp->pad, 0, sizeof(vp->pad));
  ------------------
  |  Branch (217:7): [True: 3.09k, Folded]
  ------------------
  218|       |
  219|       |		/*
  220|       |		 *	Hack around const issues...
  221|       |		 * 	Here again, the workaround suffices for the compiler but
  222|       |		 * 	not for Coverity, so again we annotate.
  223|       |		 */
  224|       |		/* coverity[store_writes_const_field] */
  225|  3.09k|		memcpy(UNCONST(fr_type_t *, &vp->vp_type), &da->type, sizeof(vp->vp_type));
  ------------------
  |  |  186|  3.09k|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
              		memcpy(UNCONST(fr_type_t *, &vp->vp_type), &da->type, sizeof(vp->vp_type));
  ------------------
  |  |  149|  3.09k|#define vp_type			data.type
  ------------------
  226|  3.09k|		fr_pair_list_init(&vp->vp_group);
  ------------------
  |  |  144|  3.09k|#define vp_group		children
  ------------------
  227|  3.09k|		vp->vp_group.is_child = true;
  ------------------
  |  |  144|  3.09k|#define vp_group		children
  ------------------
  228|  3.09k|		fr_pair_order_list_talloc_init_children(vp, &vp->vp_group.order);
  ------------------
  |  |  144|  3.09k|#define vp_group		children
  ------------------
  229|  3.09k|	}
  230|  24.8k|}

fr_pair_list_tail:
   56|    133|{
   57|    133|	return fr_pair_order_list_tail(&list->order);
   58|    133|}
fr_pair_list_free:
  113|  1.56k|{
  114|  1.56k|	fr_pair_order_list_talloc_free(&list->order);
  115|  1.56k|}
fr_pair_list_append:
  182|  2.09k|{
  183|       |#ifdef WITH_VERIFY_POINTER
  184|       |	dst->verified = false;
  185|       |#endif
  186|  2.09k|	fr_pair_order_list_move(&dst->order, &src->order);
  187|  2.09k|}

fr_path_default_lib_dir:
   44|      4|{
   45|      4|	return LIBDIR;
  ------------------
  |  |    2|      4|#define LIBDIR		"/usr/local/lib"
  ------------------
   46|      4|}

fr_vasprintf:
  861|  7.96k|{
  862|  7.96k|	return fr_vasprintf_internal(ctx, fmt, ap, false);
  863|  7.96k|}
print.c:fr_vasprintf_internal:
  484|  7.96k|{
  485|  7.96k|	char const	*p = fmt, *end = p + strlen(fmt), *fmt_p = p, *fmt_q = p;
  486|  7.96k|	char		*out = NULL, *out_tmp;
  487|  7.96k|	va_list		ap_p, ap_q;
  488|  7.96k|	char		*subst;
  489|       |
  490|  7.96k|	out = talloc_strdup(ctx, "");
  ------------------
  |  |  149|  7.96k|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  491|  7.96k|	va_copy(ap_p, ap);
  492|  7.96k|	va_copy(ap_q, ap_p);
  493|       |
  494|   281k|	do {
  495|   281k|		char const	*q;
  496|   281k|		char		len[2] = { '\0', '\0' };
  497|       |
  498|   281k|		subst = NULL;
  499|       |
  500|   281k|		if ((*p != '%') || (*++p == '%')) {
  ------------------
  |  Branch (500:7): [True: 268k, False: 13.2k]
  |  Branch (500:22): [True: 0, False: 13.2k]
  ------------------
  501|   268k|			fmt_q = p + 1;
  502|   268k|			continue;	/* literal char */
  503|   268k|		}
  504|       |
  505|       |		/*
  506|       |		 *	Check for parameter field
  507|       |		 */
  508|  13.2k|		for (q = p; isdigit((uint8_t) *q); q++);
  ------------------
  |  Branch (508:15): [True: 2.34k, False: 13.2k]
  ------------------
  509|  13.2k|		if ((q != p) && (*q == '$')) {
  ------------------
  |  Branch (509:7): [True: 1.17k, False: 12.0k]
  |  Branch (509:19): [True: 0, False: 1.17k]
  ------------------
  510|      0|			p = q + 1;
  511|      0|		}
  512|       |
  513|       |		/*
  514|       |		 *	Check for flags
  515|       |		 */
  516|  14.4k|		do {
  517|  14.4k|			switch (*p) {
  518|      0|			case '-':
  ------------------
  |  Branch (518:4): [True: 0, False: 14.4k]
  ------------------
  519|      0|				continue;
  520|       |
  521|      0|			case '+':
  ------------------
  |  Branch (521:4): [True: 0, False: 14.4k]
  ------------------
  522|      0|				continue;
  523|       |
  524|      0|			case ' ':
  ------------------
  |  Branch (524:4): [True: 0, False: 14.4k]
  ------------------
  525|      0|				continue;
  526|       |
  527|  1.17k|			case '0':
  ------------------
  |  Branch (527:4): [True: 1.17k, False: 13.2k]
  ------------------
  528|  1.17k|				continue;
  529|       |
  530|      0|			case '#':
  ------------------
  |  Branch (530:4): [True: 0, False: 14.4k]
  ------------------
  531|      0|				continue;
  532|       |
  533|  13.2k|			default:
  ------------------
  |  Branch (533:4): [True: 13.2k, False: 1.17k]
  ------------------
  534|  13.2k|				goto done_flags;
  535|  14.4k|			}
  536|  14.4k|		} while (++p < end);
  ------------------
  |  Branch (536:12): [True: 1.17k, False: 0]
  ------------------
  537|  13.2k|	done_flags:
  538|       |
  539|       |		/*
  540|       |		 *	Check for width field.  First for strings, and
  541|       |		 *	then for other parameters.
  542|       |		 */
  543|  13.2k|		if ((*p == '.') && (*(p + 1) == '*') && (*(p + 2) == 's')) {
  ------------------
  |  Branch (543:7): [True: 0, False: 13.2k]
  |  Branch (543:22): [True: 0, False: 0]
  |  Branch (543:43): [True: 0, False: 0]
  ------------------
  544|      0|			(void) va_arg(ap_q, int);
  545|      0|			p += 2;
  546|  13.2k|		} else if (*p == '*') {
  ------------------
  |  Branch (546:14): [True: 0, False: 13.2k]
  ------------------
  547|      0|			(void) va_arg(ap_q, int);
  548|      0|			p++;
  549|  13.2k|		} else {
  550|  13.2k|			for (q = p; isdigit((uint8_t) *q); q++);
  ------------------
  |  Branch (550:16): [True: 1.17k, False: 13.2k]
  ------------------
  551|  13.2k|			p = q;
  552|  13.2k|		}
  553|       |
  554|       |		/*
  555|       |		 *	Check for precision field
  556|       |		 */
  557|  13.2k|		if (*p == '.') {
  ------------------
  |  Branch (557:7): [True: 0, False: 13.2k]
  ------------------
  558|      0|			char *r;
  559|       |
  560|      0|			p++;
  561|      0|			(void) strtoul(p, &r, 10);
  562|      0|			p = r;
  563|      0|		}
  564|       |
  565|       |		/*
  566|       |		 *	Length modifiers
  567|       |		 */
  568|  13.2k|		switch (*p) {
  ------------------
  |  Branch (568:11): [True: 1.48k, False: 11.7k]
  ------------------
  569|      0|		case 'h':
  ------------------
  |  Branch (569:3): [True: 0, False: 13.2k]
  ------------------
  570|      0|		case 'l':
  ------------------
  |  Branch (570:3): [True: 0, False: 13.2k]
  ------------------
  571|      0|			len[0] = *p++;
  572|      0|			if ((*p == 'h') || (*p == 'l')) len[1] = *p++;
  ------------------
  |  Branch (572:8): [True: 0, False: 0]
  |  Branch (572:23): [True: 0, False: 0]
  ------------------
  573|      0|			break;
  574|       |
  575|      0|		case 'L':
  ------------------
  |  Branch (575:3): [True: 0, False: 13.2k]
  ------------------
  576|  1.48k|		case 'z':
  ------------------
  |  Branch (576:3): [True: 1.48k, False: 11.7k]
  ------------------
  577|  1.48k|		case 'j':
  ------------------
  |  Branch (577:3): [True: 0, False: 13.2k]
  ------------------
  578|  1.48k|		case 't':
  ------------------
  |  Branch (578:3): [True: 0, False: 13.2k]
  ------------------
  579|  1.48k|			len[0] = *p++;
  580|  1.48k|			break;
  581|  13.2k|		}
  582|       |
  583|       |		/*
  584|       |		 *	Types
  585|       |		 */
  586|  13.2k|		switch (*p) {
  587|      0|		case 'i':								/* int */
  ------------------
  |  Branch (587:3): [True: 0, False: 13.2k]
  ------------------
  588|     63|		case 'd':								/* int */
  ------------------
  |  Branch (588:3): [True: 63, False: 13.1k]
  ------------------
  589|  3.81k|		case 'u':								/* unsigned int */
  ------------------
  |  Branch (589:3): [True: 3.74k, False: 9.49k]
  ------------------
  590|  4.98k|		case 'x':								/* unsigned int */
  ------------------
  |  Branch (590:3): [True: 1.17k, False: 12.0k]
  ------------------
  591|  4.98k|		case 'X':								/* unsigned int */
  ------------------
  |  Branch (591:3): [True: 0, False: 13.2k]
  ------------------
  592|  4.98k|		case 'o':								/* unsigned int */
  ------------------
  |  Branch (592:3): [True: 0, False: 13.2k]
  ------------------
  593|  4.98k|			switch (len[0]) {
  ------------------
  |  Branch (593:12): [True: 4.98k, False: 0]
  ------------------
  594|      0|			case 'h':
  ------------------
  |  Branch (594:4): [True: 0, False: 4.98k]
  ------------------
  595|      0|				if (len[1] == 'h') {					/* char (promoted to int) */
  ------------------
  |  Branch (595:9): [True: 0, False: 0]
  ------------------
  596|      0|					(void) va_arg(ap_q, int);
  597|      0|				} else {
  598|      0|					(void) va_arg(ap_q, int);			/* short (promoted to int) */
  599|      0|				}
  600|      0|				break;
  601|       |
  602|      0|			case 'l':
  ------------------
  |  Branch (602:4): [True: 0, False: 4.98k]
  ------------------
  603|      0|				if ((*p == 'i') || (*p == 'd')) {
  ------------------
  |  Branch (603:9): [True: 0, False: 0]
  |  Branch (603:24): [True: 0, False: 0]
  ------------------
  604|      0|					if (len[1] == 'l') {
  ------------------
  |  Branch (604:10): [True: 0, False: 0]
  ------------------
  605|      0|						(void) va_arg(ap_q, long long);		/* long long */
  606|      0|					} else {
  607|      0|						(void) va_arg(ap_q, long);		/* long */
  608|      0|					}
  609|      0|				} else {
  610|      0|					if (len[1] == 'l') {
  ------------------
  |  Branch (610:10): [True: 0, False: 0]
  ------------------
  611|      0|						(void) va_arg(ap_q, unsigned long long); /* unsigned long long */
  612|      0|					} else {
  613|      0|						(void) va_arg(ap_q, unsigned long);	/* unsigned long */
  614|      0|					}
  615|      0|				}
  616|      0|				break;
  617|       |
  618|  1.48k|			case 'z':
  ------------------
  |  Branch (618:4): [True: 1.48k, False: 3.49k]
  ------------------
  619|  1.48k|				(void) va_arg(ap_q, size_t);				/* size_t */
  620|  1.48k|				break;
  621|       |
  622|      0|			case 'j':
  ------------------
  |  Branch (622:4): [True: 0, False: 4.98k]
  ------------------
  623|      0|				(void) va_arg(ap_q, intmax_t);				/* intmax_t */
  624|      0|				break;
  625|       |
  626|      0|			case 't':
  ------------------
  |  Branch (626:4): [True: 0, False: 4.98k]
  ------------------
  627|      0|				(void) va_arg(ap_q, ptrdiff_t);				/* ptrdiff_t */
  628|      0|				break;
  629|       |
  630|  3.49k|			case '\0':	/* no length modifier */
  ------------------
  |  Branch (630:4): [True: 3.49k, False: 1.48k]
  ------------------
  631|  3.49k|				if ((*p == 'i') || (*p == 'd')) {
  ------------------
  |  Branch (631:9): [True: 0, False: 3.49k]
  |  Branch (631:24): [True: 40, False: 3.45k]
  ------------------
  632|     40|					(void) va_arg(ap_q, int);			/* int */
  633|  3.45k|				} else {
  634|  3.45k|					(void) va_arg(ap_q, unsigned int);		/* unsigned int */
  635|  3.45k|				}
  636|  4.98k|			}
  637|  4.98k|			break;
  638|       |
  639|  4.98k|		case 'f':								/* double */
  ------------------
  |  Branch (639:3): [True: 0, False: 13.2k]
  ------------------
  640|      0|		case 'F':								/* double */
  ------------------
  |  Branch (640:3): [True: 0, False: 13.2k]
  ------------------
  641|      0|		case 'e':								/* double */
  ------------------
  |  Branch (641:3): [True: 0, False: 13.2k]
  ------------------
  642|      0|		case 'E':								/* double */
  ------------------
  |  Branch (642:3): [True: 0, False: 13.2k]
  ------------------
  643|      0|		case 'g':								/* double */
  ------------------
  |  Branch (643:3): [True: 0, False: 13.2k]
  ------------------
  644|      0|		case 'G':								/* double */
  ------------------
  |  Branch (644:3): [True: 0, False: 13.2k]
  ------------------
  645|      0|		case 'a':								/* double */
  ------------------
  |  Branch (645:3): [True: 0, False: 13.2k]
  ------------------
  646|      0|		case 'A':								/* double */
  ------------------
  |  Branch (646:3): [True: 0, False: 13.2k]
  ------------------
  647|      0|			switch (len[0]) {
  648|      0|			case 'L':
  ------------------
  |  Branch (648:4): [True: 0, False: 0]
  ------------------
  649|      0|				(void) va_arg(ap_q, long double);			/* long double */
  650|      0|				break;
  651|       |
  652|      0|			case 'l':	/* does nothing */
  ------------------
  |  Branch (652:4): [True: 0, False: 0]
  ------------------
  653|      0|			default:	/* no length modifier */
  ------------------
  |  Branch (653:4): [True: 0, False: 0]
  ------------------
  654|      0|				(void) va_arg(ap_q, double);				/* double */
  655|      0|			}
  656|      0|			break;
  657|       |
  658|  8.25k|		case 's':
  ------------------
  |  Branch (658:3): [True: 8.25k, False: 4.98k]
  ------------------
  659|  8.25k|			(void) va_arg(ap_q, char *);					/* char * */
  660|  8.25k|			break;
  661|       |
  662|      0|		case 'c':
  ------------------
  |  Branch (662:3): [True: 0, False: 13.2k]
  ------------------
  663|      0|			(void) va_arg(ap_q, int);					/* char (promoted to int) */
  664|      0|			break;
  665|       |
  666|      0|		case 'p':
  ------------------
  |  Branch (666:3): [True: 0, False: 13.2k]
  ------------------
  667|       |			/*
  668|       |			 *	subst types
  669|       |			 */
  670|      0|			switch (*(p + 1)) {
  671|      0|			case 'R':
  ------------------
  |  Branch (671:4): [True: 0, False: 0]
  ------------------
  672|       |				/*
  673|       |				 *	If the caller explicitly asks to suppress secrets via '%pR', then we
  674|       |				 *	do that.
  675|       |				 */
  676|      0|				suppress_secrets = true;
  677|      0|				FALL_THROUGH;
  ------------------
  |  |  341|      0|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      0|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
  678|       |
  679|      0|			case 'V':
  ------------------
  |  Branch (679:4): [True: 0, False: 0]
  ------------------
  680|      0|			{
  681|      0|				fr_value_box_t const *in = va_arg(ap_q, fr_value_box_t const *);
  682|       |
  683|       |				/*
  684|       |				 *	Allocations that are not part of the output
  685|       |				 *	string need to occur in the NULL ctx so we don't fragment
  686|       |				 *	any pool associated with it.
  687|       |				 */
  688|      0|				if (unlikely(in && in->secret && suppress_secrets)) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  689|      0|					subst = talloc_strdup(NULL, "<<< secret >>>");
  ------------------
  |  |  149|      0|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  690|       |
  691|      0|				} else if (in) {
  ------------------
  |  Branch (691:16): [True: 0, False: 0]
  ------------------
  692|       |					/*
  693|       |					 *	Value boxes get escaped as double-quoted strings.
  694|       |					 */
  695|      0|					fr_value_box_aprint(NULL, &subst, in, &fr_value_escape_double);
  696|       |
  697|      0|				} else {
  698|      0|					subst = talloc_strdup(NULL, "(null)");
  ------------------
  |  |  149|      0|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  699|      0|				}
  700|       |
  701|      0|			do_splice:
  702|      0|				if (!subst) goto oom;
  ------------------
  |  Branch (702:9): [True: 0, False: 0]
  ------------------
  703|       |
  704|      0|				p++;
  705|       |
  706|       |				/*
  707|       |				 *	Pass part of a format string to printf
  708|       |				 */
  709|      0|				if (fmt_q != fmt_p) {
  ------------------
  |  Branch (709:9): [True: 0, False: 0]
  ------------------
  710|      0|					char *sub_fmt;
  711|       |
  712|      0|					sub_fmt = talloc_strndup(NULL, fmt_p, fmt_q - fmt_p);
  ------------------
  |  |  150|      0|#define talloc_strndup(_ctx, _str, _len) talloc_typed_strndup((TALLOC_CTX *) (_ctx), _str, _len)
  ------------------
  713|      0|					out_tmp = talloc_vasprintf_append_buffer(out, sub_fmt, ap_p);
  714|      0|					talloc_free(sub_fmt);
  715|      0|					if (!out_tmp) {
  ------------------
  |  Branch (715:10): [True: 0, False: 0]
  ------------------
  716|      0|					oom:
  717|      0|						fr_strerror_const("Out of memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  718|      0|						talloc_free(out);
  719|      0|						TALLOC_FREE(subst);
  ------------------
  |  Branch (719:7): [True: 0, False: 0]
  |  Branch (719:7): [Folded, False: 0]
  ------------------
  720|      0|						va_end(ap_p);
  721|      0|						va_end(ap_q);
  722|      0|						return NULL;
  723|      0|					}
  724|      0|					out = out_tmp;
  725|       |
  726|      0|					out_tmp = talloc_strdup_append_buffer(out, subst);
  727|      0|					if (!out_tmp) goto oom;
  ------------------
  |  Branch (727:10): [True: 0, False: 0]
  ------------------
  728|      0|					TALLOC_FREE(subst);
  ------------------
  |  Branch (728:6): [True: 0, False: 0]
  |  Branch (728:6): [Folded, False: 0]
  ------------------
  729|      0|					out = out_tmp;
  730|       |
  731|      0|					va_end(ap_p);		/* one time use only */
  732|      0|				} else {
  733|      0|					out_tmp = talloc_strdup_append_buffer(out, subst);
  734|      0|					if (!out_tmp) goto oom;
  ------------------
  |  Branch (734:10): [True: 0, False: 0]
  ------------------
  735|      0|					TALLOC_FREE(subst);
  ------------------
  |  Branch (735:6): [True: 0, False: 0]
  |  Branch (735:6): [Folded, False: 0]
  ------------------
  736|      0|					out = out_tmp;
  737|      0|				}
  738|       |
  739|      0|				va_copy(ap_p, ap_q);	/* already advanced to the next argument */
  740|       |
  741|      0|				fmt_p = p + 1;
  742|      0|			}
  743|      0|				break;
  744|       |
  745|      0|			case 'H':
  ------------------
  |  Branch (745:4): [True: 0, False: 0]
  ------------------
  746|      0|			{
  747|      0|				fr_value_box_t const *in = va_arg(ap_q, fr_value_box_t const *);
  748|       |
  749|      0|				if (!in) {
  ------------------
  |  Branch (749:9): [True: 0, False: 0]
  ------------------
  750|      0|					subst = talloc_strdup(NULL, "(null)");
  ------------------
  |  |  149|      0|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  751|      0|					goto do_splice;
  752|      0|				}
  753|       |
  754|      0|				switch (in->type) {
  755|      0|				case FR_TYPE_OCTETS:
  ------------------
  |  Branch (755:5): [True: 0, False: 0]
  ------------------
  756|      0|					if (in->vb_octets) {
  ------------------
  |  |  259|      0|#define vb_octets				datum.octets
  ------------------
  |  Branch (756:10): [True: 0, False: 0]
  ------------------
  757|      0|						fr_base16_aencode(NULL, &subst, &FR_DBUFF_TMP(in->vb_octets, in->vb_length));
  ------------------
  |  |  522|      0|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|      0|(fr_dbuff_t){ \
  |  |  524|      0|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|      0|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|      0|	.end_i		= _Generic((_len_or_end), \
  |  |  527|      0|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|      0|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|      0|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|      0|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|      0|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|      0|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|      0|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|      0|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|      0|			), \
  |  |  536|      0|	.p_i		= _start, \
  |  |  537|      0|	.is_const	= _Generic((_start), \
  |  |  538|      0|				uint8_t *	: false, \
  |  |  539|      0|				uint8_t const *	: true, \
  |  |  540|      0|				char *		: false, \
  |  |  541|      0|				char const *	: true \
  |  |  542|      0|	       		) \
  |  |  543|      0|}
  ------------------
  758|      0|					} else {
  759|      0|						subst = talloc_strdup(NULL, "");
  ------------------
  |  |  149|      0|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  760|      0|					}
  761|      0|					break;
  762|       |
  763|      0|				case FR_TYPE_STRING:
  ------------------
  |  Branch (763:5): [True: 0, False: 0]
  ------------------
  764|      0|					fr_base16_aencode(NULL, &subst, &FR_DBUFF_TMP((uint8_t const *)in->vb_strvalue, in->vb_length));
  ------------------
  |  |  522|      0|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|      0|(fr_dbuff_t){ \
  |  |  524|      0|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|      0|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|      0|	.end_i		= _Generic((_len_or_end), \
  |  |  527|      0|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|      0|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|      0|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|      0|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|      0|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|      0|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|      0|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|      0|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|      0|			), \
  |  |  536|      0|	.p_i		= _start, \
  |  |  537|      0|	.is_const	= _Generic((_start), \
  |  |  538|      0|				uint8_t *	: false, \
  |  |  539|      0|				uint8_t const *	: true, \
  |  |  540|      0|				char *		: false, \
  |  |  541|      0|				char const *	: true \
  |  |  542|      0|	       		) \
  |  |  543|      0|}
  ------------------
  765|      0|					break;
  766|       |
  767|      0|				default:
  ------------------
  |  Branch (767:5): [True: 0, False: 0]
  ------------------
  768|      0|				{
  769|      0|					fr_value_box_t dst;
  770|       |
  771|       |					/*
  772|       |					 *	Convert the boxed value into a octets buffer
  773|       |					 */
  774|      0|					if (fr_value_box_cast(NULL, &dst, FR_TYPE_OCTETS, NULL, in) < 0) {
  ------------------
  |  Branch (774:10): [True: 0, False: 0]
  ------------------
  775|      0|						subst = talloc_strdup(NULL, fr_strerror()); /* splice in the error */
  ------------------
  |  |  149|      0|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  776|      0|						if (!subst) goto oom;
  ------------------
  |  Branch (776:11): [True: 0, False: 0]
  ------------------
  777|      0|					}
  778|       |
  779|      0|					fr_base16_aencode(NULL, &subst, &FR_DBUFF_TMP((uint8_t const *)dst.vb_octets, dst.vb_length));
  ------------------
  |  |  522|      0|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|      0|(fr_dbuff_t){ \
  |  |  524|      0|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|      0|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|      0|	.end_i		= _Generic((_len_or_end), \
  |  |  527|      0|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|      0|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|      0|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|      0|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|      0|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|      0|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|      0|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|      0|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|      0|			), \
  |  |  536|      0|	.p_i		= _start, \
  |  |  537|      0|	.is_const	= _Generic((_start), \
  |  |  538|      0|				uint8_t *	: false, \
  |  |  539|      0|				uint8_t const *	: true, \
  |  |  540|      0|				char *		: false, \
  |  |  541|      0|				char const *	: true \
  |  |  542|      0|	       		) \
  |  |  543|      0|}
  ------------------
  780|      0|					fr_value_box_clear(&dst);
  781|      0|					break;
  782|      0|				}
  783|      0|				}
  784|      0|			}
  785|      0|				goto do_splice;
  786|       |
  787|      0|			case 'M':
  ------------------
  |  Branch (787:4): [True: 0, False: 0]
  ------------------
  788|      0|			{
  789|      0|				fr_value_box_list_t const *in = va_arg(ap_q, fr_value_box_list_t const *);
  790|       |
  791|      0|				if (!in) {
  ------------------
  |  Branch (791:9): [True: 0, False: 0]
  ------------------
  792|      0|					subst = talloc_strdup(NULL, "(null)");
  ------------------
  |  |  149|      0|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  793|      0|					goto do_splice;
  794|      0|				}
  795|       |
  796|      0|				if (suppress_secrets) {
  ------------------
  |  Branch (796:9): [True: 0, False: 0]
  ------------------
  797|      0|					subst = fr_value_box_list_aprint_secure(NULL, in, NULL, &fr_value_escape_double);
  798|      0|				} else {
  799|      0|					subst = fr_value_box_list_aprint(NULL, in, NULL, &fr_value_escape_double);
  800|      0|				}
  801|      0|			}
  802|      0|				goto do_splice;
  803|       |
  804|      0|			case 'P':
  ------------------
  |  Branch (804:4): [True: 0, False: 0]
  ------------------
  805|      0|			{
  806|      0|				fr_pair_t const *in = va_arg(ap_q, fr_pair_t const *);
  807|       |
  808|      0|				if (!in) {
  ------------------
  |  Branch (808:9): [True: 0, False: 0]
  ------------------
  809|      0|					subst = talloc_strdup(NULL, "(null)");
  ------------------
  |  |  149|      0|#define talloc_strdup(_ctx, _str)	 talloc_typed_strdup((TALLOC_CTX *) (_ctx), _str)
  ------------------
  810|      0|					goto do_splice;
  811|      0|				}
  812|       |
  813|      0|				PAIR_VERIFY(in);
  ------------------
  |  |  167|      0|#  define PAIR_VERIFY(_x)		fr_pair_verify(__FILE__, __LINE__, NULL, NULL, _x, true)
  ------------------
  814|       |
  815|      0|				if (unlikely(in && suppress_secrets)) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  816|      0|					fr_pair_aprint_secure(NULL, &subst, NULL, in);
  817|      0|				} else {
  818|      0|					fr_pair_aprint(NULL, &subst, NULL, in);
  819|      0|				}
  820|      0|			}
  821|      0|				goto do_splice;
  822|       |
  823|      0|			default:
  ------------------
  |  Branch (823:4): [True: 0, False: 0]
  ------------------
  824|      0|				(void) va_arg(ap_q, void *);				/* void * */
  825|      0|			}
  826|      0|			break;
  827|       |
  828|      0|		case 'n':
  ------------------
  |  Branch (828:3): [True: 0, False: 13.2k]
  ------------------
  829|      0|			(void) va_arg(ap_q, int *);					/* int * */
  830|      0|			break;
  831|       |
  832|      0|		default:
  ------------------
  |  Branch (832:3): [True: 0, False: 13.2k]
  ------------------
  833|      0|			break;
  834|  13.2k|		}
  835|  13.2k|		fmt_q = p + 1;
  836|   281k|	} while (++p < end);
  ------------------
  |  Branch (836:11): [True: 273k, False: 7.96k]
  ------------------
  837|       |
  838|       |	/*
  839|       |	 *	Print out the rest of the format string.
  840|       |	 */
  841|  7.96k|	if (*fmt_p) {
  ------------------
  |  Branch (841:6): [True: 7.96k, False: 0]
  ------------------
  842|  7.96k|		out_tmp = talloc_vasprintf_append_buffer(out, fmt_p, ap_p);
  843|  7.96k|		if (!out_tmp) goto oom;
  ------------------
  |  Branch (843:7): [True: 0, False: 7.96k]
  ------------------
  844|  7.96k|		out = out_tmp;
  845|  7.96k|	}
  846|       |
  847|  7.96k|	va_end(ap_p);
  848|  7.96k|	va_end(ap_q);
  849|       |
  850|       |	/*
  851|       |	 *	One of the above talloc calls sets the type to
  852|       |	 *	be the string.  We correct this here so we
  853|       |	 *	don't trigger talloc_aborts later...
  854|       |	 */
  855|  7.96k|	talloc_set_type(out, char);
  856|       |
  857|  7.96k|	return out;
  858|  7.96k|}

fr_proto_da_stack_build:
  119|    125|{
  120|    125|	fr_dict_attr_t const *da_p, **da_o;
  121|       |
  122|    125|	if (!da) return;
  ------------------
  |  Branch (122:6): [True: 0, False: 125]
  ------------------
  123|       |
  124|       |	/*
  125|       |	 *	Manually build the da_stack.
  126|       |	 */
  127|    125|	da_p = da;
  128|    125|	da_o = stack->da + (da->depth - 1);
  129|       |
  130|    375|	while (da_o >= stack->da) {
  ------------------
  |  Branch (130:9): [True: 250, False: 125]
  ------------------
  131|    250|		*da_o-- = da_p;
  132|    250|		da_p = da_p->parent;
  133|    250|	}
  134|       |
  135|    125|	stack->depth = da->depth;
  136|       |	stack->da[stack->depth] = NULL;
  137|    125|}

_fr_rb_init:
  150|      8|{
  151|       |
  152|      8|	if (unlikely(offset >= UINT16_MAX)) {
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  153|      0|		fr_strerror_printf("Inline fr_rb_node_t offset too large.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  154|      0|				   "Expected <= %zu, got %zd", (size_t) UINT16_MAX, offset);
  |  |  ------------------
  ------------------
  154|      0|				   "Expected <= %zu, got %zd", (size_t) UINT16_MAX, offset);
  155|      0|		return -1;
  156|      0|	}
  157|       |
  158|      8|	*tree = (fr_rb_tree_t) {
  159|      8|#ifndef NDEBUG
  160|      8|		.magic = RB_MAGIC,
  ------------------
  |  |   33|      8|#  define RB_MAGIC (0x5ad09c42)
  ------------------
  161|      8|#endif
  162|      8|		.root = NIL,
  ------------------
  |  |   29|      8|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  163|      8|		.node_ctx = node_ctx,
  164|      8|		.offset = offset < 0 ? 0 : (uint16_t)offset,
  ------------------
  |  Branch (164:13): [True: 0, False: 8]
  ------------------
  165|      8|		.type = type,
  166|      8|		.data_cmp = data_cmp,
  167|      8|		.data_free = data_free,
  168|      8|	};
  169|       |
  170|       |	/*
  171|       |	 *	Use inline nodes
  172|       |	 */
  173|      8|	if (offset >= 0) {
  ------------------
  |  Branch (173:6): [True: 8, False: 0]
  ------------------
  174|      8|		tree->node_alloc = _node_inline_alloc;
  175|      8|		tree->node_free = _node_inline_free;
  176|       |	/*
  177|       |	 *	Allocate node data on the heap
  178|       |	 */
  179|      8|	} else {
  180|      0|		tree->node_alloc = _node_heap_alloc;
  181|      0|		tree->node_free = _node_heap_free;
  182|      0|	}
  183|       |
  184|      8|	return 0;
  185|      8|}
_fr_rb_alloc:
  205|      8|{
  206|      8|	fr_rb_tree_t *tree;
  207|       |
  208|      8|	tree = talloc(ctx, fr_rb_tree_t);
  209|      8|	if (unlikely(!tree)) return NULL;
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  210|       |
  211|      8|	if (unlikely(_fr_rb_init(tree, tree, offset, type, data_cmp, data_free) < 0)) {
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  212|      0|		talloc_free(tree);
  213|      0|		return NULL;
  214|      0|	}
  215|       |
  216|      8|	talloc_set_destructor(tree, _tree_free);
  ------------------
  |  Branch (216:2): [Folded, False: 8]
  ------------------
  217|       |
  218|      8|	return tree;
  219|      8|}
fr_rb_find:
  578|     20|{
  579|     20|	fr_rb_node_t *x;
  580|       |
  581|     20|	if (unlikely(tree->being_freed)) return NULL;
  ------------------
  |  |  397|     20|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 20]
  |  |  ------------------
  ------------------
  582|     20|	x = find_node(tree, data);
  583|     20|	if (!x) return NULL;
  ------------------
  |  Branch (583:6): [True: 12, False: 8]
  ------------------
  584|       |
  585|      8|	return x->data;
  586|     20|}
fr_rb_insert:
  627|     12|{
  628|     12|	if (insert_node(NULL, tree, UNCONST(void *, data)) == 0) return true;
  ------------------
  |  |  186|     12|#define UNCONST(_type, _ptr)		((_type)((uintptr_t)(_ptr)))
  ------------------
  |  Branch (628:6): [True: 12, False: 0]
  ------------------
  629|       |
  630|      0|	return false;
  631|     12|}
fr_rb_delete:
  742|     12|{
  743|     12|	fr_rb_node_t *node;
  744|       |
  745|     12|	if (unlikely(tree->being_freed)) return false;
  ------------------
  |  |  397|     12|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  746|     12|	node = find_node(tree, data);
  747|     12|	if (!node) return false;
  ------------------
  |  Branch (747:6): [True: 0, False: 12]
  ------------------
  748|       |
  749|     12|	if (unlikely(node->being_freed)) return true;
  ------------------
  |  |  397|     12|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  750|       |
  751|     12|	delete_internal(tree, node, tree->data_free);
  752|       |
  753|     12|	return true;
  754|     12|}
fr_rb_num_elements:
  782|     10|{
  783|     10|	return tree->num_elements;
  784|     10|}
rb.c:_node_inline_alloc:
   49|     12|{
   50|     12|	return (fr_rb_node_t *)((uintptr_t)data + tree->offset);
   51|     12|}
rb.c:_node_inline_free:
   56|     12|{
   57|     12|	if (free_data && tree->data_free) {
  ------------------
  |  Branch (57:6): [True: 0, False: 12]
  |  Branch (57:19): [True: 0, False: 0]
  ------------------
   58|      0|		node_data_free(tree, node);
   59|     12|	} else {
   60|     12|		memset(node, 0, sizeof(fr_rb_node_t));	/* makes "still in tree?" checks easier */
   61|     12|	}
   62|     12|}
rb.c:_tree_free:
  105|      6|{
  106|       |	/*
  107|       |	 *	Prevent duplicate frees
  108|       |	 */
  109|      6|	if (unlikely(tree->being_freed)) return -1;
  ------------------
  |  |  397|      6|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 6]
  |  |  ------------------
  ------------------
  110|      6|	tree->being_freed = true;
  111|       |
  112|       |	/*
  113|       |	 *	walk the tree, deleting the nodes...
  114|       |	 */
  115|      6|	if ((tree->root != NIL) && tree->data_free) free_walker(tree, tree->root);
  ------------------
  |  |   29|      6|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (115:6): [True: 0, False: 6]
  |  Branch (115:29): [True: 0, False: 0]
  ------------------
  116|       |
  117|       |	/*
  118|       |	 *	Ensure all dependents on the tree run their
  119|       |	 *	destructors.  The tree at this point should
  120|       |	 *	and any tree operations should be empty.
  121|       |	 */
  122|      6|	talloc_free_children(tree);
  123|       |
  124|      6|#ifndef NDEBUG
  125|      6|	tree->magic = 0;
  126|      6|#endif
  127|      6|	tree->root = NIL;
  ------------------
  |  |   29|      6|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  128|      6|	tree->num_elements = 0;
  129|       |
  130|      6|	return 0;
  131|      6|}
rb.c:find_node:
  548|     32|{
  549|     32|	fr_rb_node_t *current;
  550|       |
  551|     32|	if (unlikely(tree->being_freed)) return NULL;
  ------------------
  |  |  397|     32|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 32]
  |  |  ------------------
  ------------------
  552|       |
  553|     32|	current = tree->root;
  554|       |
  555|     40|	while (current != NIL) {
  ------------------
  |  |   29|     40|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (555:9): [True: 28, False: 12]
  ------------------
  556|     28|		int result = tree->data_cmp(data, current->data);
  557|       |
  558|     28|		if (result == 0) return current;
  ------------------
  |  Branch (558:7): [True: 20, False: 8]
  ------------------
  559|       |
  560|      8|		current = (result < 0) ? current->left : current->right;
  ------------------
  |  Branch (560:13): [True: 6, False: 2]
  ------------------
  561|      8|	}
  562|       |
  563|     12|	return NULL;
  564|     32|}
rb.c:insert_node:
  346|     12|{
  347|     12|	fr_rb_node_t *current, *parent, *x;
  348|       |
  349|     12|	if (unlikely(tree->being_freed)) return -1;
  ------------------
  |  |  397|     12|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  350|       |
  351|     12|#ifndef TALLOC_GET_TYPE_ABORT_NOOP
  352|     12|	if (tree->type) (void)_talloc_get_type_abort(data, tree->type, __location__);
  ------------------
  |  Branch (352:6): [True: 4, False: 8]
  ------------------
  353|     12|#endif
  354|       |
  355|       |	/* find where node belongs */
  356|     12|	current = tree->root;
  357|     12|	parent = NIL;
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  358|     18|	while (current != NIL) {
  ------------------
  |  |   29|     18|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (358:9): [True: 6, False: 12]
  ------------------
  359|      6|		int result;
  360|       |
  361|       |		/*
  362|       |		 *	See if two entries are identical.
  363|       |		 */
  364|      6|		result = tree->data_cmp(data, current->data);
  365|      6|		if (result == 0) {
  ------------------
  |  Branch (365:7): [True: 0, False: 6]
  ------------------
  366|      0|			if (existing) *existing = current;
  ------------------
  |  Branch (366:8): [True: 0, False: 0]
  ------------------
  367|      0|			return 1;
  368|      0|		}
  369|       |
  370|      6|		parent = current;
  371|      6|		current = (result < 0) ? current->left : current->right;
  ------------------
  |  Branch (371:13): [True: 4, False: 2]
  ------------------
  372|      6|	}
  373|       |
  374|       |	/* setup new node */
  375|     12|	x = tree->node_alloc(tree, data);
  376|     12|	if (unlikely(!x)) return -1;
  ------------------
  |  |  397|     12|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  377|       |
  378|     12|	*x = (fr_rb_node_t){
  379|     12|		.data = data,
  380|     12|		.parent = parent,
  381|     12|		.left = NIL,
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  382|     12|		.right = NIL,
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  383|     12|		.colour = RED
  384|     12|	};
  385|       |
  386|       |	/* insert node in tree */
  387|     12|	if (parent != NIL) {
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (387:6): [True: 6, False: 6]
  ------------------
  388|      6|		if (tree->data_cmp(data, parent->data) <= 0) {
  ------------------
  |  Branch (388:7): [True: 4, False: 2]
  ------------------
  389|      4|			parent->left = x;
  390|      4|		} else {
  391|      2|			parent->right = x;
  392|      2|		}
  393|      6|	} else {
  394|      6|		tree->root = x;
  395|      6|	}
  396|       |
  397|     12|	insert_fixup(tree, x);
  398|       |
  399|     12|	tree->num_elements++;
  400|       |
  401|     12|	return 0;
  402|     12|}
rb.c:insert_fixup:
  282|     12|{
  283|       |	/* check RED-BLACK properties */
  284|     12|	while ((x != tree->root) && (x->parent->colour == RED)) {
  ------------------
  |  Branch (284:9): [True: 6, False: 6]
  |  Branch (284:30): [True: 0, False: 6]
  ------------------
  285|       |		/* we have a violation */
  286|      0|		if (x->parent == x->parent->parent->left) {
  ------------------
  |  Branch (286:7): [True: 0, False: 0]
  ------------------
  287|      0|			fr_rb_node_t *y = x->parent->parent->right;
  288|      0|			if (y->colour == RED) {
  ------------------
  |  Branch (288:8): [True: 0, False: 0]
  ------------------
  289|       |				/* uncle is RED */
  290|      0|				x->parent->colour = BLACK;
  291|      0|				y->colour = BLACK;
  292|      0|				x->parent->parent->colour = RED;
  293|      0|				x = x->parent->parent;
  294|      0|			} else {
  295|       |				/* uncle is BLACK */
  296|      0|				if (x == x->parent->right) {
  ------------------
  |  Branch (296:9): [True: 0, False: 0]
  ------------------
  297|       |					/* make x a left child */
  298|      0|					x = x->parent;
  299|      0|					rotate_left(tree, x);
  300|      0|				}
  301|       |
  302|       |				/* recolour and rotate */
  303|      0|				x->parent->colour = BLACK;
  304|      0|				x->parent->parent->colour = RED;
  305|      0|				rotate_right(tree, x->parent->parent);
  306|      0|			}
  307|      0|		} else {
  308|       |			/* mirror image of above code */
  309|      0|			fr_rb_node_t *y = x->parent->parent->left;
  310|      0|			if (y->colour == RED) {
  ------------------
  |  Branch (310:8): [True: 0, False: 0]
  ------------------
  311|       |				/* uncle is RED */
  312|      0|				x->parent->colour = BLACK;
  313|      0|				y->colour = BLACK;
  314|      0|				x->parent->parent->colour = RED;
  315|      0|				x = x->parent->parent;
  316|      0|			} else {
  317|       |				/* uncle is BLACK */
  318|      0|				if (x == x->parent->left) {
  ------------------
  |  Branch (318:9): [True: 0, False: 0]
  ------------------
  319|      0|					x = x->parent;
  320|      0|					rotate_right(tree, x);
  321|      0|				}
  322|       |
  323|      0|				x->parent->colour = BLACK;
  324|      0|				x->parent->parent->colour = RED;
  325|      0|				rotate_left(tree, x->parent->parent);
  326|      0|			}
  327|      0|		}
  328|      0|	}
  329|       |
  330|     12|	tree->root->colour = BLACK;
  331|     12|}
rb.c:delete_internal:
  473|     12|{
  474|     12|	fr_rb_node_t *x, *y;
  475|     12|	fr_rb_node_t *parent;
  476|       |
  477|     12|	if (!z || z == NIL) return;
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (477:6): [True: 0, False: 12]
  |  Branch (477:12): [True: 0, False: 12]
  ------------------
  478|       |
  479|     12|	if (z->left == NIL || z->right == NIL) {
  ------------------
  |  |   29|     24|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
              	if (z->left == NIL || z->right == NIL) {
  ------------------
  |  |   29|      2|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (479:6): [True: 10, False: 2]
  |  Branch (479:24): [True: 2, False: 0]
  ------------------
  480|       |		/* y has a NIL node as a child */
  481|     12|		y = z;
  482|     12|	} else {
  483|       |		/* find tree successor with a NIL node as a child */
  484|      0|		y = z->right;
  485|      0|		while (y->left != NIL) y = y->left;
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (485:10): [True: 0, False: 0]
  ------------------
  486|      0|	}
  487|       |
  488|       |	/* x is y's only child */
  489|     12|	if (y->left != NIL) {
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (489:6): [True: 2, False: 10]
  ------------------
  490|      2|		x = y->left;
  491|     10|	} else {
  492|     10|		x = y->right;	/* may be NIL! */
  493|     10|	}
  494|       |
  495|       |	/* remove y from the parent chain */
  496|     12|	parent = y->parent;
  497|     12|	if (x != NIL) x->parent = parent;
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (497:6): [True: 4, False: 8]
  ------------------
  498|       |
  499|     12|	if (parent != NIL) {
  ------------------
  |  |   29|     12|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (499:6): [True: 2, False: 10]
  ------------------
  500|      2|		if (y == parent->left) {
  ------------------
  |  Branch (500:7): [True: 2, False: 0]
  ------------------
  501|      2|			parent->left = x;
  502|      2|		} else {
  503|      0|			parent->right = x;
  504|      0|		}
  505|     10|	} else {
  506|     10|		tree->root = x;
  507|     10|	}
  508|       |
  509|     12|	if (y != z) {
  ------------------
  |  Branch (509:6): [True: 0, False: 12]
  ------------------
  510|      0|		void *y_data = y->data;
  511|       |
  512|      0|		if ((y->colour == BLACK) && parent) delete_fixup(tree, x, parent);
  ------------------
  |  Branch (512:7): [True: 0, False: 0]
  |  Branch (512:31): [True: 0, False: 0]
  ------------------
  513|       |
  514|       |		/*
  515|       |		 *	The user structure in y->data May include a
  516|       |		 *	pointer to y.  In that case, we CANNOT delete
  517|       |		 *	y.  Instead, we copy z (which is now in the
  518|       |		 *	tree) to y, and fix up the parent/child
  519|       |		 *	pointers.
  520|       |		 */
  521|      0|		memcpy(y, z, sizeof(*y));
  522|      0|		y->data = y_data;
  523|       |
  524|      0|		if (y->parent == NIL) {
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (524:7): [True: 0, False: 0]
  ------------------
  525|      0|			tree->root = y;
  526|      0|		} else {
  527|      0|			if (y->parent->left == z) y->parent->left = y;
  ------------------
  |  Branch (527:8): [True: 0, False: 0]
  ------------------
  528|      0|			if (y->parent->right == z) y->parent->right = y;
  ------------------
  |  Branch (528:8): [True: 0, False: 0]
  ------------------
  529|      0|		}
  530|      0|		if (y->left->parent == z) y->left->parent = y;
  ------------------
  |  Branch (530:7): [True: 0, False: 0]
  ------------------
  531|      0|		if (y->right->parent == z) y->right->parent = y;
  ------------------
  |  Branch (531:7): [True: 0, False: 0]
  ------------------
  532|       |
  533|      0|		tree->node_free(tree, z, free_data);
  534|     12|	} else {
  535|     12|		if (y->colour == BLACK) delete_fixup(tree, x, parent);
  ------------------
  |  Branch (535:7): [True: 10, False: 2]
  ------------------
  536|       |
  537|     12|		tree->node_free(tree, y, free_data);
  538|     12|	}
  539|       |
  540|     12|	tree->num_elements--;
  541|     12|}
rb.c:delete_fixup:
  408|     10|{
  409|     10|	while (x != tree->root && x->colour == BLACK) {
  ------------------
  |  Branch (409:9): [True: 0, False: 10]
  |  Branch (409:28): [True: 0, False: 0]
  ------------------
  410|      0|		if (x == parent->left) {
  ------------------
  |  Branch (410:7): [True: 0, False: 0]
  ------------------
  411|      0|			fr_rb_node_t *w = parent->right;
  412|      0|			if (w->colour == RED) {
  ------------------
  |  Branch (412:8): [True: 0, False: 0]
  ------------------
  413|      0|				w->colour = BLACK;
  414|      0|				parent->colour = RED; /* parent != NIL? */
  415|      0|				rotate_left(tree, parent);
  416|      0|				w = parent->right;
  417|      0|			}
  418|      0|			if ((w->left->colour == BLACK) && (w->right->colour == BLACK)) {
  ------------------
  |  Branch (418:8): [True: 0, False: 0]
  |  Branch (418:38): [True: 0, False: 0]
  ------------------
  419|      0|				if (w != NIL) w->colour = RED;
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (419:9): [True: 0, False: 0]
  ------------------
  420|      0|				x = parent;
  421|      0|				parent = x->parent;
  422|      0|			} else {
  423|      0|				if (w->right->colour == BLACK) {
  ------------------
  |  Branch (423:9): [True: 0, False: 0]
  ------------------
  424|      0|					if (w->left != NIL) w->left->colour = BLACK;
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (424:10): [True: 0, False: 0]
  ------------------
  425|      0|					w->colour = RED;
  426|      0|					rotate_right(tree, w);
  427|      0|					w = parent->right;
  428|      0|				}
  429|      0|				w->colour = parent->colour;
  430|      0|				if (parent != NIL) parent->colour = BLACK;
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (430:9): [True: 0, False: 0]
  ------------------
  431|      0|				if (w->right->colour != BLACK) {
  ------------------
  |  Branch (431:9): [True: 0, False: 0]
  ------------------
  432|      0|					w->right->colour = BLACK;
  433|      0|				}
  434|      0|				rotate_left(tree, parent);
  435|      0|				x = tree->root;
  436|      0|			}
  437|      0|		} else {
  438|      0|			fr_rb_node_t *w = parent->left;
  439|      0|			if (w->colour == RED) {
  ------------------
  |  Branch (439:8): [True: 0, False: 0]
  ------------------
  440|      0|				w->colour = BLACK;
  441|      0|				parent->colour = RED; /* parent != NIL? */
  442|      0|				rotate_right(tree, parent);
  443|      0|				w = parent->left;
  444|      0|			}
  445|      0|			if ((w->right->colour == BLACK) && (w->left->colour == BLACK)) {
  ------------------
  |  Branch (445:8): [True: 0, False: 0]
  |  Branch (445:39): [True: 0, False: 0]
  ------------------
  446|      0|				if (w != NIL) w->colour = RED;
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (446:9): [True: 0, False: 0]
  ------------------
  447|      0|				x = parent;
  448|      0|				parent = x->parent;
  449|      0|			} else {
  450|      0|				if (w->left->colour == BLACK) {
  ------------------
  |  Branch (450:9): [True: 0, False: 0]
  ------------------
  451|      0|					if (w->right != NIL) w->right->colour = BLACK;
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (451:10): [True: 0, False: 0]
  ------------------
  452|      0|					w->colour = RED;
  453|      0|					rotate_left(tree, w);
  454|      0|					w = parent->left;
  455|      0|				}
  456|      0|				w->colour = parent->colour;
  457|      0|				if (parent != NIL) parent->colour = BLACK;
  ------------------
  |  |   29|      0|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (457:9): [True: 0, False: 0]
  ------------------
  458|      0|				if (w->left->colour != BLACK) {
  ------------------
  |  Branch (458:9): [True: 0, False: 0]
  ------------------
  459|      0|					w->left->colour = BLACK;
  460|      0|				}
  461|      0|				rotate_right(tree, parent);
  462|      0|				x = tree->root;
  463|      0|			}
  464|      0|		}
  465|      0|	}
  466|     10|	if (x != NIL) x->colour = BLACK; /* Avoid cache-dirty on NIL */
  ------------------
  |  |   29|     10|#define NIL &sentinel	   /* all leafs are sentinels */
  ------------------
  |  Branch (466:6): [True: 4, False: 6]
  ------------------
  467|     10|}

fr_sbuff_update:
  161|     10|{
  162|     10|	fr_sbuff_t		*sbuff_i;
  163|     10|	char			*old_buff;	/* Current buff */
  164|       |
  165|     10|	old_buff = sbuff->buff;
  166|       |
  167|       |	/*
  168|       |	 *	Update pointers to point to positions
  169|       |	 *	in new buffer based on their relative
  170|       |	 *	offsets in the old buffer... but not
  171|       |	 *	past the end of the new buffer.
  172|       |	 */
  173|     20|	for (sbuff_i = sbuff; sbuff_i; sbuff_i = sbuff_i->parent) {
  ------------------
  |  Branch (173:24): [True: 10, False: 10]
  ------------------
  174|     10|		fr_sbuff_marker_t	*m_i;
  175|       |
  176|     10|		sbuff_i->buff = new_buff;
  177|     10|		sbuff_i->start = new_buff + min(new_len, sbuff_i->start - old_buff);
  178|     10|		sbuff_i->end = sbuff_i->buff + new_len;
  179|     10|		*(sbuff_i->end) = '\0';	/* Re-terminate */
  180|       |
  181|     10|		sbuff_i->p = new_buff + min(new_len, sbuff_i->p - old_buff);
  182|       |
  183|     10|		for (m_i = sbuff_i->m; m_i; m_i = m_i->next) m_i->p = new_buff + min(new_len, m_i->p - old_buff);
  ------------------
  |  Branch (183:26): [True: 0, False: 10]
  ------------------
  184|     10|	}
  185|     10|}
fr_sbuff_extend_talloc:
  370|      8|{
  371|      8|	fr_sbuff_uctx_talloc_t	*tctx = sbuff->uctx;
  372|      8|	size_t			clen, nlen, elen = extension;
  373|      8|	char			*new_buff;
  374|       |
  375|      8|	CHECK_SBUFF_INIT(sbuff);
  ------------------
  |  |   56|      8|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (56:45): [True: 0, False: 8]
  |  |  |  Branch (56:198): [Folded, False: 8]
  |  |  ------------------
  ------------------
  376|       |
  377|      8|	clen = sbuff->buff ? talloc_array_length(sbuff->buff) : 0;
  ------------------
  |  Branch (377:9): [True: 8, False: 0]
  ------------------
  378|       |	/*
  379|       |	 *	If the current buffer size + the extension
  380|       |	 *	is less than init, extend the buffer to init.
  381|       |	 *
  382|       |	 *	This can happen if the buffer has been
  383|       |	 *	trimmed, and then additional data is added.
  384|       |	 */
  385|      8|	if ((clen + elen) < tctx->init) {
  ------------------
  |  Branch (385:6): [True: 0, False: 8]
  ------------------
  386|      0|		elen = (tctx->init - clen) + 1;	/* add \0 */
  387|       |	/*
  388|       |	 *	Double the buffer size if it's more than the
  389|       |	 *	requested amount.
  390|       |	 */
  391|      8|	} else if (elen < clen) {
  ------------------
  |  Branch (391:13): [True: 4, False: 4]
  ------------------
  392|      4|		elen = clen - 1;		/* Don't double alloc \0 */
  393|      4|	}
  394|       |
  395|       |	/*
  396|       |	 *	Check we don't exceed the maximum buffer
  397|       |	 *	length, including the NUL byte.
  398|       |	 */
  399|      8|	if (tctx->max && ((clen + elen + 1) > tctx->max)) {
  ------------------
  |  Branch (399:6): [True: 8, False: 0]
  |  Branch (399:19): [True: 0, False: 8]
  ------------------
  400|      0|		elen = tctx->max - clen;
  401|      0|		if (elen == 0) {
  ------------------
  |  Branch (401:7): [True: 0, False: 0]
  ------------------
  402|      0|			fr_strerror_printf("Failed extending buffer by %zu bytes to "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  403|      0|					   "%zu bytes, max is %zu bytes",
  404|      0|					   extension, clen + extension, tctx->max);
  405|      0|			return 0;
  406|      0|		}
  407|      0|		elen += 1;			/* add \0 */
  408|      0|	}
  409|      8|	nlen = clen + elen;
  410|       |
  411|      8|	new_buff = talloc_realloc(tctx->ctx, sbuff->buff, char, nlen);
  412|      8|	if (unlikely(!new_buff)) {
  ------------------
  |  |  397|      8|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  413|      0|		fr_strerror_printf("Failed extending buffer by %zu bytes to %zu bytes", elen, nlen);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  414|      0|		*status |= FR_SBUFF_FLAG_EXTEND_ERROR;
  415|      0|		return 0;
  416|      0|	}
  417|       |
  418|      8|	(void)fr_sbuff_update(sbuff, new_buff, nlen - 1);	/* Shouldn't fail as we're extending */
  419|       |
  420|      8|	return elen;
  421|      8|}
fr_sbuff_reset_talloc:
  469|      2|{
  470|      2|	fr_sbuff_uctx_talloc_t	*tctx = sbuff->uctx;
  471|       |
  472|      2|	CHECK_SBUFF_INIT(sbuff);
  ------------------
  |  |   56|      2|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (56:45): [True: 0, False: 2]
  |  |  |  Branch (56:198): [Folded, False: 2]
  |  |  ------------------
  ------------------
  473|       |
  474|      2|	fr_sbuff_set_to_start(sbuff);	/* Clear data */
  475|      2|	sbuff->m = NULL;		/* Remove any maker references */
  476|       |
  477|      2|	if (fr_sbuff_used(sbuff) != tctx->init) {
  ------------------
  |  |  940|      2|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  828|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      2|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      2|	))
  |  |  ------------------
  |  |  |  Branch (940:12): [True: 0, False: 2]
  |  |  ------------------
  |  |  941|      2|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      2|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  828|      2|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      2|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      2|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      2|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      2|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      2|	))
  |  |  ------------------
  ------------------
  |  Branch (477:6): [True: 2, False: 0]
  ------------------
  478|      2|		char *new_buff;
  479|       |
  480|      2|		new_buff = talloc_realloc(tctx->ctx, sbuff->buff, char, tctx->init);
  481|      2|		if (!new_buff) {
  ------------------
  |  Branch (481:7): [True: 0, False: 2]
  ------------------
  482|      0|			fr_strerror_printf("Failed reallocing from %zu to %zu",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  483|      0|					   talloc_array_length(sbuff->buff), tctx->init);
  |  |  ------------------
  ------------------
  483|      0|					   talloc_array_length(sbuff->buff), tctx->init);
  484|      0|			return -1;
  485|      0|		}
  486|      2|		sbuff->buff = new_buff;
  487|      2|		fr_sbuff_update(sbuff, new_buff, tctx->init - 1);
  488|      2|	}
  489|       |
  490|      2|	return 0;
  491|      2|}
fr_sbuff_out_bstrncpy:
  737|    728|{
  738|    728|	fr_sbuff_t 	our_in = FR_SBUFF_BIND_CURRENT(in);
  ------------------
  |  |  500|    728|#define FR_SBUFF_BIND_CURRENT(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|    728|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|    728|((fr_sbuff_t){ \
  |  |  |  |  430|    728|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|    728|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|    728|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|    728|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|    728|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|    728|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|    728|	)
  |  |  |  |  ------------------
  |  |  |  |  431|    728|	.start		= (_start), \
  |  |  |  |  432|    728|	.end		= (_end), \
  |  |  |  |  433|    728|	.p		= (_current), \
  |  |  |  |  434|    728|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    728|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    728|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    728|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    728|	)
  |  |  |  |  ------------------
  |  |  |  |  435|    728|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|    728|	.shifted	= 0, \
  |  |  |  |  437|    728|	.extend		= (_extend), \
  |  |  |  |  438|    728|	.eof		= (_eof), \
  |  |  |  |  439|    728|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    728|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    728|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    728|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    728|	)
  |  |  |  |  ------------------
  |  |  |  |  440|    728|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    728|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    728|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    728|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    728|	)
  |  |  |  |  ------------------
  |  |  |  |  441|    728|})
  |  |  ------------------
  |  |  501|    728|							  fr_sbuff_current(_sbuff_or_marker), \
  |  |  502|    728|							  fr_sbuff_current(_sbuff_or_marker), \
  |  |  503|    728|							  fr_sbuff_end(_sbuff_or_marker), \
  |  |  504|    728|							  fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  505|    728|							  fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  506|    728|							  0x01)
  ------------------
  739|    728|	size_t		remaining;
  740|       |
  741|    728|	CHECK_SBUFF_INIT(in);
  ------------------
  |  |   56|    728|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  1.45k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 728]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  1.45k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 728]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  1.45k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 728]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    728|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 728]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (56:45): [True: 728, False: 0]
  |  |  |  Branch (56:198): [Folded, False: 728]
  |  |  ------------------
  ------------------
  742|       |
  743|  1.45k|	while (fr_sbuff_used_total(&our_in) < len) {
  ------------------
  |  |  993|  1.45k|	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  844|  1.45k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  1.45k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  1.45k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  1.45k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  1.45k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  1.45k|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  870|  1.45k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  871|  1.45k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  872|  1.45k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  873|  1.45k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted, \
  |  |  |  |  874|  1.45k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted \
  |  |  |  |  875|  1.45k|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  828|  1.45k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|  1.45k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|  1.45k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|  1.45k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|  1.45k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|  1.45k|	))
  |  |  ------------------
  ------------------
  |  Branch (743:9): [True: 1.44k, False: 10]
  ------------------
  744|  1.44k|		size_t chunk_len;
  745|       |
  746|  1.44k|		remaining = (len - fr_sbuff_used_total(&our_in));
  ------------------
  |  |  993|  1.44k|	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  844|  1.44k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  1.44k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  1.44k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  1.44k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  1.44k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  1.44k|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  870|  1.44k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  871|  1.44k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  872|  1.44k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  873|  1.44k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted, \
  |  |  |  |  874|  1.44k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted \
  |  |  |  |  875|  1.44k|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  828|  1.44k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|  1.44k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|  1.44k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|  1.44k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|  1.44k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|  1.44k|	))
  |  |  ------------------
  ------------------
  747|       |
  748|  1.44k|		if (!fr_sbuff_extend(&our_in)) break;
  ------------------
  |  | 1099|  1.44k|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|  1.44k|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|  1.44k|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|  1.44k|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|  1.44k|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|  1.44k|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|  1.44k|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|  1.44k|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  1.44k|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  1.44k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  1.44k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  1.44k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  1.44k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  1.44k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  1.44k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  1.44k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  1.44k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  1.44k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  1.44k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  1.44k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  1.44k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 1.44k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|  1.44k|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  1.44k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  1.44k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  1.44k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  1.44k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  1.44k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  1.44k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  1.44k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  1.44k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  1.44k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  1.44k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  1.44k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  1.44k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (748:7): [True: 718, False: 728]
  ------------------
  749|       |
  750|    728|		chunk_len = fr_sbuff_remaining(&our_in);
  ------------------
  |  |  929|    728|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|    728|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|    728|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|    728|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|    728|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|    728|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|    728|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|    728|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|    728|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|    728|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|    728|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|    728|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|    728|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 728]
  |  |  ------------------
  |  |  930|    728|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|    728|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|    728|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|    728|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|    728|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|    728|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|    728|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|    728|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|    728|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|    728|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|    728|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|    728|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|    728|	))
  |  |  ------------------
  ------------------
  751|    728|		if (chunk_len > remaining) chunk_len = remaining;
  ------------------
  |  Branch (751:7): [True: 2, False: 726]
  ------------------
  752|       |
  753|    728|		FILL_OR_GOTO_DONE(out, &our_in, chunk_len);
  ------------------
  |  |  499|    728|#define FILL_OR_GOTO_DONE(_out, _in, _len) if (fr_sbuff_move(_out, _in, _len) < (size_t)(_len)) goto done
  |  |  ------------------
  |  |  |  | 1395|    728|      _Generic((_out), \
  |  |  |  | 1396|    728|	       fr_sbuff_t *		: \
  |  |  |  | 1397|    728|	       		_Generic((_in), \
  |  |  |  | 1398|    728|	       			fr_sbuff_t *		: _fr_sbuff_move_sbuff_to_sbuff((fr_sbuff_t *)_out, (fr_sbuff_t *)_in, _len), \
  |  |  |  | 1399|    728|	       			fr_sbuff_marker_t *	: _fr_sbuff_move_marker_to_sbuff((fr_sbuff_t *)_out, (fr_sbuff_marker_t *)_in, _len) \
  |  |  |  | 1400|    728|	       		), \
  |  |  |  | 1401|    728|	       fr_sbuff_marker_t *	: \
  |  |  |  | 1402|    728|	       		_Generic((_in), \
  |  |  |  | 1403|    728|	       			fr_sbuff_t *		: _fr_sbuff_move_sbuff_to_marker((fr_sbuff_marker_t *)_out, (fr_sbuff_t *)_in, _len), \
  |  |  |  | 1404|    728|	       			fr_sbuff_marker_t *	: _fr_sbuff_move_marker_to_marker((fr_sbuff_marker_t *)_out, (fr_sbuff_marker_t *)_in, _len) \
  |  |  |  | 1405|    728|	       		) \
  |  |  |  | 1406|    728|      )
  |  |  ------------------
  |  |  |  Branch (499:48): [True: 0, False: 728]
  |  |  ------------------
  ------------------
  754|    728|	}
  755|       |
  756|    728|done:
  757|    728|	*out->p = '\0';
  758|    728|	return fr_sbuff_used_total(&our_in);
  ------------------
  |  |  993|    728|	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  844|    728|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|    728|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|    728|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|    728|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|    728|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|    728|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  870|    728|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  871|    728|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  872|    728|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  873|    728|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted, \
  |  |  |  |  874|    728|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted \
  |  |  |  |  875|    728|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  828|    728|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|    728|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|    728|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|    728|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|    728|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|    728|	))
  |  |  ------------------
  ------------------
  759|    728|}
fr_sbuff_out_bstrncpy_allowed:
  836|     96|{
  837|     96|	fr_sbuff_t 	our_in = FR_SBUFF_BIND_CURRENT(in);
  ------------------
  |  |  500|     96|#define FR_SBUFF_BIND_CURRENT(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|     96|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|     96|((fr_sbuff_t){ \
  |  |  |  |  430|     96|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|     96|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|     96|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|     96|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  431|     96|	.start		= (_start), \
  |  |  |  |  432|     96|	.end		= (_end), \
  |  |  |  |  433|     96|	.p		= (_current), \
  |  |  |  |  434|     96|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  435|     96|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|     96|	.shifted	= 0, \
  |  |  |  |  437|     96|	.extend		= (_extend), \
  |  |  |  |  438|     96|	.eof		= (_eof), \
  |  |  |  |  439|     96|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  440|     96|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|     96|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|     96|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|     96|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|     96|	)
  |  |  |  |  ------------------
  |  |  |  |  441|     96|})
  |  |  ------------------
  |  |  501|     96|							  fr_sbuff_current(_sbuff_or_marker), \
  |  |  502|     96|							  fr_sbuff_current(_sbuff_or_marker), \
  |  |  503|     96|							  fr_sbuff_end(_sbuff_or_marker), \
  |  |  504|     96|							  fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  505|     96|							  fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  506|     96|							  0x01)
  ------------------
  838|       |
  839|     96|	CHECK_SBUFF_INIT(in);
  ------------------
  |  |   56|     96|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    192|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    192|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    192|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|     96|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (56:45): [True: 96, False: 0]
  |  |  |  Branch (56:198): [Folded, False: 96]
  |  |  ------------------
  ------------------
  840|       |
  841|    186|	while (fr_sbuff_used_total(&our_in) < len) {
  ------------------
  |  |  993|    186|	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  844|    186|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|    186|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|    186|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|    186|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|    186|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|    186|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  870|    186|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  871|    186|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  872|    186|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  873|    186|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted, \
  |  |  |  |  874|    186|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted \
  |  |  |  |  875|    186|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  828|    186|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|    186|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|    186|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|    186|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|    186|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|    186|	))
  |  |  ------------------
  ------------------
  |  Branch (841:9): [True: 186, False: 0]
  ------------------
  842|    186|		char	*p;
  843|    186|		char	*end;
  844|       |
  845|    186|		if (!fr_sbuff_extend(&our_in)) break;
  ------------------
  |  | 1099|    186|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|    186|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|    186|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    186|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    186|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    186|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    186|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|    186|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|    186|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|    186|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|    186|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|    186|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|    186|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|    186|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|    186|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|    186|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|    186|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|    186|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|    186|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|    186|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|    186|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 186]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|    186|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|    186|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|    186|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|    186|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|    186|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|    186|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|    186|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|    186|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|    186|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|    186|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|    186|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|    186|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|    186|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (845:7): [True: 90, False: 96]
  ------------------
  846|       |
  847|     96|		p = fr_sbuff_current(&our_in);
  ------------------
  |  |  844|     96|	(_Generic((_sbuff_or_marker), \
  |  |  845|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|     96|	))
  ------------------
  848|     96|		end = CONSTRAINED_END(&our_in, len, fr_sbuff_used_total(&our_in));
  ------------------
  |  |  509|     96|	(((_max) - (_used)) > fr_sbuff_remaining(_sbuff) ? (_sbuff)->end : (_sbuff)->p + ((_max) - (_used)))
  |  |  ------------------
  |  |  |  |  929|     96|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|     96|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|     96|	))
  |  |  |  |  ------------------
  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     96|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     96|	))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (929:12): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  |  |  930|     96|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|     96|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|     96|	))
  |  |  |  |  ------------------
  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     96|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     96|	))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (509:3): [True: 96, False: 0]
  |  |  ------------------
  ------------------
  849|       |
  850|  1.41k|		while ((p < end) && allowed[(uint8_t)*p]) p++;
  ------------------
  |  Branch (850:10): [True: 1.32k, False: 90]
  |  Branch (850:23): [True: 1.32k, False: 6]
  ------------------
  851|       |
  852|     96|		FILL_OR_GOTO_DONE(out, &our_in, p - our_in.p);
  ------------------
  |  |  499|     96|#define FILL_OR_GOTO_DONE(_out, _in, _len) if (fr_sbuff_move(_out, _in, _len) < (size_t)(_len)) goto done
  |  |  ------------------
  |  |  |  | 1395|     96|      _Generic((_out), \
  |  |  |  | 1396|     96|	       fr_sbuff_t *		: \
  |  |  |  | 1397|     96|	       		_Generic((_in), \
  |  |  |  | 1398|     96|	       			fr_sbuff_t *		: _fr_sbuff_move_sbuff_to_sbuff((fr_sbuff_t *)_out, (fr_sbuff_t *)_in, _len), \
  |  |  |  | 1399|     96|	       			fr_sbuff_marker_t *	: _fr_sbuff_move_marker_to_sbuff((fr_sbuff_t *)_out, (fr_sbuff_marker_t *)_in, _len) \
  |  |  |  | 1400|     96|	       		), \
  |  |  |  | 1401|     96|	       fr_sbuff_marker_t *	: \
  |  |  |  | 1402|     96|	       		_Generic((_in), \
  |  |  |  | 1403|     96|	       			fr_sbuff_t *		: _fr_sbuff_move_sbuff_to_marker((fr_sbuff_marker_t *)_out, (fr_sbuff_t *)_in, _len), \
  |  |  |  | 1404|     96|	       			fr_sbuff_marker_t *	: _fr_sbuff_move_marker_to_marker((fr_sbuff_marker_t *)_out, (fr_sbuff_marker_t *)_in, _len) \
  |  |  |  | 1405|     96|	       		) \
  |  |  |  | 1406|     96|      )
  |  |  ------------------
  |  |  |  Branch (499:48): [True: 0, False: 96]
  |  |  ------------------
  ------------------
  853|       |
  854|     96|		if (p != end) break;		/* stopped early, break */
  ------------------
  |  Branch (854:7): [True: 6, False: 90]
  ------------------
  855|     96|	}
  856|       |
  857|     96|done:
  858|     96|	*out->p = '\0';
  859|     96|	return fr_sbuff_used_total(&our_in);
  ------------------
  |  |  993|     96|	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  844|     96|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|     96|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  870|     96|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  871|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  872|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->shifted, \
  |  |  |  |  873|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted, \
  |  |  |  |  874|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->shifted \
  |  |  |  |  875|     96|	))
  |  |  ------------------
  |  |               	((size_t)((fr_sbuff_current(_sbuff_or_marker) + fr_sbuff_shifted(_sbuff_or_marker)) - fr_sbuff_start(_sbuff_or_marker)))
  |  |  ------------------
  |  |  |  |  828|     96|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|     96|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|     96|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|     96|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|     96|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|     96|	))
  |  |  ------------------
  ------------------
  860|     96|}
fr_sbuff_out_bool:
 1128|      4|{
 1129|      4|	fr_sbuff_t our_in = FR_SBUFF(in);
  ------------------
  |  |  451|      4|#define FR_SBUFF(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|      4|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|      4|((fr_sbuff_t){ \
  |  |  |  |  430|      4|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|      4|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|      4|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|      4|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|      4|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|      4|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|      4|	)
  |  |  |  |  ------------------
  |  |  |  |  431|      4|	.start		= (_start), \
  |  |  |  |  432|      4|	.end		= (_end), \
  |  |  |  |  433|      4|	.p		= (_current), \
  |  |  |  |  434|      4|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      4|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      4|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      4|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      4|	)
  |  |  |  |  ------------------
  |  |  |  |  435|      4|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|      4|	.shifted	= 0, \
  |  |  |  |  437|      4|	.extend		= (_extend), \
  |  |  |  |  438|      4|	.eof		= (_eof), \
  |  |  |  |  439|      4|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      4|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      4|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      4|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      4|	)
  |  |  |  |  ------------------
  |  |  |  |  440|      4|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      4|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      4|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      4|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      4|	)
  |  |  |  |  ------------------
  |  |  |  |  441|      4|})
  |  |  ------------------
  |  |  452|      4|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  453|      4|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  454|      4|					     fr_sbuff_end(_sbuff_or_marker), \
  |  |  455|      4|					     fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  456|      4|					     fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  457|      4|					     0x00)
  ------------------
 1130|       |
 1131|      4|	static bool const bool_prefix[SBUFF_CHAR_CLASS] = {
 1132|      4|		['t'] = true, ['T'] = true,	/* true */
 1133|      4|		['f'] = true, ['F'] = true,	/* false */
 1134|      4|		['y'] = true, ['Y'] = true,	/* yes */
 1135|      4|		['n'] = true, ['N'] = true,	/* no */
 1136|      4|	};
 1137|       |
 1138|      4|	if (fr_sbuff_is_in_charset(&our_in, bool_prefix)) {
  ------------------
  |  Branch (1138:6): [True: 0, False: 4]
  ------------------
 1139|      0|		switch (tolower(fr_sbuff_char(&our_in, '\0'))) {
  ------------------
  |  Branch (1139:11): [True: 0, False: 0]
  |  Branch (1139:11): [True: 0, False: 0]
  |  Branch (1139:11): [True: 0, False: 0]
  |  Branch (1139:11): [True: 0, False: 0]
  |  Branch (1139:11): [True: 0, False: 0]
  |  Branch (1139:11): [True: 0, False: 0]
  |  Branch (1139:11): [True: 0, False: 0]
  |  Branch (1139:11): [True: 0, Folded]
  ------------------
 1140|      0|		default:
  ------------------
  |  Branch (1140:3): [True: 0, False: 0]
  ------------------
 1141|      0|			break;
 1142|       |
 1143|      0|		case 't':
  ------------------
  |  Branch (1143:3): [True: 0, False: 0]
  ------------------
 1144|      0|			if (fr_sbuff_adv_past_strcase_literal(&our_in, "true")) {
  ------------------
  |  | 1716|      0|#define fr_sbuff_adv_past_strcase_literal(_sbuff, _needle) fr_sbuff_adv_past_strcase(_sbuff, _needle, sizeof(_needle) - 1)
  |  |  ------------------
  |  |  |  Branch (1716:60): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1145|      0|				*out = true;
 1146|      0|				FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 1147|      0|			}
 1148|      0|			break;
 1149|       |
 1150|      0|		case 'f':
  ------------------
  |  Branch (1150:3): [True: 0, False: 0]
  ------------------
 1151|      0|			if (fr_sbuff_adv_past_strcase_literal(&our_in, "false")) {
  ------------------
  |  | 1716|      0|#define fr_sbuff_adv_past_strcase_literal(_sbuff, _needle) fr_sbuff_adv_past_strcase(_sbuff, _needle, sizeof(_needle) - 1)
  |  |  ------------------
  |  |  |  Branch (1716:60): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1152|      0|				*out = false;
 1153|      0|				FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 1154|      0|			}
 1155|      0|			break;
 1156|       |
 1157|      0|		case 'y':
  ------------------
  |  Branch (1157:3): [True: 0, False: 0]
  ------------------
 1158|      0|			if (fr_sbuff_adv_past_strcase_literal(&our_in, "yes")) {
  ------------------
  |  | 1716|      0|#define fr_sbuff_adv_past_strcase_literal(_sbuff, _needle) fr_sbuff_adv_past_strcase(_sbuff, _needle, sizeof(_needle) - 1)
  |  |  ------------------
  |  |  |  Branch (1716:60): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1159|      0|				*out = true;
 1160|      0|				FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 1161|      0|			}
 1162|      0|			break;
 1163|       |
 1164|      0|		case 'n':
  ------------------
  |  Branch (1164:3): [True: 0, False: 0]
  ------------------
 1165|      0|			if (fr_sbuff_adv_past_strcase_literal(&our_in, "no")) {
  ------------------
  |  | 1716|      0|#define fr_sbuff_adv_past_strcase_literal(_sbuff, _needle) fr_sbuff_adv_past_strcase(_sbuff, _needle, sizeof(_needle) - 1)
  |  |  ------------------
  |  |  |  Branch (1716:60): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1166|      0|				*out = false;
 1167|      0|				FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 1168|      0|			}
 1169|      0|			break;
 1170|      0|		}
 1171|      0|	}
 1172|       |
 1173|      4|	*out = false;	/* Always initialise out */
 1174|       |
 1175|      4|	fr_strerror_const("Not a valid boolean value.  Accepted values are 'yes', 'no', 'true', 'false'");
  ------------------
  |  |  223|      4|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1176|       |
 1177|      4|	return -1;
 1178|      4|}
_fr_sbuff_move_sbuff_to_sbuff:
 1394|    824|{
 1395|    824|	size_t o_remaining = fr_sbuff_extend_lowat(NULL, out, len);
  ------------------
  |  | 1074|    824|	_fr_sbuff_extend_lowat(_status, \
  |  | 1075|    824|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  801|    824|	_Generic((_sbuff_or_marker), \
  |  |  |  |  802|    824|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  803|    824|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  804|    824|	)
  |  |  ------------------
  |  | 1076|    824|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  ------------------
  |  |  |  |  929|    824|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|    824|	))
  |  |  |  |  ------------------
  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (929:12): [True: 0, False: 824]
  |  |  |  |  ------------------
  |  |  |  |  930|    824|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|    824|	))
  |  |  |  |  ------------------
  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1396|    824|	size_t i_remaining = fr_sbuff_extend_lowat(NULL, in, len);
  ------------------
  |  | 1074|    824|	_fr_sbuff_extend_lowat(_status, \
  |  | 1075|    824|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  801|    824|	_Generic((_sbuff_or_marker), \
  |  |  |  |  802|    824|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  803|    824|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  804|    824|	)
  |  |  ------------------
  |  | 1076|    824|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  ------------------
  |  |  |  |  929|    824|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|    824|	))
  |  |  |  |  ------------------
  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (929:12): [True: 0, False: 824]
  |  |  |  |  ------------------
  |  |  |  |  930|    824|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|    824|	))
  |  |  |  |  ------------------
  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1397|    824|	size_t to_copy = len;
 1398|    824|	if (to_copy > o_remaining) to_copy = o_remaining;
  ------------------
  |  Branch (1398:6): [True: 0, False: 824]
  ------------------
 1399|    824|	if (to_copy > i_remaining) to_copy = i_remaining;
  ------------------
  |  Branch (1399:6): [True: 0, False: 824]
  ------------------
 1400|    824|	safecpy(fr_sbuff_current(out), fr_sbuff_end(out), fr_sbuff_current(in), fr_sbuff_current(in) + to_copy);
  ------------------
  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|    824|	))
  ------------------
              	safecpy(fr_sbuff_current(out), fr_sbuff_end(out), fr_sbuff_current(in), fr_sbuff_current(in) + to_copy);
  ------------------
  |  |  857|    824|	(_Generic((_sbuff_or_marker), \
  |  |  858|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  859|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  860|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  861|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  862|    824|	))
  ------------------
              	safecpy(fr_sbuff_current(out), fr_sbuff_end(out), fr_sbuff_current(in), fr_sbuff_current(in) + to_copy);
  ------------------
  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|    824|	))
  ------------------
              	safecpy(fr_sbuff_current(out), fr_sbuff_end(out), fr_sbuff_current(in), fr_sbuff_current(in) + to_copy);
  ------------------
  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|    824|	))
  ------------------
 1401|    824|	return fr_sbuff_advance(out, fr_sbuff_advance(in, to_copy));
  ------------------
  |  | 1194|    824|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|    824|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|    824|_Generic((_dst), \
  |  |  |  | 1164|    824|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|    824|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|    824|)(_dst, \
  |  |  |  | 1167|    824|_Generic((_src), \
  |  |  |  | 1168|    824|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|    824|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|    824|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|    824|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|    824|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|    824|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|    824|	char *				: (char const *)(_src), \
  |  |  |  | 1174|    824|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|    824|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|    824|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|    824|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|    824|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|    824|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|    824|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|    824|))
  |  |  ------------------
  ------------------
 1402|    824|}
fr_sbuff_in_strcpy:
 1473|      4|{
 1474|      4|	size_t len;
 1475|       |
 1476|      4|	CHECK_SBUFF_WRITEABLE(sbuff);
  ------------------
  |  |   57|      4|#  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |   56|      4|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (56:45): [True: 0, False: 4]
  |  |  |  |  |  Branch (56:198): [Folded, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (57:125): [Folded, False: 4]
  |  |  ------------------
  ------------------
 1477|       |
 1478|      4|	len = strlen(str);
 1479|      4|	FR_SBUFF_EXTEND_LOWAT_OR_RETURN(sbuff, len);
  ------------------
  |  | 1086|      4|#define FR_SBUFF_EXTEND_LOWAT_OR_RETURN(_sbuff, _len) \
  |  | 1087|      4|do { \
  |  | 1088|      4|	size_t _remaining = fr_sbuff_extend_lowat(NULL, _sbuff, _len); \
  |  |  ------------------
  |  |  |  | 1074|      4|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|      4|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      4|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      4|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      4|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      4|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|      4|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      4|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 4]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|      4|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1089|      4|	if (_remaining < _len) return -(_len - _remaining); \
  |  |  ------------------
  |  |  |  Branch (1089:6): [True: 0, False: 4]
  |  |  ------------------
  |  | 1090|      4|} while (0)
  |  |  ------------------
  |  |  |  Branch (1090:10): [Folded, False: 4]
  |  |  ------------------
  ------------------
 1480|       |
 1481|      4|	safecpy(sbuff->p, sbuff->end, str, str + len);
 1482|      4|	sbuff->p[len] = '\0';
 1483|       |
 1484|      4|	return fr_sbuff_advance(sbuff, len);
  ------------------
  |  | 1194|      4|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|      4|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      4|_Generic((_dst), \
  |  |  |  | 1164|      4|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      4|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      4|)(_dst, \
  |  |  |  | 1167|      4|_Generic((_src), \
  |  |  |  | 1168|      4|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      4|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      4|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      4|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      4|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      4|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      4|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      4|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      4|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      4|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      4|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      4|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      4|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      4|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      4|))
  |  |  ------------------
  ------------------
 1485|      4|}
fr_sbuff_in_bstrcpy_buffer:
 1517|  2.28k|{
 1518|  2.28k|	size_t len;
 1519|       |
 1520|  2.28k|	CHECK_SBUFF_WRITEABLE(sbuff);
  ------------------
  |  |   57|  2.28k|#  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |   56|  2.28k|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  2.27k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (56:45): [True: 2.27k, False: 4]
  |  |  |  |  |  Branch (56:198): [Folded, False: 2.28k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  2.28k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.28k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (57:125): [Folded, False: 2.28k]
  |  |  ------------------
  ------------------
 1521|       |
 1522|  2.28k|	len = talloc_strlen(str);
 1523|       |
 1524|  2.28k|	FR_SBUFF_EXTEND_LOWAT_OR_RETURN(sbuff, len);
  ------------------
  |  | 1086|  2.28k|#define FR_SBUFF_EXTEND_LOWAT_OR_RETURN(_sbuff, _len) \
  |  | 1087|  2.28k|do { \
  |  | 1088|  2.28k|	size_t _remaining = fr_sbuff_extend_lowat(NULL, _sbuff, _len); \
  |  |  ------------------
  |  |  |  | 1074|  2.28k|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|  2.28k|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|  2.28k|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|  2.28k|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|  2.28k|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|  2.28k|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|  2.28k|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  2.28k|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  2.28k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  2.28k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 2.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|  2.28k|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  2.28k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  2.28k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1089|  2.28k|	if (_remaining < _len) return -(_len - _remaining); \
  |  |  ------------------
  |  |  |  Branch (1089:6): [True: 0, False: 2.28k]
  |  |  ------------------
  |  | 1090|  2.28k|} while (0)
  |  |  ------------------
  |  |  |  Branch (1090:10): [Folded, False: 2.28k]
  |  |  ------------------
  ------------------
 1525|       |
 1526|  2.28k|	safecpy(sbuff->p, sbuff->end, str, str + len);
 1527|  2.28k|	sbuff->p[len] = '\0';
 1528|       |
 1529|  2.28k|	return fr_sbuff_advance(sbuff, len);
  ------------------
  |  | 1194|  2.28k|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|  2.28k|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|  2.28k|_Generic((_dst), \
  |  |  |  | 1164|  2.28k|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|  2.28k|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|  2.28k|)(_dst, \
  |  |  |  | 1167|  2.28k|_Generic((_src), \
  |  |  |  | 1168|  2.28k|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  2.28k|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|  2.28k|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  2.28k|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|  2.28k|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  2.28k|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|  2.28k|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  2.28k|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|  2.28k|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|  2.28k|	char *				: (char const *)(_src), \
  |  |  |  | 1174|  2.28k|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|  2.28k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|  2.28k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|  2.28k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|  2.28k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|  2.28k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|  2.28k|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|  2.28k|))
  |  |  ------------------
  ------------------
 1530|  2.28k|}
fr_sbuff_in_vsprintf:
 1582|  2.28k|{
 1583|  2.28k|	TALLOC_CTX	*scratch;
 1584|  2.28k|	va_list		ap_p;
 1585|  2.28k|	char		*tmp;
 1586|  2.28k|	ssize_t		slen;
 1587|       |
 1588|  2.28k|	CHECK_SBUFF_WRITEABLE(sbuff);
  ------------------
  |  |   57|  2.28k|#  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |   56|  2.28k|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  2.27k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (56:45): [True: 2.27k, False: 4]
  |  |  |  |  |  Branch (56:198): [Folded, False: 2.28k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  2.28k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.28k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (57:125): [Folded, False: 2.28k]
  |  |  ------------------
  ------------------
 1589|       |
 1590|  2.28k|	if (sbuff_scratch_init(&scratch) < 0) return 0;
  ------------------
  |  Branch (1590:6): [True: 0, False: 2.28k]
  ------------------
 1591|       |
 1592|  2.28k|	va_copy(ap_p, ap);
 1593|  2.28k|	tmp = fr_vasprintf(scratch, fmt, ap_p);
 1594|  2.28k|	va_end(ap_p);
 1595|  2.28k|	if (!tmp) return 0;
  ------------------
  |  Branch (1595:6): [True: 0, False: 2.28k]
  ------------------
 1596|       |
 1597|  2.28k|	slen = fr_sbuff_in_bstrcpy_buffer(sbuff, tmp);
 1598|  2.28k|	talloc_free(tmp);	/* Free the temporary buffer */
 1599|       |
 1600|  2.28k|	return slen;
 1601|  2.28k|}
fr_sbuff_in_sprintf:
 1613|  2.28k|{
 1614|  2.28k|	va_list		ap;
 1615|  2.28k|	ssize_t		slen;
 1616|       |
 1617|  2.28k|	CHECK_SBUFF_WRITEABLE(sbuff);
  ------------------
  |  |   57|  2.28k|#  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |   56|  2.28k|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  4.55k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  |  397|  2.27k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (56:45): [True: 2.27k, False: 4]
  |  |  |  |  |  Branch (56:198): [Folded, False: 2.28k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  2.28k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.28k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (57:125): [Folded, False: 2.28k]
  |  |  ------------------
  ------------------
 1618|       |
 1619|  2.28k|	va_start(ap, fmt);
 1620|  2.28k|	slen = fr_sbuff_in_vsprintf(sbuff, fmt, ap);
 1621|  2.28k|	va_end(ap);
 1622|       |
 1623|  2.28k|	return slen;
 1624|  2.28k|}
fr_sbuff_adv_past_allowed:
 1827|  2.33k|{
 1828|  2.33k|	size_t		total = 0;
 1829|  2.33k|	char const	*p;
 1830|  2.33k|	uint8_t		idx[SBUFF_CHAR_CLASS];	/* Fast path index */
 1831|  2.33k|	size_t		needle_len = 0;
 1832|       |
 1833|  2.33k|	CHECK_SBUFF_INIT(sbuff);
  ------------------
  |  |   56|  2.33k|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  4.67k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.33k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  4.67k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.33k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  4.67k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.33k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|  2.33k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.33k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (56:45): [True: 2.33k, False: 0]
  |  |  |  Branch (56:198): [Folded, False: 2.33k]
  |  |  ------------------
  ------------------
 1834|       |
 1835|  2.33k|	if (tt) fr_sbuff_terminal_idx_init(&needle_len, idx, tt);
  ------------------
  |  Branch (1835:6): [True: 0, False: 2.33k]
  ------------------
 1836|       |
 1837|  2.33k|	while (total < len) {
  ------------------
  |  Branch (1837:9): [True: 2.33k, False: 0]
  ------------------
 1838|  2.33k|		char *end;
 1839|       |
 1840|  2.33k|		if (!fr_sbuff_extend(sbuff)) break;
  ------------------
  |  | 1099|  2.33k|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|  2.33k|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|  2.33k|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|  2.33k|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|  2.33k|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|  2.33k|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|  2.33k|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|  2.33k|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  2.33k|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  2.33k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  2.33k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 2.33k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|  2.33k|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|  2.33k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|  2.33k|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1840:7): [True: 0, False: 2.33k]
  ------------------
 1841|       |
 1842|  2.33k|		end = CONSTRAINED_END(sbuff, len, total);
  ------------------
  |  |  509|  2.33k|	(((_max) - (_used)) > fr_sbuff_remaining(_sbuff) ? (_sbuff)->end : (_sbuff)->p + ((_max) - (_used)))
  |  |  ------------------
  |  |  |  |  929|  2.33k|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|  2.33k|	))
  |  |  |  |  ------------------
  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  2.33k|	))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (929:12): [True: 0, False: 2.33k]
  |  |  |  |  ------------------
  |  |  |  |  930|  2.33k|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  858|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  859|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  860|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  861|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  862|  2.33k|	))
  |  |  |  |  ------------------
  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|  2.33k|	))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (509:3): [True: 2.33k, False: 0]
  |  |  ------------------
  ------------------
 1843|  2.33k|		p = sbuff->p;
 1844|  2.34k|		while ((p < end) && allowed[(uint8_t)*p]) {
  ------------------
  |  Branch (1844:10): [True: 2.34k, False: 0]
  |  Branch (1844:23): [True: 4, False: 2.33k]
  ------------------
 1845|      4|			if (needle_len == 0) {
  ------------------
  |  Branch (1845:8): [True: 4, False: 0]
  ------------------
 1846|      4|				p++;
 1847|      4|				continue;
 1848|      4|			}
 1849|       |
 1850|       |		       /*
 1851|       |			*	If this character is allowed, BUT is also listed as a one-character terminal,
 1852|       |			*	then we still allow it.  This decision implements "greedy" parsing.
 1853|       |			*/
 1854|      0|		       if (fr_sbuff_terminal_search(sbuff, p, idx, tt, 1)) {
  ------------------
  |  Branch (1854:14): [True: 0, False: 0]
  ------------------
 1855|      0|			       p++;
 1856|      0|			       continue;
 1857|      0|		       }
 1858|       |
 1859|       |		       /*
 1860|       |			*	Otherwise if the next *set* of characters) is not in the terminals, then
 1861|       |			*	allow the current character.
 1862|       |			*/
 1863|      0|		       if (!fr_sbuff_terminal_search(sbuff, p, idx, tt, needle_len)) {
  ------------------
  |  Branch (1863:14): [True: 0, False: 0]
  ------------------
 1864|      0|			       p++;
 1865|      0|			       continue;
 1866|      0|		       }
 1867|       |
 1868|       |		       /*
 1869|       |			*	The character is allowed, and is NOT listed as a terminal character by itself.
 1870|       |			*	However, it is part of a multi-character terminal sequence.  We therefore
 1871|       |			*	stop.
 1872|       |			*
 1873|       |			*	This decision allows us to parse things like "Framed-User", where we might
 1874|       |			*	normally stop at the "-".  However, we will still stop at "Framed-=User", as
 1875|       |			*	"-=" may be a terminal sequence.
 1876|       |			*
 1877|       |			*	There is no perfect solution here, other than to fix the input grammar so that
 1878|       |			*	it has no ambiguity.  Since we can't do that, we choose to err on the side of
 1879|       |			*	allowing the existing grammar, where it makes sense
 1880|       |			*/
 1881|      0|		       break;
 1882|      0|		}
 1883|       |
 1884|  2.33k|		total += fr_sbuff_set(sbuff, p);
  ------------------
  |  | 1162|  2.33k|#define fr_sbuff_set(_dst, _src) \
  |  | 1163|  2.33k|_Generic((_dst), \
  |  | 1164|  2.33k|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  | 1165|  2.33k|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  | 1166|  2.33k|)(_dst, \
  |  | 1167|  2.33k|_Generic((_src), \
  |  | 1168|  2.33k|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  2.33k|	))
  |  |  ------------------
  |  | 1169|  2.33k|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  2.33k|	))
  |  |  ------------------
  |  | 1170|  2.33k|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  2.33k|	))
  |  |  ------------------
  |  | 1171|  2.33k|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|  2.33k|	))
  |  |  ------------------
  |  | 1172|  2.33k|	char const *			: (char const *)(_src), \
  |  | 1173|  2.33k|	char *				: (char const *)(_src), \
  |  | 1174|  2.33k|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  828|  2.33k|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|  2.33k|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|  2.33k|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|  2.33k|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|  2.33k|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|  2.33k|	))
  |  |  ------------------
  |  | 1175|  2.33k|))
  ------------------
 1885|  2.33k|		if (p != end) break;		/* stopped early, break */
  ------------------
  |  Branch (1885:7): [True: 2.33k, False: 0]
  ------------------
 1886|  2.33k|	}
 1887|       |
 1888|  2.33k|	return total;
 1889|  2.33k|}
fr_sbuff_next_if_char:
 2137|    196|{
 2138|    196|	CHECK_SBUFF_INIT(sbuff);
  ------------------
  |  |   56|    196|#  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    392|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 196]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    392|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 196]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    392|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 196]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #  define CHECK_SBUFF_INIT(_sbuff)	do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
  |  |  ------------------
  |  |  |  |  397|    196|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 196]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (56:45): [True: 196, False: 0]
  |  |  |  Branch (56:198): [Folded, False: 196]
  |  |  ------------------
  ------------------
 2139|       |
 2140|    196|	if (!fr_sbuff_extend(sbuff)) return false;
  ------------------
  |  | 1099|    196|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|    196|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  | 1075|    196|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    196|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    196|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    196|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    196|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|    196|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|    196|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|    196|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|    196|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|    196|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|    196|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|    196|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|    196|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|    196|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|    196|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|    196|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|    196|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|    196|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|    196|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 196]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|    196|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|    196|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|    196|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|    196|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|    196|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|    196|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|    196|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|    196|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|    196|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|    196|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|    196|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|    196|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|    196|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2140:6): [True: 88, False: 108]
  ------------------
 2141|       |
 2142|    108|	if (*sbuff->p != c) return false;
  ------------------
  |  Branch (2142:6): [True: 98, False: 10]
  ------------------
 2143|       |
 2144|     10|	fr_sbuff_advance(sbuff, 1);
  ------------------
  |  | 1194|     10|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|     10|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|     10|_Generic((_dst), \
  |  |  |  | 1164|     10|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|     10|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|     10|)(_dst, \
  |  |  |  | 1167|     10|_Generic((_src), \
  |  |  |  | 1168|     10|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     10|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     10|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     10|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     10|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     10|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     10|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|     10|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     10|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     10|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     10|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     10|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     10|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     10|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|     10|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     10|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     10|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     10|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     10|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     10|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     10|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|     10|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|     10|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|     10|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|     10|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|     10|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|     10|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|     10|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|     10|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|     10|	char *				: (char const *)(_src), \
  |  |  |  | 1174|     10|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|     10|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|     10|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|     10|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|     10|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|     10|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|     10|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|     10|))
  |  |  ------------------
  ------------------
 2145|       |
 2146|     10|	return true;
 2147|    108|}
sbuff.c:min:
  148|     20|{
  149|     20|	return x < y ? x : y;
  ------------------
  |  Branch (149:9): [True: 0, False: 20]
  ------------------
  150|     20|}
sbuff.c:safecpy:
  129|  3.10k|{
  130|  3.10k|	ssize_t	diff;
  131|  3.10k|	size_t	i_len = i_end - i_start;
  132|       |
  133|  3.10k|	if (unlikely((o_end < o_start) || (i_end < i_start))) return 0;	/* sanity check */
  ------------------
  |  |  397|  6.21k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 3.10k]
  |  |  |  Branch (397:43): [True: 0, False: 3.10k]
  |  |  |  Branch (397:43): [True: 0, False: 3.10k]
  |  |  ------------------
  ------------------
  134|       |
  135|  3.10k|	diff = (o_end - o_start) - (i_len);
  136|  3.10k|	if (diff < 0) return diff;
  ------------------
  |  Branch (136:6): [True: 0, False: 3.10k]
  ------------------
  137|       |
  138|  3.10k|	if ((i_start > o_end) || (i_end < o_start)) {			/* no-overlap */
  ------------------
  |  Branch (138:6): [True: 824, False: 2.28k]
  |  Branch (138:27): [True: 2.28k, False: 0]
  ------------------
  139|  3.10k|		memcpy(o_start,  i_start, i_len);
  140|  3.10k|	} else {							/* overlap */
  141|      0|		memmove(o_start, i_start, i_len);
  142|      0|	}
  143|       |
  144|  3.10k|	return (i_len);
  145|  3.10k|}
sbuff.c:sbuff_scratch_init:
 1542|  2.28k|{
 1543|  2.28k|	TALLOC_CTX	*scratch;
 1544|       |
 1545|       |	/*
 1546|       |	 *	Once main has signalled shutdown the TLS slot may be a
 1547|       |	 *	dangling pointer on threads we don't own; skip the scratch
 1548|       |	 *	cache and let callers allocate at top level instead.  The
 1549|       |	 *	TLS-local `sbuff_scratch_freed` is left in place for the
 1550|       |	 *	per-thread teardown path on FR-managed threads.
 1551|       |	 */
 1552|  2.28k|	if (sbuff_scratch_freed || fr_atexit_thread_local_alloc_disabled()) {
  ------------------
  |  Branch (1552:6): [True: 0, False: 2.28k]
  |  Branch (1552:29): [True: 0, False: 2.28k]
  ------------------
 1553|      0|		*out = NULL;
 1554|      0|		return 0;
 1555|      0|	}
 1556|       |
 1557|  2.28k|	scratch = sbuff_scratch;
 1558|  2.28k|	if (!scratch) {
  ------------------
  |  Branch (1558:6): [True: 2, False: 2.27k]
  ------------------
 1559|      2|		scratch = talloc_pool(NULL, 4096);
 1560|      2|		if (unlikely(!scratch)) {
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 1561|      0|			fr_strerror_const("Out of Memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 1562|      0|			return -1;
 1563|      0|		}
 1564|      2|		fr_atexit_thread_local(sbuff_scratch, _sbuff_scratch_free, scratch);
  ------------------
  |  |  185|      2|#  define fr_atexit_thread_local(_name, _free, _uctx) \
  |  |  186|      2|do { \
  |  |  187|      2|	void *_our_uctx = _uctx; /* stop _uctx being evaluated multiple times, it may be a call to malloc() */ \
  |  |  188|      2|	_fr_atexit_thread_local(__FILE__, __LINE__, _free, _our_uctx); \
  |  |  189|      2|	_name = _our_uctx; \
  |  |  190|      2|} while (0)
  |  |  ------------------
  |  |  |  Branch (190:10): [Folded, False: 2]
  |  |  ------------------
  ------------------
 1565|      2|	}
 1566|       |
 1567|  2.28k|	*out = scratch;
 1568|       |
 1569|  2.28k|	return 0;
 1570|  2.28k|}
sbuff.c:_sbuff_scratch_free:
 1536|      2|{
 1537|      2|	sbuff_scratch_freed = true;
 1538|       |	return talloc_free(arg);
 1539|      2|}

_fr_strerror_vprintf:
  250|  5.68k|{
  251|  5.68k|	va_list		our_ap;
  252|       |
  253|  5.68k|	va_copy(our_ap, ap);
  254|  5.68k|	strerror_vprintf(file, line, fmt, our_ap);
  255|       |	va_end(our_ap);
  256|  5.68k|}
_fr_strerror_const:
  455|    559|{
  456|    559|	(void)strerror_const(file, line, msg);
  457|    559|}
fr_strerror_clear:
  582|  1.98k|{
  583|  1.98k|	fr_log_buffer_t		*buffer = fr_strerror_buffer;
  584|       |
  585|  1.98k|	if (unlikely(buffer == NULL)) return;
  ------------------
  |  |  397|  1.98k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.98k]
  |  |  ------------------
  ------------------
  586|       |
  587|  1.98k|	fr_dlist_clear(&buffer->entries);
  588|  1.98k|	talloc_free_children(buffer->pool_a);
  589|  1.98k|	talloc_free_children(buffer->pool_b);
  590|  1.98k|}
strerror.c:strerror_vprintf:
  149|  5.68k|{
  150|  5.68k|	va_list		ap_p;
  151|  5.68k|	fr_log_entry_t	*entry;
  152|  5.68k|	fr_log_buffer_t	*buffer;
  153|       |
  154|  5.68k|	buffer = fr_strerror_init();
  155|  5.68k|	if (unlikely(buffer == NULL)) return NULL;
  ------------------
  |  |  397|  5.68k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 5.68k]
  |  |  ------------------
  ------------------
  156|       |
  157|       |	/*
  158|       |	 *	Clear any existing log messages
  159|       |	 */
  160|  5.68k|	if (!fmt) {
  ------------------
  |  Branch (160:6): [True: 0, False: 5.68k]
  ------------------
  161|      0|		fr_strerror_clear();
  162|      0|		return NULL;
  163|      0|	}
  164|       |
  165|  5.68k|	entry = talloc(pool_alt(buffer), fr_log_entry_t);
  166|  5.68k|	if (unlikely(!entry)) {
  ------------------
  |  |  397|  5.68k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 5.68k]
  |  |  ------------------
  ------------------
  167|      0|	oom:
  168|      0|		fr_perror("Failed allocating memory for libradius error buffer");
  169|      0|		return NULL;
  170|      0|	}
  171|       |
  172|  5.68k|	va_copy(ap_p, ap);
  173|  5.68k|	entry->msg = fr_vasprintf(entry, fmt, ap_p);
  174|  5.68k|	va_end(ap_p);
  175|  5.68k|	if (unlikely(!entry->msg)) goto oom;
  ------------------
  |  |  397|  5.68k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 5.68k]
  |  |  ------------------
  ------------------
  176|  5.68k|	entry->subject = NULL;
  177|  5.68k|	entry->offset = 0;
  178|  5.68k|	entry->file = file;
  179|  5.68k|	entry->line = line;
  180|       |
  181|  5.68k|	pool_alt_free_children(buffer);
  182|  5.68k|	fr_dlist_clear(&buffer->entries);
  183|  5.68k|	fr_dlist_insert_tail(&buffer->entries, entry);
  184|       |
  185|  5.68k|	return entry;
  186|  5.68k|}
strerror.c:pool_alt:
  125|  6.24k|{
  126|  6.24k|	if (buffer->pool == buffer->pool_a) {
  ------------------
  |  Branch (126:6): [True: 3.12k, False: 3.11k]
  ------------------
  127|  3.12k|		buffer->pool = buffer->pool_b;
  128|  3.12k|		return buffer->pool;
  129|  3.12k|	}
  130|  3.11k|	return buffer->pool = buffer->pool_a;
  131|  6.24k|}
strerror.c:pool_alt_free_children:
  134|  6.24k|{
  135|  6.24k|	if (buffer->pool == buffer->pool_a) {
  ------------------
  |  Branch (135:6): [True: 3.11k, False: 3.12k]
  ------------------
  136|  3.11k|		talloc_free_children(buffer->pool_b);
  137|  3.11k|		return;
  138|  3.11k|	}
  139|  3.12k|	talloc_free_children(buffer->pool_a);
  140|  3.12k|}
strerror.c:fr_strerror_init:
   88|  6.24k|{
   89|  6.24k|	fr_log_buffer_t *buffer;
   90|       |
   91|  6.24k|	if (unlikely(logging_stop)) return NULL;	/* No more logging */
  ------------------
  |  |  397|  6.24k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 6.24k]
  |  |  ------------------
  ------------------
   92|       |
   93|  6.24k|	buffer = fr_strerror_buffer;
   94|  6.24k|	if (!buffer) {
  ------------------
  |  Branch (94:6): [True: 4, False: 6.23k]
  ------------------
   95|      4|		buffer = talloc(NULL, fr_log_buffer_t);	/* One byte extra for status */
   96|      4|		if (!buffer) {
  ------------------
  |  Branch (96:7): [True: 0, False: 4]
  ------------------
   97|      0|		oom:
   98|      0|			fr_perror("Failed allocating memory for libradius error buffer");
   99|      0|			return NULL;
  100|      0|		}
  101|      4|		buffer->pool_a = talloc_pool(buffer, FR_STRERROR_BUFSIZE);
  ------------------
  |  |   31|      4|#define FR_STRERROR_BUFSIZE (2048)
  ------------------
  102|      4|		if (!buffer->pool_a) goto oom;
  ------------------
  |  Branch (102:7): [True: 0, False: 4]
  ------------------
  103|       |
  104|      4|		buffer->pool_b = talloc_pool(buffer, FR_STRERROR_BUFSIZE);
  ------------------
  |  |   31|      4|#define FR_STRERROR_BUFSIZE (2048)
  ------------------
  105|      4|		if (!buffer->pool_b) goto oom;
  ------------------
  |  Branch (105:7): [True: 0, False: 4]
  ------------------
  106|       |
  107|      4|		buffer->pool = buffer->pool_a;
  108|       |
  109|      4|		fr_atexit_thread_local(fr_strerror_buffer, _fr_logging_free, buffer);
  ------------------
  |  |  185|      4|#  define fr_atexit_thread_local(_name, _free, _uctx) \
  |  |  186|      4|do { \
  |  |  187|      4|	void *_our_uctx = _uctx; /* stop _uctx being evaluated multiple times, it may be a call to malloc() */ \
  |  |  188|      4|	_fr_atexit_thread_local(__FILE__, __LINE__, _free, _our_uctx); \
  |  |  189|      4|	_name = _our_uctx; \
  |  |  190|      4|} while (0)
  |  |  ------------------
  |  |  |  Branch (190:10): [Folded, False: 4]
  |  |  ------------------
  ------------------
  110|       |
  111|      4|		fr_dlist_talloc_init(&buffer->entries, fr_log_entry_t, list);
  ------------------
  |  |  258|      4|	_Generic((((_type *)0)->_field), fr_dlist_t: _fr_dlist_init(_head, offsetof(_type, _field), #_type))
  ------------------
  112|      4|	}
  113|       |
  114|  6.24k|	return buffer;
  115|  6.24k|}
strerror.c:_fr_logging_free:
   69|      4|{
   70|       |	/*
   71|       |	 *	Free arg instead of thread local storage
   72|       |	 *	as address sanitizer does a better job
   73|       |	 *	of tracking and doesn't report a leak.
   74|       |	 */
   75|      4|	if (talloc_free(arg) < 0) return -1;
  ------------------
  |  Branch (75:6): [True: 0, False: 4]
  ------------------
   76|      4|	fr_strerror_buffer = NULL;
   77|       |
   78|      4|	logging_stop = true;
   79|       |
   80|      4|	return 0;
   81|      4|}
strerror.c:strerror_const:
  413|    559|{
  414|    559|	fr_log_entry_t	*entry;
  415|    559|	fr_log_buffer_t	*buffer;
  416|       |
  417|    559|	buffer = fr_strerror_init();
  418|    559|	if (unlikely(buffer == NULL)) return NULL;
  ------------------
  |  |  397|    559|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 559]
  |  |  ------------------
  ------------------
  419|       |
  420|    559|	entry = talloc(pool_alt(buffer), fr_log_entry_t);
  421|    559|	if (unlikely(!entry)) {
  ------------------
  |  |  397|    559|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 559]
  |  |  ------------------
  ------------------
  422|      0|		fr_perror("Failed allocating memory for libradius error buffer");
  423|      0|		return NULL;
  424|      0|	}
  425|       |	/*
  426|       |	 *	For some reason this is significantly
  427|       |	 *	more efficient than a compound literal
  428|       |	 *	even though in the majority of cases
  429|       |	 *	compound literals and individual field
  430|       |	 *	assignments result in the same byte
  431|       |	 *	code.
  432|       |	 */
  433|    559|	entry->file = file;
  434|    559|	entry->line = line;
  435|    559|	entry->msg = msg;
  436|    559|	entry->subject = NULL;
  437|    559|	entry->offset = 0;
  438|       |
  439|    559|	pool_alt_free_children(buffer);
  440|    559|	fr_dlist_clear(&buffer->entries);
  441|    559|	fr_dlist_insert_tail(&buffer->entries, entry);
  442|       |
  443|    559|	return entry;
  444|    559|}

fr_struct_from_network:
   36|  2.16k|{
   37|  2.16k|	unsigned int		child_num;
   38|  2.16k|	uint8_t const		*p = data, *end = data + data_len;
   39|  2.16k|	fr_dict_attr_t const	*child, *substruct_da;
   40|  2.16k|	fr_pair_list_t		child_list_head;
   41|  2.16k|	fr_pair_list_t		*child_list;
   42|  2.16k|	fr_pair_t		*vp, *key_vp, *struct_vp = NULL;
   43|  2.16k|	unsigned int		offset = 0;
   44|  2.16k|	TALLOC_CTX		*child_ctx;
   45|  2.16k|	ssize_t			slen;
   46|  2.16k|	size_t			child_length;
   47|       |
   48|  2.16k|	if (data_len == 0) {
  ------------------
  |  Branch (48:6): [True: 51, False: 2.11k]
  ------------------
   49|     51|		fr_strerror_const("struct decoder was passed zero bytes of data");
  ------------------
  |  |  223|     51|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
   50|     51|		return -1; /* at least one byte of data */
   51|     51|	}
   52|       |
   53|  2.11k|	FR_PROTO_TRACE("Decoding struct %s", parent->name);
  ------------------
  |  |   41|  2.11k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 2.11k]
  |  |  ------------------
  ------------------
   54|  2.11k|	FR_PROTO_HEX_DUMP(data, data_len, "fr_struct_from_network");
  ------------------
  |  |   42|  2.11k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 2.11k]
  |  |  ------------------
  ------------------
   55|       |
   56|       |	/*
   57|       |	 *	Start a child list.
   58|       |	 */
   59|  2.11k|	fr_assert(parent->type == FR_TYPE_STRUCT);
  ------------------
  |  |  194|  2.11k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  2.11k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.11k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   60|       |
   61|  2.11k|	struct_vp = fr_pair_afrom_da(ctx, parent);
   62|  2.11k|	if (!struct_vp) {
  ------------------
  |  Branch (62:6): [True: 0, False: 2.11k]
  ------------------
   63|      0|		return PAIR_DECODE_OOM;
  ------------------
  |  |   45|      0|#define PAIR_DECODE_OOM		FR_VALUE_BOX_NET_OOM
  |  |  ------------------
  |  |  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|      0|	}
   65|  2.11k|	PAIR_ALLOCED(struct_vp);
  ------------------
  |  |  174|  2.11k|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 2.11k]
  |  |  ------------------
  ------------------
   66|       |
   67|  2.11k|	fr_pair_list_init(&child_list_head); /* still used elsewhere */
   68|  2.11k|	child_list = &struct_vp->vp_group;
  ------------------
  |  |  144|  2.11k|#define vp_group		children
  ------------------
   69|  2.11k|	child_ctx = struct_vp;
   70|  2.11k|	key_vp = NULL;
   71|       |
   72|       |	/*
   73|       |	 *	Simplify the code by having a generic decode routine.
   74|       |	 */
   75|  2.11k|	if (!decode_value) decode_value = fr_pair_decode_value;
  ------------------
  |  Branch (75:6): [True: 0, False: 2.11k]
  ------------------
   76|       |
   77|       |	/*
   78|       |	 *	Decode structs with length prefixes.
   79|       |	 */
   80|  2.11k|	if (da_is_length_field(parent)) {
  ------------------
  |  |  172|  2.11k|#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
  |  |  ------------------
  |  |  |  Branch (172:34): [True: 589, False: 1.52k]
  |  |  |  Branch (172:57): [True: 589, False: 0]
  |  |  |  Branch (172:104): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   81|    589|		size_t claimed_len, field_len, calc_len;
   82|       |
   83|       |		/*
   84|       |		 *	Set how many bytes there are in the "length" field.
   85|       |		 */
   86|    589|		if (da_is_length_field8(parent)) {
  ------------------
  |  |  173|    589|#define da_is_length_field8(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT8))
  |  |  ------------------
  |  |  |  Branch (173:35): [True: 589, False: 0]
  |  |  |  Branch (173:57): [True: 589, False: 0]
  |  |  ------------------
  ------------------
   87|    589|			field_len = 1;
   88|    589|		} else {
   89|      0|			fr_assert(da_is_length_field16(parent));
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  |  Branch (397:43): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   90|      0|			field_len = 2;
   91|      0|		}
   92|       |
   93|    589|		if ((size_t) (end - p) < field_len) {
  ------------------
  |  Branch (93:7): [True: 0, False: 589]
  ------------------
   94|      0|			FR_PROTO_TRACE("Insufficient room for length field");
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   95|       |
   96|    278|		invalid_struct:
   97|       |			/*
   98|       |			 *	Some field could not be decoded.  Nuke the entire struct, and just make the
   99|       |			 *	whole thing "raw".
  100|       |			 */
  101|    278|			TALLOC_FREE(struct_vp);
  ------------------
  |  Branch (101:4): [True: 278, False: 0]
  |  Branch (101:4): [Folded, False: 278]
  ------------------
  102|       |
  103|    278|			slen = fr_pair_raw_from_network(ctx, out, parent, data, data_len);
  104|    278|			if (slen < 0) return slen;
  ------------------
  |  Branch (104:8): [True: 278, False: 0]
  ------------------
  105|      0|			return data_len;
  106|    278|		}
  107|       |
  108|    589|		claimed_len = p[0];
  109|    589|		if (field_len > 1) {
  ------------------
  |  Branch (109:7): [True: 0, False: 589]
  ------------------
  110|      0|			claimed_len <<= 8;
  111|      0|			claimed_len |= p[1];
  112|      0|		}
  113|    589|		p += field_len;
  114|       |
  115|    589|		if (claimed_len < da_length_offset(parent)) {
  ------------------
  |  |  175|    589|#define da_length_offset(_da) ((_da)->flags.type_size)
  ------------------
  |  Branch (115:7): [True: 0, False: 589]
  ------------------
  116|      0|			FR_PROTO_TRACE("Length header (%zu) is smaller than minimum value (%u)",
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  117|      0|				       claimed_len, parent->flags.type_size);
  118|      0|			goto invalid_struct;
  119|      0|		}
  120|       |
  121|       |		/*
  122|       |		 *	Get the calculated length of the actual data.
  123|       |		 */
  124|    589|		calc_len = claimed_len - da_length_offset(parent);
  ------------------
  |  |  175|    589|#define da_length_offset(_da) ((_da)->flags.type_size)
  ------------------
  125|       |
  126|    589|		if (calc_len > (size_t) (end - p)) {
  ------------------
  |  Branch (126:7): [True: 278, False: 311]
  ------------------
  127|    278|			FR_PROTO_TRACE("Length header (%zu) is larger than remaining data (%zu)",
  ------------------
  |  |   41|    278|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 278]
  |  |  ------------------
  ------------------
  128|    278|				       claimed_len + field_len, (size_t) (end - p));
  129|    278|			goto invalid_struct;
  130|    278|		}
  131|       |
  132|       |		/*
  133|       |		 *	Limit the size of the decoded structure to the correct length.
  134|       |		 */
  135|    311|		data_len = calc_len;
  136|    311|		end = p + data_len;
  137|    311|	}
  138|       |
  139|       |	/*
  140|       |	 *	@todo - If the struct is truncated on a MEMBER boundary, we silently omit
  141|       |	 *	the trailing members.  Maybe this should be an error?
  142|       |	 */
  143|  1.83k|	for (child_num = 1;
  144|  7.54k|	     (p < end) && (child = fr_dict_attr_child_by_num(parent, child_num)) != NULL;
  ------------------
  |  Branch (144:7): [True: 6.29k, False: 1.24k]
  |  Branch (144:20): [True: 6.15k, False: 143]
  ------------------
  145|  6.15k|	     child_num++) {
  146|  6.15k|		FR_PROTO_TRACE("Decoding struct %s child %s (%d)", parent->name, child->name, child->attr);
  ------------------
  |  |   41|  6.15k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 6.15k]
  |  |  ------------------
  ------------------
  147|  6.15k|		FR_PROTO_HEX_DUMP(p, (end - p), "fr_struct_from_network - remaining %zu", (size_t) (end - p));
  ------------------
  |  |   42|  6.15k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 6.15k]
  |  |  ------------------
  ------------------
  148|       |
  149|       |		/*
  150|       |		 *	Check for bit fields.
  151|       |		 */
  152|  6.15k|		if (da_is_bit_field(child)) {
  ------------------
  |  |  171|  6.15k|#define da_is_bit_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_BIT_FIELD))
  |  |  ------------------
  |  |  |  Branch (171:31): [True: 3.99k, False: 2.16k]
  |  |  |  Branch (171:53): [True: 3.52k, False: 469]
  |  |  ------------------
  ------------------
  153|  3.52k|			uint8_t array[8];
  154|  3.52k|			unsigned int num_bits;
  155|  3.52k|			uint64_t value;
  156|       |
  157|  3.52k|			num_bits = offset + child->flags.length;
  158|  3.52k|			if ((size_t)(end - p) < fr_bytes_from_bits(num_bits)) {
  ------------------
  |  Branch (158:8): [True: 40, False: 3.48k]
  ------------------
  159|     40|				FR_PROTO_TRACE("not enough data for bit decoder?");
  ------------------
  |  |   41|     40|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 40]
  |  |  ------------------
  ------------------
  160|     40|				goto remainder_raw;
  161|     40|			}
  162|       |
  163|  3.48k|			memset(array, 0, sizeof(array));
  164|  3.48k|			memcpy(&array[0], p, fr_bytes_from_bits(num_bits));
  165|       |
  166|  3.48k|			if (offset > 0) array[0] &= (1 << (8 - offset)) - 1; /* mask off bits we don't care about */
  ------------------
  |  Branch (166:8): [True: 2.86k, False: 618]
  ------------------
  167|       |
  168|  3.48k|			memcpy(&value, &array[0], sizeof(value));
  169|  3.48k|			value = htonll(value);
  ------------------
  |  |  502|  3.48k|#  define htonll(x) ntohll(x)
  |  |  ------------------
  |  |  |  |  495|  3.48k|#      define ntohll(x) ((uint64_t)__builtin_bswap64(x))
  |  |  ------------------
  ------------------
  170|  3.48k|			value >>= (8 - offset); /* move it to the lower bits */
  171|  3.48k|			value >>= (56 - child->flags.length);
  172|       |
  173|  3.48k|			vp = fr_pair_afrom_da(child_ctx, child);
  174|  3.48k|			if (!vp) {
  ------------------
  |  Branch (174:8): [True: 0, False: 3.48k]
  ------------------
  175|      0|				FR_PROTO_TRACE("fr_struct_from_network - failed allocating child VP");
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  176|      0|			oom:
  177|      0|				talloc_free(struct_vp);
  178|      0|				return PAIR_DECODE_OOM;
  ------------------
  |  |   45|      0|#define PAIR_DECODE_OOM		FR_VALUE_BOX_NET_OOM
  |  |  ------------------
  |  |  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|      0|			}
  180|  3.48k|			PAIR_ALLOCED(vp);
  ------------------
  |  |  174|  3.48k|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 3.48k]
  |  |  ------------------
  ------------------
  181|       |
  182|  3.48k|			switch (child->type) {
  183|  2.86k|				case FR_TYPE_BOOL:
  ------------------
  |  Branch (183:5): [True: 2.86k, False: 618]
  ------------------
  184|  2.86k|					vp->vp_bool = value;
  ------------------
  |  |  125|  2.86k|#define vp_bool			data.datum.boolean
  ------------------
  185|  2.86k|					break;
  186|       |
  187|    150|				case FR_TYPE_UINT8:
  ------------------
  |  Branch (187:5): [True: 150, False: 3.33k]
  ------------------
  188|    150|					vp->vp_uint8 = value;
  ------------------
  |  |  126|    150|#define vp_uint8		data.vb_uint8
  |  |  ------------------
  |  |  |  |  272|    150|#define vb_uint8				datum.uint8
  |  |  ------------------
  ------------------
  189|    150|					break;
  190|       |
  191|    380|				case FR_TYPE_UINT16:
  ------------------
  |  Branch (191:5): [True: 380, False: 3.10k]
  ------------------
  192|    380|					vp->vp_uint16 = value;
  ------------------
  |  |  127|    380|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|    380|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
  193|    380|					break;
  194|       |
  195|     88|				case FR_TYPE_UINT32:
  ------------------
  |  Branch (195:5): [True: 88, False: 3.39k]
  ------------------
  196|     88|					vp->vp_uint32 = value;
  ------------------
  |  |  128|     88|#define vp_uint32		data.vb_uint32
  |  |  ------------------
  |  |  |  |  274|     88|#define vb_uint32				datum.uint32
  |  |  ------------------
  ------------------
  197|     88|					break;
  198|       |
  199|      0|				case FR_TYPE_UINT64:
  ------------------
  |  Branch (199:5): [True: 0, False: 3.48k]
  ------------------
  200|      0|					vp->vp_uint64 = value;
  ------------------
  |  |  129|      0|#define vp_uint64		data.vb_uint64
  |  |  ------------------
  |  |  |  |  275|      0|#define vb_uint64				datum.uint64
  |  |  ------------------
  ------------------
  201|      0|					break;
  202|       |
  203|      0|				default:
  ------------------
  |  Branch (203:5): [True: 0, False: 3.48k]
  ------------------
  204|      0|					FR_PROTO_TRACE("Can't decode unknown type?");
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  205|      0|					goto remainder_raw;
  206|  3.48k|			}
  207|       |
  208|  3.48k|			vp->vp_tainted = true;
  ------------------
  |  |  150|  3.48k|#define vp_tainted		data.tainted
  ------------------
  209|  3.48k|			fr_pair_append(child_list, vp);
  210|       |
  211|  3.48k|			p += (num_bits >> 3); /* go to the LAST bit, not the byte AFTER the last bit */
  212|  3.48k|			offset = num_bits & 0x07;
  213|  3.48k|			continue;
  214|  3.48k|		}
  215|       |
  216|  2.63k|		fr_assert(offset == 0);
  ------------------
  |  |  194|  2.63k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  2.63k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.63k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  217|  2.63k|		offset = 0;	/* reset for non-bit-field attributes */
  218|       |
  219|       |		/*
  220|       |		 *	The child is either unknown width, OR known width with a length that is too large for
  221|       |		 *	the "length" field, OR is known width via some kind of protocol-specific length header.
  222|       |		 */
  223|  2.63k|		if (!child->flags.length || child->flags.array) {
  ------------------
  |  Branch (223:7): [True: 843, False: 1.78k]
  |  Branch (223:31): [True: 175, False: 1.61k]
  ------------------
  224|  1.01k|			child_length = end - p;
  225|       |
  226|  1.61k|		} else {
  227|  1.61k|			child_length = child->flags.length;
  228|       |
  229|       |			/*
  230|       |			 *	If this field overflows the input, then *all*
  231|       |			 *	of the input is suspect.
  232|       |			 */
  233|  1.61k|			if (child_length > (size_t) (end - p)) {
  ------------------
  |  Branch (233:8): [True: 473, False: 1.14k]
  ------------------
  234|    473|				child_length = (size_t) (end - p);
  235|    473|			}
  236|  1.61k|		}
  237|       |
  238|       |		/*
  239|       |		 *	We only allow a limited number of data types
  240|       |		 *	inside of a struct.
  241|       |		 */
  242|  2.63k|		switch (child->type) {
  ------------------
  |  Branch (242:11): [True: 2.63k, False: 0]
  ------------------
  243|      0|		case FR_TYPE_INTERNAL:
  ------------------
  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  274|      0|	_beg(FR_TYPE_VALUE_BOX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  275|      0|	_mid(FR_TYPE_VOID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  276|      0|	_mid(FR_TYPE_VALUE_BOX_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  277|      0|	_mid(FR_TYPE_PAIR_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  278|      0|	_end(FR_TYPE_MAX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (243:3): [True: 0, False: 2.63k]
  ------------------
  244|      0|		case FR_TYPE_NULL:
  ------------------
  |  Branch (244:3): [True: 0, False: 2.63k]
  ------------------
  245|      0|			FR_PROTO_TRACE("fr_struct_from_network - unknown child type");
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  246|      0|			goto remainder_raw;
  247|       |
  248|    569|		case FR_TYPE_STRUCT:
  ------------------
  |  Branch (248:3): [True: 569, False: 2.06k]
  ------------------
  249|    569|		case FR_TYPE_VSA:
  ------------------
  |  Branch (249:3): [True: 0, False: 2.63k]
  ------------------
  250|    569|		case FR_TYPE_VENDOR:
  ------------------
  |  Branch (250:3): [True: 0, False: 2.63k]
  ------------------
  251|    569|		case FR_TYPE_GROUP:
  ------------------
  |  Branch (251:3): [True: 0, False: 2.63k]
  ------------------
  252|  2.50k|		case FR_TYPE_LEAF:
  ------------------
  |  |  317|    569|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|    569|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|    569|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|    569|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|    569|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|    569|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    569|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|    569|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|    569|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    569|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|  1.36k|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|    569|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    569|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    569|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|    569|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    569|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    569|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|    955|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|    955|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|    955|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 386, False: 2.24k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|  1.30k|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.30k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.30k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 351, False: 2.28k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|  1.36k|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.36k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.36k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 59, False: 2.57k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|  1.36k|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.36k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.36k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|  1.60k|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|  1.54k|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.54k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.54k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 182, False: 2.45k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|  1.60k|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.60k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.60k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 61, False: 2.57k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|  1.60k|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|  1.60k|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.60k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.60k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|  1.60k|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.60k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|  1.60k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|  1.60k|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|  1.60k|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|  1.60k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.60k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|  1.60k|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|  2.29k|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.29k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.29k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 684, False: 1.94k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|  2.29k|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.29k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.29k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|  2.39k|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.39k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.39k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 102, False: 2.53k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|  2.50k|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.50k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 110, False: 2.52k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|  2.50k|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.50k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|  2.50k|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.50k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|  2.50k|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.50k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|  2.50k|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.50k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|  2.50k|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.50k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|  2.50k|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  2.50k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2.63k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|  2.50k|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|  2.50k|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|  2.50k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (252:3): [True: 0, False: 2.63k]
  ------------------
  253|  2.50k|			break;
  254|       |
  255|       |		/*
  256|       |		 *	Decode child TLVs, according to the parent attribute.
  257|       |		 */
  258|     18|		case FR_TYPE_TLV:
  ------------------
  |  Branch (258:3): [True: 18, False: 2.61k]
  ------------------
  259|     18|			fr_assert(!key_vp);
  ------------------
  |  |  194|     18|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     18|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 18]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|       |
  261|     18|			if (!decode_tlv) {
  ------------------
  |  Branch (261:8): [True: 0, False: 18]
  ------------------
  262|      0|				fr_strerror_const("Decoding TLVs requires a decode_tlv() function to be passed");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  263|      0|				talloc_free(struct_vp);
  264|      0|				return -(p - data);
  265|      0|			}
  266|       |
  267|       |			/*
  268|       |			 *	Decode all of the remaining data as
  269|       |			 *	TLVs.  Any malformed TLVs are appended
  270|       |			 *	as raw VP.
  271|       |			 */
  272|     21|			while (p < end) {
  ------------------
  |  Branch (272:11): [True: 18, False: 3]
  ------------------
  273|     18|				slen = decode_tlv(child_ctx, child_list, child, p, end - p, decode_ctx);
  274|     18|				if (slen < 0) {
  ------------------
  |  Branch (274:9): [True: 15, False: 3]
  ------------------
  275|     15|					FR_PROTO_TRACE("failed decoding TLV?");
  ------------------
  |  |   41|     15|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 15]
  |  |  ------------------
  ------------------
  276|     15|					goto remainder_raw;
  277|     15|				}
  278|      3|				p += slen;
  279|      3|			}
  280|       |
  281|      3|			goto done;
  282|       |
  283|       |		/*
  284|       |		 *	The child is a union, it MUST be at the end of
  285|       |		 *	the struct, and we must have seen a key before
  286|       |		 *	we reach the union.  See dict_tokenize.
  287|       |		 */
  288|    110|		case FR_TYPE_UNION:
  ------------------
  |  Branch (288:3): [True: 110, False: 2.52k]
  ------------------
  289|       |			/*
  290|       |			 *	Create the union wrapper, and reset the child_ctx and child_list to it.
  291|       |			 */
  292|    110|			vp = fr_pair_afrom_da(child_ctx, child);
  293|    110|			if (!vp) goto oom;
  ------------------
  |  Branch (293:8): [True: 0, False: 110]
  ------------------
  294|    110|			PAIR_ALLOCED(vp);
  ------------------
  |  |  174|    110|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 110]
  |  |  ------------------
  ------------------
  295|       |
  296|    110|			fr_pair_append(child_list, vp);
  297|    110|			substruct_da = child;
  298|    110|			child_ctx = vp;
  299|    110|			child_list = &vp->vp_group;
  ------------------
  |  |  144|    110|#define vp_group		children
  ------------------
  300|       |
  301|    110|			fr_assert(!fr_dict_attr_child_by_num(parent, child_num + 1)); /* has to be the last one */
  ------------------
  |  |  194|    110|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|    110|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 110]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  302|    110|			if (!key_vp) {
  ------------------
  |  Branch (302:8): [True: 0, False: 110]
  ------------------
  303|     55|			remainder_raw:
  304|     55|				child_length = (size_t) (end - p);
  305|     55|				goto raw;
  306|      0|			}
  307|       |
  308|    110|			goto substruct;
  309|  2.63k|		}
  310|       |
  311|       |		/*
  312|       |		 *	Magic values get the callback called.
  313|       |		 *
  314|       |		 *	@todo - if this is an array of DNS labels, we
  315|       |		 *	need to do decompression checks on the entire
  316|       |		 *	block, and then decode each field
  317|       |		 *	individually.
  318|       |		 */
  319|  2.50k|		if (child->flags.array) {
  ------------------
  |  Branch (319:7): [True: 797, False: 1.70k]
  ------------------
  320|    797|			slen = fr_pair_array_from_network(child_ctx, child_list, child, p, child_length, decode_ctx, decode_value);
  321|  1.70k|		} else {
  322|  1.70k|			slen = decode_value(child_ctx, child_list, child, p, child_length, decode_ctx);
  323|  1.70k|		}
  324|  2.50k|		if (slen < 0) {
  ------------------
  |  Branch (324:7): [True: 278, False: 2.22k]
  ------------------
  325|    278|			FR_PROTO_TRACE("Failed decoding value");
  ------------------
  |  |   41|    278|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 278]
  |  |  ------------------
  ------------------
  326|       |
  327|    333|		raw:
  328|    333|			slen = fr_pair_raw_from_network(child_ctx, child_list, child, p, child_length);
  329|    333|			if (slen < 0) {
  ------------------
  |  Branch (329:8): [True: 333, False: 0]
  ------------------
  330|    333|				talloc_free(struct_vp);
  331|    333|				return slen;
  332|    333|			}
  333|    333|		}
  334|       |
  335|  2.22k|		p += slen;   	/* not always the same as child->flags.length */
  336|       |
  337|  2.22k|		if (fr_dict_attr_is_key_field(child)) {
  ------------------
  |  |  170|  2.22k|#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
  |  |  ------------------
  |  |  |  Branch (170:41): [True: 191, False: 2.03k]
  |  |  |  Branch (170:63): [True: 133, False: 58]
  |  |  ------------------
  ------------------
  338|    133|			fr_assert(!key_vp);
  ------------------
  |  |  194|    133|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|    133|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 133]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|    133|			key_vp = fr_pair_list_tail(child_list);
  340|    133|		}
  341|  2.22k|	}
  342|       |
  343|       |	/*
  344|       |	 *	Is there a substructure after this one?  If so, go
  345|       |	 *	decode it.
  346|       |	 */
  347|  1.39k|	if (key_vp) {
  ------------------
  |  Branch (347:6): [True: 23, False: 1.36k]
  ------------------
  348|     23|		fr_dict_enum_value_t const *enumv;
  349|       |
  350|     23|		substruct_da = key_vp->da;
  351|       |
  352|    133|	substruct:
  353|    133|		child = NULL;
  354|       |
  355|    133|		FR_PROTO_TRACE("Key %s", key_vp->da->name);
  ------------------
  |  |   41|    133|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 133]
  |  |  ------------------
  ------------------
  356|    133|		FR_PROTO_HEX_DUMP(p, (end - p), "fr_struct_from_network - child structure");
  ------------------
  |  |   42|    133|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 133]
  |  |  ------------------
  ------------------
  357|       |
  358|       |		/*
  359|       |		 *	Nothing more to decode, don't decode it.
  360|       |		 */
  361|    133|		if (p >= end) {
  ------------------
  |  Branch (361:7): [True: 23, False: 110]
  ------------------
  362|     23|			FR_PROTO_TRACE("Expected substruct, but there is none. We're done decoding this structure");
  ------------------
  |  |   41|     23|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 23]
  |  |  ------------------
  ------------------
  363|     23|			goto done;
  364|     23|		}
  365|       |
  366|    110|		enumv = fr_dict_enum_by_value(key_vp->da, &key_vp->data);
  367|    110|		if (enumv) child = fr_dict_enum_attr_ref(enumv);
  ------------------
  |  Branch (367:7): [True: 102, False: 8]
  ------------------
  368|       |
  369|    110|		if (!child) {
  ------------------
  |  Branch (369:7): [True: 8, False: 102]
  ------------------
  370|       |			/*
  371|       |			 *	Always encode the unknown child as attribute number 0.  Since the unknown
  372|       |			 *	children have no "real" number, and are all unique da's, they are
  373|       |			 *	incomparable.  And thus can all be given the same number.
  374|       |			 */
  375|      8|			uint64_t attr;
  376|       |
  377|      8|			FR_PROTO_TRACE("No matching child structure found");
  ------------------
  |  |   41|      8|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  378|       |
  379|      8|		unknown_child:
  380|      8|			attr = 0;
  381|       |
  382|       |			/*
  383|       |			 *	But if we have a key field, the unknown attribute number is taken from the
  384|       |			 *	from the key field.
  385|       |			 */
  386|      8|			if (fr_type_is_integer(key_vp->vp_type)) {
  ------------------
  |  |  381|      8|#define fr_type_is_integer(_x)			(fr_type_integer[_x])
  |  |  ------------------
  |  |  |  Branch (381:34): [True: 8, False: 0]
  |  |  ------------------
  ------------------
  387|      8|				attr = fr_value_box_as_uint64(&key_vp->data);
  388|      8|			}
  389|       |
  390|      8|			child = fr_dict_attr_unknown_raw_afrom_num(child_ctx, substruct_da, attr);
  391|      8|			if (!child) {
  ------------------
  |  Branch (391:8): [True: 0, False: 8]
  ------------------
  392|      0|				FR_PROTO_TRACE("failed allocating unknown child for key VP %s - %s",
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  393|      0|					       key_vp->da->name, fr_strerror());
  394|      0|				goto oom;
  395|      0|			}
  396|       |
  397|      8|			slen = fr_pair_raw_from_network(child_ctx, child_list, child, p, end - p);
  398|      8|			if (slen < 0) {
  ------------------
  |  Branch (398:8): [True: 0, False: 8]
  ------------------
  399|      0|				FR_PROTO_TRACE("Failed creating raw VP from malformed or unknown substruct for child %s", child->name);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  400|      0|				fr_dict_attr_unknown_free(&child);
  401|      0|				return slen;
  402|      0|			}
  403|       |
  404|      8|			p = end;
  405|       |
  406|    102|		} else {
  407|    102|			switch (child->type) {
  408|    102|			case FR_TYPE_STRUCT:
  ------------------
  |  Branch (408:4): [True: 102, False: 0]
  ------------------
  409|    102|				FR_PROTO_TRACE("Decoding child structure %s", child->name);
  ------------------
  |  |   41|    102|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 102]
  |  |  ------------------
  ------------------
  410|    102|				slen = fr_struct_from_network(child_ctx, child_list, child, p, end - p,
  411|    102|							      decode_ctx, decode_value, decode_tlv);
  412|    102|				break;
  413|       |
  414|      0|			case FR_TYPE_TLV:
  ------------------
  |  Branch (414:4): [True: 0, False: 102]
  ------------------
  415|      0|				if (!decode_tlv) {
  ------------------
  |  Branch (415:9): [True: 0, False: 0]
  ------------------
  416|      0|					FR_PROTO_TRACE("Failed to pass decode_tlv() for child tlv %s", child->name);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  417|      0|					goto unknown_child;
  418|      0|				}
  419|       |
  420|      0|				FR_PROTO_TRACE("Decoding child tlv %s", child->name);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  421|       |
  422|      0|				slen = decode_tlv(child_ctx, child_list, child, p, end - p, decode_ctx);
  423|      0|				break;
  424|       |
  425|      0|			case FR_TYPE_LEAF:
  ------------------
  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  260|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  261|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  262|      0|	_mid(FR_TYPE_ATTR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  263|      0|	FR_TYPE_IP_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  168|      0|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  170|      0|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  171|      0|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  172|      0|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  173|      0|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  264|      0|	FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|	_end(FR_TYPE_OCTETS)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  265|      0|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|      0|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|      0|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|      0|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|      0|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|      0|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|      0|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|      0|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|      0|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|      0|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|      0|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|      0|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|      0|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|      0|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|      0|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|      0|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 102]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|      0|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  317|      0|#define FR_TYPE_LEAF				FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (425:4): [True: 0, False: 102]
  ------------------
  426|      0|				fr_assert(decode_value);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  427|       |
  428|      0|				FR_PROTO_TRACE("Decoding child %s", child->name);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  429|       |
  430|       |				/*
  431|       |				 *	@todo - unify this code with the code above, but for now copying is
  432|       |				 *	easier.
  433|       |				 */
  434|       |
  435|       |				/*
  436|       |				 *	The child is either unknown width, OR known width with a length that is too large for
  437|       |				 *	the "length" field, OR is known width via some kind of protocol-specific length header.
  438|       |				 */
  439|      0|				if (!child->flags.length || child->flags.array) {
  ------------------
  |  Branch (439:9): [True: 0, False: 0]
  |  Branch (439:33): [True: 0, False: 0]
  ------------------
  440|      0|					child_length = end - p;
  441|       |
  442|      0|				} else {
  443|      0|					child_length = child->flags.length;
  444|       |
  445|       |					/*
  446|       |					 *	If this field overflows the input, then *all*
  447|       |					 *	of the input is suspect.
  448|       |					 */
  449|      0|					if (child_length > (size_t) (end - p)) {
  ------------------
  |  Branch (449:10): [True: 0, False: 0]
  ------------------
  450|      0|						FR_PROTO_TRACE("fr_struct_from_network - child length %zu overflows buffer", child_length);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  451|      0|						goto remainder_raw;
  452|      0|					}
  453|      0|				}
  454|       |
  455|      0|				if (child->flags.array) {
  ------------------
  |  Branch (455:9): [True: 0, False: 0]
  ------------------
  456|      0|					slen = fr_pair_array_from_network(child_ctx, child_list, child, p, child_length, decode_ctx, decode_value);
  457|      0|				} else {
  458|      0|					slen = decode_value(child_ctx, child_list, child, p, child_length, decode_ctx);
  459|      0|				}
  460|      0|				break;
  461|       |
  462|      0|			default:
  ------------------
  |  Branch (462:4): [True: 0, False: 102]
  ------------------
  463|      0|				FR_PROTO_TRACE("Unknown data type %s in child %s", fr_type_to_str(child->type), child->name);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  464|      0|				goto unknown_child;
  465|    102|			}
  466|       |
  467|    102|			if (slen <= 0) {
  ------------------
  |  Branch (467:8): [True: 0, False: 102]
  ------------------
  468|      0|				FR_PROTO_TRACE("failed decoding child %s", child->name);
  ------------------
  |  |   41|      0|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  469|      0|				goto unknown_child;
  470|      0|			}
  471|    102|			p += slen;
  472|    102|		}
  473|       |
  474|    110|		fr_dict_attr_unknown_free(&child);
  475|    110|	}
  476|       |
  477|  1.50k|done:
  478|  1.50k|	fr_assert(struct_vp != NULL);
  ------------------
  |  |  194|  1.50k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  1.50k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 1.50k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  479|  1.50k|	fr_pair_append(out, struct_vp);
  480|       |
  481|  1.50k|	FR_PROTO_TRACE("used %zu bytes", data_len);
  ------------------
  |  |   41|  1.50k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 1.50k]
  |  |  ------------------
  ------------------
  482|  1.50k|	return p - data;
  483|  1.39k|}

talloc_destructor_add:
   99|      4|{
  100|      4|	fr_talloc_destructor_t *d;
  101|       |
  102|      4|	if (!fire_ctx) {
  ------------------
  |  Branch (102:6): [True: 0, False: 4]
  ------------------
  103|      0|		fr_strerror_const("No firing ctx provided when setting destructor");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  104|      0|		return NULL;
  105|      0|	}
  106|       |
  107|      4|	d = talloc_zero(fire_ctx, fr_talloc_destructor_t);
  108|      4|	if (!d) {
  ------------------
  |  Branch (108:6): [True: 0, False: 4]
  ------------------
  109|      0|	oom:
  110|      0|		fr_strerror_const("Out of Memory");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  111|      0|		return NULL;
  112|      0|	}
  113|       |
  114|      4|	d->fire = fire_ctx;
  115|      4|	d->func = func;
  116|      4|	memcpy(&d->uctx, &uctx, sizeof(d->uctx));
  117|       |
  118|      4|	if (disarm_ctx) {
  ------------------
  |  Branch (118:6): [True: 4, False: 0]
  ------------------
  119|      4|		fr_talloc_destructor_disarm_t *ds;
  120|       |
  121|      4|		ds = talloc(disarm_ctx, fr_talloc_destructor_disarm_t);
  122|      4|		if (!ds) {
  ------------------
  |  Branch (122:7): [True: 0, False: 4]
  ------------------
  123|      0|			talloc_free(d);
  124|      0|			goto oom;
  125|      0|		}
  126|      4|		ds->d = d;
  127|      4|		d->ds = ds;
  128|      4|		talloc_set_destructor(ds, _talloc_destructor_disarm);
  ------------------
  |  Branch (128:3): [Folded, False: 4]
  ------------------
  129|      4|	}
  130|       |
  131|      4|	talloc_set_destructor(d, _talloc_destructor_fire);
  ------------------
  |  Branch (131:2): [Folded, False: 4]
  ------------------
  132|       |
  133|      4|	return d;
  134|      4|}
talloc_link_ctx:
  169|      4|{
  170|      4|	if (!talloc_destructor_add(parent, child, _talloc_link_ctx_free, child)) return -1;
  ------------------
  |  Branch (170:6): [True: 0, False: 4]
  ------------------
  171|       |
  172|      4|	return 0;
  173|      4|}
talloc_typed_strdup:
  472|  9.04k|{
  473|  9.04k|	char *n;
  474|       |
  475|  9.04k|#undef talloc_strdup
  476|  9.04k|	n = talloc_strdup(ctx, p);
  477|  9.04k|	if (unlikely(!n)) return NULL;
  ------------------
  |  |  397|  9.04k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 9.04k]
  |  |  ------------------
  ------------------
  478|  9.04k|	talloc_set_type(n, char);
  479|       |
  480|  9.04k|	return n;
  481|  9.04k|}
talloc_typed_asprintf:
  547|     98|{
  548|     98|	char *n;
  549|     98|	va_list ap;
  550|       |
  551|     98|	va_start(ap, fmt);
  552|     98|	n = talloc_vasprintf(ctx, fmt, ap);
  553|     98|	va_end(ap);
  554|     98|	if (unlikely(!n)) return NULL;
  ------------------
  |  |  397|     98|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 98]
  |  |  ------------------
  ------------------
  555|     98|	talloc_set_type(n, char);
  556|       |
  557|     98|	return n;
  558|     98|}
talloc_bstrndup:
  619|    323|{
  620|    323|	char *p;
  621|       |
  622|    323|	p = talloc_array(ctx, char, inlen + 1);
  623|    323|	if (unlikely(!p)) return NULL;
  ------------------
  |  |  397|    323|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 323]
  |  |  ------------------
  ------------------
  624|       |
  625|       |	/*
  626|       |	 * C99 (7.21.1/2) - Length zero results in noop
  627|       |	 *
  628|       |	 * But ubsan still flags this, grrr.
  629|       |	 */
  630|    323|	if (inlen > 0) memcpy(p, in, inlen);
  ------------------
  |  Branch (630:6): [True: 323, False: 0]
  ------------------
  631|    323|	p[inlen] = '\0';
  632|       |
  633|    323|	return p;
  634|    323|}
talloc_decrease_ref_count:
  819|      4|{
  820|      4|	size_t ref_count;
  821|      4|	void *to_free;
  822|       |
  823|      4|	if (!ptr) return 0;
  ------------------
  |  Branch (823:6): [True: 0, False: 4]
  ------------------
  824|       |
  825|      4|	memcpy(&to_free, &ptr, sizeof(to_free));
  826|       |
  827|      4|	ref_count = talloc_reference_count(to_free);
  828|      4|	if (ref_count == 0) {
  ------------------
  |  Branch (828:6): [True: 4, False: 0]
  ------------------
  829|      4|		talloc_free(to_free);
  830|      4|	} else {
  831|      0|		talloc_unlink(talloc_parent(ptr), to_free);
  832|      0|		if (talloc_reference_count(to_free) == 0) talloc_free(to_free);
  ------------------
  |  Branch (832:7): [True: 0, False: 0]
  ------------------
  833|      0|	}
  834|       |
  835|      4|	return ref_count;
  836|      4|}
talloc_autofree_context_global:
  890|      2|{
  891|      2|	TALLOC_CTX *af = global_ctx;
  892|       |
  893|      2|	if (!af) {
  ------------------
  |  Branch (893:6): [True: 2, False: 0]
  ------------------
  894|      2|		af = talloc_init_const("global_autofree_context");
  895|      2|		if (unlikely(!af)) return NULL;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  896|       |
  897|      2|		talloc_set_destructor(af, _autofree_global_destructor);
  ------------------
  |  Branch (897:3): [Folded, False: 2]
  ------------------
  898|       |
  899|      2|		fr_atexit_global(_autofree_on_exit, af);
  ------------------
  |  |   58|      2|#define fr_atexit_global(_func, _uctx) _atexit_global(__FILE__, __LINE__, _func, _uctx)
  ------------------
  900|      2|		global_ctx = af;
  901|      2|	}
  902|       |
  903|      2|	return af;
  904|      2|}
talloc.c:_talloc_destructor_fire:
   66|      2|{
   67|      2|	if (d->ds) {
  ------------------
  |  Branch (67:6): [True: 2, False: 0]
  ------------------
   68|      2|		talloc_set_destructor(d->ds, NULL);	/* Disarm the disarmer */
  ------------------
  |  Branch (68:3): [Folded, False: 2]
  ------------------
   69|      2|		TALLOC_FREE(d->ds);			/* Free the disarm trigger ctx */
  ------------------
  |  Branch (69:3): [True: 2, False: 0]
  |  Branch (69:3): [Folded, False: 2]
  ------------------
   70|      2|	}
   71|       |
   72|      2|	return d->func(d->fire, d->uctx);
   73|      2|}
talloc.c:_talloc_link_ctx_free:
  151|      2|{
  152|      2|	talloc_free(child);
  153|       |
  154|      2|	return 0;
  155|      2|}
talloc.c:_autofree_global_destructor:
  885|      2|{
  886|      2|	return fr_atexit_global_disarm(true, _autofree_on_exit, af);
  887|      2|}

fr_value_box_cmp:
  749|    136|{
  750|    136|	if (a->type != b->type) {
  ------------------
  |  Branch (750:6): [True: 0, False: 136]
  ------------------
  751|      0|		fr_strerror_printf("%s: Can't compare values of different types", __FUNCTION__);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  752|      0|		return -2;
  753|      0|	}
  754|       |
  755|       |	/*
  756|       |	 *	After doing the previous check for special comparisons,
  757|       |	 *	do the per-type comparison here.
  758|       |	 */
  759|    136|	switch (a->type) {
  ------------------
  |  Branch (759:10): [True: 136, False: 0]
  ------------------
  760|      0|	case FR_TYPE_VARIABLE_SIZE:
  ------------------
  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  201|      0|	_end(FR_TYPE_OCTETS)
  |  |  |  |  ------------------
  |  |  |  |  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (760:2): [True: 0, False: 136]
  ------------------
  761|       |		/*
  762|       |		 *	Note that we do NOT check a->secret or b->secret.  This function is used to sort pairs
  763|       |		 *	and sets of value-boxes.  The fr_digest_cmp() function returns 0..255 no matter what
  764|       |		 *	the two inputs are.  So it can't be used in a stable sort.
  765|       |		 */
  766|      0|		return MEMCMP_FIELDS(a, b, datum.ptr, vb_length);
  ------------------
  |  |  179|      0|	memcmp_return((_a)->_field, (_b)->_field, (_a)->_len_field, (_b)->_len_field)
  ------------------
  767|       |
  768|       |	/*
  769|       |	 *	Short-hand for simplicity.
  770|       |	 */
  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  772|      0|#define COMPARE(_type) return CMP(memcmp(&a->datum._type, &b->datum._type, sizeof(a->datum._type)), 0)
  773|       |
  774|      0|	case FR_TYPE_BOOL:
  ------------------
  |  Branch (774:2): [True: 0, False: 136]
  ------------------
  775|      0|		RETURN(boolean);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  776|       |
  777|      0|	case FR_TYPE_DATE:
  ------------------
  |  Branch (777:2): [True: 0, False: 136]
  ------------------
  778|      0|		return fr_unix_time_cmp(a->datum.date, b->datum.date);
  779|       |
  780|    118|	case FR_TYPE_UINT8:
  ------------------
  |  Branch (780:2): [True: 118, False: 18]
  ------------------
  781|    118|		RETURN(uint8);
  ------------------
  |  |  771|    118|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|    118|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|    118|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  782|       |
  783|      0|	case FR_TYPE_UINT16:
  ------------------
  |  Branch (783:2): [True: 0, False: 136]
  ------------------
  784|      0|		RETURN(uint16);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  785|       |
  786|     18|	case FR_TYPE_UINT32:
  ------------------
  |  Branch (786:2): [True: 18, False: 118]
  ------------------
  787|     18|		RETURN(uint32);
  ------------------
  |  |  771|     18|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|     18|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|     18|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  788|       |
  789|      0|	case FR_TYPE_UINT64:
  ------------------
  |  Branch (789:2): [True: 0, False: 136]
  ------------------
  790|      0|		RETURN(uint64);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|       |
  792|      0|	case FR_TYPE_INT8:
  ------------------
  |  Branch (792:2): [True: 0, False: 136]
  ------------------
  793|      0|		RETURN(int8);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  794|       |
  795|      0|	case FR_TYPE_INT16:
  ------------------
  |  Branch (795:2): [True: 0, False: 136]
  ------------------
  796|      0|		RETURN(int16);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  797|       |
  798|      0|	case FR_TYPE_INT32:
  ------------------
  |  Branch (798:2): [True: 0, False: 136]
  ------------------
  799|      0|		RETURN(int32);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  800|       |
  801|      0|	case FR_TYPE_INT64:
  ------------------
  |  Branch (801:2): [True: 0, False: 136]
  ------------------
  802|      0|		RETURN(int64);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  803|       |
  804|      0|	case FR_TYPE_SIZE:
  ------------------
  |  Branch (804:2): [True: 0, False: 136]
  ------------------
  805|      0|		RETURN(size);
  ------------------
  |  |  771|      0|#define RETURN(_type) return CMP(a->datum._type, b->datum._type)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  806|       |
  807|      0|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (807:2): [True: 0, False: 136]
  ------------------
  808|      0|		return fr_time_delta_cmp(a->datum.time_delta, b->datum.time_delta);
  809|       |
  810|      0|	case FR_TYPE_FLOAT32:
  ------------------
  |  Branch (810:2): [True: 0, False: 136]
  ------------------
  811|      0|		return float_cmp(a->vb_float32, b->vb_float32);
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
              		return float_cmp(a->vb_float32, b->vb_float32);
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
  812|       |
  813|      0|	case FR_TYPE_FLOAT64:
  ------------------
  |  Branch (813:2): [True: 0, False: 136]
  ------------------
  814|      0|		return float_cmp(a->vb_float64, b->vb_float64);
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
              		return float_cmp(a->vb_float64, b->vb_float64);
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
  815|       |
  816|      0|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (816:2): [True: 0, False: 136]
  ------------------
  817|      0|		COMPARE(ether);
  ------------------
  |  |  772|      0|#define COMPARE(_type) return CMP(memcmp(&a->datum._type, &b->datum._type, sizeof(a->datum._type)), 0)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  818|       |
  819|      0|	case FR_TYPE_COMBO_IP_ADDR:
  ------------------
  |  Branch (819:2): [True: 0, False: 136]
  ------------------
  820|      0|	case FR_TYPE_COMBO_IP_PREFIX:
  ------------------
  |  Branch (820:2): [True: 0, False: 136]
  ------------------
  821|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (821:2): [True: 0, False: 136]
  ------------------
  822|      0|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (822:2): [True: 0, False: 136]
  ------------------
  823|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (823:2): [True: 0, False: 136]
  ------------------
  824|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (824:2): [True: 0, False: 136]
  ------------------
  825|      0|		return fr_ipaddr_cmp(&a->vb_ip, &b->vb_ip);
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		return fr_ipaddr_cmp(&a->vb_ip, &b->vb_ip);
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  826|       |
  827|      0|	case FR_TYPE_IFID:
  ------------------
  |  Branch (827:2): [True: 0, False: 136]
  ------------------
  828|      0|		COMPARE(ifid);
  ------------------
  |  |  772|      0|#define COMPARE(_type) return CMP(memcmp(&a->datum._type, &b->datum._type, sizeof(a->datum._type)), 0)
  |  |  ------------------
  |  |  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  829|       |
  830|      0|	case FR_TYPE_NULL:	/* NULLs are not comparable */
  ------------------
  |  Branch (830:2): [True: 0, False: 136]
  ------------------
  831|      0|		return -2;
  832|       |
  833|      0|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (833:2): [True: 0, False: 136]
  ------------------
  834|       |		/*
  835|       |		 *	@todo - this makes things _distinct_, but doesn't provide a _full_ order.  We
  836|       |		 *	generally don't need a full ordering for attributes.
  837|       |		 *
  838|       |		 *	The need to call fr_dict_attr_cmp() here is for comparing raw / unknown attributes
  839|       |		 *	which come from xlats.  Unknown / raw attributes which are in policies are added to
  840|       |		 *	the dictionaries when the server starts, and are thus known.
  841|       |		 */
  842|      0|		return fr_dict_attr_cmp(a->vb_attr, b->vb_attr);
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
              		return fr_dict_attr_cmp(a->vb_attr, b->vb_attr);
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
  843|       |
  844|      0|	case FR_TYPE_VOID:
  ------------------
  |  Branch (844:2): [True: 0, False: 136]
  ------------------
  845|      0|		return CMP(a->vb_void, b->vb_void);
  ------------------
  |  |  113|      0|#define CMP(_a, _b)			CMP_PREFER_SMALLER(_a, _b)
  |  |  ------------------
  |  |  |  |  105|      0|#define CMP_PREFER_SMALLER(_a,_b)	(((_a) > (_b)) - ((_a) < (_b)))
  |  |  ------------------
  ------------------
  846|       |
  847|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 136]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 136]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 136]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 136]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (847:2): [True: 0, False: 136]
  ------------------
  848|      0|	case FR_TYPE_VALUE_BOX:
  ------------------
  |  Branch (848:2): [True: 0, False: 136]
  ------------------
  849|      0|	case FR_TYPE_VALUE_BOX_CURSOR:
  ------------------
  |  Branch (849:2): [True: 0, False: 136]
  ------------------
  850|      0|	case FR_TYPE_PAIR_CURSOR:
  ------------------
  |  Branch (850:2): [True: 0, False: 136]
  ------------------
  851|      0|	case FR_TYPE_MAX:
  ------------------
  |  Branch (851:2): [True: 0, False: 136]
  ------------------
  852|      0|		break;
  853|       |
  854|       |	/*
  855|       |	 *	Do NOT add a default here, as new types are added
  856|       |	 *	static analysis will warn us they're not handled
  857|       |	 */
  858|    136|	}
  859|       |
  860|      0|	(void)fr_cond_assert(0);	/* invalud type for leaf comparison */
  ------------------
  |  |  131|      0|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|      0|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  861|      0|	return -2;
  862|    136|}
fr_value_box_network_length:
 1410|    678|{
 1411|    678|	switch (value->type) {
 1412|      0|	case FR_TYPE_VARIABLE_SIZE:
  ------------------
  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  201|      0|	_end(FR_TYPE_OCTETS)
  |  |  |  |  ------------------
  |  |  |  |  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1412:2): [True: 0, False: 678]
  ------------------
 1413|      0|		if (value->enumv) {
  ------------------
  |  Branch (1413:7): [True: 0, False: 0]
  ------------------
 1414|       |			/*
 1415|       |			 *	Fixed-width fields.
 1416|       |			 */
 1417|      0|			if (value->enumv->flags.length) {
  ------------------
  |  Branch (1417:8): [True: 0, False: 0]
  ------------------
 1418|      0|				return value->enumv->flags.length;
 1419|      0|			}
 1420|       |
 1421|       |			/*
 1422|       |			 *	Clamp length at maximum we're allowed to encode.
 1423|       |			 */
 1424|      0|			if (da_is_length_field8(value->enumv)) {
  ------------------
  |  |  173|      0|#define da_is_length_field8(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT8))
  |  |  ------------------
  |  |  |  Branch (173:35): [True: 0, False: 0]
  |  |  |  Branch (173:57): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1425|      0|				if (value->vb_length > UINT8_MAX) return UINT8_MAX;
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
  |  Branch (1425:9): [True: 0, False: 0]
  ------------------
 1426|       |
 1427|      0|			} else if (da_is_length_field16(value->enumv)) {
  ------------------
  |  |  174|      0|#define da_is_length_field16(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT16))
  |  |  ------------------
  |  |  |  Branch (174:36): [True: 0, False: 0]
  |  |  |  Branch (174:58): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1428|      0|				if (value->vb_length > UINT16_MAX) return UINT16_MAX;
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
  |  Branch (1428:9): [True: 0, False: 0]
  ------------------
 1429|      0|			}
 1430|      0|		}
 1431|      0|		return value->vb_length;
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
 1432|       |
 1433|       |		/*
 1434|       |		 *	These can have different encodings, depending on the underlying protocol.
 1435|       |		 */
 1436|      2|	case FR_TYPE_DATE:
  ------------------
  |  Branch (1436:2): [True: 2, False: 676]
  ------------------
 1437|      4|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (1437:2): [True: 2, False: 676]
  ------------------
 1438|      4|		if (value->enumv) return value->enumv->flags.length;
  ------------------
  |  Branch (1438:7): [True: 0, False: 4]
  ------------------
 1439|      4|		FALL_THROUGH;
  ------------------
  |  |  341|      4|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      4|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
 1440|       |
 1441|    678|	default:
  ------------------
  |  Branch (1441:2): [True: 674, False: 4]
  ------------------
 1442|    678|		fr_assert(network_min_size(value->type) != 0);
  ------------------
  |  |  194|    678|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|    678|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 678]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1443|    678|		return network_min_size(value->type);
  ------------------
  |  |  105|    678|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  ------------------
 1444|       |
 1445|      0|	case FR_TYPE_TLV:
  ------------------
  |  Branch (1445:2): [True: 0, False: 678]
  ------------------
 1446|      0|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (1446:2): [True: 0, False: 678]
  ------------------
 1447|      0|	case FR_TYPE_VSA:
  ------------------
  |  Branch (1447:2): [True: 0, False: 678]
  ------------------
 1448|      0|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (1448:2): [True: 0, False: 678]
  ------------------
 1449|      0|	case FR_TYPE_INTERNAL:
  ------------------
  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  274|      0|	_beg(FR_TYPE_VALUE_BOX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  275|      0|	_mid(FR_TYPE_VOID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 678]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  276|      0|	_mid(FR_TYPE_VALUE_BOX_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 678]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  277|      0|	_mid(FR_TYPE_PAIR_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 678]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  278|      0|	_end(FR_TYPE_MAX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1449:2): [True: 0, False: 678]
  ------------------
 1450|       |		fr_assert(0);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1451|      0|		return -1;
 1452|    678|	}
 1453|    678|}
fr_value_box_from_network:
 1896|  14.1k|{
 1897|  14.1k|	size_t		min, max;
 1898|  14.1k|	fr_dbuff_t	work_dbuff = FR_DBUFF(dbuff);
  ------------------
  |  |  230|  14.1k|#define FR_DBUFF(_dbuff_or_marker) _FR_DBUFF(_dbuff_or_marker, fr_dbuff_current(_dbuff_or_marker), 0x00)
  |  |  ------------------
  |  |  |  |  208|  14.1k|#define _FR_DBUFF(_dbuff_or_marker, _start, _adv_parent) \
  |  |  |  |  209|  14.1k|((fr_dbuff_t){ \
  |  |  |  |  210|  14.1k|	.buff		= fr_dbuff_buff(_dbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  891|  14.1k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  892|  14.1k|		 fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->buff), \
  |  |  |  |  |  |  893|  14.1k|		 fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->buff), \
  |  |  |  |  |  |  894|  14.1k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->buff), \
  |  |  |  |  |  |  895|  14.1k|		 fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->buff) \
  |  |  |  |  |  |  896|  14.1k|	)
  |  |  |  |  ------------------
  |  |  |  |  211|  14.1k|	.start		= (_start), \
  |  |  |  |  212|  14.1k|	.end		= fr_dbuff_end(_dbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  947|  14.1k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  948|  14.1k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->end), \
  |  |  |  |  |  |  949|  14.1k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->end), \
  |  |  |  |  |  |  950|  14.1k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->end), \
  |  |  |  |  |  |  951|  14.1k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->end) \
  |  |  |  |  |  |  952|  14.1k|	))
  |  |  |  |  ------------------
  |  |  |  |  213|  14.1k|	.p		= fr_dbuff_current(_dbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  920|  14.1k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  921|  14.1k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  922|  14.1k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  923|  14.1k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  924|  14.1k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  925|  14.1k|	))
  |  |  |  |  ------------------
  |  |  |  |  214|  14.1k|	.is_const 	= fr_dbuff_ptr(_dbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  867|  14.1k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  868|  14.1k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  869|  14.1k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  870|  14.1k|	)
  |  |  |  |  ------------------
  |  |  |  |  215|  14.1k|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  216|  14.1k|	.shifted	= fr_dbuff_ptr(_dbuff_or_marker)->shifted, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  867|  14.1k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  868|  14.1k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  869|  14.1k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  870|  14.1k|	)
  |  |  |  |  ------------------
  |  |  |  |  217|  14.1k|	.extend		= fr_dbuff_ptr(_dbuff_or_marker)->extend, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  867|  14.1k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  868|  14.1k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  869|  14.1k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  870|  14.1k|	)
  |  |  |  |  ------------------
  |  |  |  |  218|  14.1k|	.uctx		= fr_dbuff_ptr(_dbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  867|  14.1k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  868|  14.1k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  869|  14.1k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  870|  14.1k|	)
  |  |  |  |  ------------------
  |  |  |  |  219|  14.1k|	.parent 	= fr_dbuff_ptr(_dbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  867|  14.1k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  868|  14.1k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  869|  14.1k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  870|  14.1k|	)
  |  |  |  |  ------------------
  |  |  |  |  220|  14.1k|})
  |  |  ------------------
  ------------------
 1899|       |
 1900|  14.1k|	min = network_min_size(type);
  ------------------
  |  |  105|  14.1k|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  ------------------
 1901|  14.1k|	max = network_max_size(type);
  ------------------
  |  |  106|  14.1k|#define network_max_size(_x) (fr_value_box_network_sizes[_x][1])
  ------------------
 1902|       |
 1903|  14.1k|	fr_assert(max > 0);
  ------------------
  |  |  194|  14.1k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  14.1k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 14.1k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1904|       |
 1905|  14.1k|	if (len < min) {
  ------------------
  |  Branch (1905:6): [True: 545, False: 13.6k]
  ------------------
 1906|    545|		fr_strerror_printf("Got truncated value parsing type \"%s\". "
  ------------------
  |  |   65|    545|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1907|    545|				   "Expected length >= %zu bytes, got %zu bytes",
 1908|    545|				   fr_type_to_str(type),
 1909|    545|				   min, len);
 1910|    545|		return -(min);
 1911|    545|	}
 1912|       |
 1913|       |	/*
 1914|       |	 *	For array entries, we only decode one value at a time.
 1915|       |	 */
 1916|  13.6k|	if (len > max) {
  ------------------
  |  Branch (1916:6): [True: 1.21k, False: 12.4k]
  ------------------
 1917|  1.21k|		if (enumv && !enumv->flags.array) {
  ------------------
  |  Branch (1917:7): [True: 1.21k, False: 0]
  |  Branch (1917:16): [True: 47, False: 1.16k]
  ------------------
 1918|     47|			fr_strerror_printf("Found trailing garbage parsing type \"%s\". "
  ------------------
  |  |   65|     47|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 1919|     47|					   "Expected length <= %zu bytes, got %zu bytes",
 1920|     47|					   fr_type_to_str(type),
 1921|     47|				   max, len);
 1922|     47|			return -(max);
 1923|     47|		}
 1924|       |
 1925|  1.16k|		len = max;
 1926|  1.16k|	}
 1927|       |
 1928|       |	/*
 1929|       |	 *	String / octets are special.
 1930|       |	 */
 1931|  13.6k|	if (fr_type_is_variable_size(type)) {
  ------------------
  |  |  388|  13.6k|#define fr_type_is_variable_size(_x)		(fr_type_variable_size[_x])
  |  |  ------------------
  |  |  |  Branch (388:39): [True: 2.50k, False: 11.0k]
  |  |  ------------------
  ------------------
 1932|  2.50k|		size_t newlen = len;
 1933|  2.50k|		size_t offset = 0;
 1934|       |
 1935|       |		/*
 1936|       |		 *	Decode fixed-width fields.
 1937|       |		 */
 1938|  2.50k|		if (enumv) {
  ------------------
  |  Branch (1938:7): [True: 2.50k, False: 0]
  ------------------
 1939|  2.50k|			if (enumv->flags.length) {
  ------------------
  |  Branch (1939:8): [True: 185, False: 2.32k]
  ------------------
 1940|    185|				newlen = enumv->flags.length;
 1941|       |
 1942|  2.32k|			} else if (da_is_length_field8(enumv)) {
  ------------------
  |  |  173|  2.32k|#define da_is_length_field8(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT8))
  |  |  ------------------
  |  |  |  Branch (173:35): [True: 1.24k, False: 1.07k]
  |  |  |  Branch (173:57): [True: 1.24k, False: 0]
  |  |  ------------------
  ------------------
 1943|  1.24k|				uint8_t num = 0;
 1944|       |
 1945|  1.24k|				FR_DBUFF_OUT_RETURN(&num, &work_dbuff);
  ------------------
  |  | 1827|  1.24k|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|  1.24k|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|  1.24k|do { \
  |  |  |  |  186|  1.24k|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|  1.24k|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|  1.24k|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|  1.24k|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|  1.24k|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|  1.24k|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|  1.24k|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|  1.24k|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|  1.24k|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|  1.24k|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|  1.24k|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|  1.24k|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|  1.24k|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.24k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.24k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.24k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.24k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.24k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.24k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.24k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.24k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|  1.24k|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|  1.24k|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 1.24k]
  |  |  |  |  ------------------
  |  |  |  |  188|  1.24k|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 1.24k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1946|  1.24k|				newlen = num;
 1947|  1.24k|				offset = 1;
 1948|       |
 1949|  1.24k|			} else if (da_is_length_field16(enumv)) {
  ------------------
  |  |  174|  1.07k|#define da_is_length_field16(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT16))
  |  |  ------------------
  |  |  |  Branch (174:36): [True: 0, False: 1.07k]
  |  |  |  Branch (174:58): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1950|      0|				uint16_t num = 0;
 1951|       |
 1952|      0|				FR_DBUFF_OUT_RETURN(&num, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1953|      0|				newlen = num;
 1954|      0|				offset = 2;
 1955|      0|			}
 1956|  2.50k|		}
 1957|       |
 1958|       |		/*
 1959|       |		 *	If we need more data than exists, that's an error.
 1960|       |		 *
 1961|       |		 *	Otherwise, bound the decoding to the count we found.
 1962|       |		 */
 1963|  2.50k|		if (newlen > len) return -(newlen + offset);
  ------------------
  |  Branch (1963:7): [True: 193, False: 2.31k]
  ------------------
 1964|  2.31k|		len = newlen;
 1965|       |
 1966|  2.31k|		switch (type) {
 1967|  1.19k|		case FR_TYPE_STRING:
  ------------------
  |  Branch (1967:3): [True: 1.19k, False: 1.12k]
  ------------------
 1968|  1.19k|			if (fr_value_box_bstrndup_dbuff(ctx, dst, enumv, &work_dbuff, len, tainted) < 0) {
  ------------------
  |  Branch (1968:8): [True: 136, False: 1.05k]
  ------------------
 1969|    136|				return FR_VALUE_BOX_NET_OOM;
  ------------------
  |  | 1051|    136|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  ------------------
  |  |  |  | 1047|    136|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|    136|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1970|    136|			}
 1971|  1.05k|			return fr_dbuff_set(dbuff, &work_dbuff);
  ------------------
  |  | 1012|  1.05k|#define fr_dbuff_set(_dst, _src) \
  |  | 1013|  1.05k|_fr_dbuff_set(\
  |  | 1014|  1.05k|	_fr_dbuff_current_ptr(_dst), fr_dbuff_ptr(_dst), \
  |  |  ------------------
  |  |  |  |  935|  1.05k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.05k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.05k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.05k|	))
  |  |  ------------------
  |  |               	_fr_dbuff_current_ptr(_dst), fr_dbuff_ptr(_dst), \
  |  |  ------------------
  |  |  |  |  867|  1.05k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.05k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.05k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.05k|	)
  |  |  ------------------
  |  | 1015|  1.05k|	_Generic((_src), \
  |  | 1016|  1.05k|		fr_dbuff_t *			: fr_dbuff_current((fr_dbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  920|  1.05k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  921|  1.05k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  922|  1.05k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  923|  1.05k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  924|  1.05k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p) \
  |  |  |  |  925|  1.05k|	))
  |  |  ------------------
  |  | 1017|  1.05k|		fr_dbuff_marker_t *		: fr_dbuff_current((fr_dbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  920|  1.05k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  921|  1.05k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  922|  1.05k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  923|  1.05k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  924|  1.05k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p) \
  |  |  |  |  925|  1.05k|	))
  |  |  ------------------
  |  | 1018|  1.05k|		uint8_t const *			: (uint8_t const *)(_src), \
  |  | 1019|  1.05k|		uint8_t *			: (uint8_t const *)(_src), \
  |  | 1020|  1.05k|		size_t				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)), \
  |  |  ------------------
  |  |  |  |  907|  1.05k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  1.05k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  1.05k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  1.05k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  1.05k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  1.05k|	))
  |  |  ------------------
  |  | 1021|  1.05k|		long				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)), \
  |  |  ------------------
  |  |  |  |  907|  1.05k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  1.05k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  1.05k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  1.05k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  1.05k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  1.05k|	))
  |  |  ------------------
  |  | 1022|  1.05k|		int				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  907|  1.05k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  1.05k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  1.05k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  1.05k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  1.05k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  1.05k|	))
  |  |  ------------------
  |  | 1023|  1.05k|	) \
  |  | 1024|  1.05k|)
  ------------------
 1972|       |
 1973|  1.12k|		case FR_TYPE_OCTETS:
  ------------------
  |  Branch (1973:3): [True: 1.12k, False: 1.19k]
  ------------------
 1974|  1.12k|			if (fr_value_box_memdup_dbuff(ctx, dst, enumv, &work_dbuff, len, tainted) < 0) {
  ------------------
  |  Branch (1974:8): [True: 0, False: 1.12k]
  ------------------
 1975|      0|				return FR_VALUE_BOX_NET_OOM;
  ------------------
  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  ------------------
  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1976|      0|			}
 1977|  1.12k|			return fr_dbuff_set(dbuff, &work_dbuff);
  ------------------
  |  | 1012|  1.12k|#define fr_dbuff_set(_dst, _src) \
  |  | 1013|  1.12k|_fr_dbuff_set(\
  |  | 1014|  1.12k|	_fr_dbuff_current_ptr(_dst), fr_dbuff_ptr(_dst), \
  |  |  ------------------
  |  |  |  |  935|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.12k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.12k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.12k|	))
  |  |  ------------------
  |  |               	_fr_dbuff_current_ptr(_dst), fr_dbuff_ptr(_dst), \
  |  |  ------------------
  |  |  |  |  867|  1.12k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.12k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.12k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.12k|	)
  |  |  ------------------
  |  | 1015|  1.12k|	_Generic((_src), \
  |  | 1016|  1.12k|		fr_dbuff_t *			: fr_dbuff_current((fr_dbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  920|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  921|  1.12k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  922|  1.12k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  923|  1.12k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  924|  1.12k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p) \
  |  |  |  |  925|  1.12k|	))
  |  |  ------------------
  |  | 1017|  1.12k|		fr_dbuff_marker_t *		: fr_dbuff_current((fr_dbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  920|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  921|  1.12k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  922|  1.12k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  923|  1.12k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  924|  1.12k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p) \
  |  |  |  |  925|  1.12k|	))
  |  |  ------------------
  |  | 1018|  1.12k|		uint8_t const *			: (uint8_t const *)(_src), \
  |  | 1019|  1.12k|		uint8_t *			: (uint8_t const *)(_src), \
  |  | 1020|  1.12k|		size_t				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)), \
  |  |  ------------------
  |  |  |  |  907|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  1.12k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  1.12k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  1.12k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  1.12k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  1.12k|	))
  |  |  ------------------
  |  | 1021|  1.12k|		long				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)), \
  |  |  ------------------
  |  |  |  |  907|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  1.12k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  1.12k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  1.12k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  1.12k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  1.12k|	))
  |  |  ------------------
  |  | 1022|  1.12k|		int				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  907|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  1.12k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  1.12k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  1.12k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  1.12k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  1.12k|	))
  |  |  ------------------
  |  | 1023|  1.12k|	) \
  |  | 1024|  1.12k|)
  ------------------
 1978|       |
 1979|      0|		default:
  ------------------
  |  Branch (1979:3): [True: 0, False: 2.31k]
  ------------------
 1980|      0|			return -1;
 1981|  2.31k|		}
 1982|  2.31k|	}
 1983|       |
 1984|       |	/*
 1985|       |	 *	Pre-Initialise box for non-variable types
 1986|       |	 */
 1987|  11.0k|	fr_value_box_init(dst, type, enumv, tainted);
  ------------------
  |  |  610|  11.0k|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|  11.0k|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 1988|  11.0k|	switch (type) {
  ------------------
  |  Branch (1988:10): [True: 11.0k, False: 0]
  ------------------
 1989|       |	/*
 1990|       |	 *	Already in network byte order
 1991|       |	 */
 1992|  2.16k|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (1992:2): [True: 2.16k, False: 8.93k]
  ------------------
 1993|  2.16k|	ipv4addr:
 1994|  2.16k|		dst->vb_ip = (fr_ipaddr_t){
  ------------------
  |  |  264|  2.16k|#define vb_ip					datum.ip
  ------------------
 1995|  2.16k|			.af = AF_INET,
 1996|  2.16k|			.prefix = 32,
 1997|  2.16k|		};
 1998|  2.16k|		FR_DBUFF_OUT_MEMCPY_RETURN((uint8_t *)&dst->vb_ip.addr.v4, &work_dbuff, len);
  ------------------
  |  | 1761|  2.16k|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  ------------------
  |  |  |  |  184|  2.16k|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|  2.16k|do { \
  |  |  |  |  186|  2.16k|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1761|  2.16k|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1742|  2.16k|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1743|  2.16k|		 uint8_t *		: _fr_dbuff_out_memcpy((uint8_t *)(_out), \
  |  |  |  |  |  |  |  | 1744|  2.16k|		 					       _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  2.16k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  2.16k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  2.16k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  2.16k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1745|  2.16k|		 					       fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  2.16k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  2.16k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  2.16k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  2.16k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1746|  2.16k|		 					       _outlen), \
  |  |  |  |  |  |  |  | 1747|  2.16k|		 fr_dbuff_t *		: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  2.16k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  2.16k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  2.16k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  2.16k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1748|  2.16k|		 						     fr_dbuff_ptr((fr_dbuff_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  2.16k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  2.16k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  2.16k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  2.16k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1749|  2.16k|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  2.16k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  2.16k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  2.16k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  2.16k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1750|  2.16k|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  2.16k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  2.16k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  2.16k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  2.16k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1751|  2.16k|		 fr_dbuff_marker_t *	: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_marker_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  2.16k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  2.16k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  2.16k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  2.16k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1752|  2.16k|		 						     fr_dbuff_ptr((fr_dbuff_marker_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  2.16k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  2.16k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  2.16k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  2.16k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1753|  2.16k|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  2.16k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  2.16k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  2.16k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  2.16k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1754|  2.16k|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  2.16k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  2.16k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  2.16k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  2.16k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1755|  2.16k|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|  2.16k|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 2.16k]
  |  |  |  |  ------------------
  |  |  |  |  188|  2.16k|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 2.16k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1999|  2.16k|		break;
 2000|       |
 2001|  2.16k|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (2001:2): [True: 0, False: 11.0k]
  ------------------
 2002|      0|	ipv4prefix:
 2003|      0|		dst->vb_ip = (fr_ipaddr_t){
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 2004|      0|			.af = AF_INET,
 2005|      0|		};
 2006|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_ip.prefix, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2007|      0|		FR_DBUFF_OUT_MEMCPY_RETURN((uint8_t *)&dst->vb_ip.addr.v4, &work_dbuff, len - 1);
  ------------------
  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1742|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1743|      0|		 uint8_t *		: _fr_dbuff_out_memcpy((uint8_t *)(_out), \
  |  |  |  |  |  |  |  | 1744|      0|		 					       _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1745|      0|		 					       fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1746|      0|		 					       _outlen), \
  |  |  |  |  |  |  |  | 1747|      0|		 fr_dbuff_t *		: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1748|      0|		 						     fr_dbuff_ptr((fr_dbuff_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1749|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1750|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1751|      0|		 fr_dbuff_marker_t *	: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_marker_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1752|      0|		 						     fr_dbuff_ptr((fr_dbuff_marker_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1753|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1754|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1755|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2008|      0|		break;
 2009|       |
 2010|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (2010:2): [True: 0, False: 11.0k]
  ------------------
 2011|      0|	ipv6addr:
 2012|      0|		dst->vb_ip = (fr_ipaddr_t){
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 2013|      0|			.af = AF_INET6,
 2014|      0|			.scope_id = 0,
 2015|      0|			.prefix = 128
 2016|      0|		};
 2017|      0|		if (len == max) {
  ------------------
  |  Branch (2017:7): [True: 0, False: 0]
  ------------------
 2018|      0|			uint8_t	scope_id = 0;
 2019|       |
 2020|      0|			FR_DBUFF_OUT_RETURN(&scope_id, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2021|      0|			dst->vb_ip.scope_id = scope_id;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 2022|      0|			len--;
 2023|      0|		}
 2024|      0|		FR_DBUFF_OUT_MEMCPY_RETURN((uint8_t *)&dst->vb_ip.addr.v6, &work_dbuff, len);
  ------------------
  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1742|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1743|      0|		 uint8_t *		: _fr_dbuff_out_memcpy((uint8_t *)(_out), \
  |  |  |  |  |  |  |  | 1744|      0|		 					       _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1745|      0|		 					       fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1746|      0|		 					       _outlen), \
  |  |  |  |  |  |  |  | 1747|      0|		 fr_dbuff_t *		: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1748|      0|		 						     fr_dbuff_ptr((fr_dbuff_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1749|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1750|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1751|      0|		 fr_dbuff_marker_t *	: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_marker_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1752|      0|		 						     fr_dbuff_ptr((fr_dbuff_marker_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1753|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1754|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1755|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2025|      0|		break;
 2026|       |
 2027|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (2027:2): [True: 0, False: 11.0k]
  ------------------
 2028|      0|	ipv6prefix:
 2029|      0|		dst->vb_ip = (fr_ipaddr_t){
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 2030|      0|			.af = AF_INET6,
 2031|      0|			.scope_id = 0,
 2032|      0|		};
 2033|      0|		if (len == max) {
  ------------------
  |  Branch (2033:7): [True: 0, False: 0]
  ------------------
 2034|      0|			uint8_t	scope_id = 0;
 2035|       |
 2036|      0|			FR_DBUFF_OUT_RETURN(&scope_id, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2037|      0|			dst->vb_ip.scope_id = scope_id;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 2038|      0|			len--;
 2039|      0|		}
 2040|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_ip.prefix, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|      0|		FR_DBUFF_OUT_MEMCPY_RETURN((uint8_t *)&dst->vb_ip.addr.v6, &work_dbuff, len - 1);
  ------------------
  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1742|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1743|      0|		 uint8_t *		: _fr_dbuff_out_memcpy((uint8_t *)(_out), \
  |  |  |  |  |  |  |  | 1744|      0|		 					       _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1745|      0|		 					       fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1746|      0|		 					       _outlen), \
  |  |  |  |  |  |  |  | 1747|      0|		 fr_dbuff_t *		: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1748|      0|		 						     fr_dbuff_ptr((fr_dbuff_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1749|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1750|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1751|      0|		 fr_dbuff_marker_t *	: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_marker_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1752|      0|		 						     fr_dbuff_ptr((fr_dbuff_marker_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1753|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1754|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1755|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2042|      0|		break;
 2043|       |
 2044|      0|	case FR_TYPE_COMBO_IP_ADDR:
  ------------------
  |  Branch (2044:2): [True: 0, False: 11.0k]
  ------------------
 2045|      0|		if ((len >= network_min_size(FR_TYPE_IPV6_ADDR)) &&
  ------------------
  |  |  105|      0|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  ------------------
  |  Branch (2045:7): [True: 0, False: 0]
  ------------------
 2046|      0|		    (len <= network_max_size(FR_TYPE_IPV6_ADDR))) goto ipv6addr;	/* scope is optional */
  ------------------
  |  |  106|      0|#define network_max_size(_x) (fr_value_box_network_sizes[_x][1])
  ------------------
  |  Branch (2046:7): [True: 0, False: 0]
  ------------------
 2047|      0|		else if ((len >= network_min_size(FR_TYPE_IPV4_ADDR)) &&
  ------------------
  |  |  105|      0|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  ------------------
  |  Branch (2047:12): [True: 0, False: 0]
  ------------------
 2048|      0|		    	 (len <= network_max_size(FR_TYPE_IPV4_ADDR))) goto ipv4addr;
  ------------------
  |  |  106|      0|#define network_max_size(_x) (fr_value_box_network_sizes[_x][1])
  ------------------
  |  Branch (2048:9): [True: 0, False: 0]
  ------------------
 2049|       |
 2050|      0|		fr_strerror_const("Invalid combo ip address value");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2051|      0|		return -1;
 2052|       |
 2053|      0|	case FR_TYPE_COMBO_IP_PREFIX:
  ------------------
  |  Branch (2053:2): [True: 0, False: 11.0k]
  ------------------
 2054|      0|		if ((len >= network_min_size(FR_TYPE_IPV6_PREFIX)) &&
  ------------------
  |  |  105|      0|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  ------------------
  |  Branch (2054:7): [True: 0, False: 0]
  ------------------
 2055|      0|		    (len <= network_max_size(FR_TYPE_IPV6_PREFIX))) goto ipv6prefix;	/* scope is optional */
  ------------------
  |  |  106|      0|#define network_max_size(_x) (fr_value_box_network_sizes[_x][1])
  ------------------
  |  Branch (2055:7): [True: 0, False: 0]
  ------------------
 2056|      0|		else if ((len >= network_min_size(FR_TYPE_IPV4_PREFIX)) &&
  ------------------
  |  |  105|      0|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  ------------------
  |  Branch (2056:12): [True: 0, False: 0]
  ------------------
 2057|      0|		    	 (len <= network_max_size(FR_TYPE_IPV4_PREFIX))) goto ipv4prefix;
  ------------------
  |  |  106|      0|#define network_max_size(_x) (fr_value_box_network_sizes[_x][1])
  ------------------
  |  Branch (2057:9): [True: 0, False: 0]
  ------------------
 2058|       |
 2059|      0|		fr_strerror_const("Invalid combo ip prefix value");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2060|      0|		return -1;
 2061|       |
 2062|      0|	case FR_TYPE_BOOL:
  ------------------
  |  Branch (2062:2): [True: 0, False: 11.0k]
  ------------------
 2063|      0|		{
 2064|      0|			uint8_t	val = 0;
 2065|       |
 2066|      0|			FR_DBUFF_OUT_RETURN(&val, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2067|      0|			dst->datum.boolean = (val != 0);
 2068|      0|		}
 2069|      0|		break;
 2070|       |
 2071|      0|	case FR_TYPE_IFID:
  ------------------
  |  Branch (2071:2): [True: 0, False: 11.0k]
  ------------------
 2072|      0|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (2072:2): [True: 0, False: 11.0k]
  ------------------
 2073|      0|		FR_DBUFF_OUT_MEMCPY_RETURN(fr_value_box_raw(dst, type), &work_dbuff, len);
  ------------------
  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1761|      0|#define FR_DBUFF_OUT_MEMCPY_RETURN(_out, _dbuff_or_marker, _outlen) FR_DBUFF_RETURN(fr_dbuff_out_memcpy, _out, _dbuff_or_marker, _outlen)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1742|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1743|      0|		 uint8_t *		: _fr_dbuff_out_memcpy((uint8_t *)(_out), \
  |  |  |  |  |  |  |  | 1744|      0|		 					       _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1745|      0|		 					       fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1746|      0|		 					       _outlen), \
  |  |  |  |  |  |  |  | 1747|      0|		 fr_dbuff_t *		: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1748|      0|		 						     fr_dbuff_ptr((fr_dbuff_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1749|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1750|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1751|      0|		 fr_dbuff_marker_t *	: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_marker_t *)_out), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1752|      0|		 						     fr_dbuff_ptr((fr_dbuff_marker_t *)(_out)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1753|      0|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1754|      0|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1755|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2074|      0|		break;
 2075|       |
 2076|  1.83k|	case FR_TYPE_UINT8:
  ------------------
  |  Branch (2076:2): [True: 1.83k, False: 9.26k]
  ------------------
 2077|  1.83k|		FR_DBUFF_OUT_RETURN(&dst->vb_uint8, &work_dbuff);
  ------------------
  |  | 1827|  1.83k|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|  1.83k|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|  1.83k|do { \
  |  |  |  |  186|  1.83k|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|  1.83k|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|  1.83k|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|  1.83k|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|  1.83k|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|  1.83k|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|  1.83k|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|  1.83k|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|  1.83k|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|  1.83k|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|  1.83k|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|  1.83k|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|  1.83k|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  1.83k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  1.83k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  1.83k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  1.83k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  1.83k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  1.83k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  1.83k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  1.83k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|  1.83k|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|  1.83k|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 1.83k]
  |  |  |  |  ------------------
  |  |  |  |  188|  1.83k|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 1.83k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2078|  1.83k|		break;
 2079|       |
 2080|  1.83k|	case FR_TYPE_UINT16:
  ------------------
  |  Branch (2080:2): [True: 473, False: 10.6k]
  ------------------
 2081|    473|		FR_DBUFF_OUT_RETURN(&dst->vb_uint16, &work_dbuff);
  ------------------
  |  | 1827|    473|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|    473|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|    473|do { \
  |  |  |  |  186|    473|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|    473|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|    473|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|    473|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|    473|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|    473|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|    473|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|    473|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|    473|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|    473|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|    473|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|    473|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|    473|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    473|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    473|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    473|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    473|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    473|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    473|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    473|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    473|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|    473|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|    473|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 473]
  |  |  |  |  ------------------
  |  |  |  |  188|    473|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 473]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2082|    473|		break;
 2083|       |
 2084|    473|	case FR_TYPE_UINT32:
  ------------------
  |  Branch (2084:2): [True: 260, False: 10.8k]
  ------------------
 2085|    260|		FR_DBUFF_OUT_RETURN(&dst->vb_uint32, &work_dbuff);
  ------------------
  |  | 1827|    260|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|    260|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|    260|do { \
  |  |  |  |  186|    260|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|    260|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|    260|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|    260|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|    260|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|    260|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|    260|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|    260|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|    260|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|    260|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|    260|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|    260|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|    260|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    260|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    260|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    260|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    260|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    260|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    260|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    260|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    260|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|    260|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|    260|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 260]
  |  |  |  |  ------------------
  |  |  |  |  188|    260|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 260]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2086|    260|		break;
 2087|       |
 2088|    260|	case FR_TYPE_UINT64:
  ------------------
  |  Branch (2088:2): [True: 110, False: 10.9k]
  ------------------
 2089|    110|		FR_DBUFF_OUT_RETURN(&dst->vb_uint64, &work_dbuff);
  ------------------
  |  | 1827|    110|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|    110|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|    110|do { \
  |  |  |  |  186|    110|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|    110|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|    110|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|    110|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|    110|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|    110|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|    110|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|    110|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|    110|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|    110|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|    110|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|    110|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|    110|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|    110|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|    110|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|    110|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|    110|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|    110|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|    110|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|    110|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|    110|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|    110|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|    110|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 110]
  |  |  |  |  ------------------
  |  |  |  |  188|    110|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 110]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2090|    110|		break;
 2091|       |
 2092|    110|	case FR_TYPE_INT8:
  ------------------
  |  Branch (2092:2): [True: 0, False: 11.0k]
  ------------------
 2093|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_int8, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2094|      0|		break;
 2095|       |
 2096|      0|	case FR_TYPE_INT16:
  ------------------
  |  Branch (2096:2): [True: 0, False: 11.0k]
  ------------------
 2097|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_int16, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2098|      0|		break;
 2099|       |
 2100|      0|	case FR_TYPE_INT32:
  ------------------
  |  Branch (2100:2): [True: 0, False: 11.0k]
  ------------------
 2101|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_int32, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2102|      0|		break;
 2103|       |
 2104|      0|	case FR_TYPE_INT64:
  ------------------
  |  Branch (2104:2): [True: 0, False: 11.0k]
  ------------------
 2105|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_int64, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2106|      0|		break;
 2107|       |
 2108|      0|	case FR_TYPE_FLOAT32:
  ------------------
  |  Branch (2108:2): [True: 0, False: 11.0k]
  ------------------
 2109|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_float32, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2110|      0|		break;
 2111|       |
 2112|      0|	case FR_TYPE_FLOAT64:
  ------------------
  |  Branch (2112:2): [True: 0, False: 11.0k]
  ------------------
 2113|      0|		FR_DBUFF_OUT_RETURN(&dst->vb_float64, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2114|      0|		break;
 2115|       |
 2116|  6.22k|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (2116:2): [True: 6.22k, False: 4.87k]
  ------------------
 2117|  6.22k|		if (!enumv) {
  ------------------
  |  Branch (2117:7): [True: 0, False: 6.22k]
  ------------------
 2118|      0|			fr_strerror_const("No enumv (i.e. root) passed to fr_value_box_from_network for type 'attribute'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2119|      0|			return -1;
 2120|      0|		}
 2121|       |
 2122|       |		/*
 2123|       |		 *	Decode the number, and see if we can create a
 2124|       |		 *	matching attribute.
 2125|       |		 */
 2126|  6.22k|		{
 2127|  6.22k|			unsigned int num;
 2128|  6.22k|			uint8_t num8;
 2129|  6.22k|			uint16_t num16;
 2130|  6.22k|			uint32_t num32;
 2131|       |
 2132|  6.22k|			switch (enumv->flags.length) {
 2133|  6.22k|			case 1:
  ------------------
  |  Branch (2133:4): [True: 6.22k, False: 0]
  ------------------
 2134|  6.22k|				FR_DBUFF_OUT_RETURN(&num8, &work_dbuff);
  ------------------
  |  | 1827|  6.22k|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|  6.22k|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|  6.22k|do { \
  |  |  |  |  186|  6.22k|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|  6.22k|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|  6.22k|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|  6.22k|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|  6.22k|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|  6.22k|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|  6.22k|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|  6.22k|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|  6.22k|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|  6.22k|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|  6.22k|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|  6.22k|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|  6.22k|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|  6.22k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|  6.22k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|  6.22k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|  6.22k|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|  6.22k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|  6.22k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|  6.22k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|  6.22k|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|  6.22k|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|  6.22k|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 6.22k]
  |  |  |  |  ------------------
  |  |  |  |  188|  6.22k|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 6.22k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2135|  6.22k|				num = num8;
 2136|  6.22k|				break;
 2137|       |
 2138|      0|			case 2:
  ------------------
  |  Branch (2138:4): [True: 0, False: 6.22k]
  ------------------
 2139|      0|				FR_DBUFF_OUT_RETURN(&num16, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2140|      0|				num = num16;
 2141|      0|				break;
 2142|       |
 2143|      0|			case 4:
  ------------------
  |  Branch (2143:4): [True: 0, False: 6.22k]
  ------------------
 2144|      0|				FR_DBUFF_OUT_RETURN(&num32, &work_dbuff);
  ------------------
  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1827|      0|#define FR_DBUFF_OUT_RETURN(_out, _dbuff_or_marker) FR_DBUFF_RETURN(fr_dbuff_out, _out, _dbuff_or_marker)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1809|      0|	_Generic((_out), \
  |  |  |  |  |  |  |  | 1810|      0|		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint8_t *	: _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1811|      0|		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint16_t *	: _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1812|      0|		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint32_t *	: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1813|      0|		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		uint64_t *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1814|      0|		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int8_t *	: _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1815|      0|		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int16_t *	: _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1816|      0|		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int32_t *	: _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1817|      0|		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		int64_t *	: _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1818|      0|		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		float *		: _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1819|      0|		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               		double *	: _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1820|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2145|      0|				num = num32;
 2146|      0|				break;
 2147|       |
 2148|      0|			default:
  ------------------
  |  Branch (2148:4): [True: 0, False: 6.22k]
  ------------------
 2149|      0|				fr_strerror_const("Unsupported parent length");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2150|      0|				return -1;
 2151|  6.22k|			}
 2152|       |
 2153|  6.22k|			dst->vb_attr = fr_dict_attr_child_by_num(enumv, num);
  ------------------
  |  |  262|  6.22k|#define vb_attr					datum.da
  ------------------
 2154|  6.22k|			if (!dst->vb_attr) {
  ------------------
  |  |  262|  6.22k|#define vb_attr					datum.da
  ------------------
  |  Branch (2154:8): [True: 2.06k, False: 4.15k]
  ------------------
 2155|  2.06k|				dst->vb_attr = fr_dict_attr_unknown_raw_afrom_num(ctx, enumv, num);
  ------------------
  |  |  262|  2.06k|#define vb_attr					datum.da
  ------------------
 2156|  2.06k|				if (!dst->vb_attr) return -1;
  ------------------
  |  |  262|  2.06k|#define vb_attr					datum.da
  ------------------
  |  Branch (2156:9): [True: 0, False: 2.06k]
  ------------------
 2157|  2.06k|			}
 2158|       |
 2159|  6.22k|			break;
 2160|  6.22k|		}
 2161|       |
 2162|       |	/*
 2163|       |	 *	Dates and deltas are stored internally as
 2164|       |	 *	64-bit nanoseconds.  We have to convert from
 2165|       |	 *	the network format.  First by size
 2166|       |	 *	(16/32/64-bit), and then by resolution (ns,
 2167|       |	 *	us, ms, s).
 2168|       |	 */
 2169|  6.22k|	case FR_TYPE_DATE:
  ------------------
  |  Branch (2169:2): [True: 36, False: 11.0k]
  ------------------
 2170|     36|	{
 2171|     36|		size_t length = 4;
 2172|     36|		fr_time_res_t precision = FR_TIME_RES_SEC;
 2173|     36|		uint64_t date;
 2174|       |
 2175|     36|		if (enumv) {
  ------------------
  |  Branch (2175:7): [True: 36, False: 0]
  ------------------
 2176|     36|			length = enumv->flags.length;
 2177|     36|			precision = (fr_time_res_t)enumv->flags.flag_time_res;
  ------------------
  |  |  156|     36|#define flag_time_res type_size
  ------------------
 2178|     36|		}
 2179|       |
 2180|       |		/*
 2181|       |		 *	Input data doesn't match what we were told we
 2182|       |		 *	need.
 2183|       |		 */
 2184|     36|		if (len > length) return -(length);
  ------------------
  |  Branch (2184:7): [True: 36, False: 0]
  ------------------
 2185|       |
 2186|      0|		dst->enumv = enumv;
 2187|       |
 2188|      0|		FR_DBUFF_OUT_UINT64V_RETURN(&date, &work_dbuff, length);
  ------------------
  |  | 1867|      0|#define FR_DBUFF_OUT_UINT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_uint64v, _num, _dbuff_or_marker, _len)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1867|      0|#define FR_DBUFF_OUT_UINT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_uint64v, _num, _dbuff_or_marker, _len)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1861|      0|	_fr_dbuff_out_uint64v(_num, _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), _len)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               	_fr_dbuff_out_uint64v(_num, _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), _len)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2189|       |
 2190|      0|		if (!fr_multiply(&date, date, fr_time_multiplier_by_res[precision])) {
  ------------------
  |  |  176|      0|#define fr_multiply(_out, _a, _b) !__builtin_mul_overflow(_a, _b, _out)
  ------------------
  |  Branch (2190:7): [True: 0, False: 0]
  ------------------
 2191|      0|			fr_strerror_const("date would overflow");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 2192|      0|			return -1;
 2193|      0|		}
 2194|       |
 2195|      0|		dst->vb_date = fr_unix_time_wrap(date);
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
              		dst->vb_date = fr_unix_time_wrap(date);
  ------------------
  |  |  160|      0|#define fr_unix_time_wrap(_time) (fr_unix_time_t){ .value = (_time) }
  ------------------
 2196|      0|	}
 2197|      0|		break;
 2198|       |
 2199|      0|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (2199:2): [True: 0, False: 11.0k]
  ------------------
 2200|      0|	{
 2201|      0|		size_t length = 4;
 2202|      0|		fr_time_res_t precision = FR_TIME_RES_SEC;
 2203|      0|		int64_t date;
 2204|       |
 2205|      0|		if (enumv) {
  ------------------
  |  Branch (2205:7): [True: 0, False: 0]
  ------------------
 2206|      0|			length = enumv->flags.length;
 2207|      0|			precision = (fr_time_res_t)enumv->flags.flag_time_res;
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
 2208|      0|		}
 2209|       |
 2210|       |		/*
 2211|       |		 *	Input data doesn't match what we were told we
 2212|       |		 *	need.
 2213|       |		 */
 2214|      0|		if (len > length) return -(length);
  ------------------
  |  Branch (2214:7): [True: 0, False: 0]
  ------------------
 2215|       |
 2216|      0|		dst->enumv = enumv;
 2217|       |
 2218|      0|		if (!enumv || !enumv->flags.is_unsigned) {
  ------------------
  |  Branch (2218:7): [True: 0, False: 0]
  |  Branch (2218:17): [True: 0, False: 0]
  ------------------
 2219|      0|			FR_DBUFF_OUT_INT64V_RETURN(&date, &work_dbuff, length);
  ------------------
  |  | 1907|      0|#define FR_DBUFF_OUT_INT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_int64v, _num, _dbuff_or_marker, _len)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1907|      0|#define FR_DBUFF_OUT_INT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_int64v, _num, _dbuff_or_marker, _len)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1901|      0|	_fr_dbuff_out_int64v(_num, _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), _len)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               	_fr_dbuff_out_int64v(_num, _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), _len)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2220|      0|		} else {
 2221|      0|			uint64_t tmp;
 2222|       |
 2223|       |			/*
 2224|       |			 *	Else it's an unsigned time delta, but
 2225|       |			 *	we do have to clamp it at the max
 2226|       |			 *	value for a signed 64-bit integer.
 2227|       |			 */
 2228|      0|			FR_DBUFF_OUT_UINT64V_RETURN(&tmp, &work_dbuff, length);
  ------------------
  |  | 1867|      0|#define FR_DBUFF_OUT_UINT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_uint64v, _num, _dbuff_or_marker, _len)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1867|      0|#define FR_DBUFF_OUT_UINT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_uint64v, _num, _dbuff_or_marker, _len)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1861|      0|	_fr_dbuff_out_uint64v(_num, _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), _len)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |               	_fr_dbuff_out_uint64v(_num, _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), _len)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2229|       |
 2230|      0|			if (tmp > INT64_MAX) tmp = INT64_MAX;
  ------------------
  |  Branch (2230:8): [True: 0, False: 0]
  ------------------
 2231|       |
 2232|      0|			date = tmp;
 2233|      0|		}
 2234|       |
 2235|      0|		dst->vb_time_delta = fr_time_delta_wrap(fr_time_scale(date, precision));
  ------------------
  |  |  290|      0|#define vb_time_delta				datum.time_delta
  ------------------
              		dst->vb_time_delta = fr_time_delta_wrap(fr_time_scale(date, precision));
  ------------------
  |  |  152|      0|#define fr_time_delta_wrap(_time) (fr_time_delta_t){ .value = (_time) }
  ------------------
 2236|      0|	}
 2237|      0|		break;
 2238|       |
 2239|      0|	case FR_TYPE_STRING:
  ------------------
  |  Branch (2239:2): [True: 0, False: 11.0k]
  ------------------
 2240|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (2240:2): [True: 0, False: 11.0k]
  ------------------
 2241|      0|		break;		/* Already dealt with */
 2242|       |
 2243|      0|	case FR_TYPE_SIZE:
  ------------------
  |  Branch (2243:2): [True: 0, False: 11.0k]
  ------------------
 2244|      0|	case FR_TYPE_NON_LEAF:
  ------------------
  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  289|      0|	_beg(FR_TYPE_NULL) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  290|      0|	FR_TYPE_INTERNAL_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  274|      0|	_beg(FR_TYPE_VALUE_BOX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  275|      0|	_mid(FR_TYPE_VOID) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  276|      0|	_mid(FR_TYPE_VALUE_BOX_CURSOR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  277|      0|	_mid(FR_TYPE_PAIR_CURSOR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  278|      0|	_end(FR_TYPE_MAX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  291|      0|	FR_TYPE_STRUCTURAL_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2244:2): [True: 0, False: 11.0k]
  ------------------
 2245|      0|		fr_strerror_printf("Cannot decode type \"%s\" - Is not a value",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2246|      0|				   fr_type_to_str(type));
 2247|      0|		return -1;
 2248|  11.0k|	}
 2249|       |
 2250|  11.0k|	return fr_dbuff_set(dbuff, &work_dbuff);
  ------------------
  |  | 1012|  11.0k|#define fr_dbuff_set(_dst, _src) \
  |  | 1013|  11.0k|_fr_dbuff_set(\
  |  | 1014|  11.0k|	_fr_dbuff_current_ptr(_dst), fr_dbuff_ptr(_dst), \
  |  |  ------------------
  |  |  |  |  935|  11.0k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  11.0k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  11.0k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  11.0k|	))
  |  |  ------------------
  |  |               	_fr_dbuff_current_ptr(_dst), fr_dbuff_ptr(_dst), \
  |  |  ------------------
  |  |  |  |  867|  11.0k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  11.0k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  11.0k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  11.0k|	)
  |  |  ------------------
  |  | 1015|  11.0k|	_Generic((_src), \
  |  | 1016|  11.0k|		fr_dbuff_t *			: fr_dbuff_current((fr_dbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  920|  11.0k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  921|  11.0k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  922|  11.0k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  923|  11.0k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  924|  11.0k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p) \
  |  |  |  |  925|  11.0k|	))
  |  |  ------------------
  |  | 1017|  11.0k|		fr_dbuff_marker_t *		: fr_dbuff_current((fr_dbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  920|  11.0k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  921|  11.0k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  922|  11.0k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  923|  11.0k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p), \
  |  |  |  |  924|  11.0k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->p) \
  |  |  |  |  925|  11.0k|	))
  |  |  ------------------
  |  | 1018|  11.0k|		uint8_t const *			: (uint8_t const *)(_src), \
  |  | 1019|  11.0k|		uint8_t *			: (uint8_t const *)(_src), \
  |  | 1020|  11.0k|		size_t				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)), \
  |  |  ------------------
  |  |  |  |  907|  11.0k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  11.0k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  11.0k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  11.0k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  11.0k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  11.0k|	))
  |  |  ------------------
  |  | 1021|  11.0k|		long				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)), \
  |  |  ------------------
  |  |  |  |  907|  11.0k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  11.0k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  11.0k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  11.0k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  11.0k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  11.0k|	))
  |  |  ------------------
  |  | 1022|  11.0k|		int				: (fr_dbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  907|  11.0k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  908|  11.0k|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  909|  11.0k|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  |  |  910|  11.0k|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  |  |  911|  11.0k|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  |  |  912|  11.0k|	))
  |  |  ------------------
  |  | 1023|  11.0k|	) \
  |  | 1024|  11.0k|)
  ------------------
 2251|  11.0k|}
fr_value_box_ipaddr_from_network:
 2299|    220|{
 2300|    220|	switch (type) {
 2301|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (2301:2): [True: 0, False: 220]
  ------------------
 2302|      0|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (2302:2): [True: 0, False: 220]
  ------------------
 2303|    220|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (2303:2): [True: 220, False: 0]
  ------------------
 2304|    220|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (2304:2): [True: 0, False: 220]
  ------------------
 2305|    220|		break;
 2306|       |
 2307|      0|	default:
  ------------------
  |  Branch (2307:2): [True: 0, False: 220]
  ------------------
 2308|      0|		fr_strerror_printf("Invalid data type '%s' passed to IP address decode function",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2309|      0|				   fr_type_to_str(type));
 2310|      0|		return -1;
 2311|    220|	}
 2312|       |
 2313|       |	/*
 2314|       |	 *	Check the allowed values for prefix length.
 2315|       |	 */
 2316|    220|	if (prefix_len < ipaddr_sizes[type].prefix_min) {
  ------------------
  |  Branch (2316:6): [True: 0, False: 220]
  ------------------
 2317|      0|		fr_strerror_printf("Invalid prefix length %d, expected at least %d",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2318|      0|				   prefix_len, ipaddr_sizes[type].prefix_min);
 2319|      0|		return -1;
 2320|      0|	}
 2321|       |
 2322|    220|	if (prefix_len > ipaddr_sizes[type].prefix_max) {
  ------------------
  |  Branch (2322:6): [True: 0, False: 220]
  ------------------
 2323|      0|		fr_strerror_printf("Invalid prefix length '%d', expected no more than %d",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2324|      0|				   prefix_len, ipaddr_sizes[type].prefix_max);
 2325|      0|		return -1;
 2326|      0|	}
 2327|       |
 2328|       |	/*
 2329|       |	 *	It's a prefix data type.  Verify that the prefix length doesn't require more bytes than we
 2330|       |	 *	have.
 2331|       |	 *
 2332|       |	 *	@todo - some protocols allow a larger prefix, and then set the extra bytes to zero.  <sigh>
 2333|       |	 */
 2334|    220|	if (!ipaddr_sizes[type].addr_min) {
  ------------------
  |  Branch (2334:6): [True: 0, False: 220]
  ------------------
 2335|      0|		if (fr_bytes_from_bits(prefix_len) > data_len) {
  ------------------
  |  Branch (2335:7): [True: 0, False: 0]
  ------------------
 2336|      0|			fr_strerror_printf("Invalid prefix length '%d' - it requires %u bytes of data, and there are only %zu bytes of data",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2337|      0|					   prefix_len, fr_bytes_from_bits(prefix_len), data_len);
 2338|      0|			return -1;
 2339|      0|		}
 2340|      0|	}
 2341|       |
 2342|       |	/*
 2343|       |	 *	Check how much data is in the buffer.
 2344|       |	 */
 2345|    220|	if (data_len < ipaddr_sizes[type].addr_min) {
  ------------------
  |  Branch (2345:6): [True: 127, False: 93]
  ------------------
 2346|    127|		fr_strerror_printf("Invalid address length '%zu', expected at least %zu",
  ------------------
  |  |   65|    127|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2347|    127|				   data_len, ipaddr_sizes[type].addr_min);
 2348|    127|		return -1;
 2349|    127|	}
 2350|       |
 2351|       |	/*
 2352|       |	 *	Do various checks for the size.
 2353|       |	 */
 2354|     93|	if (enumv && enumv->flags.array) {
  ------------------
  |  Branch (2354:6): [True: 93, False: 0]
  |  Branch (2354:15): [True: 40, False: 53]
  ------------------
 2355|       |		/*
 2356|       |		 *	If this field is part of an array, then it has to be fixed size.
 2357|       |		 */
 2358|     40|		data_len = ipaddr_sizes[type].addr_max;
 2359|       |
 2360|     53|	} else if (fixed) {
  ------------------
  |  Branch (2360:13): [True: 53, False: 0]
  ------------------
 2361|       |		/*
 2362|       |		 *	If it's fixed size, it must be the maximum size.
 2363|       |		 */
 2364|     53|		if (data_len != ipaddr_sizes[type].addr_max) {
  ------------------
  |  Branch (2364:7): [True: 0, False: 53]
  ------------------
 2365|      0|			fr_strerror_printf("Invalid address length '%zu', expected at exactly %zu",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2366|      0|					   data_len, ipaddr_sizes[type].addr_max);
 2367|      0|			return -1;
 2368|      0|		}
 2369|       |
 2370|       |		/*
 2371|       |		 *	There is more data in the array - limit what we read to the size of the address.
 2372|       |		 */
 2373|     53|		data_len = ipaddr_sizes[type].addr_max;
 2374|       |
 2375|     53|	} else if (data_len > ipaddr_sizes[type].addr_max) {
  ------------------
  |  Branch (2375:13): [True: 0, False: 0]
  ------------------
 2376|      0|		fr_strerror_printf("Invalid address length '%zu', expected no more than %zu",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2377|      0|				   data_len, ipaddr_sizes[type].addr_max);
 2378|      0|		return -1;
 2379|      0|	}
 2380|       |
 2381|     93|	fr_value_box_init(dst, type, enumv, tainted);
  ------------------
  |  |  610|     93|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|     93|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 2382|     93|	dst->vb_ip = (fr_ipaddr_t) {
  ------------------
  |  |  264|     93|#define vb_ip					datum.ip
  ------------------
 2383|     93|		.af = ipaddr_sizes[type].af,
 2384|     93|		.prefix = prefix_len,
 2385|       |		/* automatically initialize vp_ip.addr to all zeros */
 2386|     93|	};
 2387|       |
 2388|     93|	if (!data_len) return 0;
  ------------------
  |  Branch (2388:6): [True: 0, False: 93]
  ------------------
 2389|       |
 2390|     93|	fr_assert(data_len <= sizeof(dst->vb_ip.addr));
  ------------------
  |  |  194|     93|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     93|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 93]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2391|       |
 2392|     93|	memcpy((uint8_t *) &dst->vb_ip.addr, data, data_len);
  ------------------
  |  |  264|     93|#define vb_ip					datum.ip
  ------------------
 2393|       |
 2394|       |	/*
 2395|       |	 *	@todo - maybe it's an error to have bits set outsize of the prefix length.
 2396|       |	 */
 2397|     93|	fr_ipaddr_mask(&dst->vb_ip, prefix_len);
  ------------------
  |  |  264|     93|#define vb_ip					datum.ip
  ------------------
 2398|       |
 2399|     93|	return data_len;
 2400|     93|}
fr_value_box_cast:
 3949|    127|{
 3950|    127|	if (!fr_cond_assert(src != dst)) return -1;
  ------------------
  |  |  131|    127|#define		fr_cond_assert(_x) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, NULL) && false)))
  |  |  ------------------
  |  |  |  |  396|    254|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 127, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (3950:6): [True: 0, False: 127]
  ------------------
 3951|       |
 3952|    127|	if (fr_type_is_non_leaf(dst_type)) {
  ------------------
  |  |  394|    127|#define fr_type_is_non_leaf(_x)			(fr_type_non_leaf[_x])
  |  |  ------------------
  |  |  |  Branch (394:35): [True: 0, False: 127]
  |  |  ------------------
  ------------------
 3953|      0|		fr_strerror_printf("Invalid cast from %s to %s.  Can only cast simple data types",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3954|      0|				   fr_type_to_str(src->type),
 3955|      0|				   fr_type_to_str(dst_type));
 3956|      0|		return -1;
 3957|      0|	}
 3958|       |
 3959|       |	/*
 3960|       |	 *	If it's the same type, copy, but set the enumv
 3961|       |	 *	in the destination box to be the one provided.
 3962|       |	 *
 3963|       |	 *	The theory here is that the attribute value isn't
 3964|       |	 *	being converted into its presentation format and
 3965|       |	 *	re-parsed, and the enumv names only get applied
 3966|       |	 *	when converting internal values to/from strings,
 3967|       |	 *	so it's OK just to swap out the enumv.
 3968|       |	 *
 3969|       |	 *	If there's a compelling case in the future we
 3970|       |	 *	might revisit this, but it'd likely mean fixing
 3971|       |	 *	all the casting functions to treat any value
 3972|       |	 *	with an enumv as a string, which seems weird.
 3973|       |	 */
 3974|    127|	if (dst_type == src->type) {
  ------------------
  |  Branch (3974:6): [True: 0, False: 127]
  ------------------
 3975|      0|		int ret;
 3976|       |
 3977|      0|		ret = fr_value_box_copy(ctx, dst, src);
 3978|      0|		if (ret < 0) return ret;
  ------------------
  |  Branch (3978:7): [True: 0, False: 0]
  ------------------
 3979|       |
 3980|      0|		if (dst_enumv) dst->enumv = dst_enumv;
  ------------------
  |  Branch (3980:7): [True: 0, False: 0]
  ------------------
 3981|       |
 3982|      0|		return ret;
 3983|      0|	}
 3984|       |
 3985|       |	/*
 3986|       |	 *	Initialise dst
 3987|       |	 */
 3988|    127|	fr_value_box_init(dst, dst_type, NULL, src->tainted);
  ------------------
  |  |  610|    127|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|    127|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 3989|       |
 3990|       |	/*
 3991|       |	 *	Dispatch to specialised cast functions
 3992|       |	 */
 3993|    127|	switch (dst_type) {
  ------------------
  |  Branch (3993:10): [True: 127, False: 0]
  ------------------
 3994|      0|	case FR_TYPE_STRING:
  ------------------
  |  Branch (3994:2): [True: 0, False: 127]
  ------------------
 3995|      0|		return fr_value_box_cast_to_strvalue(ctx, dst, dst_type, dst_enumv, src);
 3996|       |
 3997|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (3997:2): [True: 0, False: 127]
  ------------------
 3998|      0|		return fr_value_box_cast_to_octets(ctx, dst, dst_type, dst_enumv, src);
 3999|       |
 4000|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (4000:2): [True: 0, False: 127]
  ------------------
 4001|      0|		return fr_value_box_cast_to_ipv4addr(ctx, dst, dst_type, dst_enumv, src);
 4002|       |
 4003|    125|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (4003:2): [True: 125, False: 2]
  ------------------
 4004|    125|		return fr_value_box_cast_to_ipv4prefix(ctx, dst, dst_type, dst_enumv, src);
 4005|       |
 4006|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (4006:2): [True: 0, False: 127]
  ------------------
 4007|      0|		return fr_value_box_cast_to_ipv6addr(ctx, dst, dst_type, dst_enumv, src);
 4008|       |
 4009|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (4009:2): [True: 0, False: 127]
  ------------------
 4010|      0|		return fr_value_box_cast_to_ipv6prefix(ctx, dst, dst_type, dst_enumv, src);
 4011|       |
 4012|      0|	case FR_TYPE_COMBO_IP_ADDR:
  ------------------
  |  Branch (4012:2): [True: 0, False: 127]
  ------------------
 4013|      0|	case FR_TYPE_COMBO_IP_PREFIX:
  ------------------
  |  Branch (4013:2): [True: 0, False: 127]
  ------------------
 4014|      0|		break;
 4015|       |	/*
 4016|       |	 *	Need func
 4017|       |	 */
 4018|      0|	case FR_TYPE_IFID:
  ------------------
  |  Branch (4018:2): [True: 0, False: 127]
  ------------------
 4019|      0|		break;
 4020|       |
 4021|      0|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (4021:2): [True: 0, False: 127]
  ------------------
 4022|      0|		return fr_value_box_cast_to_ethernet(ctx, dst, dst_type, dst_enumv, src);
 4023|       |
 4024|      0|	case FR_TYPE_BOOL:
  ------------------
  |  Branch (4024:2): [True: 0, False: 127]
  ------------------
 4025|      0|		return fr_value_box_cast_to_bool(ctx, dst, dst_type, dst_enumv, src);
 4026|       |
 4027|      0|	case FR_TYPE_DATE:
  ------------------
  |  Branch (4027:2): [True: 0, False: 127]
  ------------------
 4028|      0|		if (src->type != FR_TYPE_TIME_DELTA) return fr_value_box_cast_to_integer(ctx, dst, dst_type, dst_enumv, src);
  ------------------
  |  Branch (4028:7): [True: 0, False: 0]
  ------------------
 4029|       |
 4030|      0|		if (fr_time_delta_isneg(src->vb_time_delta)) {
  ------------------
  |  |  291|      0|#define fr_time_delta_isneg(_a) (fr_time_delta_unwrap(_a) < 0)
  |  |  ------------------
  |  |  |  Branch (291:33): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4031|      0|			fr_strerror_const("Input to data type would underflow");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4032|      0|			return -1;
 4033|      0|		}
 4034|       |
 4035|      0|		fr_value_box_safety_copy_changed(dst, src);
 4036|      0|		dst->enumv = dst_enumv;
 4037|      0|		dst->vb_date = fr_unix_time_wrap(fr_time_delta_unwrap(src->vb_time_delta));
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
              		dst->vb_date = fr_unix_time_wrap(fr_time_delta_unwrap(src->vb_time_delta));
  ------------------
  |  |  160|      0|#define fr_unix_time_wrap(_time) (fr_unix_time_t){ .value = (_time) }
  ------------------
 4038|      0|		return 0;
 4039|       |
 4040|      0|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (4040:2): [True: 0, False: 127]
  ------------------
 4041|       |		/*
 4042|       |		 *	Unix time cast to time_delta is just nanoseconds since the epoch.
 4043|       |		 *
 4044|       |		 *	Note that we do NOT change time resolution, but we DO change enumv.  Both unix time
 4045|       |		 *	and time_delta are tracked internally as nanoseconds, and the only use of precision is
 4046|       |		 *	for printing / parsing.
 4047|       |		 */
 4048|      0|		if (src->type == FR_TYPE_DATE) {
  ------------------
  |  Branch (4048:7): [True: 0, False: 0]
  ------------------
 4049|      0|			uint64_t when;
 4050|       |
 4051|      0|			when = fr_unix_time_unwrap(src->vb_date);
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
 4052|      0|			if (when > INT64_MAX) {
  ------------------
  |  Branch (4052:8): [True: 0, False: 0]
  ------------------
 4053|      0|				fr_strerror_const("Input to data type would overflow");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4054|      0|				return -1;
 4055|      0|			}
 4056|       |
 4057|      0|			fr_value_box_safety_copy_changed(dst, src);
 4058|      0|			dst->enumv = dst_enumv;
 4059|      0|			dst->vb_time_delta = fr_time_delta_wrap((int64_t) when);
  ------------------
  |  |  290|      0|#define vb_time_delta				datum.time_delta
  ------------------
              			dst->vb_time_delta = fr_time_delta_wrap((int64_t) when);
  ------------------
  |  |  152|      0|#define fr_time_delta_wrap(_time) (fr_time_delta_t){ .value = (_time) }
  ------------------
 4060|      0|			return 0;
 4061|      0|		}
 4062|      0|		FALL_THROUGH;
  ------------------
  |  |  341|      0|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      0|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
 4063|       |
 4064|      2|	case FR_TYPE_UINT8:
  ------------------
  |  Branch (4064:2): [True: 2, False: 125]
  ------------------
 4065|      2|	case FR_TYPE_UINT16:
  ------------------
  |  Branch (4065:2): [True: 0, False: 127]
  ------------------
 4066|      2|	case FR_TYPE_UINT32:
  ------------------
  |  Branch (4066:2): [True: 0, False: 127]
  ------------------
 4067|      2|	case FR_TYPE_UINT64:
  ------------------
  |  Branch (4067:2): [True: 0, False: 127]
  ------------------
 4068|      2|	case FR_TYPE_INT8:
  ------------------
  |  Branch (4068:2): [True: 0, False: 127]
  ------------------
 4069|      2|	case FR_TYPE_INT16:
  ------------------
  |  Branch (4069:2): [True: 0, False: 127]
  ------------------
 4070|      2|	case FR_TYPE_INT32:
  ------------------
  |  Branch (4070:2): [True: 0, False: 127]
  ------------------
 4071|      2|	case FR_TYPE_INT64:
  ------------------
  |  Branch (4071:2): [True: 0, False: 127]
  ------------------
 4072|      2|	case FR_TYPE_SIZE:
  ------------------
  |  Branch (4072:2): [True: 0, False: 127]
  ------------------
 4073|      2|		return fr_value_box_cast_to_integer(ctx, dst, dst_type, dst_enumv, src);
 4074|       |
 4075|      0|	case FR_TYPE_FLOAT32:
  ------------------
  |  Branch (4075:2): [True: 0, False: 127]
  ------------------
 4076|      0|	case FR_TYPE_FLOAT64:
  ------------------
  |  Branch (4076:2): [True: 0, False: 127]
  ------------------
 4077|      0|		if (fr_type_is_fixed_size(src->type)) {
  ------------------
  |  |  387|      0|#define fr_type_is_fixed_size(_x)		(fr_type_fixed_size[_x])
  |  |  ------------------
  |  |  |  Branch (387:36): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4078|      0|			return fr_value_box_cast_to_float(ctx, dst, dst_type, dst_enumv, src);
 4079|      0|		}
 4080|      0|		break;		/* use generic string/octets stuff below */
 4081|       |
 4082|       |#if 0
 4083|       |	case FR_TYPE_ATTR:
 4084|       |		/*
 4085|       |		 *	Convert it to an integer of the correct length. Then, cast it in place.
 4086|       |		 */
 4087|       |		switch (src->vb_attr->flags.length) {
 4088|       |		case 1:
 4089|       |			fr_value_box_init(dst, FR_TYPE_UINT8, NULL, false);
 4090|       |			dst->vb_uint8 = src->vb_attr->attr;
 4091|       |			break;
 4092|       |
 4093|       |		case 2:
 4094|       |			fr_value_box_init(dst, FR_TYPE_UINT16, NULL, false);
 4095|       |			dst->vb_uint16 = src->vb_attr->attr;
 4096|       |			break;
 4097|       |
 4098|       |		case 4:
 4099|       |			fr_value_box_init(dst, FR_TYPE_UINT32, NULL, false);
 4100|       |			dst->vb_uint32 = src->vb_attr->attr;
 4101|       |			break;
 4102|       |
 4103|       |		default:
 4104|       |			fr_strerror_printf("Unsupported length '%d' for attribute %s",
 4105|       |					   src->vb_attr->flags.length, src->vb_attr->name);
 4106|       |			return 0;
 4107|       |		}
 4108|       |
 4109|       |		return fr_value_box_cast_in_place(ctx, dst, dst_type, dst_enumv);
 4110|       |#else
 4111|      0|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (4111:2): [True: 0, False: 127]
  ------------------
 4112|      0|		if (src->type == FR_TYPE_STRING) break;
  ------------------
  |  Branch (4112:7): [True: 0, False: 0]
  ------------------
 4113|       |
 4114|      0|		FALL_THROUGH;
  ------------------
  |  |  341|      0|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      0|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
 4115|       |
 4116|      0|#endif
 4117|       |	/*
 4118|       |	 *	Invalid types for casting (were caught earlier)
 4119|       |	 */
 4120|      0|	case FR_TYPE_NON_LEAF:
  ------------------
  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  289|      0|	_beg(FR_TYPE_NULL) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  290|      0|	FR_TYPE_INTERNAL_DEF(_mid, _mid, _mid) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  274|      0|	_beg(FR_TYPE_VALUE_BOX) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  275|      0|	_mid(FR_TYPE_VOID) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  276|      0|	_mid(FR_TYPE_VALUE_BOX_CURSOR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  277|      0|	_mid(FR_TYPE_PAIR_CURSOR) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  278|      0|	_end(FR_TYPE_MAX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  291|      0|	FR_TYPE_STRUCTURAL_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 127]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  318|      0|#define FR_TYPE_NON_LEAF			FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (4120:2): [True: 0, False: 127]
  ------------------
 4121|      0|		fr_strerror_printf("Invalid cast from %s to %s.  Invalid destination type",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4122|      0|				   fr_type_to_str(src->type),
 4123|      0|				   fr_type_to_str(dst_type));
 4124|      0|		return -1;
 4125|    127|	}
 4126|       |
 4127|       |	/*
 4128|       |	 *	Deserialise a fr_value_box_t
 4129|       |	 */
 4130|      0|	if (src->type == FR_TYPE_STRING) return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
  ------------------
  |  Branch (4130:6): [True: 0, False: 0]
  ------------------
 4131|      0|								      src->vb_strvalue, src->vb_length,
  ------------------
  |  |  258|      0|#define vb_strvalue				datum.strvalue
  ------------------
              								      src->vb_strvalue, src->vb_length,
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
 4132|      0|								      NULL);
 4133|       |
 4134|      0|	if (src->type == FR_TYPE_OCTETS) {
  ------------------
  |  Branch (4134:6): [True: 0, False: 0]
  ------------------
 4135|      0|		fr_value_box_t tmp;
 4136|       |
 4137|      0|		if (src->vb_length < network_min_size(dst_type)) {
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
              		if (src->vb_length < network_min_size(dst_type)) {
  ------------------
  |  |  105|      0|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  ------------------
  |  Branch (4137:7): [True: 0, False: 0]
  ------------------
 4138|      0|			fr_strerror_printf("Invalid cast from %s to %s.  Source is length %zu is smaller than "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 4140|      0|					   fr_type_to_str(src->type),
  |  |  |  | 4141|      0|					   fr_type_to_str(dst_type),
  |  |  |  | 4142|      0|					   src->vb_length,
  |  |  |  |  ------------------
  |  |  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  |  |  ------------------
  |  |  |  | 4143|      0|					   network_min_size(dst_type));
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      0|#define network_min_size(_x) (fr_value_box_network_sizes[_x][0])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4139|      0|					   "destination type size %zu",
 4140|      0|					   fr_type_to_str(src->type),
 4141|      0|					   fr_type_to_str(dst_type),
 4142|      0|					   src->vb_length,
 4143|      0|					   network_min_size(dst_type));
 4144|      0|			return -1;
 4145|      0|		}
 4146|       |
 4147|      0|		if (src->vb_length > network_max_size(dst_type)) {
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
              		if (src->vb_length > network_max_size(dst_type)) {
  ------------------
  |  |  106|      0|#define network_max_size(_x) (fr_value_box_network_sizes[_x][1])
  ------------------
  |  Branch (4147:7): [True: 0, False: 0]
  ------------------
 4148|      0|			fr_strerror_printf("Invalid cast from %s to %s.  Source length %zu is greater than "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 4150|      0|					   fr_type_to_str(src->type),
  |  |  |  | 4151|      0|					   fr_type_to_str(dst_type),
  |  |  |  | 4152|      0|					   src->vb_length,
  |  |  |  |  ------------------
  |  |  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  |  |  ------------------
  |  |  |  | 4153|      0|					   network_max_size(dst_type));
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      0|#define network_max_size(_x) (fr_value_box_network_sizes[_x][1])
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4149|      0|					   "destination type size %zu",
 4150|      0|					   fr_type_to_str(src->type),
 4151|      0|					   fr_type_to_str(dst_type),
 4152|      0|					   src->vb_length,
 4153|      0|					   network_max_size(dst_type));
 4154|      0|			return -1;
 4155|      0|		}
 4156|       |
 4157|      0|		fr_value_box_init(&tmp, dst_type, NULL, false);
  ------------------
  |  |  610|      0|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 4158|       |
 4159|       |		/*
 4160|       |		 *	Copy the raw octets into the datum of a value_box
 4161|       |		 *	inverting bytesex for uint32s (if LE).
 4162|       |		 */
 4163|      0|		memcpy(&tmp.datum, src->vb_octets, fr_value_box_field_sizes[dst_type]);
  ------------------
  |  |  259|      0|#define vb_octets				datum.octets
  ------------------
 4164|      0|		tmp.type = dst_type;
 4165|      0|		dst->enumv = dst_enumv;
 4166|       |
 4167|      0|		fr_value_box_hton(dst, &tmp);
 4168|      0|		fr_value_box_safety_copy(dst, src);
 4169|      0|		return 0;
 4170|      0|	}
 4171|       |
 4172|      0|	memcpy(&dst->datum, &src->datum, fr_value_box_field_sizes[src->type]);
 4173|       |
 4174|      0|	fr_value_box_safety_copy_changed(dst, src);
 4175|      0|	dst->enumv = dst_enumv;
 4176|       |
 4177|      0|	return 0;
 4178|      0|}
fr_value_box_cast_in_place:
 4198|      2|{
 4199|      2|	fr_value_box_t tmp;
 4200|       |	/*
 4201|       |	 *	Store list pointers to restore later - fr_value_box_cast clears them
 4202|       |	 */
 4203|      2|	fr_value_box_entry_t entry = vb->entry;
 4204|       |
 4205|       |	/*
 4206|       |	 *	Simple case, destination type and current
 4207|       |	 *	type are the same.
 4208|       |	 */
 4209|      2|	if (vb->type == dst_type) {
  ------------------
  |  Branch (4209:6): [True: 0, False: 2]
  ------------------
 4210|      0|		vb->enumv = dst_enumv;	/* Update the enumv as this may be different */
 4211|      0|		return 0;
 4212|      0|	}
 4213|       |
 4214|       |	/*
 4215|       |	 *	Copy meta data and any existing buffers to
 4216|       |	 *	a temporary box.  We then clear that value
 4217|       |	 *	box after the cast has been completed,
 4218|       |	 *	freeing any old buffers.
 4219|       |	 */
 4220|      2|	fr_value_box_copy_shallow(NULL, &tmp, vb);
 4221|       |
 4222|      2|	if (fr_value_box_cast(ctx, vb, dst_type, dst_enumv, &tmp) < 0) {
  ------------------
  |  Branch (4222:6): [True: 0, False: 2]
  ------------------
 4223|       |		/*
 4224|       |		 *	On error, make sure the original
 4225|       |		 *	box is left in a consistent state.
 4226|       |		 */
 4227|      0|		fr_value_box_copy_shallow(NULL, vb, &tmp);
 4228|      0|		vb->entry = entry;
 4229|      0|		return -1;
 4230|      0|	}
 4231|      2|	fr_value_box_clear_value(&tmp);	/* Clear out any old buffers */
 4232|       |
 4233|       |	/*
 4234|       |	 *	Restore list pointers
 4235|       |	 */
 4236|      2|	vb->entry = entry;
 4237|       |
 4238|      2|	return 0;
 4239|      2|}
fr_value_box_as_uint64:
 4247|      8|{
 4248|      8|#undef O
 4249|      8|#define O(_x, _y) case FR_TYPE_##_x: return vb->vb_##_y
 4250|       |
 4251|       |
 4252|      8|	switch (vb->type) {
 4253|      0|		O(BOOL, bool);
  ------------------
  |  | 4249|      0|#define O(_x, _y) case FR_TYPE_##_x: return vb->vb_##_y
  |  |  ------------------
  |  |  |  |  271|      0|#define vb_bool					datum.boolean
  |  |  ------------------
  |  |  |  Branch (4249:19): [True: 0, False: 8]
  |  |  ------------------
  ------------------
 4254|      8|		O(UINT8, uint8);
  ------------------
  |  | 4249|      8|#define O(_x, _y) case FR_TYPE_##_x: return vb->vb_##_y
  |  |  ------------------
  |  |  |  |  272|      8|#define vb_uint8				datum.uint8
  |  |  ------------------
  |  |  |  Branch (4249:19): [True: 8, False: 0]
  |  |  ------------------
  ------------------
 4255|      0|		O(UINT16, uint16);
  ------------------
  |  | 4249|      0|#define O(_x, _y) case FR_TYPE_##_x: return vb->vb_##_y
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  |  |  |  Branch (4249:19): [True: 0, False: 8]
  |  |  ------------------
  ------------------
 4256|      0|		O(UINT32, uint32);
  ------------------
  |  | 4249|      0|#define O(_x, _y) case FR_TYPE_##_x: return vb->vb_##_y
  |  |  ------------------
  |  |  |  |  274|      0|#define vb_uint32				datum.uint32
  |  |  ------------------
  |  |  |  Branch (4249:19): [True: 0, False: 8]
  |  |  ------------------
  ------------------
 4257|      0|		O(UINT64, uint64);
  ------------------
  |  | 4249|      0|#define O(_x, _y) case FR_TYPE_##_x: return vb->vb_##_y
  |  |  ------------------
  |  |  |  |  275|      0|#define vb_uint64				datum.uint64
  |  |  ------------------
  |  |  |  Branch (4249:19): [True: 0, False: 8]
  |  |  ------------------
  ------------------
 4258|      0|		O(SIZE, size);
  ------------------
  |  | 4249|      0|#define O(_x, _y) case FR_TYPE_##_x: return vb->vb_##_y
  |  |  ------------------
  |  |  |  |  288|      0|#define vb_size					datum.size
  |  |  ------------------
  |  |  |  Branch (4249:19): [True: 0, False: 8]
  |  |  ------------------
  ------------------
 4259|       |
 4260|      0|	default:
  ------------------
  |  Branch (4260:2): [True: 0, False: 8]
  ------------------
 4261|       |		fr_assert(0);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4262|      0|		return 0;
 4263|      8|	}
 4264|      8|}
fr_value_box_clear_value:
 4332|  2.46k|{
 4333|  2.46k|	switch (data->type) {
 4334|    125|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (4334:2): [True: 125, False: 2.34k]
  ------------------
 4335|    678|	case FR_TYPE_STRING:
  ------------------
  |  Branch (4335:2): [True: 553, False: 1.91k]
  ------------------
 4336|    678|		if (data->secret) memset_explicit(data->datum.ptr, 0, data->vb_length);
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
  |  Branch (4336:7): [True: 0, False: 678]
  ------------------
 4337|    678|		talloc_free(data->datum.ptr);
 4338|    678|		break;
 4339|       |
 4340|      0|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (4340:2): [True: 0, False: 2.46k]
  ------------------
 4341|       |		/*
 4342|       |		 *	Depth first freeing of children
 4343|       |		 *
 4344|       |		 *	This ensures orderly freeing, regardless
 4345|       |		 *	of talloc hierarchy.
 4346|       |		 */
 4347|      0|		{
 4348|      0|			fr_value_box_t *vb;
 4349|       |
 4350|      0|			while ((vb = fr_value_box_list_pop_head(&data->vb_group)) != NULL) {
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  |  Branch (4350:11): [True: 0, False: 0]
  ------------------
 4351|      0|				fr_value_box_clear_value(vb);
 4352|      0|				talloc_free(vb);
 4353|      0|			}
 4354|      0|		}
 4355|      0|		return;
 4356|       |
 4357|      0|	case FR_TYPE_NULL:
  ------------------
  |  Branch (4357:2): [True: 0, False: 2.46k]
  ------------------
 4358|      0|		return;
 4359|       |
 4360|      0|	case FR_TYPE_PAIR_CURSOR:
  ------------------
  |  Branch (4360:2): [True: 0, False: 2.46k]
  ------------------
 4361|      0|		talloc_free(data->vb_cursor);
 4362|      0|		break;
 4363|       |
 4364|  1.78k|	default:
  ------------------
  |  Branch (4364:2): [True: 1.78k, False: 678]
  ------------------
 4365|  1.78k|		break;
 4366|  2.46k|	}
 4367|       |
 4368|  2.46k|	memset(&data->datum, 0, sizeof(data->datum));
 4369|  2.46k|}
fr_value_box_clear:
 4378|  2.46k|{
 4379|  2.46k|	fr_value_box_clear_value(data);
 4380|  2.46k|	fr_value_box_init(data, FR_TYPE_NULL, NULL, false);
  ------------------
  |  |  610|  2.46k|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|  2.46k|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 4381|  2.46k|}
fr_value_box_copy:
 4395|    806|{
 4396|    806|	switch (src->type) {
  ------------------
  |  Branch (4396:10): [True: 806, False: 0]
  ------------------
 4397|  8.15k|	case FR_TYPE_NUMERIC:
  ------------------
  |  |  306|      0|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  154|      0|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  306|      0|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  155|      0|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  306|      0|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  156|      0|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  127|      4|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  306|      4|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      4|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 4, False: 802]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  128|      4|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  107|    354|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    354|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    354|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 350, False: 456]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  108|    544|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    544|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    544|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 190, False: 616]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  109|    806|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 262, False: 544]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  110|    806|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  111|    806|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  112|    806|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  113|    806|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  114|    806|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  115|    806|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  116|    806|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  117|    806|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  301|    806|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (4397:2): [True: 0, False: 806]
  ------------------
 4398|  8.15k|	case FR_TYPE_IP:
  ------------------
  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  168|    806|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|    806|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  169|    806|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  170|    806|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  171|    806|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  172|    806|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  173|    806|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|    806|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (4398:2): [True: 0, False: 806]
  ------------------
 4399|  4.03k|	case FR_TYPE_IFID:
  ------------------
  |  Branch (4399:2): [True: 0, False: 806]
  ------------------
 4400|    806|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (4400:2): [True: 0, False: 806]
  ------------------
 4401|    806|		fr_value_box_memcpy_out(fr_value_box_raw(dst, src->type), src);
 4402|    806|		fr_value_box_copy_meta(dst, src);
 4403|    806|		break;
 4404|       |
 4405|      0|	case FR_TYPE_NULL:
  ------------------
  |  Branch (4405:2): [True: 0, False: 806]
  ------------------
 4406|      0|		fr_value_box_copy_meta(dst, src);
 4407|      0|		break;
 4408|       |
 4409|      0|	case FR_TYPE_STRING:
  ------------------
  |  Branch (4409:2): [True: 0, False: 806]
  ------------------
 4410|      0|	{
 4411|      0|		char *str = NULL;
 4412|       |
 4413|       |		/*
 4414|       |		 *	Zero length strings still have a one uint8 buffer
 4415|       |		 */
 4416|      0|		str = talloc_bstrndup(ctx, src->vb_strvalue, src->vb_length);
  ------------------
  |  |  258|      0|#define vb_strvalue				datum.strvalue
  ------------------
              		str = talloc_bstrndup(ctx, src->vb_strvalue, src->vb_length);
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
 4417|      0|		if (!str) {
  ------------------
  |  Branch (4417:7): [True: 0, False: 0]
  ------------------
 4418|      0|			fr_strerror_const("Failed allocating string buffer");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4419|      0|			return -1;
 4420|      0|		}
 4421|      0|		dst->vb_strvalue = str;
  ------------------
  |  |  258|      0|#define vb_strvalue				datum.strvalue
  ------------------
 4422|      0|		fr_value_box_copy_meta(dst, src);
 4423|      0|	}
 4424|      0|		break;
 4425|       |
 4426|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (4426:2): [True: 0, False: 806]
  ------------------
 4427|      0|	{
 4428|      0|		uint8_t *bin;
 4429|       |
 4430|      0|		if (src->vb_length) {
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
  |  Branch (4430:7): [True: 0, False: 0]
  ------------------
 4431|      0|			bin = talloc_memdup(ctx, src->vb_octets, src->vb_length);
 4432|      0|			if (!bin) {
  ------------------
  |  Branch (4432:8): [True: 0, False: 0]
  ------------------
 4433|      0|				fr_strerror_const("Failed allocating octets buffer");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4434|      0|				return -1;
 4435|      0|			}
 4436|      0|			talloc_set_type(bin, uint8_t);
 4437|      0|		} else {
 4438|      0|			bin = talloc_array(ctx, uint8_t, 0);
 4439|      0|		}
 4440|      0|		dst->vb_octets = bin;
  ------------------
  |  |  259|      0|#define vb_octets				datum.octets
  ------------------
 4441|      0|		fr_value_box_copy_meta(dst, src);
 4442|      0|	}
 4443|      0|		break;
 4444|       |
 4445|      0|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (4445:2): [True: 0, False: 806]
  ------------------
 4446|      0|	{
 4447|      0|		fr_value_box_t *child = NULL;
 4448|       |
 4449|      0|		fr_value_box_copy_meta(dst, src);	/* Initialises group child dlist */
 4450|       |
 4451|      0|		while ((child = fr_value_box_list_next(&src->vb_group, child))) {
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  |  Branch (4451:10): [True: 0, False: 0]
  ------------------
 4452|      0|			fr_value_box_t *new;
 4453|       |
 4454|       |			/*
 4455|       |			 *	Build out the child
 4456|       |			 */
 4457|      0|			new = fr_value_box_alloc_null(ctx);
  ------------------
  |  |  655|      0|#define fr_value_box_alloc_null(_ctx) _fr_value_box_alloc(NDEBUG_LOCATION_EXP _ctx, FR_TYPE_NULL, NULL)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 4458|      0|			if (unlikely(!new)) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4459|      0|			group_error:
 4460|      0|				fr_strerror_const("Failed duplicating group child");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4461|      0|				fr_value_box_list_talloc_free(&dst->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
 4462|      0|				return -1;
 4463|      0|			}
 4464|       |
 4465|       |			/*
 4466|       |			 *	Populate it with the data from the original child.
 4467|       |			 *
 4468|       |			 *	We do NOT update the dst safety.  The individual boxes have safety.  A group
 4469|       |			 *	doesn't.
 4470|       |			 */
 4471|      0|			if (unlikely(fr_value_box_copy(new, new, child) < 0)) goto group_error;
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4472|      0|			fr_value_box_list_insert_tail(&dst->vb_group, new);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
 4473|      0|		}
 4474|      0|	}
 4475|      0|		break;
 4476|       |
 4477|      0|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (4477:2): [True: 0, False: 806]
  ------------------
 4478|      0|		fr_value_box_copy_meta(dst, src);
 4479|       |
 4480|       |		/* raw also sets is_unknown */
 4481|      0|		if (src->vb_attr->flags.is_unknown) {
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
  |  Branch (4481:7): [True: 0, False: 0]
  ------------------
 4482|      0|			dst->vb_attr = fr_dict_attr_unknown_copy(ctx, src->vb_attr);
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
              			dst->vb_attr = fr_dict_attr_unknown_copy(ctx, src->vb_attr);
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
 4483|      0|			if (!dst->vb_attr) return -1;
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
  |  Branch (4483:8): [True: 0, False: 0]
  ------------------
 4484|      0|			break;
 4485|      0|		}
 4486|      0|		dst->vb_attr = src->vb_attr;
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
              		dst->vb_attr = src->vb_attr;
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
 4487|      0|		break;
 4488|       |
 4489|      0|	case FR_TYPE_TLV:
  ------------------
  |  Branch (4489:2): [True: 0, False: 806]
  ------------------
 4490|      0|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (4490:2): [True: 0, False: 806]
  ------------------
 4491|      0|	case FR_TYPE_VSA:
  ------------------
  |  Branch (4491:2): [True: 0, False: 806]
  ------------------
 4492|      0|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (4492:2): [True: 0, False: 806]
  ------------------
 4493|      0|	case FR_TYPE_UNION:
  ------------------
  |  Branch (4493:2): [True: 0, False: 806]
  ------------------
 4494|      0|	case FR_TYPE_VOID:
  ------------------
  |  Branch (4494:2): [True: 0, False: 806]
  ------------------
 4495|      0|	case FR_TYPE_VALUE_BOX:
  ------------------
  |  Branch (4495:2): [True: 0, False: 806]
  ------------------
 4496|      0|	case FR_TYPE_VALUE_BOX_CURSOR:
  ------------------
  |  Branch (4496:2): [True: 0, False: 806]
  ------------------
 4497|      0|	case FR_TYPE_PAIR_CURSOR:
  ------------------
  |  Branch (4497:2): [True: 0, False: 806]
  ------------------
 4498|      0|	case FR_TYPE_MAX:
  ------------------
  |  Branch (4498:2): [True: 0, False: 806]
  ------------------
 4499|      0|		fr_assert(0);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4500|      0|		fr_strerror_printf("Cannot copy data type '%s'", fr_type_to_str(src->type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4501|      0|		return -1;
 4502|    806|	}
 4503|       |
 4504|    806|	return 0;
 4505|    806|}
fr_value_box_copy_shallow:
 4519|      2|{
 4520|      2|	switch (src->type) {
 4521|      2|	default:
  ------------------
  |  Branch (4521:2): [True: 2, False: 0]
  ------------------
 4522|      2|		if (unlikely(fr_value_box_copy(NULL, dst, src) < 0)) return;
  ------------------
  |  |  397|      2|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 4523|      2|		break;
 4524|       |
 4525|      2|	case FR_TYPE_STRING:
  ------------------
  |  Branch (4525:2): [True: 0, False: 2]
  ------------------
 4526|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (4526:2): [True: 0, False: 2]
  ------------------
 4527|      0|		dst->datum.ptr = ctx ? talloc_reference(ctx, src->datum.ptr) : src->datum.ptr;
  ------------------
  |  Branch (4527:20): [True: 0, False: 0]
  ------------------
 4528|      0|		fr_value_box_copy_meta(dst, src);
 4529|      0|		break;
 4530|       |
 4531|      0|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (4531:2): [True: 0, False: 2]
  ------------------
 4532|      0|		dst->vb_attr = src->vb_attr;
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
              		dst->vb_attr = src->vb_attr;
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
 4533|      0|		fr_value_box_copy_meta(dst, src);
 4534|      0|		break;
 4535|       |
 4536|      0|	case FR_TYPE_VOID:
  ------------------
  |  Branch (4536:2): [True: 0, False: 2]
  ------------------
 4537|      0|		dst->vb_void = src->vb_void;
  ------------------
  |  |  260|      0|#define vb_void					datum.ptr
  ------------------
              		dst->vb_void = src->vb_void;
  ------------------
  |  |  260|      0|#define vb_void					datum.ptr
  ------------------
 4538|      0|		fr_value_box_copy_meta(dst, src);
 4539|      0|		break;
 4540|      2|	}
 4541|      2|}
fr_value_box_bstr_alloc:
 4766|    722|{
 4767|    722|	char	*str;
 4768|       |
 4769|    722|	str = talloc_zero_array(ctx, char, len + 1);
 4770|    722|	if (!str) {
  ------------------
  |  Branch (4770:6): [True: 0, False: 722]
  ------------------
 4771|      0|		fr_strerror_const("Failed allocating string buffer");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4772|      0|		return -1;
 4773|      0|	}
 4774|    722|	str[len] = '\0';
 4775|       |
 4776|    722|	fr_value_box_init(dst, FR_TYPE_STRING, enumv, tainted);
  ------------------
  |  |  610|    722|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|    722|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 4777|    722|	dst->vb_strvalue = str;
  ------------------
  |  |  258|    722|#define vb_strvalue				datum.strvalue
  ------------------
 4778|    722|	dst->vb_length = len;
  ------------------
  |  |  292|    722|#define vb_length				datum.length
  ------------------
 4779|       |
 4780|    722|	if (out) *out = str;
  ------------------
  |  Branch (4780:6): [True: 722, False: 0]
  ------------------
 4781|       |
 4782|    722|	return 0;
 4783|    722|}
fr_value_box_bstrndup:
 4840|    323|{
 4841|    323|	char const	*str;
 4842|       |
 4843|    323|	if (unlikely((len > 0) && !src)) {
  ------------------
  |  |  397|    646|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 323]
  |  |  |  Branch (397:43): [True: 323, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 323]
  |  |  ------------------
  ------------------
 4844|      0|		fr_strerror_printf("Invalid arguments to %s.  Len > 0 (%zu) but src string was NULL",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4845|      0|				   __FUNCTION__, len);
 4846|      0|		return -1;
 4847|      0|	}
 4848|       |
 4849|    323|	str = talloc_bstrndup(ctx, src, len);
 4850|    323|	if (!str) {
  ------------------
  |  Branch (4850:6): [True: 0, False: 323]
  ------------------
 4851|      0|		fr_strerror_const("Failed allocating string buffer");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 4852|      0|		return -1;
 4853|      0|	}
 4854|       |
 4855|    323|	fr_value_box_init(dst, FR_TYPE_STRING, enumv, tainted);
  ------------------
  |  |  610|    323|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|    323|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 4856|    323|	dst->vb_strvalue = str;
  ------------------
  |  |  258|    323|#define vb_strvalue				datum.strvalue
  ------------------
 4857|    323|	dst->vb_length = len;
  ------------------
  |  |  292|    323|#define vb_length				datum.length
  ------------------
 4858|       |
 4859|    323|	return 0;
 4860|    323|}
fr_value_box_bstrndup_dbuff:
 4864|  1.19k|{
 4865|  1.19k|	char	*str;
 4866|       |
 4867|  1.19k|	str = talloc_array(ctx, char, len + 1);
 4868|  1.19k|	if (!str) {
  ------------------
  |  Branch (4868:6): [True: 0, False: 1.19k]
  ------------------
 4869|      0|		fr_strerror_printf("Failed allocating string buffer");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 4870|      0|		return -1;
 4871|      0|	}
 4872|       |
 4873|  1.19k|	if (fr_dbuff_out_memcpy((uint8_t *)str, dbuff, len) < 0) {
  ------------------
  |  | 1742|  1.19k|	_Generic((_out), \
  |  | 1743|  1.19k|		 uint8_t *		: _fr_dbuff_out_memcpy((uint8_t *)(_out), \
  |  | 1744|  1.19k|		 					       _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  935|  1.19k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.19k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.19k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.19k|	))
  |  |  ------------------
  |  | 1745|  1.19k|		 					       fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  867|  1.19k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.19k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.19k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.19k|	)
  |  |  ------------------
  |  | 1746|  1.19k|		 					       _outlen), \
  |  | 1747|  1.19k|		 fr_dbuff_t *		: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_t *)_out), \
  |  |  ------------------
  |  |  |  |  935|  1.19k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.19k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.19k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.19k|	))
  |  |  ------------------
  |  | 1748|  1.19k|		 						     fr_dbuff_ptr((fr_dbuff_t *)(_out)), \
  |  |  ------------------
  |  |  |  |  867|  1.19k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.19k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.19k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.19k|	)
  |  |  ------------------
  |  | 1749|  1.19k|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  935|  1.19k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.19k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.19k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.19k|	))
  |  |  ------------------
  |  | 1750|  1.19k|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen), \
  |  |  ------------------
  |  |  |  |  867|  1.19k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.19k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.19k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.19k|	)
  |  |  ------------------
  |  | 1751|  1.19k|		 fr_dbuff_marker_t *	: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_marker_t *)_out), \
  |  |  ------------------
  |  |  |  |  935|  1.19k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.19k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.19k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.19k|	))
  |  |  ------------------
  |  | 1752|  1.19k|		 						     fr_dbuff_ptr((fr_dbuff_marker_t *)(_out)), \
  |  |  ------------------
  |  |  |  |  867|  1.19k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.19k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.19k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.19k|	)
  |  |  ------------------
  |  | 1753|  1.19k|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  935|  1.19k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.19k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.19k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.19k|	))
  |  |  ------------------
  |  | 1754|  1.19k|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen) \
  |  |  ------------------
  |  |  |  |  867|  1.19k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.19k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.19k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.19k|	)
  |  |  ------------------
  |  | 1755|  1.19k|	)
  ------------------
  |  Branch (4873:6): [True: 136, False: 1.05k]
  ------------------
 4874|    136|		talloc_free(str);
 4875|    136|		return -1;
 4876|    136|	}
 4877|  1.05k|	str[len] = '\0';
 4878|       |
 4879|  1.05k|	fr_value_box_init(dst, FR_TYPE_STRING, enumv, tainted);
  ------------------
  |  |  610|  1.05k|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|  1.05k|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 4880|  1.05k|	dst->vb_strvalue = str;
  ------------------
  |  |  258|  1.05k|#define vb_strvalue				datum.strvalue
  ------------------
 4881|  1.05k|	dst->vb_length = len;
  ------------------
  |  |  292|  1.05k|#define vb_length				datum.length
  ------------------
 4882|       |
 4883|  1.05k|	return 0;
 4884|  1.19k|}
fr_value_box_memdup:
 5081|  1.41k|{
 5082|  1.41k|	uint8_t *bin;
 5083|       |
 5084|  1.41k|	if (unlikely((len > 0) && !src)) {
  ------------------
  |  |  397|  2.83k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 1.41k]
  |  |  |  Branch (397:43): [True: 1.41k, False: 0]
  |  |  |  Branch (397:43): [True: 0, False: 1.41k]
  |  |  ------------------
  ------------------
 5085|      0|		fr_strerror_printf("Invalid arguments to %s.  Len > 0 (%zu) but src was NULL",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5086|      0|				   __FUNCTION__, len);
 5087|      0|		return -1;
 5088|      0|	}
 5089|       |
 5090|  1.41k|	bin = talloc_memdup(ctx, src, len);
 5091|  1.41k|	if (!bin) {
  ------------------
  |  Branch (5091:6): [True: 0, False: 1.41k]
  ------------------
 5092|      0|		fr_strerror_const("Failed allocating octets buffer");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5093|      0|		return -1;
 5094|      0|	}
 5095|  1.41k|	talloc_set_type(bin, uint8_t);
 5096|       |
 5097|  1.41k|	fr_value_box_init(dst, FR_TYPE_OCTETS, enumv, tainted);
  ------------------
  |  |  610|  1.41k|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|  1.41k|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 5098|  1.41k|	dst->vb_octets = bin;
  ------------------
  |  |  259|  1.41k|#define vb_octets				datum.octets
  ------------------
 5099|  1.41k|	dst->vb_length = len;
  ------------------
  |  |  292|  1.41k|#define vb_length				datum.length
  ------------------
 5100|       |
 5101|  1.41k|	return 0;
 5102|  1.41k|}
fr_value_box_memdup_dbuff:
 5106|  1.12k|{
 5107|  1.12k|	uint8_t *bin;
 5108|       |
 5109|  1.12k|	bin = talloc_size(ctx, len);
 5110|  1.12k|	if (!bin) {
  ------------------
  |  Branch (5110:6): [True: 0, False: 1.12k]
  ------------------
 5111|      0|		fr_strerror_printf("Failed allocating octets buffer");
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5112|      0|		return -1;
 5113|      0|	}
 5114|       |
 5115|  1.12k|	if (fr_dbuff_out_memcpy(bin, dbuff, len) < (ssize_t) len) {
  ------------------
  |  | 1742|  1.12k|	_Generic((_out), \
  |  | 1743|  1.12k|		 uint8_t *		: _fr_dbuff_out_memcpy((uint8_t *)(_out), \
  |  | 1744|  1.12k|		 					       _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  935|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.12k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.12k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.12k|	))
  |  |  ------------------
  |  | 1745|  1.12k|		 					       fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  867|  1.12k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.12k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.12k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.12k|	)
  |  |  ------------------
  |  | 1746|  1.12k|		 					       _outlen), \
  |  | 1747|  1.12k|		 fr_dbuff_t *		: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_t *)_out), \
  |  |  ------------------
  |  |  |  |  935|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.12k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.12k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.12k|	))
  |  |  ------------------
  |  | 1748|  1.12k|		 						     fr_dbuff_ptr((fr_dbuff_t *)(_out)), \
  |  |  ------------------
  |  |  |  |  867|  1.12k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.12k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.12k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.12k|	)
  |  |  ------------------
  |  | 1749|  1.12k|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  935|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.12k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.12k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.12k|	))
  |  |  ------------------
  |  | 1750|  1.12k|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen), \
  |  |  ------------------
  |  |  |  |  867|  1.12k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.12k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.12k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.12k|	)
  |  |  ------------------
  |  | 1751|  1.12k|		 fr_dbuff_marker_t *	: _fr_dbuff_out_memcpy_dbuff(_fr_dbuff_current_ptr((fr_dbuff_marker_t *)_out), \
  |  |  ------------------
  |  |  |  |  935|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.12k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.12k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.12k|	))
  |  |  ------------------
  |  | 1752|  1.12k|		 						     fr_dbuff_ptr((fr_dbuff_marker_t *)(_out)), \
  |  |  ------------------
  |  |  |  |  867|  1.12k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.12k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.12k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.12k|	)
  |  |  ------------------
  |  | 1753|  1.12k|		 						     _fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  ------------------
  |  |  |  |  935|  1.12k|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  936|  1.12k|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  937|  1.12k|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  938|  1.12k|	))
  |  |  ------------------
  |  | 1754|  1.12k|		 						     fr_dbuff_ptr(_dbuff_or_marker), _outlen) \
  |  |  ------------------
  |  |  |  |  867|  1.12k|	_Generic((_dbuff_or_marker), \
  |  |  |  |  868|  1.12k|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  869|  1.12k|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  870|  1.12k|	)
  |  |  ------------------
  |  | 1755|  1.12k|	)
  ------------------
  |  Branch (5115:6): [True: 0, False: 1.12k]
  ------------------
 5116|      0|		talloc_free(bin);
 5117|      0|		return -1;
 5118|      0|	}
 5119|  1.12k|	talloc_set_type(bin, uint8_t);
 5120|       |
 5121|  1.12k|	fr_value_box_init(dst, FR_TYPE_OCTETS, enumv, tainted);
  ------------------
  |  |  610|  1.12k|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|  1.12k|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 5122|  1.12k|	dst->vb_octets = bin;
  ------------------
  |  |  259|  1.12k|#define vb_octets				datum.octets
  ------------------
 5123|  1.12k|	dst->vb_length = len;
  ------------------
  |  |  292|  1.12k|#define vb_length				datum.length
  ------------------
 5124|       |
 5125|  1.12k|	return 0;
 5126|  1.12k|}
fr_value_box_from_substr:
 5411|    726|{
 5412|    726|	static fr_sbuff_parse_rules_t	default_rules;
 5413|    726|	fr_sbuff_t			*unescaped = NULL;
 5414|    726|	fr_sbuff_t			our_in = FR_SBUFF(in);
  ------------------
  |  |  451|    726|#define FR_SBUFF(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|    726|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|    726|((fr_sbuff_t){ \
  |  |  |  |  430|    726|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|    726|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|    726|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|    726|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  431|    726|	.start		= (_start), \
  |  |  |  |  432|    726|	.end		= (_end), \
  |  |  |  |  433|    726|	.p		= (_current), \
  |  |  |  |  434|    726|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    726|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  435|    726|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|    726|	.shifted	= 0, \
  |  |  |  |  437|    726|	.extend		= (_extend), \
  |  |  |  |  438|    726|	.eof		= (_eof), \
  |  |  |  |  439|    726|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    726|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  440|    726|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|    726|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|    726|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|    726|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|    726|	)
  |  |  |  |  ------------------
  |  |  |  |  441|    726|})
  |  |  ------------------
  |  |  452|    726|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  453|    726|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  454|    726|					     fr_sbuff_end(_sbuff_or_marker), \
  |  |  455|    726|					     fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  456|    726|					     fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  457|    726|					     0x00)
  ------------------
 5415|    726|	fr_ipaddr_t			addr;
 5416|    726|	fr_slen_t			slen;
 5417|    726|	char				buffer[256];
 5418|       |
 5419|    726|	if (!rules) rules = &default_rules;
  ------------------
  |  Branch (5419:6): [True: 0, False: 726]
  ------------------
 5420|       |
 5421|    726|	fr_strerror_clear();
 5422|       |
 5423|       |	/*
 5424|       |	 *	Lookup any names before continuing
 5425|       |	 */
 5426|    726|	if (dst_enumv && dst_enumv->flags.has_value && (dst_type != FR_TYPE_ATTR)) {
  ------------------
  |  Branch (5426:6): [True: 0, False: 726]
  |  Branch (5426:19): [True: 0, False: 0]
  |  Branch (5426:49): [True: 0, False: 0]
  ------------------
 5427|      0|		size_t				name_len;
 5428|      0|		fr_dict_enum_value_t const	*enumv;
 5429|       |
 5430|       |		/*
 5431|       |		 *	@todo - allow enum names for IPv6 addresses and prefixes.  See also
 5432|       |		 *	tmpl_afrom_enum().
 5433|       |		 */
 5434|      0|		(void) fr_sbuff_adv_past_str_literal(&our_in, "::");
  ------------------
  |  | 1712|      0|#define fr_sbuff_adv_past_str_literal(_sbuff, _needle) fr_sbuff_adv_past_str(_sbuff, _needle, sizeof(_needle) - 1)
  ------------------
 5435|       |
 5436|       |		/*
 5437|       |		 *	If there is no escaping, then we ignore the terminals.  The list of allowed characters
 5438|       |		 *	in enum names will ensure that the parsing doesn't go too far.  i.e. to '\r', '\n'. '}', etc.
 5439|       |		 *
 5440|       |		 *	The reason is that the list of terminals may include things like '-', which is also a
 5441|       |		 *	valid character in enum names.  We don't want to parse "Framed-User" as "Framed - User".
 5442|       |		 */
 5443|      0|		if (!rules->escapes) {
  ------------------
  |  Branch (5443:7): [True: 0, False: 0]
  ------------------
 5444|      0|			size_t len;
 5445|      0|			fr_sbuff_marker_t m;
 5446|       |
 5447|      0|			fr_sbuff_marker(&m, &our_in);
 5448|       |
 5449|      0|			len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in),
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5450|      0|							fr_dict_enum_allowed_chars, NULL);
 5451|      0|			fr_sbuff_set(&our_in, &m);
  ------------------
  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  | 1163|      0|_Generic((_dst), \
  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  | 1166|      0|)(_dst, \
  |  | 1167|      0|_Generic((_src), \
  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  | 1175|      0|))
  ------------------
 5452|      0|			fr_sbuff_marker_release(&m);
 5453|       |
 5454|      0|			if (!len) goto parse; /* Zero length name can't match enum */
  ------------------
  |  Branch (5454:8): [True: 0, False: 0]
  ------------------
 5455|       |
 5456|      0|			enumv = fr_dict_enum_by_name(dst_enumv, fr_sbuff_current(&our_in), len);
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
 5457|      0|			if (!enumv) {
  ------------------
  |  Branch (5457:8): [True: 0, False: 0]
  ------------------
 5458|      0|				goto parse;	/* No enumeration matches escaped string */
 5459|      0|			}
 5460|       |
 5461|      0|			(void) fr_sbuff_advance(&our_in, len);
  ------------------
  |  | 1194|      0|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5462|      0|			goto cast_enum;
 5463|      0|		}
 5464|       |
 5465|       |		/*
 5466|       |		 *	Create a thread-local extensible buffer to
 5467|       |		 *	store unescaped data.
 5468|       |		 *
 5469|       |		 *	This is created once per-thread (the first time
 5470|       |		 *	this function is called), and freed when the
 5471|       |		 *	thread exits.
 5472|       |		 */
 5473|      0|		FR_SBUFF_TALLOC_THREAD_LOCAL(&unescaped, 256, 4096);
  ------------------
  |  |  600|      0|#define FR_SBUFF_TALLOC_THREAD_LOCAL(_out, _init, _max) \
  |  |  601|      0|do { \
  |  |  602|      0|	static _Thread_local fr_sbuff_thread_local_t *_sbuff_t_local; \
  |  |  603|      0|	if (!_sbuff_t_local) { \
  |  |  ------------------
  |  |  |  Branch (603:6): [True: 0, False: 0]
  |  |  ------------------
  |  |  604|      0|		fr_sbuff_thread_local_t *sbtl = talloc_zero(NULL, fr_sbuff_thread_local_t); \
  |  |  605|      0|		fr_sbuff_init_talloc(sbtl, &sbtl->sbuff, &sbtl->tctx, _init, _max); \
  |  |  606|      0|		fr_atexit_thread_local(_sbuff_t_local, _sbuff_thread_local_free, sbtl); \
  |  |  ------------------
  |  |  |  |  185|      0|#  define fr_atexit_thread_local(_name, _free, _uctx) \
  |  |  |  |  186|      0|do { \
  |  |  |  |  187|      0|	void *_our_uctx = _uctx; /* stop _uctx being evaluated multiple times, it may be a call to malloc() */ \
  |  |  |  |  188|      0|	_fr_atexit_thread_local(__FILE__, __LINE__, _free, _our_uctx); \
  |  |  |  |  189|      0|	_name = _our_uctx; \
  |  |  |  |  190|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (190:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  607|      0|		*(_out) = &_sbuff_t_local->sbuff; \
  |  |  608|      0|	} else { \
  |  |  609|      0|		fr_sbuff_reset_talloc(&_sbuff_t_local->sbuff); \
  |  |  610|      0|		*(_out) = &_sbuff_t_local->sbuff; \
  |  |  611|      0|	} \
  |  |  612|      0|} while (0)
  |  |  ------------------
  |  |  |  Branch (612:10): [Folded, False: 0]
  |  |  ------------------
  ------------------
 5474|       |
 5475|       |		/*
 5476|       |		 *	This function only does escaping until a terminal character, such as '-'.  So
 5477|       |		 *	Framed-User will get parsed as "Framed - User".
 5478|       |		 *
 5479|       |		 *	Pretty much no other enum has this problem. For Service-Type, it defines "Framed" ss
 5480|       |		 *	an equivalent name to "Framed-User".  The parser sees "Framed-User", stops at the '-',
 5481|       |		 *	and then finds the enum named "Framed".  It then returns the trailing "-User" as
 5482|       |		 *	something more to parse.
 5483|       |		 *
 5484|       |		 *	As a result, when the user passes in "Framed-User", the output is "Framed-User -
 5485|       |		 *	User", which is more than a bit surprising.
 5486|       |		 */
 5487|      0|		name_len = fr_sbuff_out_unescape_until(unescaped, &our_in, SIZE_MAX,
 5488|      0|						       rules->terminals, rules->escapes);
 5489|      0|		if (!name_len) {
  ------------------
  |  Branch (5489:7): [True: 0, False: 0]
  ------------------
 5490|      0|			fr_sbuff_set_to_start(&our_in);
 5491|      0|			goto parse;	/* Zero length name can't match enum */
 5492|      0|		}
 5493|       |
 5494|      0|		enumv = fr_dict_enum_by_name(dst_enumv, fr_sbuff_start(unescaped), fr_sbuff_used(unescaped));
  ------------------
  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  833|      0|	))
  ------------------
              		enumv = fr_dict_enum_by_name(dst_enumv, fr_sbuff_start(unescaped), fr_sbuff_used(unescaped));
  ------------------
  |  |  940|      0|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (940:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  941|      0|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  ------------------
 5495|      0|		if (!enumv) {
  ------------------
  |  Branch (5495:7): [True: 0, False: 0]
  ------------------
 5496|      0|			fr_sbuff_set_to_start(&our_in);
 5497|      0|			goto parse;	/* No enumeration matches escaped string */
 5498|      0|		}
 5499|       |
 5500|      0|	cast_enum:
 5501|       |		/*
 5502|       |		 *	dst_type may not match enumv type
 5503|       |		 */
 5504|      0|		if (fr_value_box_cast(ctx, dst, dst_type, dst_enumv, enumv->value) < 0) return -1;
  ------------------
  |  Branch (5504:7): [True: 0, False: 0]
  ------------------
 5505|       |
 5506|      0|		FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5507|      0|	}
 5508|       |
 5509|    726|parse:
 5510|       |	/*
 5511|       |	 *	It's a variable ret src->dst_type so we just alloc a new buffer
 5512|       |	 *	of size len and copy.
 5513|       |	 */
 5514|    726|	switch (dst_type) {
 5515|      0|	case FR_TYPE_STRING:
  ------------------
  |  Branch (5515:2): [True: 0, False: 726]
  ------------------
 5516|       |		/*
 5517|       |		 *	We've not unescaped the string yet, produce an unescaped version
 5518|       |		 */
 5519|      0|		if (!dst_enumv || !unescaped) {
  ------------------
  |  Branch (5519:7): [True: 0, False: 0]
  |  Branch (5519:21): [True: 0, False: 0]
  ------------------
 5520|      0|			char *buff;
 5521|       |
 5522|      0|			if (unlikely(fr_sbuff_out_aunescape_until(ctx, &buff, &our_in, SIZE_MAX,
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 5523|      0|								  rules->terminals, rules->escapes) < 0)) {
 5524|      0|				return -1;
 5525|      0|			}
 5526|      0|			fr_value_box_bstrdup_buffer_shallow(NULL, dst, dst_enumv, buff, false);
 5527|       |		/*
 5528|       |		 *	We already have an unescaped version, just use that
 5529|       |		 */
 5530|      0|		} else {
 5531|      0|			fr_value_box_bstrndup(ctx, dst, dst_enumv,
 5532|      0|					      fr_sbuff_start(unescaped), fr_sbuff_used(unescaped), false);
  ------------------
  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  833|      0|	))
  ------------------
              					      fr_sbuff_start(unescaped), fr_sbuff_used(unescaped), false);
  ------------------
  |  |  940|      0|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (940:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  941|      0|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  ------------------
 5533|      0|		}
 5534|      0|		FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5535|       |
 5536|       |	/* raw octets: 0x01020304... */
 5537|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (5537:2): [True: 0, False: 726]
  ------------------
 5538|      0|	{
 5539|      0|		fr_sbuff_marker_t	hex_start;
 5540|      0|		size_t			hex_len;
 5541|      0|		uint8_t			*bin_buff;
 5542|       |
 5543|       |		/*
 5544|       |		 *	If there's escape sequences that need to be processed
 5545|       |		 *	or the string doesn't start with 0x, then assume this
 5546|       |		 *	is literal data, not hex encoded data.
 5547|       |		 */
 5548|      0|		if (rules->escapes || !fr_sbuff_adv_past_strcase_literal(&our_in, "0x")) {
  ------------------
  |  | 1716|      0|#define fr_sbuff_adv_past_strcase_literal(_sbuff, _needle) fr_sbuff_adv_past_strcase(_sbuff, _needle, sizeof(_needle) - 1)
  ------------------
  |  Branch (5548:7): [True: 0, False: 0]
  |  Branch (5548:25): [True: 0, False: 0]
  ------------------
 5549|      0|			if (!dst_enumv || !unescaped) {
  ------------------
  |  Branch (5549:8): [True: 0, False: 0]
  |  Branch (5549:22): [True: 0, False: 0]
  ------------------
 5550|      0|				char	*buff = NULL;
 5551|      0|				uint8_t	*bin;
 5552|       |
 5553|      0|				if (fr_sbuff_extend(&our_in)) {
  ------------------
  |  | 1099|      0|#define fr_sbuff_extend(_sbuff_or_marker) fr_sbuff_extend_lowat(NULL, _sbuff_or_marker, 1)
  |  |  ------------------
  |  |  |  | 1074|      0|	_fr_sbuff_extend_lowat(_status, \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1074:2): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1075|      0|			       fr_sbuff_ptr(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  | 1076|      0|			       fr_sbuff_remaining(_sbuff_or_marker), _lowat)
  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  |  |  |  |  862|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5554|      0|					fr_sbuff_out_aunescape_until(ctx, &buff, &our_in, SIZE_MAX,
 5555|      0|								     rules->terminals, rules->escapes);
 5556|       |
 5557|      0|					if (talloc_strlen(buff) == 0) {
  ------------------
  |  Branch (5557:10): [True: 0, False: 0]
  ------------------
 5558|      0|						talloc_free(buff);
 5559|      0|						goto zero;
 5560|      0|					}
 5561|       |
 5562|       |					/*
 5563|       |					 *	Trim off the trailing '\0', and change the data type.
 5564|       |					 */
 5565|      0|					bin = talloc_typed_memdup(ctx, (uint8_t *) buff, talloc_strlen(buff));
 5566|      0|					if (unlikely(!bin)) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 5567|      0|						fr_strerror_const("Failed trimming string buffer");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5568|      0|						talloc_free(buff);
 5569|      0|						return -1;
 5570|      0|					}
 5571|       |
 5572|       |				/*
 5573|       |				 *	Input data is zero
 5574|       |				 *
 5575|       |				 *	talloc realloc will refuse to realloc to
 5576|       |				 *	a zero length buffer.  This is probably
 5577|       |				 *	a bug, because we can create zero length
 5578|       |				 *	arrays normally
 5579|       |				 */
 5580|      0|				} else {
 5581|      0|				zero:
 5582|      0|					bin = talloc_zero_array(ctx, uint8_t, 0);
 5583|      0|				}
 5584|       |
 5585|      0|				fr_value_box_memdup_buffer_shallow(NULL, dst, dst_enumv, bin, false);
 5586|       |			/*
 5587|       |			 *	We already have an unescaped version, just use that
 5588|       |			 */
 5589|      0|			} else {
 5590|      0|				fr_value_box_memdup(ctx, dst, dst_enumv,
 5591|      0|						    (uint8_t *)fr_sbuff_start(unescaped),
  ------------------
  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  833|      0|	))
  ------------------
 5592|      0|						    fr_sbuff_used(unescaped), false);
  ------------------
  |  |  940|      0|	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_start(_sbuff_or_marker) > fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (940:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  941|      0|		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_current(_sbuff_or_marker) - fr_sbuff_start(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  ------------------
 5593|      0|			}
 5594|      0|			FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5595|      0|		}
 5596|       |
 5597|      0|		fr_sbuff_marker(&hex_start, &our_in);	/* Record where the hexits start */
 5598|       |
 5599|       |		/*
 5600|       |		 *	Find the end of the hex sequence.
 5601|       |		 *
 5602|       |		 *	We don't technically need to do this, fr_base16_decode
 5603|       |		 *	will find the end on its own.
 5604|       |		 *
 5605|       |		 *	We do this so we can alloc the correct sized
 5606|       |		 *	output buffer.
 5607|       |		 */
 5608|      0|		hex_len = fr_sbuff_adv_past_allowed(&our_in, SIZE_MAX, sbuff_char_class_hex, rules->terminals);
 5609|      0|		if (hex_len == 0) {
  ------------------
  |  Branch (5609:7): [True: 0, False: 0]
  ------------------
 5610|      0|			if (fr_value_box_memdup(ctx, dst, dst_enumv, (uint8_t[]){ 0x00 }, 0, false) < 0) return -1;
  ------------------
  |  Branch (5610:8): [True: 0, False: 0]
  ------------------
 5611|      0|			FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5612|      0|		}
 5613|       |
 5614|      0|		if ((hex_len & 0x01) != 0) {
  ------------------
  |  Branch (5614:7): [True: 0, False: 0]
  ------------------
 5615|      0|			fr_strerror_printf("Length of hex string is not even, got %zu bytes", hex_len);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5616|      0|			FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5617|      0|		}
 5618|       |
 5619|       |		/*
 5620|       |		 *	Pre-allocate the bin buff and initialise the box
 5621|       |		 */
 5622|      0|		if (fr_value_box_mem_alloc(ctx, &bin_buff, dst, dst_enumv, (hex_len >> 1), false) < 0) return -1;
  ------------------
  |  Branch (5622:7): [True: 0, False: 0]
  ------------------
 5623|       |
 5624|       |		/*
 5625|       |		 *	Reset to the start of the hex string
 5626|       |		 */
 5627|      0|		fr_sbuff_set(&our_in, &hex_start);
  ------------------
  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  | 1163|      0|_Generic((_dst), \
  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  | 1166|      0|)(_dst, \
  |  | 1167|      0|_Generic((_src), \
  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  | 1175|      0|))
  ------------------
 5628|       |
 5629|      0|		if (unlikely(fr_base16_decode(NULL, &FR_DBUFF_TMP(bin_buff, hex_len), &our_in, false) < 0)) {
  ------------------
  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  ------------------
  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 5630|      0|			talloc_free(bin_buff);
 5631|      0|			FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5632|      0|		}
 5633|       |
 5634|      0|		FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5635|      0|	}
 5636|       |
 5637|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (5637:2): [True: 0, False: 726]
  ------------------
 5638|      0|	{
 5639|      0|		size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5640|      0|		if (!name_len) goto empty_is_invalid;
  ------------------
  |  Branch (5640:7): [True: 0, False: 0]
  ------------------
 5641|       |
 5642|      0|		if (fr_inet_pton4(&addr, fr_sbuff_current(in), name_len,
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
  |  Branch (5642:7): [True: 0, False: 0]
  ------------------
 5643|      0|				  fr_hostname_lookups, false, true) < 0) return -1;
 5644|       |
 5645|       |		/*
 5646|       |		 *	We allow v4 addresses to have a /32 suffix as some databases (PostgreSQL)
 5647|       |		 *	print them this way.
 5648|       |		 */
 5649|      0|		if (addr.prefix != 32) {
  ------------------
  |  Branch (5649:7): [True: 0, False: 0]
  ------------------
 5650|      0|		fail_ipv4_prefix:
 5651|      0|			fr_strerror_printf("Invalid IPv4 mask length \"/%i\".  Only \"/32\" permitted "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5652|      0|					   "for non-prefix types", addr.prefix);
 5653|      0|			return -1;
 5654|      0|		}
 5655|       |
 5656|      0|		memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 5657|      0|	}
 5658|      0|		goto finish;
 5659|       |
 5660|      0|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (5660:2): [True: 0, False: 726]
  ------------------
 5661|      0|	{
 5662|      0|		size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5663|      0|		if (!name_len) goto empty_is_invalid;
  ------------------
  |  Branch (5663:7): [True: 0, False: 0]
  ------------------
 5664|       |
 5665|      0|		if (fr_inet_pton4(&dst->vb_ip, fr_sbuff_current(in), name_len,
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		if (fr_inet_pton4(&dst->vb_ip, fr_sbuff_current(in), name_len,
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
  |  Branch (5665:7): [True: 0, False: 0]
  ------------------
 5666|      0|				  fr_hostname_lookups, false, true) < 0) return -1;
 5667|      0|	}
 5668|      0|		goto finish;
 5669|       |
 5670|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (5670:2): [True: 0, False: 726]
  ------------------
 5671|      0|	{
 5672|      0|		size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5673|      0|		if (!name_len) goto empty_is_invalid;
  ------------------
  |  Branch (5673:7): [True: 0, False: 0]
  ------------------
 5674|       |
 5675|       |		/*
 5676|       |		 *	Parse scope, too.
 5677|       |		 */
 5678|      0|		if (fr_sbuff_next_if_char(&our_in, '%')) {
  ------------------
  |  Branch (5678:7): [True: 0, False: 0]
  ------------------
 5679|      0|			name_len += fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_uint, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5680|      0|		}
 5681|       |
 5682|      0|		if (fr_inet_pton6(&addr, fr_sbuff_current(in), name_len,
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
  |  Branch (5682:7): [True: 0, False: 0]
  ------------------
 5683|      0|				  fr_hostname_lookups, false, true) < 0) return -1;
 5684|       |
 5685|       |		/*
 5686|       |		 *	We allow v6 addresses to have a /128 suffix as some databases (PostgreSQL)
 5687|       |		 *	print them this way.
 5688|       |		 */
 5689|      0|		if (addr.prefix != 128) {
  ------------------
  |  Branch (5689:7): [True: 0, False: 0]
  ------------------
 5690|      0|		fail_ipv6_prefix:
 5691|      0|			fr_strerror_printf("Invalid IPv6 mask length \"/%i\".  Only \"/128\" permitted "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5692|      0|					   "for non-prefix types", addr.prefix);
 5693|      0|			return -1;
 5694|      0|		}
 5695|       |
 5696|      0|		memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 5697|      0|	}
 5698|      0|		goto finish;
 5699|       |
 5700|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (5700:2): [True: 0, False: 726]
  ------------------
 5701|      0|	{
 5702|      0|		size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5703|      0|		if (!name_len) goto empty_is_invalid;
  ------------------
  |  Branch (5703:7): [True: 0, False: 0]
  ------------------
 5704|       |
 5705|      0|		if (fr_inet_pton6(&dst->vb_ip, fr_sbuff_current(in), name_len,
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		if (fr_inet_pton6(&dst->vb_ip, fr_sbuff_current(in), name_len,
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
  |  Branch (5705:7): [True: 0, False: 0]
  ------------------
 5706|      0|				  fr_hostname_lookups, false, true) < 0) return -1;
 5707|      0|	}
 5708|      0|		goto finish;
 5709|       |
 5710|      0|	case FR_TYPE_COMBO_IP_ADDR:
  ------------------
  |  Branch (5710:2): [True: 0, False: 726]
  ------------------
 5711|      0|	{
 5712|      0|		size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5713|      0|		if (!name_len) goto empty_is_invalid;
  ------------------
  |  Branch (5713:7): [True: 0, False: 0]
  ------------------
 5714|       |
 5715|       |		/*
 5716|       |		 *	Parse scope, too.
 5717|       |		 */
 5718|      0|		if (fr_sbuff_next_if_char(&our_in, '%')) {
  ------------------
  |  Branch (5718:7): [True: 0, False: 0]
  ------------------
 5719|      0|			name_len += fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_uint, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5720|      0|		}
 5721|       |
 5722|      0|		if (fr_inet_pton(&addr, fr_sbuff_current(in), name_len, AF_UNSPEC,
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
  |  Branch (5722:7): [True: 0, False: 0]
  ------------------
 5723|      0|				 fr_hostname_lookups, true) < 0) return -1;
 5724|       |
 5725|      0|		if ((addr.af == AF_INET) && (addr.prefix != 32)) {
  ------------------
  |  Branch (5725:7): [True: 0, False: 0]
  |  Branch (5725:31): [True: 0, False: 0]
  ------------------
 5726|      0|			goto fail_ipv4_prefix;
 5727|      0|		}
 5728|       |
 5729|      0|		if ((addr.af == AF_INET6) && (addr.prefix != 128)) {
  ------------------
  |  Branch (5729:7): [True: 0, False: 0]
  |  Branch (5729:32): [True: 0, False: 0]
  ------------------
 5730|      0|			goto fail_ipv6_prefix;
 5731|      0|		}
 5732|       |
 5733|      0|		memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 5734|      0|	}
 5735|      0|		goto finish;
 5736|       |
 5737|      0|	case FR_TYPE_COMBO_IP_PREFIX:
  ------------------
  |  Branch (5737:2): [True: 0, False: 726]
  ------------------
 5738|      0|	{
 5739|      0|		size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals);
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5740|      0|		if (!name_len) goto empty_is_invalid;
  ------------------
  |  Branch (5740:7): [True: 0, False: 0]
  ------------------
 5741|       |
 5742|      0|		if (fr_inet_pton(&dst->vb_ip, fr_sbuff_current(in), name_len, AF_UNSPEC,
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		if (fr_inet_pton(&dst->vb_ip, fr_sbuff_current(in), name_len, AF_UNSPEC,
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
  |  Branch (5742:7): [True: 0, False: 0]
  ------------------
 5743|      0|				  fr_hostname_lookups, true) < 0) return -1;
 5744|      0|	}
 5745|      0|		goto finish;
 5746|       |
 5747|    272|	case FR_TYPE_UINT8:
  ------------------
  |  Branch (5747:2): [True: 272, False: 454]
  ------------------
 5748|    462|	case FR_TYPE_UINT16:
  ------------------
  |  Branch (5748:2): [True: 190, False: 536]
  ------------------
 5749|    722|	case FR_TYPE_UINT32:
  ------------------
  |  Branch (5749:2): [True: 260, False: 466]
  ------------------
 5750|    722|	case FR_TYPE_UINT64:
  ------------------
  |  Branch (5750:2): [True: 0, False: 726]
  ------------------
 5751|    722|	case FR_TYPE_INT8:
  ------------------
  |  Branch (5751:2): [True: 0, False: 726]
  ------------------
 5752|    722|	case FR_TYPE_INT16:
  ------------------
  |  Branch (5752:2): [True: 0, False: 726]
  ------------------
 5753|    722|	case FR_TYPE_INT32:
  ------------------
  |  Branch (5753:2): [True: 0, False: 726]
  ------------------
 5754|    722|	case FR_TYPE_INT64:
  ------------------
  |  Branch (5754:2): [True: 0, False: 726]
  ------------------
 5755|    722|	case FR_TYPE_FLOAT32:
  ------------------
  |  Branch (5755:2): [True: 0, False: 726]
  ------------------
 5756|    722|	case FR_TYPE_FLOAT64:
  ------------------
  |  Branch (5756:2): [True: 0, False: 726]
  ------------------
 5757|    722|		return fr_value_box_from_numeric_substr(dst, dst_type, dst_enumv, in, rules, false);
 5758|       |
 5759|      0|	case FR_TYPE_SIZE:
  ------------------
  |  Branch (5759:2): [True: 0, False: 726]
  ------------------
 5760|      0|		if (fr_size_from_str(&dst->datum.size, &our_in) < 0) return -1;
  ------------------
  |  Branch (5760:7): [True: 0, False: 0]
  ------------------
 5761|      0|		goto finish;
 5762|       |
 5763|      4|	case FR_TYPE_BOOL:
  ------------------
  |  Branch (5763:2): [True: 4, False: 722]
  ------------------
 5764|      4|		fr_value_box_init(dst, dst_type, dst_enumv, false);
  ------------------
  |  |  610|      4|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      4|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 5765|       |
 5766|       |		/*
 5767|       |		 *	Quoted boolean values are "yes", "no", "true", "false"
 5768|       |		 */
 5769|      4|		slen = fr_sbuff_out(NULL, &dst->vb_bool, in);
  ------------------
  |  | 1685|      4|	_Generic((_out), \
  |  | 1686|      4|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      4|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      4|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      4|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      4|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      4|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      4|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      4|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      4|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      4|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      4|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      4|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      4|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      4|	)
  ------------------
 5770|      4|		if (slen > 0) return slen;
  ------------------
  |  Branch (5770:7): [True: 0, False: 4]
  ------------------
 5771|       |
 5772|       |		/*
 5773|       |		 *	For barewords we also allow 0 for false and any other
 5774|       |		 *      integer value for true.
 5775|       |		 */
 5776|      4|		if (!rules->escapes) {
  ------------------
  |  Branch (5776:7): [True: 4, False: 0]
  ------------------
 5777|      4|			int64_t	stmp;
 5778|      4|			uint64_t utmp;
 5779|       |
 5780|      4|			slen = fr_sbuff_out(NULL, &stmp, in);
  ------------------
  |  | 1685|      4|	_Generic((_out), \
  |  | 1686|      4|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      4|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      4|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      4|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      4|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      4|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      4|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      4|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      4|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      4|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      4|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      4|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      4|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      4|	)
  ------------------
 5781|      4|			if (slen >= 0) {
  ------------------
  |  Branch (5781:8): [True: 4, False: 0]
  ------------------
 5782|      4|				dst->vb_bool = (stmp != 0);
  ------------------
  |  |  271|      4|#define vb_bool					datum.boolean
  ------------------
 5783|      4|				return slen;
 5784|      4|			}
 5785|       |
 5786|      0|			slen = fr_sbuff_out(NULL, &utmp, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5787|      0|			if (slen >= 0) {
  ------------------
  |  Branch (5787:8): [True: 0, False: 0]
  ------------------
 5788|      0|				dst->vb_bool = (utmp != 0);
  ------------------
  |  |  271|      0|#define vb_bool					datum.boolean
  ------------------
 5789|      0|				return slen;
 5790|      0|			}
 5791|      0|		}
 5792|       |
 5793|      0|		fr_strerror_const("Invalid boolean value.  Accepted values are "
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5794|      0|				 "\"yes\", \"no\", \"true\", \"false\" or any unquoted integer");
 5795|       |
 5796|      0|		return slen;	/* Just whatever the last error offset was */
 5797|       |
 5798|      0|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (5798:2): [True: 0, False: 726]
  ------------------
 5799|      0|	{
 5800|      0|		uint64_t 		num;
 5801|      0|		fr_ethernet_t		ether;
 5802|      0|		fr_dbuff_t		dbuff;
 5803|      0|		fr_sbuff_parse_error_t	err;
 5804|       |
 5805|      0|		fr_dbuff_init(&dbuff, ether.addr, sizeof(ether.addr));
  ------------------
  |  |  362|      0|#define fr_dbuff_init(_out, _start, _len_or_end) \
  |  |  363|      0|_fr_dbuff_init(_out, \
  |  |  364|      0|	       (uint8_t const *)(_start), \
  |  |  365|      0|	       _Generic((_len_or_end), \
  |  |  366|      0|			size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  367|      0|			long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  368|      0|			int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  369|      0|			unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  370|      0|			uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  371|      0|			uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  372|      0|			char *		: (uint8_t const *)(_len_or_end), \
  |  |  373|      0|			char const *	: (uint8_t const *)(_len_or_end) \
  |  |  374|      0|	       ), \
  |  |  375|      0|	       _Generic((_start), \
  |  |  376|      0|			uint8_t *	: false, \
  |  |  377|      0|			uint8_t const *	: true, \
  |  |  378|      0|			char *		: false, \
  |  |  379|      0|			char const *	: true \
  |  |  380|      0|	       ))
  ------------------
 5806|       |
 5807|       |		/*
 5808|       |		 *	Convert things which are obviously integers to Ethernet addresses
 5809|       |		 *
 5810|       |		 *	We assume the number is the decimal
 5811|       |		 *	representation of the ethernet address.
 5812|       |		 *	i.e. the ethernet address converted to a
 5813|       |		 *	number, and printed.
 5814|       |		 *
 5815|       |		 *	The string gets converted to a network-order
 5816|       |		 *	8-byte number, and then the lower bytes of
 5817|       |		 *	that get copied to the ethernet address.
 5818|       |		 *
 5819|       |		 *	Note: We need to check for a terminal sequence
 5820|       |		 *	after the number, else we may just end up
 5821|       |		 *	parsing the first hexit and returning.
 5822|       |		 *
 5823|       |		 *	i.e. 1c:00:00:00:00 -> 1
 5824|       |		 */
 5825|      0|		if ((fr_sbuff_out(NULL, &num, &our_in) > 0) && fr_sbuff_is_terminal(&our_in, rules->terminals)) {
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
  |  Branch (5825:7): [True: 0, False: 0]
  |  Branch (5825:50): [True: 0, False: 0]
  ------------------
 5826|      0|			num = htonll(num);
  ------------------
  |  |  502|      0|#  define htonll(x) ntohll(x)
  |  |  ------------------
  |  |  |  |  495|      0|#      define ntohll(x) ((uint64_t)__builtin_bswap64(x))
  |  |  ------------------
  ------------------
 5827|       |
 5828|      0|			FR_DBUFF_IN_MEMCPY_RETURN(&dbuff, ((uint8_t *) &num) + 2, sizeof(dst->vb_ether));
  ------------------
  |  | 1391|      0|#define FR_DBUFF_IN_MEMCPY_RETURN(_dbuff_or_marker, _in, _inlen) FR_DBUFF_RETURN(fr_dbuff_in_memcpy, _dbuff_or_marker, _in, _inlen)
  |  |  ------------------
  |  |  |  |  184|      0|#define FR_DBUFF_RETURN(_func, ...) \
  |  |  |  |  185|      0|do { \
  |  |  |  |  186|      0|	ssize_t _slen = _func(__VA_ARGS__ ); \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1391|      0|#define FR_DBUFF_IN_MEMCPY_RETURN(_dbuff_or_marker, _in, _inlen) FR_DBUFF_RETURN(fr_dbuff_in_memcpy, _dbuff_or_marker, _in, _inlen)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1360|      0|	_Generic((_in), \
  |  |  |  |  |  |  |  | 1361|      0|		uint8_t *		: _fr_dbuff_in_memcpy(_fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1362|      0|							      fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1363|      0|							      (uint8_t const *)(_in), \
  |  |  |  |  |  |  |  | 1364|      0|							      _inlen), \
  |  |  |  |  |  |  |  | 1365|      0|		uint8_t const *		: _fr_dbuff_in_memcpy(_fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1366|      0|							      fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1367|      0|							      (uint8_t const *)(_in), \
  |  |  |  |  |  |  |  | 1368|      0|							      _inlen), \
  |  |  |  |  |  |  |  | 1369|      0|		char *			: _fr_dbuff_in_memcpy(_fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1370|      0|							      fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1371|      0|							      (uint8_t const *)(_in), \
  |  |  |  |  |  |  |  | 1372|      0|							      (size_t)(_inlen) == SIZE_MAX ? strlen((char const *)(_in)) : (_inlen)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1372:14): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1373|      0|		char const *		: _fr_dbuff_in_memcpy(_fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1374|      0|							      fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1375|      0|							      (uint8_t const *)(_in), \
  |  |  |  |  |  |  |  | 1376|      0|							      (size_t)(_inlen) == SIZE_MAX ? strlen((char const *)(_in)) : (_inlen)), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1376:14): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1377|      0|		fr_dbuff_t *		: _fr_dbuff_in_memcpy_dbuff(_fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1378|      0|								    fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1379|      0|								    &((fr_dbuff_t const *)(_in))->p, \
  |  |  |  |  |  |  |  | 1380|      0|								    ((fr_dbuff_t const *)(_in)), \
  |  |  |  |  |  |  |  | 1381|      0|								    _inlen), \
  |  |  |  |  |  |  |  | 1382|      0|		fr_dbuff_marker_t *	: _fr_dbuff_in_memcpy_dbuff(_fr_dbuff_current_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  935|      0|	(_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  936|      0|		  fr_dbuff_t *			: &(((fr_dbuff_t *)(_dbuff_or_marker))->p), \
  |  |  |  |  |  |  |  |  |  |  937|      0|		  fr_dbuff_marker_t *		: &(((fr_dbuff_marker_t *)(_dbuff_or_marker))->p) \
  |  |  |  |  |  |  |  |  |  |  938|      0|	))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1383|      0|								    fr_dbuff_ptr(_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  867|      0|	_Generic((_dbuff_or_marker), \
  |  |  |  |  |  |  |  |  |  |  868|      0|		 fr_dbuff_t *			: ((fr_dbuff_t *)(_dbuff_or_marker)), \
  |  |  |  |  |  |  |  |  |  |  869|      0|		 fr_dbuff_marker_t *		: (((fr_dbuff_marker_t *)(_dbuff_or_marker))->parent) \
  |  |  |  |  |  |  |  |  |  |  870|      0|	)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1384|      0|								    &((fr_dbuff_marker_t const *)(_in))->p, \
  |  |  |  |  |  |  |  | 1385|      0|								    ((fr_dbuff_marker_t const *)(_in))->parent, _inlen) \
  |  |  |  |  |  |  |  | 1386|      0|	)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	if (_slen < 0) return _slen; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (187:6): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  188|      0|} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5829|      0|			fr_value_box_ethernet_addr(dst, dst_enumv, &ether, false);
 5830|       |
 5831|      0|			FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5832|      0|		}
 5833|       |
 5834|      0|		fr_sbuff_set_to_start(&our_in);
 5835|       |
 5836|      0|		fr_base16_decode(&err, &dbuff, &our_in, true);
  ------------------
  |  |   93|      0|		fr_base16_decode_nstd(_err, _out, _in, _no_trailing, fr_base16_alphabet_decode_mc)
  ------------------
 5837|      0|		if (err != FR_SBUFF_PARSE_OK) {
  ------------------
  |  Branch (5837:7): [True: 0, False: 0]
  ------------------
 5838|      0|		ether_error:
 5839|      0|			fr_sbuff_parse_error_to_strerror(err);
 5840|      0|			FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5841|      0|		}
 5842|       |
 5843|      0|		if (!fr_sbuff_next_if_char(&our_in, ':')) {
  ------------------
  |  Branch (5843:7): [True: 0, False: 0]
  ------------------
 5844|      0|		ether_sep_error:
 5845|      0|			fr_strerror_const("Missing separator, expected ':'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5846|      0|			FR_SBUFF_ERROR_RETURN(&our_in);
  ------------------
  |  | 1027|      0|#define FR_SBUFF_ERROR_RETURN(_sbuff_or_marker) return fr_sbuff_error(_sbuff_or_marker)
  |  |  ------------------
  |  |  |  |  982|      0|	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |               	_fr_sbuff_error(fr_sbuff_ptr(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker))
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5847|      0|		}
 5848|       |
 5849|      0|		fr_base16_decode(&err, &dbuff, &our_in, true);
  ------------------
  |  |   93|      0|		fr_base16_decode_nstd(_err, _out, _in, _no_trailing, fr_base16_alphabet_decode_mc)
  ------------------
 5850|      0|		if (err != FR_SBUFF_PARSE_OK) goto ether_error;
  ------------------
  |  Branch (5850:7): [True: 0, False: 0]
  ------------------
 5851|       |
 5852|      0|		if (!fr_sbuff_next_if_char(&our_in, ':')) goto ether_sep_error;
  ------------------
  |  Branch (5852:7): [True: 0, False: 0]
  ------------------
 5853|       |
 5854|      0|		fr_base16_decode(&err, &dbuff, &our_in, true);
  ------------------
  |  |   93|      0|		fr_base16_decode_nstd(_err, _out, _in, _no_trailing, fr_base16_alphabet_decode_mc)
  ------------------
 5855|      0|		if (err != FR_SBUFF_PARSE_OK) goto ether_error;
  ------------------
  |  Branch (5855:7): [True: 0, False: 0]
  ------------------
 5856|       |
 5857|      0|		if (!fr_sbuff_next_if_char(&our_in, ':')) goto ether_sep_error;
  ------------------
  |  Branch (5857:7): [True: 0, False: 0]
  ------------------
 5858|       |
 5859|      0|		fr_base16_decode(&err, &dbuff, &our_in, true);
  ------------------
  |  |   93|      0|		fr_base16_decode_nstd(_err, _out, _in, _no_trailing, fr_base16_alphabet_decode_mc)
  ------------------
 5860|      0|		if (err != FR_SBUFF_PARSE_OK) goto ether_error;
  ------------------
  |  Branch (5860:7): [True: 0, False: 0]
  ------------------
 5861|       |
 5862|      0|		if (!fr_sbuff_next_if_char(&our_in, ':')) goto ether_sep_error;
  ------------------
  |  Branch (5862:7): [True: 0, False: 0]
  ------------------
 5863|       |
 5864|      0|		fr_base16_decode(&err, &dbuff, &our_in, true);
  ------------------
  |  |   93|      0|		fr_base16_decode_nstd(_err, _out, _in, _no_trailing, fr_base16_alphabet_decode_mc)
  ------------------
 5865|      0|		if (err != FR_SBUFF_PARSE_OK) goto ether_error;
  ------------------
  |  Branch (5865:7): [True: 0, False: 0]
  ------------------
 5866|       |
 5867|      0|		if (!fr_sbuff_next_if_char(&our_in, ':')) goto ether_sep_error;
  ------------------
  |  Branch (5867:7): [True: 0, False: 0]
  ------------------
 5868|       |
 5869|      0|		fr_base16_decode(&err, &dbuff, &our_in, true);
  ------------------
  |  |   93|      0|		fr_base16_decode_nstd(_err, _out, _in, _no_trailing, fr_base16_alphabet_decode_mc)
  ------------------
 5870|      0|		if (err != FR_SBUFF_PARSE_OK) goto ether_error;
  ------------------
  |  Branch (5870:7): [True: 0, False: 0]
  ------------------
 5871|       |
 5872|      0|		fr_value_box_ethernet_addr(dst, dst_enumv, (fr_ethernet_t * const)fr_dbuff_start(&dbuff), false);
  ------------------
  |  |  907|      0|	(_Generic((_dbuff_or_marker), \
  |  |  908|      0|		  fr_dbuff_t *			: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  909|      0|		  fr_dbuff_t const *		: (((fr_dbuff_t const *)(_dbuff_or_marker))->start), \
  |  |  910|      0|		  fr_dbuff_marker_t *		: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start), \
  |  |  911|      0|		  fr_dbuff_marker_t const *	: (((fr_dbuff_marker_t const *)(_dbuff_or_marker))->parent->start) \
  |  |  912|      0|	))
  ------------------
 5873|       |
 5874|      0|		FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5875|      0|	}
 5876|       |
 5877|      0|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (5877:2): [True: 0, False: 726]
  ------------------
 5878|      0|		fr_value_box_init(dst, FR_TYPE_TIME_DELTA, dst_enumv, false);
  ------------------
  |  |  610|      0|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 5879|       |
 5880|      0|		slen = fr_time_delta_from_substr(&dst->datum.time_delta, &our_in,
 5881|      0|						 dst_enumv ? dst_enumv->flags.flag_time_res : FR_TIME_RES_SEC,
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (5881:8): [True: 0, False: 0]
  ------------------
 5882|      0|						 false, rules->terminals);
 5883|      0|		if (slen < 0) return slen;
  ------------------
  |  Branch (5883:7): [True: 0, False: 0]
  ------------------
 5884|      0|		if (!slen) {
  ------------------
  |  Branch (5884:7): [True: 0, False: 0]
  ------------------
 5885|      0|		empty_is_invalid:
 5886|      0|			fr_strerror_const("Empty input is invalid");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5887|      0|			return -1;
 5888|      0|		}
 5889|      0|		FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5890|       |
 5891|      0|	case FR_TYPE_NULL:
  ------------------
  |  Branch (5891:2): [True: 0, False: 726]
  ------------------
 5892|      0|		if (!rules->escapes && fr_sbuff_adv_past_str_literal(&our_in, "NULL")) {
  ------------------
  |  | 1712|      0|#define fr_sbuff_adv_past_str_literal(_sbuff, _needle) fr_sbuff_adv_past_str(_sbuff, _needle, sizeof(_needle) - 1)
  |  |  ------------------
  |  |  |  Branch (1712:56): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (5892:7): [True: 0, False: 0]
  ------------------
 5893|      0|			fr_value_box_init(dst, dst_type, dst_enumv, false);
  ------------------
  |  |  610|      0|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 5894|      0|			FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5895|      0|		}
 5896|       |
 5897|      0|		fr_strerror_const("Unexpected value for data type NULL");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5898|      0|		return -1;
 5899|       |
 5900|      0|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (5900:2): [True: 0, False: 726]
  ------------------
 5901|      0|		if (!dst_enumv) {
  ------------------
  |  Branch (5901:7): [True: 0, False: 0]
  ------------------
 5902|      0|			fr_strerror_const("No dictionary passed for data type 'attr'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5903|      0|			return -1;
 5904|      0|		}
 5905|       |
 5906|       |		/*
 5907|       |		 *	@todo - have attributes of FR_TYPE_ATTR also
 5908|       |		 *	carry a ref to where their values are taken from.
 5909|       |		 */
 5910|      0|		if (dst_enumv->type == FR_TYPE_ATTR) {
  ------------------
  |  Branch (5910:7): [True: 0, False: 0]
  ------------------
 5911|      0|			dst_enumv = fr_value_box_attr_enumv(dst_enumv);
 5912|       |
 5913|      0|		} else if (dst_enumv->type != FR_TYPE_TLV) {
  ------------------
  |  Branch (5913:14): [True: 0, False: 0]
  ------------------
 5914|      0|			fr_strerror_printf("Can only start from data type 'tlv' for data type 'attribute', and not from %s", dst_enumv->name);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5915|      0|			return -1;
 5916|      0|		}
 5917|       |
 5918|      0|		fr_value_box_init(dst, dst_type, dst_enumv, false);
  ------------------
  |  |  610|      0|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 5919|       |
 5920|      0|		(void) fr_sbuff_adv_past_str_literal(&our_in, "::");
  ------------------
  |  | 1712|      0|#define fr_sbuff_adv_past_str_literal(_sbuff, _needle) fr_sbuff_adv_past_str(_sbuff, _needle, sizeof(_needle) - 1)
  ------------------
 5921|       |
 5922|       |		/*
 5923|       |		 *	Allow '@' references in values.
 5924|       |		 */
 5925|      0|		if (fr_sbuff_is_char(&our_in, '@')) {
  ------------------
  |  | 1797|      0|	_Generic((_sbuff_or_marker), \
  |  |  ------------------
  |  |  |  Branch (1797:2): [True: 0, False: 0]
  |  |  ------------------
  |  | 1798|      0|		 fr_sbuff_t *		: _fr_sbuff_is_char((fr_sbuff_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker), _c), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1799|      0|		 fr_sbuff_marker_t *	: _fr_marker_is_char((fr_sbuff_marker_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker), _c) \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1800|      0|	)
  ------------------
 5926|      0|			size_t len;
 5927|      0|			fr_sbuff_marker_t m;
 5928|       |
 5929|      0|			fr_sbuff_marker(&m, &our_in);
 5930|      0|			fr_sbuff_advance(&our_in, 1); /* '@' is not an allowed character for dictionary names */
  ------------------
  |  | 1194|      0|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5931|       |
 5932|      0|			len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in),
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 5933|      0|							fr_dict_attr_nested_allowed_chars, NULL);
 5934|      0|			fr_sbuff_set(&our_in, &m);
  ------------------
  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  | 1163|      0|_Generic((_dst), \
  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  | 1166|      0|)(_dst, \
  |  | 1167|      0|_Generic((_src), \
  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  ------------------
  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  833|      0|	))
  |  |  ------------------
  |  | 1175|      0|))
  ------------------
 5935|      0|			fr_sbuff_marker_release(&m);
 5936|       |
 5937|      0|			len++;	/* account for '@' */
 5938|       |
 5939|       |			/*
 5940|       |			 *	This function needs the '@'.
 5941|       |			 */
 5942|      0|			if (fr_dict_protocol_reference(&dst->vb_attr, fr_dict_root(dst_enumv->dict), &FR_SBUFF_IN(fr_sbuff_current(&our_in), len)) < 0) {
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
              			if (fr_dict_protocol_reference(&dst->vb_attr, fr_dict_root(dst_enumv->dict), &FR_SBUFF_IN(fr_sbuff_current(&our_in), len)) < 0) {
  ------------------
  |  |  558|      0|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  559|      0|((fr_sbuff_t){ \
  |  |  560|      0|	.buff_i		= _start, \
  |  |  561|      0|	.start_i	= _Generic((_start), \
  |  |  562|      0|				char *		: _start, \
  |  |  563|      0|				char const *	: _start, \
  |  |  564|      0|				uint8_t *	: _start, \
  |  |  565|      0|				uint8_t const *	: _start \
  |  |  566|      0|			), \
  |  |  567|      0|	.end_i		= _Generic((_len_or_end), \
  |  |  568|      0|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  569|      0|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  570|      0|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  571|      0|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  572|      0|				char *		: (char const *)(_len_or_end), \
  |  |  573|      0|				char const *	: (char const *)(_len_or_end) \
  |  |  574|      0|			), \
  |  |  575|      0|	.p_i		= _start, \
  |  |  576|      0|	.is_const	= true, \
  |  |  577|      0|})
  ------------------
  |  Branch (5942:8): [True: 0, False: 0]
  ------------------
 5943|      0|				return -1;
 5944|      0|			}
 5945|       |
 5946|      0|			if (!dst->vb_attr) {
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
  |  Branch (5946:8): [True: 0, False: 0]
  ------------------
 5947|      0|				fr_strerror_printf("Failed to find attribute reference %.*s", (int) len, fr_sbuff_current(&our_in));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 5947|      0|				fr_strerror_printf("Failed to find attribute reference %.*s", (int) len, fr_sbuff_current(&our_in));
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5948|      0|				return -1;
 5949|      0|			}
 5950|       |
 5951|      0|			fr_assert(dst->vb_attr != NULL);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5952|       |
 5953|      0|			if (dst->vb_attr->dict != dst_enumv->dict) {
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
  |  Branch (5953:8): [True: 0, False: 0]
  ------------------
 5954|      0|				fr_strerror_const("Type 'attribute' cannot reference a different protocol");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 5955|      0|				return -1;
 5956|      0|			}
 5957|       |
 5958|      0|			fr_sbuff_advance(&our_in, len);
  ------------------
  |  | 1194|      0|#define fr_sbuff_advance(_sbuff_or_marker, _len)  fr_sbuff_set(_sbuff_or_marker, (fr_sbuff_current(_sbuff_or_marker) + (_len)))
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5959|      0|			FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5960|       |
 5961|      0|		} else {
 5962|      0|			fr_dict_attr_t const *da;
 5963|       |
 5964|      0|			fr_assert(dst_enumv != NULL);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5965|       |
 5966|      0|			slen = fr_dict_attr_by_oid_substr(NULL, &dst->vb_attr, dst_enumv, &our_in, rules->terminals);
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
 5967|      0|			if (slen > 0) {
  ------------------
  |  Branch (5967:8): [True: 0, False: 0]
  ------------------
 5968|      0|				fr_assert(dst->vb_attr != NULL);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5969|       |
 5970|      0|				if (!fr_sbuff_next_if_char(&our_in, '.')) {
  ------------------
  |  Branch (5970:9): [True: 0, False: 0]
  ------------------
 5971|      0|					FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5972|      0|				}
 5973|       |
 5974|       |				/*
 5975|       |				 *	The next bit MUST be an unknown attribute.
 5976|       |				 */
 5977|      0|			}
 5978|       |
 5979|      0|			if (!fr_sbuff_is_digit(&our_in)) {
  ------------------
  |  | 1822|      0|	SBUFF_IS_GENERIC(_sbuff_or_marker, digit)
  |  |  ------------------
  |  |  |  | 1815|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  | 1816|      0|		 fr_sbuff_t *		: _fr_sbuff_is_ ## _name((fr_sbuff_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1817|      0|		 fr_sbuff_marker_t *	: _fr_marker_is_ ## _name((fr_sbuff_marker_t *)(_sbuff_or_marker), fr_sbuff_current(_sbuff_or_marker)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1818|      0|	)
  |  |  ------------------
  ------------------
  |  Branch (5979:8): [True: 0, False: 0]
  ------------------
 5980|      0|			invalid_attr:
 5981|      0|				fr_strerror_printf_push("Failed to find the attribute in %s", dst_enumv->name);
  ------------------
  |  |   85|      0|			_fr_strerror_printf_push(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5982|      0|				return -2;
 5983|      0|			}
 5984|       |
 5985|      0|			slen = fr_dict_attr_unknown_afrom_oid_substr(ctx, &da, dst->vb_attr, &our_in, FR_TYPE_OCTETS);
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
 5986|      0|			if (slen <= 0) goto invalid_attr;
  ------------------
  |  Branch (5986:8): [True: 0, False: 0]
  ------------------
 5987|       |
 5988|      0|			dst->vb_attr = da;
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
 5989|      0|			FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 5990|      0|		}
 5991|       |
 5992|       |	/*
 5993|       |	 *	Dealt with below
 5994|       |	 */
 5995|      0|	default:
  ------------------
  |  Branch (5995:2): [True: 0, False: 726]
  ------------------
 5996|      0|		break;
 5997|    726|	}
 5998|       |
 5999|       |	/*
 6000|       |	 *	We may have terminals.  If so, respect them.
 6001|       |	 */
 6002|      0|	if (rules && rules->terminals) {
  ------------------
  |  Branch (6002:6): [True: 0, False: 0]
  |  Branch (6002:15): [True: 0, False: 0]
  ------------------
 6003|      0|		size_t len;
 6004|       |
 6005|      0|		len = fr_sbuff_out_unescape_until(&FR_SBUFF_OUT(buffer, sizeof(buffer)), &our_in, SIZE_MAX,
  ------------------
  |  |  531|      0|#define FR_SBUFF_OUT(_start, _len_or_end) \
  |  |  532|      0|((fr_sbuff_t){ \
  |  |  533|      0|	.buff_i		= _start, \
  |  |  534|      0|	.start_i	= _Generic((_start), \
  |  |  535|      0|				char *		: _start, \
  |  |  536|      0|				uint8_t *	: _start \
  |  |  537|      0|			), \
  |  |  538|      0|	.end_i		= _Generic((_len_or_end), \
  |  |  539|      0|				size_t		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  540|      0|				long		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  541|      0|				int		: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  542|      0|				unsigned int	: (char const *)(_start) + ((size_t)(_len_or_end) - 1), \
  |  |  543|      0|				char *		: (char const *)(_len_or_end), \
  |  |  544|      0|				char const *	: (char const *)(_len_or_end) \
  |  |  545|      0|			), \
  |  |  546|      0|	.p_i		= _start, \
  |  |  547|      0|	.is_const	= false, \
  |  |  548|      0|})
  ------------------
 6006|      0|						  rules->terminals, rules->escapes);
 6007|      0|		if (len >= sizeof(buffer)) goto too_small;
  ------------------
  |  Branch (6007:7): [True: 0, False: 0]
  ------------------
 6008|       |
 6009|      0|		buffer[len] = '\0';
 6010|       |
 6011|      0|	} else {
 6012|       |		/*
 6013|       |		 *	It's a fixed size src->dst_type, copy to a temporary buffer and
 6014|       |		 *	\0 terminate.
 6015|       |		 *
 6016|       |		 *	@todo - note that this brute-force copy means that the input sbuff
 6017|       |		 *	is NOT advanced, and this function will return 0, even though it parsed data!
 6018|       |		 */
 6019|      0|		if (fr_sbuff_remaining(in) >= sizeof(buffer)) {
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
  |  Branch (6019:7): [True: 0, False: 0]
  ------------------
 6020|      0|		too_small:
 6021|      0|			fr_strerror_const("Temporary buffer too small");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 6022|      0|			return -1;
 6023|      0|		}
 6024|       |
 6025|      0|		memcpy(buffer, fr_sbuff_current(in), fr_sbuff_remaining(in));
  ------------------
  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  849|      0|	))
  ------------------
              		memcpy(buffer, fr_sbuff_current(in), fr_sbuff_remaining(in));
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 6026|      0|		buffer[fr_sbuff_remaining(in)] = '\0';
  ------------------
  |  |  929|      0|	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               	((size_t)(fr_sbuff_end(_sbuff_or_marker) < fr_sbuff_current(_sbuff_or_marker) ? \
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  |  |  |  Branch (929:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  930|      0|		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  857|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  858|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  859|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->end, \
  |  |  |  |  860|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end, \
  |  |  |  |  861|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->end \
  |  |  |  |  862|      0|	))
  |  |  ------------------
  |  |               		0 : (fr_sbuff_end(_sbuff_or_marker) - fr_sbuff_current(_sbuff_or_marker))))
  |  |  ------------------
  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  849|      0|	))
  |  |  ------------------
  ------------------
 6027|      0|	}
 6028|       |
 6029|      0|	switch (dst_type) {
 6030|      0|	case FR_TYPE_DATE:
  ------------------
  |  Branch (6030:2): [True: 0, False: 0]
  ------------------
 6031|      0|	{
 6032|      0|		if (dst_enumv) {
  ------------------
  |  Branch (6032:7): [True: 0, False: 0]
  ------------------
 6033|      0|			if (fr_unix_time_from_str(&dst->vb_date, buffer, dst_enumv->flags.flag_time_res) < 0) return -1;
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
              			if (fr_unix_time_from_str(&dst->vb_date, buffer, dst_enumv->flags.flag_time_res) < 0) return -1;
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (6033:8): [True: 0, False: 0]
  ------------------
 6034|      0|		} else {
 6035|      0|			if (fr_unix_time_from_str(&dst->vb_date, buffer, FR_TIME_RES_SEC) < 0) return -1;
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
  |  Branch (6035:8): [True: 0, False: 0]
  ------------------
 6036|      0|		}
 6037|       |
 6038|      0|		dst->enumv = dst_enumv;
 6039|      0|	}
 6040|      0|		break;
 6041|       |
 6042|      0|	case FR_TYPE_IFID:
  ------------------
  |  Branch (6042:2): [True: 0, False: 0]
  ------------------
 6043|      0|		if (fr_inet_ifid_pton((void *) dst->vb_ifid, buffer) == NULL) {
  ------------------
  |  |  268|      0|#define vb_ifid					datum.ifid.addr
  ------------------
  |  Branch (6043:7): [True: 0, False: 0]
  ------------------
 6044|      0|			fr_strerror_printf("Failed to parse interface-id string \"%s\"", buffer);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 6045|      0|			return -1;
 6046|      0|		}
 6047|      0|		break;
 6048|       |
 6049|      0|	default:
  ------------------
  |  Branch (6049:2): [True: 0, False: 0]
  ------------------
 6050|      0|		fr_strerror_printf("Cannot parse input as data type %s", fr_type_to_str(dst_type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 6051|      0|		return -1;
 6052|      0|	}
 6053|       |
 6054|      0|finish:
 6055|      0|	dst->type = dst_type;
 6056|      0|	dst->tainted = false;
 6057|      0|	fr_value_box_mark_unsafe(dst);
 6058|       |
 6059|       |	/*
 6060|       |	 *	Fixup enumvs
 6061|       |	 */
 6062|      0|	dst->enumv = dst_enumv;
 6063|      0|	fr_value_box_list_entry_init(dst);
 6064|       |
 6065|      0|	FR_SBUFF_SET_RETURN(in, &our_in);
  ------------------
  |  | 1183|      0|#define FR_SBUFF_SET_RETURN(_dst, _src) return fr_sbuff_set(_dst, _src)
  |  |  ------------------
  |  |  |  | 1162|      0|#define fr_sbuff_set(_dst, _src) \
  |  |  |  | 1163|      0|_Generic((_dst), \
  |  |  |  | 1164|      0|	 fr_sbuff_t *			: _fr_sbuff_set, \
  |  |  |  | 1165|      0|	 fr_sbuff_marker_t *		: _fr_sbuff_marker_set \
  |  |  |  | 1166|      0|)(_dst, \
  |  |  |  | 1167|      0|_Generic((_src), \
  |  |  |  | 1168|      0|	fr_sbuff_t *			: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1169|      0|	fr_sbuff_t const *		: fr_sbuff_current((fr_sbuff_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1170|      0|	fr_sbuff_marker_t *		: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1171|      0|	fr_sbuff_marker_t const *	: fr_sbuff_current((fr_sbuff_marker_t const *)(_src)), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  844|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  845|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  846|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  847|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p, \
  |  |  |  |  |  |  848|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->p \
  |  |  |  |  |  |  849|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1172|      0|	char const *			: (char const *)(_src), \
  |  |  |  | 1173|      0|	char *				: (char const *)(_src), \
  |  |  |  | 1174|      0|	size_t				: (fr_sbuff_start(_dst) + (uintptr_t)(_src)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  828|      0|	(_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  829|      0|		  fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  830|      0|		  fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->start, \
  |  |  |  |  |  |  831|      0|		  fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start, \
  |  |  |  |  |  |  832|      0|		  fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->start \
  |  |  |  |  |  |  833|      0|	))
  |  |  |  |  ------------------
  |  |  |  | 1175|      0|))
  |  |  ------------------
  ------------------
 6066|      0|}
fr_value_box_from_str:
 6072|    726|{
 6073|    726|	ssize_t slen;
 6074|    726|	fr_sbuff_parse_rules_t prules = { .escapes = erules };
 6075|       |
 6076|    726|	slen = fr_value_box_from_substr(ctx, dst, dst_type, dst_enumv, &FR_SBUFF_IN(in, inlen), &prules);
  ------------------
  |  |  558|    726|#define FR_SBUFF_IN(_start, _len_or_end) \
  |  |  559|    726|((fr_sbuff_t){ \
  |  |  560|    726|	.buff_i		= _start, \
  |  |  561|    726|	.start_i	= _Generic((_start), \
  |  |  562|    726|				char *		: _start, \
  |  |  563|    726|				char const *	: _start, \
  |  |  564|    726|				uint8_t *	: _start, \
  |  |  565|    726|				uint8_t const *	: _start \
  |  |  566|    726|			), \
  |  |  567|    726|	.end_i		= _Generic((_len_or_end), \
  |  |  568|    726|				size_t		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  569|    726|				long		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  570|    726|				int		: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  571|    726|				unsigned int	: (char const *)(_start) + (size_t)(_len_or_end), \
  |  |  572|    726|				char *		: (char const *)(_len_or_end), \
  |  |  573|    726|				char const *	: (char const *)(_len_or_end) \
  |  |  574|    726|			), \
  |  |  575|    726|	.p_i		= _start, \
  |  |  576|    726|	.is_const	= true, \
  |  |  577|    726|})
  ------------------
 6077|    726|	if (slen <= 0) return slen;
  ------------------
  |  Branch (6077:6): [True: 0, False: 726]
  ------------------
 6078|       |
 6079|    726|	if (slen != (ssize_t)inlen) {
  ------------------
  |  Branch (6079:6): [True: 0, False: 726]
  ------------------
 6080|      0|		fr_strerror_printf("Failed parsing '%s'.  %zu bytes of trailing data after string value \"%pV\"",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 6081|      0|				   fr_type_to_str(dst_type),
  |  |  |  | 6082|      0|				   inlen - slen,
  |  |  |  | 6083|      0|				   fr_box_strvalue_len(in + slen, inlen - slen));
  |  |  |  |  ------------------
  |  |  |  |  |  |  309|      0|#define fr_box_strvalue_len(_val, _len)		_fr_box_with_len(FR_TYPE_STRING, .vb_strvalue, _val, _len)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  306|      0|#define _fr_box_with_len(_type, _field, _val, _len) &(fr_value_box_t){ .type = _type, _field = _val, .vb_length = _len, VALUE_BOX_NDEBUG_INITIALISER }
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  246|      0|#define VALUE_BOX_NDEBUG_INITIALISER .file = __FILE__, .line = __LINE__, .magic = FR_VALUE_BOX_MAGIC
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   91|      0|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   81|      0|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  206|      0|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  205|      0|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 6081|      0|				   fr_type_to_str(dst_type),
 6082|      0|				   inlen - slen,
 6083|      0|				   fr_box_strvalue_len(in + slen, inlen - slen));
 6084|      0|		return (slen - inlen) - 1;
 6085|      0|	}
 6086|       |
 6087|    726|	return slen;
 6088|    726|}
fr_value_box_hash:
 7089|  1.62k|{
 7090|  1.62k|	switch (vb->type) {
  ------------------
  |  Branch (7090:10): [True: 1.62k, False: 0]
  ------------------
 7091|  1.62k|	case FR_TYPE_FIXED_SIZE:
  ------------------
  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  182|      0|	_beg(FR_TYPE_ETHERNET) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  183|      0|	_mid(FR_TYPE_IFID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  184|      0|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  185|      0|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  186|      0|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  187|      0|	_mid(FR_TYPE_IPV6_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  188|      0|	FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|      0|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  155|      0|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  310|      0|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  156|      0|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  127|      8|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  310|      8|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|      8|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 8, False: 1.61k]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  128|      8|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  107|    742|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|    742|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|    742|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 734, False: 890]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  108|  1.12k|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.12k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.12k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 380, False: 1.24k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  109|  1.62k|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 502, False: 1.12k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  110|  1.62k|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  111|  1.62k|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  112|  1.62k|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  113|  1.62k|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  114|  1.62k|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  115|  1.62k|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  116|  1.62k|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  300|  1.62k|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  117|  1.62k|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  310|  1.62k|#define FR_TYPE_FIXED_SIZE			FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  301|  1.62k|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (7091:2): [True: 0, False: 1.62k]
  ------------------
 7092|  1.62k|		return fr_hash(fr_value_box_raw(vb, vb->type),
 7093|  1.62k|			       fr_value_box_field_sizes[vb->type]);
 7094|       |
 7095|      0|	case FR_TYPE_STRING:
  ------------------
  |  Branch (7095:2): [True: 0, False: 1.62k]
  ------------------
 7096|      0|		return fr_hash(vb->vb_strvalue, vb->vb_length);
  ------------------
  |  |  258|      0|#define vb_strvalue				datum.strvalue
  ------------------
              		return fr_hash(vb->vb_strvalue, vb->vb_length);
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
 7097|       |
 7098|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (7098:2): [True: 0, False: 1.62k]
  ------------------
 7099|      0|		return fr_hash(vb->vb_octets, vb->vb_length);
  ------------------
  |  |  259|      0|#define vb_octets				datum.octets
  ------------------
              		return fr_hash(vb->vb_octets, vb->vb_length);
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
 7100|       |
 7101|      0|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (7101:2): [True: 0, False: 1.62k]
  ------------------
 7102|      0|		return fr_hash(&vb->vb_attr, sizeof(vb->vb_attr));
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
              		return fr_hash(&vb->vb_attr, sizeof(vb->vb_attr));
  ------------------
  |  |  262|      0|#define vb_attr					datum.da
  ------------------
 7103|       |
 7104|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (7104:2): [True: 0, False: 1.62k]
  ------------------
 7105|      0|	case FR_TYPE_INTERNAL:
  ------------------
  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  274|      0|	_beg(FR_TYPE_VALUE_BOX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  275|      0|	_mid(FR_TYPE_VOID) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  276|      0|	_mid(FR_TYPE_VALUE_BOX_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  277|      0|	_mid(FR_TYPE_PAIR_CURSOR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 1.62k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  278|      0|	_end(FR_TYPE_MAX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  319|      0|#define FR_TYPE_INTERNAL			FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (7105:2): [True: 0, False: 1.62k]
  ------------------
 7106|      0|	case FR_TYPE_COMBO_IP_ADDR:
  ------------------
  |  Branch (7106:2): [True: 0, False: 1.62k]
  ------------------
 7107|      0|	case FR_TYPE_COMBO_IP_PREFIX:
  ------------------
  |  Branch (7107:2): [True: 0, False: 1.62k]
  ------------------
 7108|      0|	case FR_TYPE_NULL:
  ------------------
  |  Branch (7108:2): [True: 0, False: 1.62k]
  ------------------
 7109|      0|		fr_assert(0);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7110|      0|		break;
 7111|  1.62k|	}
 7112|       |
 7113|      0|	return 0;
 7114|  1.62k|}
fr_value_box_verify:
 7198|   125k|{
 7199|   125k|DIAG_OFF(nonnull-compare)
 7200|       |	/*
 7201|       |	 *	nonnull only does something if we're building
 7202|       |	 *	with ubsan...  We still want to assert event
 7203|       |	 *	if we're building without sanitizers.
 7204|       |	 */
 7205|   125k|	fr_fatal_assert_msg(vb, "CONSISTENCY CHECK FAILED %s[%i]: fr_value_box_t pointer was NULL", file, line);
  ------------------
  |  |  176|   125k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|   125k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 125k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7206|   125k|DIAG_ON(nonnull-compare)
 7207|       |
 7208|   125k|	if (vb->talloced) vb = talloc_get_type_abort_const(vb, fr_value_box_t);
  ------------------
  |  |  117|      0|#  define talloc_get_type_abort_const talloc_get_type_abort
  ------------------
  |  Branch (7208:6): [True: 0, False: 125k]
  ------------------
 7209|       |
 7210|   125k|#ifndef NDEBUG
 7211|   125k|	fr_fatal_assert_msg(vb->magic == FR_VALUE_BOX_MAGIC, "CONSISTENCY CHECK FAILED %s[%i]: fr_value_box_t magic "
  ------------------
  |  |  176|   125k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|   125k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 125k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 7212|      0|			    "incorrect, expected %" PRIx64 ", got %" PRIx64, file, line, FR_VALUE_BOX_MAGIC, vb->magic);
  |  |  |  |  ------------------
  |  |  |  |  |  |   91|      0|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   81|      0|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  206|      0|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  205|      0|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7212|   125k|			    "incorrect, expected %" PRIx64 ", got %" PRIx64, file, line, FR_VALUE_BOX_MAGIC, vb->magic);
 7213|   125k|#endif
 7214|   125k|	switch (vb->type) {
 7215|  6.41k|	case FR_TYPE_STRING:
  ------------------
  |  Branch (7215:2): [True: 6.41k, False: 118k]
  ------------------
 7216|  6.41k|		if (!vb->vb_length) {
  ------------------
  |  |  292|  6.41k|#define vb_length				datum.length
  ------------------
  |  Branch (7216:7): [True: 2.16k, False: 4.25k]
  ------------------
 7217|       |#if 0
 7218|       |			fr_fatal_assert_msg(!vb->vb_strvalue || (talloc_array_length(vb->vb_strvalue) == 1), "CONSISTENCY CHECK FAILED %s[%d]: fr_value_box_t strvalue field "
 7219|       |					    "wasn non-NULL, but length was %u", file, line, vb->vb_length);
 7220|       |#endif
 7221|  2.16k|			break;
 7222|  2.16k|		}
 7223|       |
 7224|  4.25k|		fr_fatal_assert_msg(vb->vb_strvalue, "CONSISTENCY CHECK FAILED %s[%d]: fr_value_box_t strvalue field "
  ------------------
  |  |  176|  4.25k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|  4.25k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4.25k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7225|  4.25k|				    "was NULL", file, line);
 7226|  4.25k|		fr_fatal_assert_msg(vb->vb_strvalue[vb->vb_length] == '\0',
  ------------------
  |  |  176|  4.25k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|  4.25k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4.25k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7227|  4.25k|				    "CONSISTENCY CHECK FAILED %s[%i]: fr_value_box_t strvalue field "
 7228|  4.25k|				    "not null terminated", file, line);
 7229|  4.25k|		if (vb->talloced) {
  ------------------
  |  Branch (7229:7): [True: 0, False: 4.25k]
  ------------------
 7230|      0|			size_t len = talloc_array_length(vb->vb_strvalue);
 7231|       |
 7232|       |			/* We always \0 terminate to be safe, even though most things should use the len field */
 7233|      0|			if (len <= vb->vb_length) {
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
  |  Branch (7233:8): [True: 0, False: 0]
  ------------------
 7234|      0|				fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%d]: Expected fr_value_box_t->vb_strvalue talloc buffer "
  ------------------
  |  |  183|      0|#define		fr_fatal_assert_fail(_msg, ...) _fr_assert_fatal(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  | 7236|      0|						    file, line, vb->vb_length + 1, len);
  |  |  |  |  ------------------
  |  |  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7235|      0|						    "len >= %zu, got %zu",
 7236|      0|						    file, line, vb->vb_length + 1, len);
 7237|      0|			}
 7238|      0|		}
 7239|  4.25k|		break;
 7240|       |
 7241|  85.4k|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (7241:2): [True: 85.4k, False: 39.6k]
  ------------------
 7242|  85.4k|		if (!vb->vb_length) {
  ------------------
  |  |  292|  85.4k|#define vb_length				datum.length
  ------------------
  |  Branch (7242:7): [True: 82.5k, False: 2.89k]
  ------------------
 7243|       |#if 0
 7244|       |			fr_fatal_assert_msg(!vb->vb_octets || (talloc_array_length(vb->vb_octets) == 0), "CONSISTENCY CHECK FAILED %s[%d]: fr_value_box_t octets field "
 7245|       |					    "wasn non-NULL, but length was %u", file, line, vb->vb_length);
 7246|       |#endif
 7247|  82.5k|			break;
 7248|  82.5k|		}
 7249|       |
 7250|  2.89k|		fr_fatal_assert_msg(vb->vb_octets, "CONSISTENCY CHECK FAILED %s[%d]: fr_value_box_t octets field "
  ------------------
  |  |  176|  2.89k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|  2.89k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 2.89k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7251|  2.89k|				    "was NULL", file, line);
 7252|  2.89k|		break;
 7253|       |
 7254|      0|	case FR_TYPE_VOID:
  ------------------
  |  Branch (7254:2): [True: 0, False: 125k]
  ------------------
 7255|      0|		fr_fatal_assert_msg(vb->vb_void, "CONSISTENCY CHECK FAILED %s[%d]: fr_value_box_t ptr field "
  ------------------
  |  |  176|      0|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7256|      0|				    "was NULL", file, line);
 7257|      0|		break;
 7258|       |
 7259|      0|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (7259:2): [True: 0, False: 125k]
  ------------------
 7260|      0|		fr_value_box_list_verify(file, line, &vb->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
 7261|      0|		break;
 7262|       |
 7263|  9.11k|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (7263:2): [True: 9.11k, False: 115k]
  ------------------
 7264|  9.11k|		fr_fatal_assert_msg(vb->vb_attr, "CONSISTENCY CHECK FAILED %s[%d]: fr_value_box_t vb_attr field "
  ------------------
  |  |  176|  9.11k|#define		fr_fatal_assert_msg(_x, _fmt, ...) if (unlikely(!((bool)(_x)))) _fr_assert_fatal(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  397|  9.11k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 9.11k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7265|  9.11k|				    "was NULL", file, line);
 7266|  9.11k|		break;
 7267|       |
 7268|  24.1k|	default:
  ------------------
  |  Branch (7268:2): [True: 24.1k, False: 100k]
  ------------------
 7269|  24.1k|		break;
 7270|   125k|	}
 7271|   125k|}
fr_value_box_safety_copy_changed:
 7344|    127|{
 7345|    127|	out->safe_for = FR_VALUE_BOX_SAFE_FOR_NONE;
  ------------------
  |  |  172|    127|#define FR_VALUE_BOX_SAFE_FOR_NONE ((uintptr_t) 0)
  ------------------
 7346|    127|	out->tainted = in->tainted;
 7347|    127|	out->secret = in->secret;
 7348|    127|}
value.c:fr_value_box_cast_to_ipv4prefix:
 2942|    125|{
 2943|    125|	fr_type_t src_type = src->type;
 2944|       |
 2945|    125|	fr_assert(dst_type == FR_TYPE_IPV4_PREFIX);
  ------------------
  |  |  194|    125|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|    125|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 125]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2946|    125|	fr_value_box_safety_copy_changed(dst, src);
 2947|       |
 2948|    125|	switch (src_type) {
 2949|      0|	case FR_TYPE_STRING:
  ------------------
  |  Branch (2949:2): [True: 0, False: 125]
  ------------------
 2950|      0|		return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
 2951|      0|					     src->vb_strvalue, src->vb_length,
  ------------------
  |  |  258|      0|#define vb_strvalue				datum.strvalue
  ------------------
              					     src->vb_strvalue, src->vb_length,
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
 2952|      0|					     NULL);
 2953|       |
 2954|      0|	CAST_IP_FIX_COMBO;
  ------------------
  |  | 2785|      0|	case FR_TYPE_COMBO_IP_ADDR: \
  |  |  ------------------
  |  |  |  Branch (2785:2): [True: 0, False: 125]
  |  |  ------------------
  |  | 2786|      0|		if (src->vb_ip.af == AF_INET) { \
  |  |  ------------------
  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  ------------------
  |  |  |  Branch (2786:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 2787|      0|			src_type = FR_TYPE_IPV4_ADDR; \
  |  | 2788|      0|		} else if (src->vb_ip.af == AF_INET6) { \
  |  |  ------------------
  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  ------------------
  |  |  |  Branch (2788:14): [True: 0, False: 0]
  |  |  ------------------
  |  | 2789|      0|			src_type = FR_TYPE_IPV6_ADDR; \
  |  | 2790|      0|		} \
  |  | 2791|      0|		break; \
  |  | 2792|      0|	case FR_TYPE_COMBO_IP_PREFIX: \
  |  |  ------------------
  |  |  |  Branch (2792:2): [True: 0, False: 125]
  |  |  ------------------
  |  | 2793|      0|		if (src->vb_ip.af == AF_INET) { \
  |  |  ------------------
  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  ------------------
  |  |  |  Branch (2793:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 2794|      0|			src_type = FR_TYPE_IPV4_PREFIX; \
  |  | 2795|      0|		} else if (src->vb_ip.af == AF_INET6) { \
  |  |  ------------------
  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  ------------------
  |  |  |  Branch (2795:14): [True: 0, False: 0]
  |  |  ------------------
  |  | 2796|      0|			src_type = FR_TYPE_IPV6_PREFIX; \
  |  | 2797|      0|		} \
  |  | 2798|      0|		break
  ------------------
 2955|       |
 2956|    125|	default:
  ------------------
  |  Branch (2956:2): [True: 125, False: 0]
  ------------------
 2957|    125|		break;
 2958|    125|	}
 2959|       |
 2960|       |	/*
 2961|       |	 *	Pre-initialise box for non-variable types
 2962|       |	 */
 2963|    125|	fr_value_box_init(dst, dst_type, dst_enumv, src->tainted);
  ------------------
  |  |  610|    125|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|    125|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 2964|    125|	dst->vb_ip.af = AF_INET;
  ------------------
  |  |  264|    125|#define vb_ip					datum.ip
  ------------------
 2965|    125|	dst->vb_ip.scope_id = 0;
  ------------------
  |  |  264|    125|#define vb_ip					datum.ip
  ------------------
 2966|       |
 2967|    125|	switch (src_type) {
 2968|      0|	case FR_TYPE_IPV4_PREFIX:		/* Needed for handling combo prefixes */
  ------------------
  |  Branch (2968:2): [True: 0, False: 125]
  ------------------
 2969|      0|		dst->vb_ip.prefix = src->vb_ip.prefix;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		dst->vb_ip.prefix = src->vb_ip.prefix;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 2970|      0|		FALL_THROUGH;
  ------------------
  |  |  341|      0|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      0|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
 2971|       |
 2972|    125|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (2972:2): [True: 125, False: 0]
  ------------------
 2973|    125|		memcpy(&dst->vb_ip, &src->vb_ip, sizeof(dst->vb_ip));
  ------------------
  |  |  264|    125|#define vb_ip					datum.ip
  ------------------
              		memcpy(&dst->vb_ip, &src->vb_ip, sizeof(dst->vb_ip));
  ------------------
  |  |  264|    125|#define vb_ip					datum.ip
  ------------------
              		memcpy(&dst->vb_ip, &src->vb_ip, sizeof(dst->vb_ip));
  ------------------
  |  |  264|    125|#define vb_ip					datum.ip
  ------------------
 2974|    125|		break;
 2975|       |
 2976|       |	/*
 2977|       |	 *	Copy the last four bytes, to make an IPv4prefix
 2978|       |	 */
 2979|      0|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (2979:2): [True: 0, False: 125]
  ------------------
 2980|      0|		if (memcmp(src->vb_ipv6addr, v4_v6_map, sizeof(v4_v6_map)) != 0) {
  ------------------
  |  |  266|      0|#define vb_ipv6addr    				datum.ip.addr.v6.s6_addr
  ------------------
  |  Branch (2980:7): [True: 0, False: 0]
  ------------------
 2981|      0|		bad_v6_prefix_map:
 2982|      0|			fr_strerror_printf("Invalid cast from %s to %s.  No IPv4-IPv6 mapping prefix",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 2983|      0|					   fr_type_to_str(src->type),
 2984|      0|					   fr_type_to_str(dst_type));
 2985|      0|			return -1;
 2986|      0|		}
 2987|      0|		memcpy(&dst->vb_ipv4addr, &src->vb_ipv6addr[sizeof(v4_v6_map)],
  ------------------
  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  ------------------
              		memcpy(&dst->vb_ipv4addr, &src->vb_ipv6addr[sizeof(v4_v6_map)],
  ------------------
  |  |  266|      0|#define vb_ipv6addr    				datum.ip.addr.v6.s6_addr
  ------------------
 2988|      0|		       sizeof(dst->vb_ipv4addr));
  ------------------
  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  ------------------
 2989|      0|		dst->vb_ip.prefix = 32;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 2990|      0|		break;
 2991|       |
 2992|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (2992:2): [True: 0, False: 125]
  ------------------
 2993|      0|		if (memcmp(src->vb_ipv6addr, v4_v6_map, sizeof(v4_v6_map)) != 0) goto bad_v6_prefix_map;
  ------------------
  |  |  266|      0|#define vb_ipv6addr    				datum.ip.addr.v6.s6_addr
  ------------------
  |  Branch (2993:7): [True: 0, False: 0]
  ------------------
 2994|       |
 2995|      0|		if (src->vb_ip.prefix < (sizeof(v4_v6_map) << 3)) {
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
  |  Branch (2995:7): [True: 0, False: 0]
  ------------------
 2996|      0|			fr_strerror_printf("Invalid cast from %s to %s. Expected prefix >= %u bits got %u bits",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 2997|      0|					   fr_type_to_str(src->type),
  |  |  |  | 2998|      0|					   fr_type_to_str(dst_type),
  |  |  |  | 2999|      0|					   (unsigned int)(sizeof(v4_v6_map) << 3), src->vb_ip.prefix);
  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|#define vb_ip					datum.ip
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2997|      0|					   fr_type_to_str(src->type),
 2998|      0|					   fr_type_to_str(dst_type),
 2999|      0|					   (unsigned int)(sizeof(v4_v6_map) << 3), src->vb_ip.prefix);
 3000|      0|			return -1;
 3001|      0|		}
 3002|      0|		memcpy(&dst->vb_ipv4addr, &src->vb_ipv6addr[sizeof(v4_v6_map)],
  ------------------
  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  ------------------
              		memcpy(&dst->vb_ipv4addr, &src->vb_ipv6addr[sizeof(v4_v6_map)],
  ------------------
  |  |  266|      0|#define vb_ipv6addr    				datum.ip.addr.v6.s6_addr
  ------------------
 3003|      0|		       sizeof(dst->vb_ipv4addr));
  ------------------
  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  ------------------
 3004|       |
 3005|       |		/*
 3006|       |		 *	Subtract the bits used by the v4_v6_map to get the v4 prefix bits
 3007|       |		 */
 3008|      0|		dst->vb_ip.prefix = src->vb_ip.prefix - (sizeof(v4_v6_map) << 3);
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		dst->vb_ip.prefix = src->vb_ip.prefix - (sizeof(v4_v6_map) << 3);
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 3009|      0|		break;
 3010|       |
 3011|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (3011:2): [True: 0, False: 125]
  ------------------
 3012|      0|		if (src->vb_length != sizeof(dst->vb_ipv4addr) + 1) {
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
              		if (src->vb_length != sizeof(dst->vb_ipv4addr) + 1) {
  ------------------
  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  ------------------
  |  Branch (3012:7): [True: 0, False: 0]
  ------------------
 3013|      0|			fr_strerror_printf("Invalid cast from %s to %s.  Needed octet string of length %zu, got %zu",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 3014|      0|					   fr_type_to_str(src->type),
  |  |  |  | 3015|      0|					   fr_type_to_str(dst_type),
  |  |  |  | 3016|      0|					   sizeof(dst->vb_ipv4addr) + 1, src->vb_length);
  |  |  |  |  ------------------
  |  |  |  |  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  |  |  |  |  ------------------
  |  |  |  |               					   sizeof(dst->vb_ipv4addr) + 1, src->vb_length);
  |  |  |  |  ------------------
  |  |  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3014|      0|					   fr_type_to_str(src->type),
 3015|      0|					   fr_type_to_str(dst_type),
 3016|      0|					   sizeof(dst->vb_ipv4addr) + 1, src->vb_length);
 3017|      0|			return -1;
 3018|      0|		}
 3019|      0|		dst->vb_ip.prefix = src->vb_octets[0];
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		dst->vb_ip.prefix = src->vb_octets[0];
  ------------------
  |  |  259|      0|#define vb_octets				datum.octets
  ------------------
 3020|      0|		memcpy(&dst->vb_ip.addr.v4, &src->vb_octets[1], sizeof(dst->vb_ipv4addr));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		memcpy(&dst->vb_ip.addr.v4, &src->vb_octets[1], sizeof(dst->vb_ipv4addr));
  ------------------
  |  |  259|      0|#define vb_octets				datum.octets
  ------------------
              		memcpy(&dst->vb_ip.addr.v4, &src->vb_octets[1], sizeof(dst->vb_ipv4addr));
  ------------------
  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  ------------------
 3021|      0|		break;
 3022|       |
 3023|      0|	case FR_TYPE_UINT32:
  ------------------
  |  Branch (3023:2): [True: 0, False: 125]
  ------------------
 3024|      0|	{
 3025|      0|		uint32_t net;
 3026|       |
 3027|      0|		net = ntohl(src->vb_uint32);
 3028|      0|		memcpy(&dst->vb_ip.addr.v4, (uint8_t *)&net, sizeof(dst->vb_ipv4addr));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		memcpy(&dst->vb_ip.addr.v4, (uint8_t *)&net, sizeof(dst->vb_ipv4addr));
  ------------------
  |  |  265|      0|#define vb_ipv4addr    				datum.ip.addr.v4.s_addr
  ------------------
 3029|      0|		dst->vb_ip.prefix = 32;
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
 3030|      0|		break;
 3031|      0|	}
 3032|       |
 3033|      0|	default:
  ------------------
  |  Branch (3033:2): [True: 0, False: 125]
  ------------------
 3034|      0|		return fr_value_box_cast_unsupported(dst_type, src->type);
 3035|    125|	}
 3036|       |
 3037|    125|	return 0;
 3038|    125|}
value.c:fr_value_box_cast_to_integer:
 3571|      2|{
 3572|      2|	switch (src->type) {
 3573|      0|	case FR_TYPE_STRING:
  ------------------
  |  Branch (3573:2): [True: 0, False: 2]
  ------------------
 3574|      0|		return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
 3575|      0|					     src->vb_strvalue, src->vb_length,
  ------------------
  |  |  258|      0|#define vb_strvalue				datum.strvalue
  ------------------
              					     src->vb_strvalue, src->vb_length,
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
 3576|      0|					     NULL);
 3577|       |
 3578|      0|	case FR_TYPE_OCTETS:
  ------------------
  |  Branch (3578:2): [True: 0, False: 2]
  ------------------
 3579|      0|		return fr_value_box_fixed_size_from_octets(dst, dst_type, dst_enumv, src);
 3580|       |
 3581|      2|	case FR_TYPE_INTEGER:
  ------------------
  |  |  304|      0|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  127|      0|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  304|      0|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  128|      0|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  107|      0|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      0|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      0|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  109|      2|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 2, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  110|      2|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  111|      2|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  112|      2|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  113|      2|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  114|      2|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  115|      2|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  116|      2|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      2|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  117|      2|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  304|      2|#define FR_TYPE_INTEGER				FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      2|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (3581:2): [True: 0, False: 2]
  ------------------
 3582|      2|		fr_value_box_init(dst, dst_type, dst_enumv, false);
  ------------------
  |  |  610|      2|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      2|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 3583|      2|		return fr_value_box_cast_integer_to_integer(ctx, dst, dst_type, dst_enumv, src);
 3584|       |
 3585|      0|	case FR_TYPE_IPV4_ADDR:
  ------------------
  |  Branch (3585:2): [True: 0, False: 2]
  ------------------
 3586|      0|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (3586:2): [True: 0, False: 2]
  ------------------
 3587|      0|	{
 3588|      0|		fr_value_box_t	tmp;
 3589|       |
 3590|      0|		switch (dst_type) {
 3591|      0|		case FR_TYPE_UINT32:
  ------------------
  |  Branch (3591:3): [True: 0, False: 0]
  ------------------
 3592|      0|		case FR_TYPE_INT64:
  ------------------
  |  Branch (3592:3): [True: 0, False: 0]
  ------------------
 3593|      0|		case FR_TYPE_UINT64:
  ------------------
  |  Branch (3593:3): [True: 0, False: 0]
  ------------------
 3594|      0|		case FR_TYPE_DATE:
  ------------------
  |  Branch (3594:3): [True: 0, False: 0]
  ------------------
 3595|      0|		case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (3595:3): [True: 0, False: 0]
  ------------------
 3596|      0|			break;
 3597|       |
 3598|      0|		default:
  ------------------
  |  Branch (3598:3): [True: 0, False: 0]
  ------------------
 3599|      0|			goto bad_cast;
 3600|      0|		}
 3601|       |
 3602|      0|		fr_value_box_init(&tmp, FR_TYPE_UINT32, src->enumv, src->tainted);
  ------------------
  |  |  610|      0|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 3603|      0|		memcpy(&tmp.vb_uint32, &src->vb_ip.addr.v4, sizeof(tmp.vb_uint32));
  ------------------
  |  |  274|      0|#define vb_uint32				datum.uint32
  ------------------
              		memcpy(&tmp.vb_uint32, &src->vb_ip.addr.v4, sizeof(tmp.vb_uint32));
  ------------------
  |  |  264|      0|#define vb_ip					datum.ip
  ------------------
              		memcpy(&tmp.vb_uint32, &src->vb_ip.addr.v4, sizeof(tmp.vb_uint32));
  ------------------
  |  |  274|      0|#define vb_uint32				datum.uint32
  ------------------
 3604|      0|		fr_value_box_hton(&tmp, &tmp);
 3605|      0|		return fr_value_box_cast_integer_to_integer(ctx, dst, dst_type, dst_enumv, &tmp);
 3606|      0|	}
 3607|       |
 3608|      0|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (3608:2): [True: 0, False: 2]
  ------------------
 3609|      0|	{
 3610|      0|		fr_value_box_t	tmp;
 3611|       |
 3612|      0|		switch (dst_type) {
 3613|      0|		case FR_TYPE_INT64:
  ------------------
  |  Branch (3613:3): [True: 0, False: 0]
  ------------------
 3614|      0|		case FR_TYPE_UINT64:
  ------------------
  |  Branch (3614:3): [True: 0, False: 0]
  ------------------
 3615|      0|		case FR_TYPE_DATE:
  ------------------
  |  Branch (3615:3): [True: 0, False: 0]
  ------------------
 3616|      0|		case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (3616:3): [True: 0, False: 0]
  ------------------
 3617|      0|			break;
 3618|       |
 3619|      0|		default:
  ------------------
  |  Branch (3619:3): [True: 0, False: 0]
  ------------------
 3620|      0|			goto bad_cast;
 3621|      0|		}
 3622|       |
 3623|      0|		fr_value_box_init(&tmp, FR_TYPE_UINT64, src->enumv, src->tainted);
  ------------------
  |  |  610|      0|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 3624|      0|		memcpy(((uint8_t *)&tmp.vb_uint64) + (sizeof(tmp.vb_uint64) - sizeof(src->vb_ether)),
  ------------------
  |  |  275|      0|#define vb_uint64				datum.uint64
  ------------------
              		memcpy(((uint8_t *)&tmp.vb_uint64) + (sizeof(tmp.vb_uint64) - sizeof(src->vb_ether)),
  ------------------
  |  |  275|      0|#define vb_uint64				datum.uint64
  ------------------
              		memcpy(((uint8_t *)&tmp.vb_uint64) + (sizeof(tmp.vb_uint64) - sizeof(src->vb_ether)),
  ------------------
  |  |  269|      0|#define vb_ether				datum.ether.addr
  ------------------
 3625|      0|		       &src->vb_ether, sizeof(src->vb_ether));
  ------------------
  |  |  269|      0|#define vb_ether				datum.ether.addr
  ------------------
              		       &src->vb_ether, sizeof(src->vb_ether));
  ------------------
  |  |  269|      0|#define vb_ether				datum.ether.addr
  ------------------
 3626|      0|#ifndef WORDS_BIGENDIAN
 3627|       |		/*
 3628|       |		 *	Ethernet addresses are always stored bigendian,
 3629|       |		 *	convert to native on little endian systems
 3630|       |		 */
 3631|      0|		fr_value_box_hton(&tmp, &tmp);
 3632|      0|#endif
 3633|      0|		return fr_value_box_cast_integer_to_integer(ctx, dst, dst_type, dst_enumv, &tmp);
 3634|      0|	}
 3635|       |
 3636|      0|	case FR_TYPE_IFID:
  ------------------
  |  Branch (3636:2): [True: 0, False: 2]
  ------------------
 3637|      0|	{
 3638|      0|		switch (dst_type) {
 3639|      0|		case FR_TYPE_UINT64:
  ------------------
  |  Branch (3639:3): [True: 0, False: 0]
  ------------------
 3640|      0|			break;
 3641|       |
 3642|      0|		default:
  ------------------
  |  Branch (3642:3): [True: 0, False: 0]
  ------------------
 3643|      0|			goto bad_cast;
 3644|      0|		}
 3645|       |
 3646|      0|		fr_value_box_init(dst, dst_type, dst_enumv, src->tainted);
  ------------------
  |  |  610|      0|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      0|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 3647|      0|		dst->vb_uint64 = fr_nbo_to_uint64(&src->vb_ifid[0]);
  ------------------
  |  |  275|      0|#define vb_uint64				datum.uint64
  ------------------
              		dst->vb_uint64 = fr_nbo_to_uint64(&src->vb_ifid[0]);
  ------------------
  |  |  268|      0|#define vb_ifid					datum.ifid.addr
  ------------------
 3648|      0|		return 0;
 3649|      0|	}
 3650|       |
 3651|      0|	case FR_TYPE_FLOAT32:
  ------------------
  |  Branch (3651:2): [True: 0, False: 2]
  ------------------
 3652|      0|		if (src->vb_float32 < (double) fr_value_box_integer_min[dst_type]) {
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
  |  Branch (3652:7): [True: 0, False: 0]
  ------------------
 3653|      0|		underflow:
 3654|      0|			fr_strerror_const("Source value for cast would underflow destination type");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3655|      0|			return -1;
 3656|      0|		}
 3657|       |
 3658|      0|		if (src->vb_float32 > (double) fr_value_box_integer_max[dst_type]) {
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
  |  Branch (3658:7): [True: 0, False: 0]
  ------------------
 3659|      0|		overflow:
 3660|      0|			fr_strerror_const("Source value for cast would overflow destination type");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3661|      0|			return -1;
 3662|      0|		}
 3663|       |
 3664|      0|		switch (dst_type) {
 3665|      0|		case FR_TYPE_UINT8:
  ------------------
  |  Branch (3665:3): [True: 0, False: 0]
  ------------------
 3666|      0|			dst->vb_uint8 = src->vb_float32;
  ------------------
  |  |  272|      0|#define vb_uint8				datum.uint8
  ------------------
              			dst->vb_uint8 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3667|      0|			break;
 3668|       |
 3669|      0|		case FR_TYPE_UINT16:
  ------------------
  |  Branch (3669:3): [True: 0, False: 0]
  ------------------
 3670|      0|			dst->vb_uint16 = src->vb_float32;
  ------------------
  |  |  273|      0|#define vb_uint16				datum.uint16
  ------------------
              			dst->vb_uint16 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3671|      0|			break;
 3672|       |
 3673|      0|		case FR_TYPE_UINT32:
  ------------------
  |  Branch (3673:3): [True: 0, False: 0]
  ------------------
 3674|      0|			dst->vb_uint32 = src->vb_float32;
  ------------------
  |  |  274|      0|#define vb_uint32				datum.uint32
  ------------------
              			dst->vb_uint32 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3675|      0|			break;
 3676|       |
 3677|      0|		case FR_TYPE_UINT64:
  ------------------
  |  Branch (3677:3): [True: 0, False: 0]
  ------------------
 3678|      0|			dst->vb_uint64 = src->vb_float32;
  ------------------
  |  |  275|      0|#define vb_uint64				datum.uint64
  ------------------
              			dst->vb_uint64 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3679|      0|			break;
 3680|       |
 3681|      0|		case FR_TYPE_INT8:
  ------------------
  |  Branch (3681:3): [True: 0, False: 0]
  ------------------
 3682|      0|			dst->vb_int8 = src->vb_float32;
  ------------------
  |  |  278|      0|#define vb_int8					datum.int8
  ------------------
              			dst->vb_int8 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3683|      0|			break;
 3684|       |
 3685|      0|		case FR_TYPE_INT16:
  ------------------
  |  Branch (3685:3): [True: 0, False: 0]
  ------------------
 3686|      0|			dst->vb_int16 = src->vb_float32;
  ------------------
  |  |  279|      0|#define vb_int16				datum.int16
  ------------------
              			dst->vb_int16 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3687|      0|			break;
 3688|       |
 3689|      0|		case FR_TYPE_INT32:
  ------------------
  |  Branch (3689:3): [True: 0, False: 0]
  ------------------
 3690|      0|			dst->vb_int32 = src->vb_float32;
  ------------------
  |  |  280|      0|#define vb_int32				datum.int32
  ------------------
              			dst->vb_int32 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3691|      0|			break;
 3692|       |
 3693|      0|		case FR_TYPE_INT64:
  ------------------
  |  Branch (3693:3): [True: 0, False: 0]
  ------------------
 3694|      0|			dst->vb_int64 = src->vb_float32;
  ------------------
  |  |  281|      0|#define vb_int64				datum.int64
  ------------------
              			dst->vb_int64 = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3695|      0|			break;
 3696|       |
 3697|      0|		case FR_TYPE_SIZE:
  ------------------
  |  Branch (3697:3): [True: 0, False: 0]
  ------------------
 3698|      0|			dst->vb_size = src->vb_float32;
  ------------------
  |  |  288|      0|#define vb_size					datum.size
  ------------------
              			dst->vb_size = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3699|      0|			break;
 3700|       |
 3701|      0|		case FR_TYPE_DATE: {
  ------------------
  |  Branch (3701:3): [True: 0, False: 0]
  ------------------
 3702|      0|			int64_t sec, nsec;
 3703|       |
 3704|      0|			sec = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3705|      0|			sec *= NSEC;
  ------------------
  |  |  379|      0|#define NSEC	(1000000000)
  ------------------
 3706|      0|			nsec = ((src->vb_float32 * NSEC) - ((float) sec));
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
              			nsec = ((src->vb_float32 * NSEC) - ((float) sec));
  ------------------
  |  |  379|      0|#define NSEC	(1000000000)
  ------------------
 3707|       |
 3708|      0|			dst->vb_date = fr_unix_time_from_nsec(sec + nsec);
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
 3709|      0|		}
 3710|      0|			break;
 3711|       |
 3712|      0|		case FR_TYPE_TIME_DELTA: {
  ------------------
  |  Branch (3712:3): [True: 0, False: 0]
  ------------------
 3713|      0|			int64_t sec, nsec;
 3714|      0|			int64_t res = NSEC;
  ------------------
  |  |  379|      0|#define NSEC	(1000000000)
  ------------------
 3715|      0|			bool fail = false;
 3716|       |
 3717|      0|			if (dst->enumv) res = fr_time_multiplier_by_res[dst->enumv->flags.flag_time_res];
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3717:8): [True: 0, False: 0]
  ------------------
 3718|       |
 3719|      0|			sec = src->vb_float32;
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3720|      0|			sec *= res;
 3721|      0|			nsec = ((src->vb_float32 * res) - ((double) sec));
  ------------------
  |  |  283|      0|#define vb_float32				datum.float32
  ------------------
 3722|       |
 3723|      0|			dst->vb_time_delta = fr_time_delta_from_integer(&fail, sec + nsec,
  ------------------
  |  |  290|      0|#define vb_time_delta				datum.time_delta
  ------------------
 3724|      0|									dst->enumv ? dst->enumv->flags.flag_time_res : FR_TIME_RES_NSEC);
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3724:10): [True: 0, False: 0]
  ------------------
 3725|      0|			if (fail) goto overflow;
  ------------------
  |  Branch (3725:8): [True: 0, False: 0]
  ------------------
 3726|      0|		}
 3727|      0|			break;
 3728|       |
 3729|      0|		default:
  ------------------
  |  Branch (3729:3): [True: 0, False: 0]
  ------------------
 3730|      0|			goto bad_cast;
 3731|      0|		}
 3732|      0|		return 0;
 3733|       |
 3734|      0|	case FR_TYPE_FLOAT64:
  ------------------
  |  Branch (3734:2): [True: 0, False: 2]
  ------------------
 3735|      0|		if (src->vb_float64 < (double) fr_value_box_integer_min[dst_type]) goto underflow;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
  |  Branch (3735:7): [True: 0, False: 0]
  ------------------
 3736|       |
 3737|      0|		if (src->vb_float64 > (double) fr_value_box_integer_max[dst_type]) goto overflow;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
  |  Branch (3737:7): [True: 0, False: 0]
  ------------------
 3738|       |
 3739|      0|		switch (dst_type) {
 3740|      0|		case FR_TYPE_UINT8:
  ------------------
  |  Branch (3740:3): [True: 0, False: 0]
  ------------------
 3741|      0|			dst->vb_uint8 = src->vb_float64;
  ------------------
  |  |  272|      0|#define vb_uint8				datum.uint8
  ------------------
              			dst->vb_uint8 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3742|      0|			break;
 3743|       |
 3744|      0|		case FR_TYPE_UINT16:
  ------------------
  |  Branch (3744:3): [True: 0, False: 0]
  ------------------
 3745|      0|			dst->vb_uint16 = src->vb_float64;
  ------------------
  |  |  273|      0|#define vb_uint16				datum.uint16
  ------------------
              			dst->vb_uint16 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3746|      0|			break;
 3747|       |
 3748|      0|		case FR_TYPE_UINT32:
  ------------------
  |  Branch (3748:3): [True: 0, False: 0]
  ------------------
 3749|      0|			dst->vb_uint32 = src->vb_float64;
  ------------------
  |  |  274|      0|#define vb_uint32				datum.uint32
  ------------------
              			dst->vb_uint32 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3750|      0|			break;
 3751|       |
 3752|      0|		case FR_TYPE_UINT64:
  ------------------
  |  Branch (3752:3): [True: 0, False: 0]
  ------------------
 3753|      0|			dst->vb_uint64 = src->vb_float64;
  ------------------
  |  |  275|      0|#define vb_uint64				datum.uint64
  ------------------
              			dst->vb_uint64 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3754|      0|			break;
 3755|       |
 3756|      0|		case FR_TYPE_INT8:
  ------------------
  |  Branch (3756:3): [True: 0, False: 0]
  ------------------
 3757|      0|			dst->vb_int8 = src->vb_float64;
  ------------------
  |  |  278|      0|#define vb_int8					datum.int8
  ------------------
              			dst->vb_int8 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3758|      0|			break;
 3759|       |
 3760|      0|		case FR_TYPE_INT16:
  ------------------
  |  Branch (3760:3): [True: 0, False: 0]
  ------------------
 3761|      0|			dst->vb_int16 = src->vb_float64;
  ------------------
  |  |  279|      0|#define vb_int16				datum.int16
  ------------------
              			dst->vb_int16 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3762|      0|			break;
 3763|       |
 3764|      0|		case FR_TYPE_INT32:
  ------------------
  |  Branch (3764:3): [True: 0, False: 0]
  ------------------
 3765|      0|			dst->vb_int32 = src->vb_float64;
  ------------------
  |  |  280|      0|#define vb_int32				datum.int32
  ------------------
              			dst->vb_int32 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3766|      0|			break;
 3767|       |
 3768|      0|		case FR_TYPE_INT64:
  ------------------
  |  Branch (3768:3): [True: 0, False: 0]
  ------------------
 3769|      0|			dst->vb_int64 = src->vb_float64;
  ------------------
  |  |  281|      0|#define vb_int64				datum.int64
  ------------------
              			dst->vb_int64 = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3770|      0|			break;
 3771|       |
 3772|      0|		case FR_TYPE_SIZE:
  ------------------
  |  Branch (3772:3): [True: 0, False: 0]
  ------------------
 3773|      0|			dst->vb_size = src->vb_float64;
  ------------------
  |  |  288|      0|#define vb_size					datum.size
  ------------------
              			dst->vb_size = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3774|      0|			break;
 3775|       |
 3776|      0|		case FR_TYPE_DATE: {
  ------------------
  |  Branch (3776:3): [True: 0, False: 0]
  ------------------
 3777|      0|			int64_t sec, nsec;
 3778|       |
 3779|      0|			sec = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3780|      0|			sec *= NSEC;
  ------------------
  |  |  379|      0|#define NSEC	(1000000000)
  ------------------
 3781|      0|			nsec = ((src->vb_float64 * NSEC) - ((double) sec));
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
              			nsec = ((src->vb_float64 * NSEC) - ((double) sec));
  ------------------
  |  |  379|      0|#define NSEC	(1000000000)
  ------------------
 3782|       |
 3783|      0|			dst->vb_date = fr_unix_time_from_nsec(sec + nsec);
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
 3784|      0|		}
 3785|      0|			break;
 3786|       |
 3787|      0|		case FR_TYPE_TIME_DELTA: {
  ------------------
  |  Branch (3787:3): [True: 0, False: 0]
  ------------------
 3788|      0|			int64_t sec, nsec;
 3789|      0|			int64_t res = NSEC;
  ------------------
  |  |  379|      0|#define NSEC	(1000000000)
  ------------------
 3790|      0|			bool fail = false;
 3791|       |
 3792|      0|			if (dst->enumv) res = fr_time_multiplier_by_res[dst->enumv->flags.flag_time_res];
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3792:8): [True: 0, False: 0]
  ------------------
 3793|       |
 3794|      0|			sec = src->vb_float64;
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3795|      0|			sec *= res;
 3796|      0|			nsec = ((src->vb_float64 * res) - ((double) sec));
  ------------------
  |  |  284|      0|#define vb_float64				datum.float64
  ------------------
 3797|       |
 3798|      0|			dst->vb_time_delta = fr_time_delta_from_integer(&fail, sec + nsec,
  ------------------
  |  |  290|      0|#define vb_time_delta				datum.time_delta
  ------------------
 3799|      0|									dst->enumv ? dst->enumv->flags.flag_time_res : FR_TIME_RES_NSEC);
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3799:10): [True: 0, False: 0]
  ------------------
 3800|      0|			if (fail) goto overflow;
  ------------------
  |  Branch (3800:8): [True: 0, False: 0]
  ------------------
 3801|      0|		}
 3802|      0|			break;
 3803|       |
 3804|      0|		default:
  ------------------
  |  Branch (3804:3): [True: 0, False: 0]
  ------------------
 3805|      0|			goto bad_cast;
 3806|      0|		}
 3807|      0|		return 0;
 3808|       |
 3809|      0|	default:
  ------------------
  |  Branch (3809:2): [True: 0, False: 2]
  ------------------
 3810|      0|		break;
 3811|      2|	}
 3812|       |
 3813|      0|bad_cast:
 3814|      0|	return fr_value_box_cast_unsupported(dst_type, src->type);
 3815|      2|}
value.c:fr_value_box_cast_integer_to_integer:
 3414|      2|{
 3415|      2|	uint64_t		tmp = 0;
 3416|      2|	size_t			len = fr_value_box_field_sizes[src->type];
 3417|      2|	int64_t			min;
 3418|       |
 3419|      2|	fr_value_box_safety_copy_changed(dst, src);
 3420|       |
 3421|      2|#define SIGN_BIT_HIGH(_int, _len)	((((uint64_t)1) << (((_len) << 3) - 1)) & (_int))
 3422|      2|#define SIGN_PROMOTE(_int, _len)	((_len) < sizeof(_int) ? \
 3423|      2|					(_int) | (~((__typeof__(_int))0)) << ((_len) << 3) : (_int))
 3424|       |
 3425|      2|#if !defined(NDEBUG) || defined(STATIC_ANALYZER)
 3426|       |	/*
 3427|       |	 *	Helps catch invalid fr_value_box_field_sizes
 3428|       |	 *	entries, and shuts up clang analyzer.
 3429|       |	 */
 3430|      2|	if (!fr_cond_assert_msg(len > 0, "Invalid cast from %s to %s. "
  ------------------
  |  |  148|      2|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|      4|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (3430:6): [True: 0, False: 2]
  ------------------
 3431|      2|			        "invalid source type len, expected > 0, got %zu",
 3432|      2|			        fr_type_to_str(src->type),
 3433|      2|			        fr_type_to_str(dst_type),
 3434|      2|			        len)) return -1;
 3435|       |
 3436|      2|	if (!fr_cond_assert_msg(len <= sizeof(uint64_t),
  ------------------
  |  |  148|      2|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|      4|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (3436:6): [True: 0, False: 2]
  ------------------
 3437|      2|				"Invalid cast from %s to %s. "
 3438|      2|				"invalid source type len, expected <= %zu, got %zu",
 3439|      2|				fr_type_to_str(src->type),
 3440|      2|				fr_type_to_str(dst_type),
 3441|      2|				sizeof(uint64_t), len)) return -1;
 3442|      2|#endif
 3443|       |
 3444|      2|	switch (src->type) {
 3445|       |	/*
 3446|       |	 *	Dates are always represented in nanoseconds
 3447|       |	 *	internally, but when we convert to another
 3448|       |	 *	integer type, we scale appropriately.
 3449|       |	 *
 3450|       |	 *	i.e. if the attribute value resolution is
 3451|       |	 *	seconds, then the integer value is
 3452|       |	 *	nanoseconds -> seconds.
 3453|       |	 */
 3454|      0|	case FR_TYPE_DATE:
  ------------------
  |  Branch (3454:2): [True: 0, False: 2]
  ------------------
 3455|      0|	{
 3456|      0|		fr_time_res_t res = FR_TIME_RES_SEC;
 3457|      0|		if (src->enumv) res = src->enumv->flags.flag_time_res;
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3457:7): [True: 0, False: 0]
  ------------------
 3458|       |
 3459|      0|		tmp = fr_unix_time_to_integer(src->vb_date, res);
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
 3460|      0|	}
 3461|      0|		break;
 3462|       |
 3463|       |	/*
 3464|       |	 *	Same deal with time deltas.  Note that
 3465|       |	 *	even though we store the value as an
 3466|       |	 *	unsigned integer, it'll be cast to a
 3467|       |	 *	signed integer for comparisons.
 3468|       |	 */
 3469|      0|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (3469:2): [True: 0, False: 2]
  ------------------
 3470|      0|	{
 3471|      0|		fr_time_res_t res = FR_TIME_RES_SEC;
 3472|       |
 3473|      0|		if (src->enumv) res = src->enumv->flags.flag_time_res;
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3473:7): [True: 0, False: 0]
  ------------------
 3474|       |
 3475|      0|		tmp = (uint64_t)fr_time_delta_to_integer(src->vb_time_delta, res);
  ------------------
  |  |  290|      0|#define vb_time_delta				datum.time_delta
  ------------------
 3476|      0|	}
 3477|      0|		break;
 3478|       |
 3479|      2|	default:
  ------------------
  |  Branch (3479:2): [True: 2, False: 0]
  ------------------
 3480|       |#ifdef WORDS_BIGENDIAN
 3481|       |		memcpy(((uint8_t *)&tmp) + (sizeof(tmp) - len),
 3482|       |		       fr_value_box_raw(src, src->type), len);
 3483|       |#else
 3484|      2|		memcpy(&tmp, fr_value_box_raw(src, src->type), len);
 3485|      2|#endif
 3486|      2|		break;
 3487|      2|	}
 3488|       |
 3489|      2|	min = fr_value_box_integer_min[dst_type];
 3490|       |
 3491|       |	/*
 3492|       |	 *	Sign promote the input if the source type is
 3493|       |	 *	signed, and the high bit is set.
 3494|       |	 */
 3495|      2|	if (fr_value_box_integer_min[src->type] < 0) {
  ------------------
  |  Branch (3495:6): [True: 0, False: 2]
  ------------------
 3496|      0|		if (SIGN_BIT_HIGH(tmp, len)) tmp = SIGN_PROMOTE(tmp, len);
  ------------------
  |  | 3421|      0|#define SIGN_BIT_HIGH(_int, _len)	((((uint64_t)1) << (((_len) << 3) - 1)) & (_int))
  |  |  ------------------
  |  |  |  Branch (3421:35): [True: 0, False: 0]
  |  |  ------------------
  ------------------
              		if (SIGN_BIT_HIGH(tmp, len)) tmp = SIGN_PROMOTE(tmp, len);
  ------------------
  |  | 3422|      0|#define SIGN_PROMOTE(_int, _len)	((_len) < sizeof(_int) ? \
  |  |  ------------------
  |  |  |  Branch (3422:35): [True: 0, False: 0]
  |  |  ------------------
  |  | 3423|      0|					(_int) | (~((__typeof__(_int))0)) << ((_len) << 3) : (_int))
  ------------------
 3497|       |
 3498|      0|		if ((int64_t)tmp < min) {
  ------------------
  |  Branch (3498:7): [True: 0, False: 0]
  ------------------
 3499|      0|			fr_strerror_printf("Invalid cast from %s to %s.  %"PRId64" "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3500|      0|					   "outside value range %"PRId64"-%"PRIu64,
 3501|      0|					   fr_type_to_str(src->type),
 3502|      0|					   fr_type_to_str(dst_type),
 3503|      0|					   (int64_t)tmp,
 3504|      0|					   min, fr_value_box_integer_max[dst_type]);
 3505|      0|			return -1;
 3506|      0|		}
 3507|      2|	} else if (tmp > fr_value_box_integer_max[dst_type]) {
  ------------------
  |  Branch (3507:13): [True: 0, False: 2]
  ------------------
 3508|      0|		fr_strerror_printf("Invalid cast from %s to %s.  %"PRIu64" "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 3509|      0|				   "outside value range 0-%"PRIu64,
 3510|      0|				   fr_type_to_str(src->type),
 3511|      0|				   fr_type_to_str(dst_type),
 3512|      0|				   tmp, fr_value_box_integer_max[dst_type]);
 3513|      0|		return -1;
 3514|      0|	}
 3515|       |
 3516|      2|	fr_value_box_init(dst, dst_type, dst_enumv, src->tainted);
  ------------------
  |  |  610|      2|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|      2|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 3517|      2|	switch (dst_type) {
 3518|      0|	case FR_TYPE_DATE:
  ------------------
  |  Branch (3518:2): [True: 0, False: 2]
  ------------------
 3519|      0|	{
 3520|      0|		bool overflow;
 3521|      0|		fr_time_res_t res = FR_TIME_RES_SEC;
 3522|      0|		if (dst->enumv) res = dst->enumv->flags.flag_time_res;
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3522:7): [True: 0, False: 0]
  ------------------
 3523|       |
 3524|      0|		dst->vb_date = fr_unix_time_from_integer(&overflow, tmp, res);
  ------------------
  |  |  286|      0|#define vb_date					datum.date
  ------------------
 3525|      0|		if (overflow) {
  ------------------
  |  Branch (3525:7): [True: 0, False: 0]
  ------------------
 3526|      0|			fr_strerror_const("Input to date type would overflow");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3527|      0|			return -1;
 3528|      0|		}
 3529|      0|	}
 3530|      0|		break;
 3531|       |
 3532|      0|	case FR_TYPE_TIME_DELTA:
  ------------------
  |  Branch (3532:2): [True: 0, False: 2]
  ------------------
 3533|      0|	{
 3534|      0|		bool overflow;
 3535|      0|		fr_time_res_t res = FR_TIME_RES_SEC;
 3536|      0|		if (dst->enumv) res = dst->enumv->flags.flag_time_res;
  ------------------
  |  |  156|      0|#define flag_time_res type_size
  ------------------
  |  Branch (3536:7): [True: 0, False: 0]
  ------------------
 3537|       |
 3538|      0|		dst->vb_time_delta = fr_time_delta_from_integer(&overflow, tmp, res);
  ------------------
  |  |  290|      0|#define vb_time_delta				datum.time_delta
  ------------------
 3539|      0|		if (overflow) {
  ------------------
  |  Branch (3539:7): [True: 0, False: 0]
  ------------------
 3540|      0|			fr_strerror_const("Input to time_delta type would overflow");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
 3541|      0|			return -1;
 3542|      0|		}
 3543|      0|	}
 3544|      0|		break;
 3545|       |
 3546|      2|	default:
  ------------------
  |  Branch (3546:2): [True: 2, False: 0]
  ------------------
 3547|       |#ifdef WORDS_BIGENDIAN
 3548|       |		memcpy(fr_value_box_raw(dst, dst->type),
 3549|       |		       ((uint8_t *)&tmp) + (sizeof(tmp) - len), fr_value_box_field_sizes[dst_type]);
 3550|       |#else
 3551|      2|		memcpy(fr_value_box_raw(dst, dst->type),
 3552|      2|		       &tmp, fr_value_box_field_sizes[dst_type]);
 3553|      2|#endif
 3554|      2|		break;
 3555|      2|	}
 3556|       |
 3557|      2|	return 0;
 3558|      2|}
value.c:fr_value_box_copy_meta:
  644|    806|{
  645|    806|	switch (src->type) {
  ------------------
  |  Branch (645:10): [True: 806, False: 0]
  ------------------
  646|      0|	case FR_TYPE_VARIABLE_SIZE:
  ------------------
  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  200|      0|	_beg(FR_TYPE_STRING) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  201|      0|	_end(FR_TYPE_OCTETS)
  |  |  |  |  ------------------
  |  |  |  |  |  |  311|      0|#define FR_TYPE_VARIABLE_SIZE			FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (646:2): [True: 0, False: 806]
  ------------------
  647|      0|		dst->vb_length = src->vb_length;
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
              		dst->vb_length = src->vb_length;
  ------------------
  |  |  292|      0|#define vb_length				datum.length
  ------------------
  648|      0|		break;
  649|       |	/*
  650|       |	 *	Not 100% sure this should be done here
  651|       |	 *	but if the intent is to make a null
  652|       |	 *	box usable, then we need to do this
  653|       |	 *	somewhere.
  654|       |	 */
  655|      0|	case FR_TYPE_GROUP:
  ------------------
  |  Branch (655:2): [True: 0, False: 806]
  ------------------
  656|      0|		fr_value_box_list_init(&dst->vb_group);
  ------------------
  |  |  261|      0|#define vb_group				datum.children
  ------------------
  657|      0|		break;
  658|       |
  659|  8.15k|	case FR_TYPE_NUMERIC:
  ------------------
  |  |  306|      0|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  154|      0|	_beg(FR_TYPE_FLOAT32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  306|      0|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  155|      0|	_mid(FR_TYPE_FLOAT64) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  306|      0|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  156|      0|	FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  127|      4|	_beg(FR_TYPE_BOOL) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  306|      4|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      4|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 4, False: 802]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  128|      4|	FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  107|    354|	_beg(FR_TYPE_UINT8) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    354|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    354|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 350, False: 456]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  108|    544|	_mid(FR_TYPE_UINT16) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    544|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    544|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 190, False: 616]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  109|    806|	_mid(FR_TYPE_UINT32) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 262, False: 544]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  110|    806|	_mid(FR_TYPE_UINT64) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  111|    806|	_mid(FR_TYPE_INT8) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  112|    806|	_mid(FR_TYPE_INT16) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  113|    806|	_mid(FR_TYPE_INT32) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  114|    806|	_mid(FR_TYPE_INT64) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  115|    806|	_mid(FR_TYPE_DATE) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  116|    806|	_mid(FR_TYPE_TIME_DELTA) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  117|    806|	_end(FR_TYPE_SIZE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  306|    806|#define FR_TYPE_NUMERIC				FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  301|    806|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (659:2): [True: 0, False: 806]
  ------------------
  660|  8.15k|	case FR_TYPE_IP:
  ------------------
  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  168|    806|	_beg(FR_TYPE_COMBO_IP_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|    806|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  169|    806|	_mid(FR_TYPE_COMBO_IP_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  170|    806|	_mid(FR_TYPE_IPV4_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  171|    806|	_mid(FR_TYPE_IPV4_PREFIX) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  172|    806|	_mid(FR_TYPE_IPV6_ADDR) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  300|    806|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 806]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  173|    806|	_end(FR_TYPE_IPV6_PREFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  308|    806|#define FR_TYPE_IP				FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  301|    806|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (660:2): [True: 0, False: 806]
  ------------------
  661|  4.03k|	case FR_TYPE_IFID:
  ------------------
  |  Branch (661:2): [True: 0, False: 806]
  ------------------
  662|    806|	case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (662:2): [True: 0, False: 806]
  ------------------
  663|    806|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (663:2): [True: 0, False: 806]
  ------------------
  664|    806|	case FR_TYPE_NULL:
  ------------------
  |  Branch (664:2): [True: 0, False: 806]
  ------------------
  665|    806|	case FR_TYPE_VOID:
  ------------------
  |  Branch (665:2): [True: 0, False: 806]
  ------------------
  666|    806|	case FR_TYPE_VALUE_BOX_CURSOR:
  ------------------
  |  Branch (666:2): [True: 0, False: 806]
  ------------------
  667|    806|	case FR_TYPE_VALUE_BOX:
  ------------------
  |  Branch (667:2): [True: 0, False: 806]
  ------------------
  668|    806|	case FR_TYPE_PAIR_CURSOR:
  ------------------
  |  Branch (668:2): [True: 0, False: 806]
  ------------------
  669|    806|		break;
  670|       |
  671|      0|	case FR_TYPE_TLV:
  ------------------
  |  Branch (671:2): [True: 0, False: 806]
  ------------------
  672|      0|	case FR_TYPE_STRUCT:
  ------------------
  |  Branch (672:2): [True: 0, False: 806]
  ------------------
  673|      0|	case FR_TYPE_VSA:
  ------------------
  |  Branch (673:2): [True: 0, False: 806]
  ------------------
  674|      0|	case FR_TYPE_VENDOR:
  ------------------
  |  Branch (674:2): [True: 0, False: 806]
  ------------------
  675|      0|	case FR_TYPE_UNION:
  ------------------
  |  Branch (675:2): [True: 0, False: 806]
  ------------------
  676|      0|	case FR_TYPE_MAX:
  ------------------
  |  Branch (676:2): [True: 0, False: 806]
  ------------------
  677|      0|		fr_assert(0);
  ------------------
  |  |  194|      0|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      0|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  678|      0|		break;
  679|    806|	}
  680|       |
  681|    806|	dst->enumv = src->enumv;
  682|    806|	dst->type = src->type;
  683|    806|	dst->tainted = src->tainted;
  684|    806|	dst->safe_for = src->safe_for;
  685|    806|	dst->secret = src->secret;
  686|    806|	fr_value_box_list_entry_init(dst);
  687|    806|}
value.c:fr_value_box_from_numeric_substr:
 5312|    722|{
 5313|    722|	fr_slen_t		slen;
 5314|    722|	fr_sbuff_parse_error_t	err;
 5315|       |
 5316|    722|	fr_value_box_init(dst, dst_type, dst_enumv, tainted);
  ------------------
  |  |  610|    722|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|    722|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
 5317|       |
 5318|    722|	switch (dst_type) {
 5319|    272|	case FR_TYPE_UINT8:
  ------------------
  |  Branch (5319:2): [True: 272, False: 450]
  ------------------
 5320|    272|		slen = fr_sbuff_out(&err, &dst->vb_uint8, in);
  ------------------
  |  | 1685|    272|	_Generic((_out), \
  |  | 1686|    272|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|    272|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|    272|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|    272|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|    272|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|    272|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|    272|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|    272|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|    272|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|    272|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|    272|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|    272|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|    272|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|    272|	)
  ------------------
 5321|    272|		break;
 5322|       |
 5323|    190|	case FR_TYPE_UINT16:
  ------------------
  |  Branch (5323:2): [True: 190, False: 532]
  ------------------
 5324|    190|		slen = fr_sbuff_out(&err, &dst->vb_uint16, in);
  ------------------
  |  | 1685|    190|	_Generic((_out), \
  |  | 1686|    190|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|    190|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|    190|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|    190|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|    190|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|    190|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|    190|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|    190|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|    190|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|    190|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|    190|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|    190|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|    190|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|    190|	)
  ------------------
 5325|    190|		break;
 5326|       |
 5327|    260|	case FR_TYPE_UINT32:
  ------------------
  |  Branch (5327:2): [True: 260, False: 462]
  ------------------
 5328|    260|		slen = fr_sbuff_out(&err, &dst->vb_uint32, in);
  ------------------
  |  | 1685|    260|	_Generic((_out), \
  |  | 1686|    260|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|    260|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|    260|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|    260|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|    260|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|    260|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|    260|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|    260|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|    260|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|    260|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|    260|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|    260|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|    260|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|    260|	)
  ------------------
 5329|    260|		break;
 5330|       |
 5331|      0|	case FR_TYPE_UINT64:
  ------------------
  |  Branch (5331:2): [True: 0, False: 722]
  ------------------
 5332|      0|		slen = fr_sbuff_out(&err, &dst->vb_uint64, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5333|      0|		break;
 5334|       |
 5335|      0|	case FR_TYPE_INT8:
  ------------------
  |  Branch (5335:2): [True: 0, False: 722]
  ------------------
 5336|      0|		slen = fr_sbuff_out(&err, &dst->vb_int8, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5337|      0|		break;
 5338|       |
 5339|      0|	case FR_TYPE_INT16:
  ------------------
  |  Branch (5339:2): [True: 0, False: 722]
  ------------------
 5340|      0|		slen = fr_sbuff_out(&err, &dst->vb_int16, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5341|      0|		break;
 5342|       |
 5343|      0|	case FR_TYPE_INT32:
  ------------------
  |  Branch (5343:2): [True: 0, False: 722]
  ------------------
 5344|      0|		slen = fr_sbuff_out(&err, &dst->vb_int32, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5345|      0|		break;
 5346|       |
 5347|      0|	case FR_TYPE_INT64:
  ------------------
  |  Branch (5347:2): [True: 0, False: 722]
  ------------------
 5348|      0|		slen = fr_sbuff_out(&err, &dst->vb_int64, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5349|      0|		break;
 5350|       |
 5351|      0|	case FR_TYPE_SIZE:
  ------------------
  |  Branch (5351:2): [True: 0, False: 722]
  ------------------
 5352|      0|		slen = fr_sbuff_out(&err, &dst->vb_size, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5353|      0|		break;
 5354|       |
 5355|      0|	case FR_TYPE_FLOAT32:
  ------------------
  |  Branch (5355:2): [True: 0, False: 722]
  ------------------
 5356|      0|		slen = fr_sbuff_out(&err, &dst->vb_float32, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5357|      0|		break;
 5358|       |
 5359|      0|	case FR_TYPE_FLOAT64:
  ------------------
  |  Branch (5359:2): [True: 0, False: 722]
  ------------------
 5360|      0|		slen = fr_sbuff_out(&err, &dst->vb_float64, in);
  ------------------
  |  | 1685|      0|	_Generic((_out), \
  |  | 1686|      0|		 bool *		: fr_sbuff_out_bool((bool *)_out, _in), \
  |  | 1687|      0|		 int8_t *	: fr_sbuff_out_int8(_err, (int8_t *)_out, _in, true), \
  |  | 1688|      0|		 int16_t *	: fr_sbuff_out_int16(_err, (int16_t *)_out, _in, true), \
  |  | 1689|      0|		 int32_t *	: fr_sbuff_out_int32(_err, (int32_t *)_out, _in, true), \
  |  | 1690|      0|		 int64_t *	: fr_sbuff_out_int64(_err, (int64_t *)_out, _in, true), \
  |  | 1691|      0|		 _fr_sbuff_out_ssize(_err, _out, _in) \
  |  | 1692|      0|		 uint8_t *	: fr_sbuff_out_uint8(_err, (uint8_t *)_out, _in, true), \
  |  | 1693|      0|		 uint16_t *	: fr_sbuff_out_uint16(_err, (uint16_t *)_out, _in, true), \
  |  | 1694|      0|		 uint32_t *	: fr_sbuff_out_uint32(_err, (uint32_t *)_out, _in, true), \
  |  | 1695|      0|		 uint64_t *	: fr_sbuff_out_uint64(_err, (uint64_t *)_out, _in, true), \
  |  | 1696|      0|		 _fr_sbuff_out_size(_err, _out, _in) \
  |  | 1697|      0|		 float *	: fr_sbuff_out_float32(_err, (float *)_out, _in, true), \
  |  | 1698|      0|		 double *	: fr_sbuff_out_float64(_err, (double *)_out, _in, true) \
  |  | 1699|      0|	)
  ------------------
 5361|      0|		break;
 5362|       |
 5363|      0|	default:
  ------------------
  |  Branch (5363:2): [True: 0, False: 722]
  ------------------
 5364|      0|		fr_assert_fail(NULL);
  ------------------
  |  |  208|      0|#define		fr_assert_fail(_msg, ...) _fr_assert_fail(__FILE__, __LINE__, "false", _msg,  ## __VA_ARGS__)
  ------------------
 5365|      0|		return -1;
 5366|    722|	}
 5367|       |
 5368|    722|	if (slen < 0) {
  ------------------
  |  Branch (5368:6): [True: 0, False: 722]
  ------------------
 5369|       |		/*
 5370|       |		 *	If an enumeration attribute is provided and we
 5371|       |		 *      don't find an integer, assume this is an enumv
 5372|       |		 *      lookup fail, and produce a better error.
 5373|       |		 */
 5374|      0|		if (dst_enumv && dst_enumv->flags.has_value && (err == FR_SBUFF_PARSE_ERROR_NOT_FOUND)) {
  ------------------
  |  Branch (5374:7): [True: 0, False: 0]
  |  Branch (5374:20): [True: 0, False: 0]
  |  Branch (5374:50): [True: 0, False: 0]
  ------------------
 5375|      0|			fr_sbuff_t our_in = FR_SBUFF(in);
  ------------------
  |  |  451|      0|#define FR_SBUFF(_sbuff_or_marker) _FR_SBUFF(_sbuff_or_marker, \
  |  |  ------------------
  |  |  |  |  428|      0|#define _FR_SBUFF(_sbuff_or_marker, _start, _current, _end, _extend, _eof, _adv_parent) \
  |  |  |  |  429|      0|((fr_sbuff_t){ \
  |  |  |  |  430|      0|	.buff		= fr_sbuff_buff(_sbuff_or_marker), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  812|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  813|      0|		 fr_sbuff_t *			: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  814|      0|		 fr_sbuff_t const *		: ((fr_sbuff_t const *)(_sbuff_or_marker))->buff, \
  |  |  |  |  |  |  815|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff, \
  |  |  |  |  |  |  816|      0|		 fr_sbuff_marker_t const *	: ((fr_sbuff_marker_t const *)(_sbuff_or_marker))->parent->buff \
  |  |  |  |  |  |  817|      0|	)
  |  |  |  |  ------------------
  |  |  |  |  431|      0|	.start		= (_start), \
  |  |  |  |  432|      0|	.end		= (_end), \
  |  |  |  |  433|      0|	.p		= (_current), \
  |  |  |  |  434|      0|	.is_const 	= fr_sbuff_ptr(_sbuff_or_marker)->is_const, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |  435|      0|	.adv_parent 	= (_adv_parent), \
  |  |  |  |  436|      0|	.shifted	= 0, \
  |  |  |  |  437|      0|	.extend		= (_extend), \
  |  |  |  |  438|      0|	.eof		= (_eof), \
  |  |  |  |  439|      0|	.uctx		= fr_sbuff_ptr(_sbuff_or_marker)->uctx, \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |  440|      0|	.parent 	= fr_sbuff_ptr(_sbuff_or_marker) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  801|      0|	_Generic((_sbuff_or_marker), \
  |  |  |  |  |  |  802|      0|		 fr_sbuff_t *			: ((fr_sbuff_t *)(_sbuff_or_marker)), \
  |  |  |  |  |  |  803|      0|		 fr_sbuff_marker_t *		: ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \
  |  |  |  |  |  |  804|      0|	)
  |  |  |  |  ------------------
  |  |  |  |  441|      0|})
  |  |  ------------------
  |  |  452|      0|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  453|      0|					     fr_sbuff_current(_sbuff_or_marker), \
  |  |  454|      0|					     fr_sbuff_end(_sbuff_or_marker), \
  |  |  455|      0|					     fr_sbuff_ptr(_sbuff_or_marker)->extend, \
  |  |  456|      0|					     fr_sbuff_ptr(_sbuff_or_marker)->eof, \
  |  |  457|      0|					     0x00)
  ------------------
 5376|      0|			fr_sbuff_adv_until(&our_in, SIZE_MAX, rules->terminals,
 5377|      0|					   rules->escapes ? rules->escapes->chr : '\0');
  ------------------
  |  Branch (5377:9): [True: 0, False: 0]
  ------------------
 5378|       |
 5379|      0|			fr_strerror_printf("Invalid enumeration value \"%pV\" for attribute %s",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  | 5380|      0|					   fr_box_strvalue_len(fr_sbuff_start(&our_in), fr_sbuff_used(&our_in)),
  |  |  |  |  ------------------
  |  |  |  |  |  |  309|      0|#define fr_box_strvalue_len(_val, _len)		_fr_box_with_len(FR_TYPE_STRING, .vb_strvalue, _val, _len)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  306|      0|#define _fr_box_with_len(_type, _field, _val, _len) &(fr_value_box_t){ .type = _type, _field = _val, .vb_length = _len, VALUE_BOX_NDEBUG_INITIALISER }
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  246|      0|#define VALUE_BOX_NDEBUG_INITIALISER .file = __FILE__, .line = __LINE__, .magic = FR_VALUE_BOX_MAGIC
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   91|      0|#  define FR_VALUE_BOX_MAGIC RADIUSD_MAGIC_NUMBER
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   81|      0|#  define RADIUSD_MAGIC_NUMBER ((uint64_t) HEXIFY2(MAGIC_PREFIX_DEBUG, RADIUSD_VERSION))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  206|      0|#  define HEXIFY2(b1,b2)	XHEXIFY2(b1, b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  205|      0|#  define XHEXIFY2(b1,b2)	(0x ## b1 ## b2)
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (306:115): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 5381|      0|					   dst_enumv->name);
  |  |  ------------------
  ------------------
 5380|      0|					   fr_box_strvalue_len(fr_sbuff_start(&our_in), fr_sbuff_used(&our_in)),
 5381|      0|					   dst_enumv->name);
 5382|      0|			return -1;
 5383|      0|		}
 5384|       |
 5385|      0|		if (err == FR_SBUFF_PARSE_ERROR_NOT_FOUND) {
  ------------------
  |  Branch (5385:7): [True: 0, False: 0]
  ------------------
 5386|      0|			fr_strerror_printf("Failed parsing string as type '%s'",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
 5387|      0|					   fr_type_to_str(dst_type));
 5388|      0|		} else {
 5389|      0|			fr_sbuff_parse_error_to_strerror(err);
 5390|      0|		}
 5391|      0|	}
 5392|       |
 5393|    722|	return slen;
 5394|    722|}

fr_dhcpv4_ok:
  249|  1.23k|{
  250|  1.23k|	uint32_t	magic;
  251|  1.23k|	uint8_t const	*code;
  252|  1.23k|	size_t		hlen;
  253|       |
  254|  1.23k|	if (data_len < MIN_PACKET_SIZE) {
  ------------------
  |  |   88|  1.23k|#define MIN_PACKET_SIZE		(244)
  ------------------
  |  Branch (254:6): [True: 16, False: 1.21k]
  ------------------
  255|     16|		fr_strerror_printf("DHCP packet is too small (%zu < %d)", data_len, MIN_PACKET_SIZE);
  ------------------
  |  |   65|     16|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  255|     16|		fr_strerror_printf("DHCP packet is too small (%zu < %d)", data_len, MIN_PACKET_SIZE);
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|     16|#define MIN_PACKET_SIZE		(244)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|     16|		return false;
  257|     16|	}
  258|       |
  259|  1.21k|	if (data_len > MAX_PACKET_SIZE) {
  ------------------
  |  |   90|  1.21k|#define MAX_PACKET_SIZE		(1500 - 40)
  ------------------
  |  Branch (259:6): [True: 23, False: 1.19k]
  ------------------
  260|     23|		fr_strerror_printf("DHCP packet is too large (%zd > %d)", data_len, MAX_PACKET_SIZE);
  ------------------
  |  |   65|     23|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  260|     23|		fr_strerror_printf("DHCP packet is too large (%zd > %d)", data_len, MAX_PACKET_SIZE);
  |  |  |  |  ------------------
  |  |  |  |  |  |   90|     23|#define MAX_PACKET_SIZE		(1500 - 40)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  261|     23|		return false;
  262|     23|	}
  263|       |
  264|  1.19k|	if (data[1] != 1) {
  ------------------
  |  Branch (264:6): [True: 703, False: 492]
  ------------------
  265|    703|		fr_strerror_printf("DHCP can only process ethernet requests, not type %02x", data[1]);
  ------------------
  |  |   65|    703|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  266|    703|		return false;
  267|    703|	}
  268|       |
  269|    492|	hlen = data[2];
  270|    492|	if ((hlen != 0) && (hlen != 6)) {
  ------------------
  |  Branch (270:6): [True: 42, False: 450]
  |  Branch (270:21): [True: 6, False: 36]
  ------------------
  271|      6|		fr_strerror_printf("Ethernet HW length incorrect.  Expected 6 got %zu", hlen);
  ------------------
  |  |   65|      6|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  272|      6|		return false;
  273|      6|	}
  274|       |
  275|    486|	memcpy(&magic, data + 236, 4);
  276|    486|	magic = ntohl(magic);
  277|    486|	if (magic != DHCP_OPTION_MAGIC_NUMBER) {
  ------------------
  |  |   41|    486|#define DHCP_OPTION_MAGIC_NUMBER (0x63825363)
  ------------------
  |  Branch (277:6): [True: 23, False: 463]
  ------------------
  278|     23|		fr_strerror_const("BOOTP not supported");
  ------------------
  |  |  223|     23|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  279|     23|		return false;
  280|     23|	}
  281|       |
  282|    463|	code = fr_dhcpv4_packet_get_option((dhcp_packet_t const *) data, data_len, attr_dhcp_message_type);
  283|    463|	if (!code || (code[1] != 1)) {
  ------------------
  |  Branch (283:6): [True: 22, False: 441]
  |  Branch (283:15): [True: 240, False: 201]
  ------------------
  284|    262|		fr_strerror_const("No message-type, or invalid option was found in the packet");
  ------------------
  |  |  223|    262|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  285|    262|		return false;
  286|    262|	}
  287|       |
  288|    201|	if ((code[2] == 0) || (code[2] >= DHCP_MAX_MESSAGE_TYPE)) {
  ------------------
  |  |  148|    201|#define DHCP_MAX_MESSAGE_TYPE (NUM_ELEMENTS(dhcp_message_types))
  |  |  ------------------
  |  |  |  |  358|    201|#define NUM_ELEMENTS(_t) (sizeof((_t)) / sizeof((_t)[0]))
  |  |  ------------------
  ------------------
  |  Branch (288:6): [True: 0, False: 201]
  |  Branch (288:24): [True: 1, False: 200]
  ------------------
  289|      1|		fr_strerror_printf("Unknown value %d for message-type option", code[2]);
  ------------------
  |  |   65|      1|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  290|      1|		return false;
  291|      1|	}
  292|       |
  293|       |	/*
  294|       |	 *	@todo - data_len MAY be larger than the data in the
  295|       |	 *	packet.  In which case, we should update data_len with
  296|       |	 *	the true size of the packet.
  297|       |	 */
  298|       |
  299|    200|	if (message_type) *message_type = code[2];
  ------------------
  |  Branch (299:6): [True: 0, False: 200]
  ------------------
  300|       |
  301|    200|	if (xid) {
  ------------------
  |  Branch (301:6): [True: 0, False: 200]
  ------------------
  302|      0|		memcpy(&magic, data + 4, 4);
  303|      0|		*xid = ntohl(magic);
  304|      0|	}
  305|       |
  306|    200|	return true;
  307|    201|}
fr_dhcpv4_global_init:
  607|      4|{
  608|      4|	if (instance_count > 0) {
  ------------------
  |  Branch (608:6): [True: 2, False: 2]
  ------------------
  609|      2|		instance_count++;
  610|      2|		return 0;
  611|      2|	}
  612|       |
  613|      2|	instance_count++;
  614|       |
  615|      2|	if (fr_dict_autoload(dhcpv4_dict) < 0) {
  ------------------
  |  |  912|      2|#define			fr_dict_autoload(_to_load) _fr_dict_autoload(_to_load, __FILE__)
  ------------------
  |  Branch (615:6): [True: 0, False: 2]
  ------------------
  616|      0|	fail:
  617|      0|		instance_count--;
  618|      0|		return -1;
  619|      0|	}
  620|       |
  621|      2|	if (fr_dict_attr_autoload(dhcpv4_dict_attr) < 0) {
  ------------------
  |  Branch (621:6): [True: 0, False: 2]
  ------------------
  622|      0|		fr_dict_autofree(dhcpv4_dict);
  ------------------
  |  |  915|      0|#define			fr_dict_autofree(_to_free) _fr_dict_autofree(_to_free, __FILE__)
  ------------------
  623|      0|		goto fail;
  624|      0|	}
  625|       |
  626|      2|	instantiated = true;
  627|      2|	return 0;
  628|      2|}
fr_dhcpv4_global_free:
  631|      4|{
  632|      4|	if (!instantiated) return;
  ------------------
  |  Branch (632:6): [True: 0, False: 4]
  ------------------
  633|       |
  634|      4|	fr_assert(instance_count > 0);
  ------------------
  |  |  194|      4|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|      4|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  635|       |
  636|      4|	if (--instance_count > 0) return;
  ------------------
  |  Branch (636:6): [True: 2, False: 2]
  ------------------
  637|       |
  638|      2|	fr_dict_autofree(dhcpv4_dict);
  ------------------
  |  |  915|      2|#define			fr_dict_autofree(_to_free) _fr_dict_autofree(_to_free, __FILE__)
  ------------------
  639|      2|	instantiated = false;
  640|      2|}
base.c:dict_flag_prefix:
  173|      4|{
  174|      4|	static fr_table_num_sorted_t const table[] = {
  175|      4|		{ L("bits"),			DHCPV4_FLAG_PREFIX_BITS },
  ------------------
  |  |  228|      4|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  176|      4|		{ L("split"),			DHCPV4_FLAG_PREFIX_SPLIT }
  ------------------
  |  |  228|      4|#define L(_str)		{ _str, sizeof(_str) - 1 }
  ------------------
  177|      4|	};
  178|      4|	static size_t table_len = NUM_ELEMENTS(table);
  ------------------
  |  |  358|      4|#define NUM_ELEMENTS(_t) (sizeof((_t)) / sizeof((_t)[0]))
  ------------------
  179|       |
  180|      4|	fr_dhcpv4_attr_flags_t *flags = fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC);
  181|      4|	fr_dhcpv4_attr_flags_prefix_t flag;
  182|       |
  183|      4|	flag = fr_table_value_by_str(table, value, DHCPV4_FLAG_PREFIX_INVALID);
  ------------------
  |  |  653|      4|#define fr_table_value_by_str(_table, _name, _def) \
  |  |  654|      4|_Generic((_table), \
  |  |  655|      4|	 fr_table_num_sorted_t const *		: fr_table_sorted_num_by_str,			\
  |  |  656|      4|	 fr_table_num_ordered_t const *		: fr_table_ordered_num_by_str,			\
  |  |  657|      4|	 fr_table_num_sorted_t *		: fr_table_sorted_num_by_str,			\
  |  |  658|      4|	 fr_table_num_ordered_t *		: fr_table_ordered_num_by_str,			\
  |  |  659|      4|	 fr_table_ptr_sorted_t const *		: fr_table_sorted_ptr_by_str,			\
  |  |  660|      4|	 fr_table_ptr_ordered_t const *		: fr_table_ordered_ptr_by_str,			\
  |  |  661|      4|	 fr_table_ptr_sorted_t *		: fr_table_sorted_ptr_by_str,			\
  |  |  662|      4|	 fr_table_ptr_ordered_t *		: fr_table_ordered_ptr_by_str,			\
  |  |  663|      4|	 fr_table_num_indexed_bit_pos_t *	: fr_table_ordered_num_by_str,			\
  |  |  664|      4|	 fr_table_num_indexed_bit_pos_t const *	: fr_table_ordered_num_by_str,			\
  |  |  665|      4|	 fr_table_num_indexed_t *		: fr_table_ordered_num_by_str,			\
  |  |  666|      4|	 fr_table_num_indexed_t const *		: fr_table_ordered_num_by_str			\
  |  |  667|      4|)(_table, _table ## _len, _name, _def)
  ------------------
  184|      4|	if (flag == DHCPV4_FLAG_PREFIX_INVALID) {
  ------------------
  |  Branch (184:6): [True: 0, False: 4]
  ------------------
  185|      0|		fr_strerror_printf("Unknown prefix type '%s'", value);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  186|      0|		return -1;
  187|      0|	}
  188|      4|	flags->prefix = flag;
  189|       |
  190|      4|	return 0;
  191|      4|}
base.c:attr_valid:
  722|    812|{
  723|       |	/*
  724|       |	 *	DNS labels are strings, but are known width.
  725|       |	 */
  726|    812|	if (fr_dhcpv4_flag_dns_label(da)) {
  ------------------
  |  |  157|    812|#define fr_dhcpv4_flag_dns_label(_da)		(fr_dhcpv4_attr_flags(_da)->dns_label)
  |  |  ------------------
  |  |  |  Branch (157:40): [True: 20, False: 792]
  |  |  ------------------
  ------------------
  727|     20|		if (da->type != FR_TYPE_STRING) {
  ------------------
  |  Branch (727:7): [True: 0, False: 20]
  ------------------
  728|      0|			fr_strerror_const("The 'dns_label' flag can only be used with attributes of type 'string'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  729|      0|			return false;
  730|      0|		}
  731|       |
  732|     20|		da->flags.is_known_width = true;
  733|     20|		da->flags.length = 0;
  734|     20|	}
  735|       |
  736|    812|	if (da->type == FR_TYPE_ATTR)  {
  ------------------
  |  Branch (736:6): [True: 2, False: 810]
  ------------------
  737|      2|		da->flags.is_known_width = true;
  738|      2|		da->flags.length = 1;
  739|      2|	}
  740|       |
  741|    812|	if (da_is_length_field16(da)) {
  ------------------
  |  |  174|    812|#define da_is_length_field16(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT16))
  |  |  ------------------
  |  |  |  Branch (174:36): [True: 102, False: 710]
  |  |  |  Branch (174:58): [True: 0, False: 102]
  |  |  ------------------
  ------------------
  742|      0|		fr_strerror_const("The 'length=uint16' flag cannot be used for DHCPv4");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  743|      0|		return false;
  744|      0|	}
  745|       |
  746|       |	/*
  747|       |	 *	"arrays" of string/octets are encoded as a 8-bit
  748|       |	 *	length, followed by the actual data.
  749|       |	 */
  750|    812|	if (da->flags.array) {
  ------------------
  |  Branch (750:6): [True: 114, False: 698]
  ------------------
  751|    114|		if ((da->type == FR_TYPE_STRING) || (da->type == FR_TYPE_OCTETS)) {
  ------------------
  |  Branch (751:7): [True: 16, False: 98]
  |  Branch (751:39): [True: 0, False: 98]
  ------------------
  752|     16|			if (da->flags.extra && !da_is_length_field8(da)) {
  ------------------
  |  |  173|      2|#define da_is_length_field8(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT8))
  |  |  ------------------
  |  |  |  Branch (173:35): [True: 2, False: 0]
  |  |  |  Branch (173:57): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (752:8): [True: 2, False: 14]
  ------------------
  753|      0|				fr_strerror_const("Invalid flags");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  754|      0|				return false;
  755|      0|			}
  756|       |
  757|     16|			da->flags.is_known_width = true;
  758|     16|			da->flags.extra = true;
  759|     16|			da->flags.subtype = FLAG_LENGTH_UINT8;
  760|     16|		}
  761|       |
  762|    114|		if (!da->flags.is_known_width) {
  ------------------
  |  Branch (762:7): [True: 0, False: 114]
  ------------------
  763|      0|			fr_strerror_const("DHCPv4 arrays require data types which have known width");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  764|      0|			return false;
  765|      0|		}
  766|    114|	}
  767|       |
  768|       |	/*
  769|       |	 *	"extra" signifies that subtype is being used by the
  770|       |	 *	dictionaries itself.
  771|       |	 */
  772|    812|	if (da->flags.extra || !da->flags.subtype) return true;
  ------------------
  |  Branch (772:6): [True: 116, False: 696]
  |  Branch (772:25): [True: 696, False: 0]
  ------------------
  773|       |
  774|      0|	if ((da->type != FR_TYPE_IPV4_PREFIX) &&
  ------------------
  |  Branch (774:6): [True: 0, False: 0]
  ------------------
  775|      0|	    (fr_dhcpv4_flag_prefix(da))) {
  ------------------
  |  |  160|      0|#define fr_dhcpv4_flag_prefix(_da)		fr_dhcpv4_attr_flags(_da)->prefix
  ------------------
  |  Branch (775:6): [True: 0, False: 0]
  ------------------
  776|      0|		fr_strerror_const("The 'prefix=...' flag can only be used with attributes of type 'ipv4prefix'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  777|      0|		return false;
  778|      0|	}
  779|       |
  780|      0|	if ((da->type != FR_TYPE_BOOL) && fr_dhcpv4_flag_exists(da)) {
  ------------------
  |  |  158|      0|#define fr_dhcpv4_flag_exists(_da)		(fr_dhcpv4_attr_flags(_da)->exists)
  |  |  ------------------
  |  |  |  Branch (158:37): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (780:6): [True: 0, False: 0]
  ------------------
  781|      0|		fr_strerror_const("The 'exists' flag can only be used with attributes of type 'bool'");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  782|      0|		return false;
  783|      0|	}
  784|       |
  785|      0|	if ((da->type == FR_TYPE_ATTR) && !da->parent->flags.is_root) {
  ------------------
  |  Branch (785:6): [True: 0, False: 0]
  |  Branch (785:36): [True: 0, False: 0]
  ------------------
  786|      0|		fr_strerror_const("The 'attribute' data type can only be used at the dictionary root");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  787|      0|		return false;
  788|      0|	}
  789|       |
  790|      0|	return true;
  791|      0|}

fr_dhcpv4_decode_option:
  590|  6.35k|{
  591|  6.35k|	ssize_t			slen;
  592|  6.35k|	uint8_t const		*p = data, *end = data + data_len;
  593|  6.35k|	uint8_t const		*next;
  594|  6.35k|	fr_dhcpv4_ctx_t		*packet_ctx = decode_ctx;
  595|       |
  596|  6.35k|	FR_PROTO_TRACE("%s called to parse %zu byte(s)", __FUNCTION__, data_len);
  ------------------
  |  |   41|  6.35k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 6.35k]
  |  |  ------------------
  ------------------
  597|       |
  598|  6.35k|	if (data_len == 0) return 0;
  ------------------
  |  Branch (598:6): [True: 0, False: 6.35k]
  ------------------
  599|       |
  600|  6.35k|	FR_PROTO_HEX_DUMP(data, data_len, NULL);
  ------------------
  |  |   42|  6.35k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 6.35k]
  |  |  ------------------
  ------------------
  601|       |
  602|       |	/*
  603|       |	 *	Padding / End of options
  604|       |	 */
  605|  6.35k|	if (p[0] == 0) {			/* 0x00 - Padding option	  */
  ------------------
  |  Branch (605:6): [True: 1.05k, False: 5.30k]
  ------------------
  606|  1.05k|		data_len = 1;			/* Walk over any consecutive 0x00 */
  607|  1.05k|		p++;				/* for efficiency		  */
  608|  1.34k|		while ((p < end) && (p[0] == 0)) {
  ------------------
  |  Branch (608:10): [True: 1.31k, False: 30]
  |  Branch (608:23): [True: 285, False: 1.02k]
  ------------------
  609|    285|			p++;
  610|    285|			data_len ++;
  611|    285|		}
  612|  1.05k|		return data_len;
  613|  1.05k|	}
  614|  5.30k|	if (p[0] == 255) return data_len;	/* 0xff - End of options signifier */
  ------------------
  |  Branch (614:6): [True: 111, False: 5.19k]
  ------------------
  615|       |
  616|       |	/*
  617|       |	 *	Everything else should be real options
  618|       |	 */
  619|  5.19k|	if ((data_len < 2) || ((size_t) (data[1] + 2) > data_len)) {
  ------------------
  |  Branch (619:6): [True: 15, False: 5.17k]
  |  Branch (619:24): [True: 45, False: 5.13k]
  ------------------
  620|     60|		fr_strerror_printf("%s: Insufficient data", __FUNCTION__);
  ------------------
  |  |   65|     60|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  621|     60|		return -1;
  622|     60|	}
  623|       |
  624|       |	/*
  625|       |	 *	Check for multiple options of the same type, and concatenate their values together.
  626|       |	 *
  627|       |	 *	RFC 2131 Section 4.1 says:
  628|       |	 *
  629|       |	 *	  The client concatenates the values of multiple
  630|       |	 *	  instances of the same option into a single parameter
  631|       |	 *	  list for configuration.
  632|       |	 *
  633|       |	 *	which presumably also means the same for the server on reception.
  634|       |	 *
  635|       |	 *	We therefore peek ahead, and concatenate the values into a temporary buffer.  The buffer is
  636|       |	 *	allocated only if necessary, and is re-used for the entire packet.
  637|       |	 *
  638|       |	 *	If the options are *not* consecutive, then we don't concatenate them.  Too bad for you!
  639|       |	 *
  640|       |	 *	Note that we don't (yet) do this for TLVs.
  641|       |	 */
  642|  5.13k|	next = data + 2 + data[1];
  643|  5.13k|	if ((data[1] > 0) && (next < end) && (next[0] == data[0])) {
  ------------------
  |  Branch (643:6): [True: 3.10k, False: 2.02k]
  |  Branch (643:23): [True: 2.98k, False: 120]
  |  Branch (643:39): [True: 309, False: 2.67k]
  ------------------
  644|    309|		uint8_t *q;
  645|    309|		fr_dict_attr_t const *da;
  646|       |
  647|    309|		q = concat_buffer;
  648|       |
  649|  1.02k|		for (next = data; next < end; next += 2 + next[1]) {
  ------------------
  |  Branch (649:21): [True: 975, False: 49]
  ------------------
  650|    975|			if (next[0] != data[0]) break;
  ------------------
  |  Branch (650:8): [True: 257, False: 718]
  ------------------
  651|    718|			if ((end - next) < 2) return -1;
  ------------------
  |  Branch (651:8): [True: 3, False: 715]
  ------------------
  652|    715|			if ((next + 2 + next[1]) > end) return -1;
  ------------------
  |  Branch (652:8): [True: 0, False: 715]
  ------------------
  653|       |
  654|    715|			if ((size_t) (q + next[1] - concat_buffer) > sizeof(concat_buffer)) return -1;
  ------------------
  |  Branch (654:8): [True: 0, False: 715]
  ------------------
  655|       |
  656|    715|			memcpy(q, next + 2, next[1]);
  657|    715|			q += next[1];
  658|    715|		}
  659|       |
  660|    306|		da = fr_dict_attr_child_by_num(packet_ctx->root, p[0]);
  661|    306|		if (!da) {
  ------------------
  |  Branch (661:7): [True: 0, False: 306]
  ------------------
  662|      0|			da = fr_dict_attr_unknown_raw_afrom_num(packet_ctx->tmp_ctx, packet_ctx->root, p[0]);
  663|      0|			if (!da) return -1;
  ------------------
  |  Branch (663:8): [True: 0, False: 0]
  ------------------
  664|       |
  665|      0|			slen = fr_pair_raw_from_network(ctx, out, da, concat_buffer, q - concat_buffer);
  666|       |
  667|    306|		} else if (da->type == FR_TYPE_VSA) {
  ------------------
  |  Branch (667:14): [True: 55, False: 251]
  ------------------
  668|     55|			slen = decode_vsa(ctx, out, da, concat_buffer, q - concat_buffer, packet_ctx);
  669|       |
  670|    251|		} else if (da->type == FR_TYPE_TLV) {
  ------------------
  |  Branch (670:14): [True: 20, False: 231]
  ------------------
  671|     20|			slen = fr_pair_tlvs_from_network(ctx, out, da, concat_buffer, q - concat_buffer,
  672|     20|							 packet_ctx, decode_option, verify_tlvs, true);
  673|       |
  674|    231|		} else if (da->flags.array) {
  ------------------
  |  Branch (674:14): [True: 187, False: 44]
  ------------------
  675|    187|			slen = fr_pair_array_from_network(ctx, out, da, concat_buffer, q - concat_buffer, packet_ctx, decode_value);
  676|    187|		} else if ((da->type == FR_TYPE_STRING) && fr_dhcpv4_flag_dns_label(da)) {
  ------------------
  |  |  157|      0|#define fr_dhcpv4_flag_dns_label(_da)		(fr_dhcpv4_attr_flags(_da)->dns_label)
  |  |  ------------------
  |  |  |  Branch (157:40): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (676:14): [True: 0, False: 44]
  ------------------
  677|      0|			slen = fr_pair_dns_labels_from_network(ctx, out, da, concat_buffer, concat_buffer,
  678|      0|							       q - concat_buffer, NULL, true);
  679|       |
  680|     44|		} else {
  681|     44|			slen = decode_value(ctx, out, da, concat_buffer, q - concat_buffer, packet_ctx);
  682|     44|		}
  683|    306|		if (slen < 0) return slen;
  ------------------
  |  Branch (683:7): [True: 12, False: 294]
  ------------------
  684|       |
  685|       |		/*
  686|       |		 *	The actual amount of data we decoded, including the various headers.
  687|       |		 */
  688|    294|		FR_PROTO_TRACE("decoding option complete, %zd decoded, returning %zu byte(s)", slen, (size_t) (next - data));
  ------------------
  |  |   41|    294|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 294]
  |  |  ------------------
  ------------------
  689|    294|		return next - data;
  690|    306|	}
  691|       |
  692|  4.82k|	slen = decode_option(ctx, out, packet_ctx->root, data, data[1] + 2, decode_ctx);
  693|  4.82k|	if (slen < 0) return slen;
  ------------------
  |  Branch (693:6): [True: 0, False: 4.82k]
  ------------------
  694|       |
  695|  4.82k|	FR_PROTO_TRACE("decoding option complete, %zd decoded, returning %u byte(s)", slen, (unsigned int) data[1] + 2);
  ------------------
  |  |   41|  4.82k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 4.82k]
  |  |  ------------------
  ------------------
  696|  4.82k|	return data[1] + 2;
  697|  4.82k|}
decode.c:decode_vsa:
  371|  1.27k|{
  372|  1.27k|	size_t			len;
  373|  1.27k|	ssize_t			slen;
  374|  1.27k|	uint8_t			option_len;
  375|  1.27k|	uint32_t		pen;
  376|  1.27k|	fr_pair_t		*vp;
  377|  1.27k|	fr_dict_attr_t const	*vendor;
  378|  1.27k|	uint8_t const		*end = data + data_len;
  379|  1.27k|	uint8_t const		*p = data;
  380|  1.27k|	fr_pair_list_t		list;
  381|       |
  382|  1.27k|	FR_PROTO_HEX_DUMP(data, data_len, "decode_vsa");
  ------------------
  |  |   42|  1.27k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 1.27k]
  |  |  ------------------
  ------------------
  383|       |
  384|  1.27k|	if (!fr_cond_assert_msg(parent->type == FR_TYPE_VSA,
  ------------------
  |  |  148|  1.27k|#define		fr_cond_assert_msg(_x, _fmt, ...) likely((bool)((_x) ? true : (_fr_assert_fail(__FILE__, __LINE__, #_x, _fmt, ## __VA_ARGS__) && false)))
  |  |  ------------------
  |  |  |  |  396|  2.54k|#  define likely(_x)		__builtin_expect((_x), 1)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (396:41): [True: 0, False: 0]
  |  |  |  |  |  Branch (396:41): [Folded, False: 0]
  |  |  |  |  |  Branch (396:41): [True: 1.27k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (384:6): [True: 0, False: 1.27k]
  ------------------
  385|  1.27k|				"%s: Internal sanity check failed, attribute \"%s\" is not of type 'vsa'",
  386|  1.27k|				__FUNCTION__, parent->name)) return PAIR_DECODE_FATAL_ERROR;
  ------------------
  |  |   49|      0|#define PAIR_DECODE_FATAL_ERROR	FR_VALUE_BOX_NET_ERROR
  |  |  ------------------
  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  387|       |
  388|  1.27k|	fr_pair_list_init(&list);
  389|       |
  390|  1.28k|next:
  391|       |	/*
  392|       |	 *	RFC 4243 Section 3 says that "the minimum length is 4 bytes."
  393|       |	 */
  394|  1.28k|	len = (size_t) (end - p);
  395|  1.28k|	if (len < (sizeof(uint32_t))) {
  ------------------
  |  Branch (395:6): [True: 1.20k, False: 74]
  ------------------
  396|  1.21k|fail:
  397|  1.21k|		fr_pair_list_free(&list);
  398|  1.21k|		return -1;
  399|  1.20k|	}
  400|       |
  401|       |	/*
  402|       |	 *	RFC 4243 is silent about this, but we assime that anything with no vendor data means that we
  403|       |	 *	ignore it.  i.e. we don't create an empty vendor attribute.
  404|       |	 */
  405|     74|	if (len == (sizeof(uint32_t) + 1)) {
  ------------------
  |  Branch (405:6): [True: 0, False: 74]
  ------------------
  406|       |		/*
  407|       |		 *	There's no more data, so this length field must be zero.
  408|       |		 */
  409|      0|		if (p[4] != 0) goto fail;
  ------------------
  |  Branch (409:7): [True: 0, False: 0]
  ------------------
  410|      0|		goto done;
  411|      0|	}
  412|       |
  413|     74|	pen = fr_nbo_to_uint32(p);
  414|       |
  415|       |	/*
  416|       |	 *	Verify that the parent (which should be a VSA)
  417|       |	 *	contains a fake attribute representing the vendor.
  418|       |	 *
  419|       |	 *	If it doesn't then this vendor is unknown, but we know
  420|       |	 *	vendor attributes have a standard format, so we can
  421|       |	 *	decode the data anyway.
  422|       |	 */
  423|     74|	vendor = fr_dict_attr_child_by_num(parent, pen);
  424|     74|	if (!vendor) {
  ------------------
  |  Branch (424:6): [True: 71, False: 3]
  ------------------
  425|     71|		fr_dict_attr_t *n;
  426|       |
  427|     71|		n = fr_dict_attr_unknown_vendor_afrom_num(ctx, parent, pen);
  428|     71|		if (!n) {
  ------------------
  |  Branch (428:7): [True: 0, False: 71]
  ------------------
  429|      0|		oom:
  430|      0|			fr_pair_list_free(&list);
  431|      0|			return PAIR_DECODE_OOM;
  ------------------
  |  |   45|      0|#define PAIR_DECODE_OOM		FR_VALUE_BOX_NET_OOM
  |  |  ------------------
  |  |  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  432|      0|		}
  433|     71|		vendor = n;
  434|     71|	}
  435|     74|	p += sizeof(uint32_t);
  436|       |
  437|       |	/*
  438|       |	 *	No more data, we're done.
  439|       |	 */
  440|     74|	if (p == end) goto done;
  ------------------
  |  Branch (440:6): [True: 0, False: 74]
  ------------------
  441|       |
  442|     74|	FR_PROTO_TRACE("decode context %s -> %s", parent->name, vendor->name);
  ------------------
  |  |   41|     74|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 74]
  |  |  ------------------
  ------------------
  443|       |
  444|     74|	option_len = p[0];
  445|     74|	if ((p + 1 + option_len) > end) {
  ------------------
  |  Branch (445:6): [True: 63, False: 11]
  ------------------
  446|     63|		slen = fr_pair_raw_from_network(ctx, out, vendor, p, end - p);
  447|     63|		if (slen < 0) goto fail;
  ------------------
  |  Branch (447:7): [True: 0, False: 63]
  ------------------
  448|       |
  449|     63|		goto done;
  450|     63|	}
  451|     11|	p++;
  452|       |
  453|       |	/*
  454|       |	 *	Pathological case of no data.
  455|       |	 */
  456|     11|	if (option_len == 0) goto next;
  ------------------
  |  Branch (456:6): [True: 4, False: 7]
  ------------------
  457|       |
  458|      7|	vp = fr_pair_find_by_da(out, NULL, vendor);
  459|      7|	if (!vp) {
  ------------------
  |  Branch (459:6): [True: 7, False: 0]
  ------------------
  460|      7|		vp = fr_pair_afrom_da(ctx, vendor);
  461|      7|		if (!vp) goto oom;
  ------------------
  |  Branch (461:7): [True: 0, False: 7]
  ------------------
  462|      7|		PAIR_ALLOCED(vp);
  ------------------
  |  |  174|      7|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 7]
  |  |  ------------------
  ------------------
  463|       |
  464|      7|		fr_pair_append(out, vp);
  465|      7|	}
  466|       |
  467|      7|	slen = fr_pair_tlvs_from_network(vp, &vp->vp_group, vendor, p, option_len, decode_ctx, decode_option, verify_tlvs, false);
  ------------------
  |  |  144|      7|#define vp_group		children
  ------------------
  468|      7|	if (slen < 0) goto fail;
  ------------------
  |  Branch (468:6): [True: 1, False: 6]
  ------------------
  469|       |
  470|      6|	p += option_len;
  471|      6|	if (p < end) goto next;
  ------------------
  |  Branch (471:6): [True: 6, False: 0]
  ------------------
  472|       |
  473|       |	/*
  474|       |	 *	Tell the caller we read all of it, even if we didn't.
  475|       |	 */
  476|     63|done:
  477|     63|	fr_pair_list_append(out, &list);
  478|     63|	return data_len;
  479|      6|}
decode.c:decode_option:
  485|  5.23k|{
  486|  5.23k|	unsigned int   		option;
  487|  5.23k|	size_t			len;
  488|  5.23k|	ssize_t			slen;
  489|  5.23k|	fr_dict_attr_t const	*da;
  490|  5.23k|	fr_dhcpv4_ctx_t		*packet_ctx = decode_ctx;
  491|       |
  492|       |#ifdef STATIC_ANALYZER
  493|       |	if (!packet_ctx || !packet_ctx->tmp_ctx) return PAIR_DECODE_FATAL_ERROR;
  494|       |#endif
  495|       |
  496|  5.23k|	fr_assert(parent != NULL);
  ------------------
  |  |  194|  5.23k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  5.23k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 5.23k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|       |
  498|       |	/*
  499|       |	 *      RFC 3046 is very specific about not allowing termination
  500|       |	 *      with a 255 sub-option. But it's required for decoding
  501|       |	 *      option 43, and vendors will probably screw it up
  502|       |	 *      anyway.
  503|       |	 *
  504|       |	 *      Similarly, option 0 is sometimes treated as
  505|       |	 *      "end of options".
  506|       |	 *
  507|       |	 *	@todo - this check is likely correct only when at the
  508|       |	 *	dhcpv4 root, OR inside of option 43.  It could be
  509|       |	 *	argued that it's wrong for all other TLVs.
  510|       |	 */
  511|  5.23k|	if ((data_len == 1) && ((data[0] == 0) || (data[0] == 255))) return data_len;
  ------------------
  |  Branch (511:6): [True: 0, False: 5.23k]
  |  Branch (511:26): [True: 0, False: 0]
  |  Branch (511:44): [True: 0, False: 0]
  ------------------
  512|       |
  513|       |	/*
  514|       |	 *	Must have at least an option header.
  515|       |	 */
  516|  5.23k|	if (data_len < 2) {
  ------------------
  |  Branch (516:6): [True: 0, False: 5.23k]
  ------------------
  517|      0|		fr_strerror_printf("%s: Insufficient data", __FUNCTION__);
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  518|      0|		return -(data_len);
  519|      0|	}
  520|       |
  521|  5.23k|	option = data[0];
  522|  5.23k|	len = data[1];
  523|  5.23k|	if (len > (data_len - 2)) {
  ------------------
  |  Branch (523:6): [True: 0, False: 5.23k]
  ------------------
  524|      0|		fr_strerror_printf("%s: Option overflows input.  "
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  525|      0|				   "Optional length must be less than %zu bytes, got %zu bytes",
  526|      0|				   __FUNCTION__, data_len - 2, len);
  527|      0|		return PAIR_DECODE_FATAL_ERROR;
  ------------------
  |  |   49|      0|#define PAIR_DECODE_FATAL_ERROR	FR_VALUE_BOX_NET_ERROR
  |  |  ------------------
  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  528|      0|	}
  529|       |
  530|  5.23k|	da = fr_dict_attr_child_by_num(parent, option);
  531|  5.23k|	if (!da) {
  ------------------
  |  Branch (531:6): [True: 131, False: 5.10k]
  ------------------
  532|    131|		da = fr_dict_attr_unknown_raw_afrom_num(packet_ctx->tmp_ctx, parent, option);
  533|    131|		if (!da) return PAIR_DECODE_OOM;
  ------------------
  |  |   45|      0|#define PAIR_DECODE_OOM		FR_VALUE_BOX_NET_OOM
  |  |  ------------------
  |  |  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (533:7): [True: 0, False: 131]
  ------------------
  534|       |
  535|    131|		slen = fr_pair_raw_from_network(ctx, out, da, data + 2, len);
  536|       |
  537|  5.10k|	} else if ((da->type == FR_TYPE_STRING) && fr_dhcpv4_flag_dns_label(da)) {
  ------------------
  |  |  157|  1.42k|#define fr_dhcpv4_flag_dns_label(_da)		(fr_dhcpv4_attr_flags(_da)->dns_label)
  |  |  ------------------
  |  |  |  Branch (157:40): [True: 1.00k, False: 416]
  |  |  ------------------
  ------------------
  |  Branch (537:13): [True: 1.42k, False: 3.68k]
  ------------------
  538|  1.00k|		slen = fr_pair_dns_labels_from_network(ctx, out, da, data + 2, data + 2, len, NULL, true);
  539|       |
  540|  4.09k|	} else if (da->flags.array) {
  ------------------
  |  Branch (540:13): [True: 667, False: 3.43k]
  ------------------
  541|    667|		slen = fr_pair_array_from_network(ctx, out, da, data + 2, len, decode_ctx, decode_value);
  542|       |
  543|  3.43k|	} else if (da->type == FR_TYPE_VSA) {
  ------------------
  |  Branch (543:13): [True: 1.21k, False: 2.21k]
  ------------------
  544|  1.21k|		bool append = false;
  545|  1.21k|		fr_pair_t *vp;
  546|       |
  547|  1.21k|		vp = fr_pair_find_by_da(out, NULL, da);
  548|  1.21k|		if (!vp) {
  ------------------
  |  Branch (548:7): [True: 811, False: 407]
  ------------------
  549|    811|			vp = fr_pair_afrom_da(ctx, da);
  550|    811|			if (!vp) return PAIR_DECODE_FATAL_ERROR;
  ------------------
  |  |   49|      0|#define PAIR_DECODE_FATAL_ERROR	FR_VALUE_BOX_NET_ERROR
  |  |  ------------------
  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  ------------------
  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (550:8): [True: 0, False: 811]
  ------------------
  551|    811|			PAIR_ALLOCED(vp);
  ------------------
  |  |  174|    811|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 811]
  |  |  ------------------
  ------------------
  552|       |
  553|    811|			append = true;
  554|    811|		}
  555|       |
  556|  1.21k|		slen = decode_vsa(vp, &vp->vp_group, da, data + 2, len, decode_ctx);
  ------------------
  |  |  144|  1.21k|#define vp_group		children
  ------------------
  557|  1.21k|		if (append) {
  ------------------
  |  Branch (557:7): [True: 811, False: 407]
  ------------------
  558|    811|			if (slen < 0) {
  ------------------
  |  Branch (558:8): [True: 803, False: 8]
  ------------------
  559|    803|				TALLOC_FREE(vp);
  ------------------
  |  Branch (559:5): [True: 803, False: 0]
  |  Branch (559:5): [Folded, False: 803]
  ------------------
  560|    803|			} else {
  561|      8|				fr_pair_append(out, vp);
  562|      8|			}
  563|    811|		}
  564|       |
  565|  2.21k|	} else if (da->type == FR_TYPE_TLV) {
  ------------------
  |  Branch (565:13): [True: 58, False: 2.15k]
  ------------------
  566|     58|		slen = fr_pair_tlvs_from_network(ctx, out, da, data + 2, len, decode_ctx, decode_option, verify_tlvs, true);
  567|       |
  568|  2.15k|	} else {
  569|  2.15k|		slen = decode_value(ctx, out, da, data + 2, len, decode_ctx);
  570|  2.15k|	}
  571|       |
  572|  5.23k|	if (slen < 0) {
  ------------------
  |  Branch (572:6): [True: 1.60k, False: 3.62k]
  ------------------
  573|  1.60k|		slen = fr_pair_raw_from_network(ctx, out, da, data + 2, len);
  574|  1.60k|		if (slen < 0) return slen;
  ------------------
  |  Branch (574:7): [True: 0, False: 1.60k]
  ------------------
  575|  1.60k|	}
  576|       |
  577|  5.23k|	return len + 2;
  578|  5.23k|}
decode.c:verify_tlvs:
   42|    103|{
   43|    103|	uint8_t const *p = data;
   44|    103|	uint8_t const *end = data + data_len;
   45|       |
   46|    612|	while (p < end) {
  ------------------
  |  Branch (46:9): [True: 552, False: 60]
  ------------------
   47|    552|		if ((end - p) < 2) return false;
  ------------------
  |  Branch (47:7): [True: 27, False: 525]
  ------------------
   48|       |
   49|    525|		if ((p + 2 + p[1]) > end) return false;
  ------------------
  |  Branch (49:7): [True: 16, False: 509]
  ------------------
   50|       |
   51|    509|		p += 2 + p[1];
   52|    509|	}
   53|       |
   54|     60|	return true;
   55|    103|}
decode.c:decode_value:
   91|  13.9k|{
   92|  13.9k|	ssize_t slen;
   93|  13.9k|	fr_pair_t *vp;
   94|  13.9k|	uint8_t const *p = data;
   95|  13.9k|	uint8_t const *end = data + data_len;
   96|  13.9k|	bool exact = !da->flags.array;
   97|       |
   98|  13.9k|	FR_PROTO_TRACE("%s called to parse %zu bytes from %s", __FUNCTION__, data_len, da->name);
  ------------------
  |  |   41|  13.9k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 13.9k]
  |  |  ------------------
  ------------------
   99|  13.9k|	FR_PROTO_HEX_DUMP(data, data_len, NULL);
  ------------------
  |  |   42|  13.9k|#  define FR_PROTO_HEX_DUMP(_data, _data_len, _fmt, ...)		if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print_hex_data(__FILE__, __LINE__, _data, _data_len, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (42:63): [True: 0, False: 13.9k]
  |  |  ------------------
  ------------------
  100|       |
  101|       |	/*
  102|       |	 *	Structs create their own VP wrapper.
  103|       |	 */
  104|  13.9k|	if (da->type == FR_TYPE_STRUCT) {
  ------------------
  |  Branch (104:6): [True: 2.06k, False: 11.9k]
  ------------------
  105|  2.06k|		slen = fr_struct_from_network(ctx, out, da, data, data_len,
  106|  2.06k|					      decode_ctx, decode_value_trampoline, decode_tlv_trampoline);
  107|  2.06k|		if (slen < 0) return slen;
  ------------------
  |  Branch (107:7): [True: 662, False: 1.40k]
  ------------------
  108|       |
  109|  1.40k|		if (!exact) return slen;
  ------------------
  |  Branch (109:7): [True: 662, False: 739]
  ------------------
  110|       |
  111|    739|		return data_len;
  112|  1.40k|	}
  113|       |
  114|       |	/*
  115|       |	 *	These are always raw.
  116|       |	 */
  117|  11.9k|	if (da->flags.is_unknown) {
  ------------------
  |  Branch (117:6): [True: 0, False: 11.9k]
  ------------------
  118|      0|		return fr_pair_raw_from_network(ctx, out, da, data, data_len);
  119|      0|	}
  120|       |
  121|  11.9k|	vp = fr_pair_afrom_da(ctx, da);
  122|  11.9k|	if (!vp) return PAIR_DECODE_OOM;
  ------------------
  |  |   45|      0|#define PAIR_DECODE_OOM		FR_VALUE_BOX_NET_OOM
  |  |  ------------------
  |  |  |  | 1051|      0|#define FR_VALUE_BOX_NET_OOM	(FR_VALUE_BOX_NET_ERROR + 1)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1047|      0|#define FR_VALUE_BOX_NET_ERROR	SSIZE_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  445|      0|#  define SSIZE_MIN LONG_MIN
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (122:6): [True: 0, False: 11.9k]
  ------------------
  123|  11.9k|	PAIR_ALLOCED(vp);
  ------------------
  |  |  174|  11.9k|#define PAIR_ALLOCED(_x) do { (_x)->filename = __FILE__; (_x)->line = __LINE__; } while (0)
  |  |  ------------------
  |  |  |  Branch (174:90): [Folded, False: 11.9k]
  |  |  ------------------
  ------------------
  124|       |
  125|       |	/*
  126|       |	 *	string / octets / bool can be empty.  Other data types are
  127|       |	 *	raw if they're empty.
  128|       |	 */
  129|  11.9k|	if (data_len == 0) {
  ------------------
  |  Branch (129:6): [True: 473, False: 11.4k]
  ------------------
  130|    473|		if (da->type == FR_TYPE_BOOL) {
  ------------------
  |  Branch (130:7): [True: 30, False: 443]
  ------------------
  131|     30|			vp->vp_bool = true;
  ------------------
  |  |  125|     30|#define vp_bool			data.datum.boolean
  ------------------
  132|     30|			goto finish;
  133|     30|		}
  134|       |
  135|    443|		if ((da->type == FR_TYPE_OCTETS) || (da->type == FR_TYPE_STRING)) {
  ------------------
  |  Branch (135:7): [True: 168, False: 275]
  |  Branch (135:39): [True: 125, False: 150]
  ------------------
  136|    293|			goto finish;
  137|    293|		}
  138|       |
  139|    443|		talloc_free(vp);
  140|    150|		return fr_pair_raw_from_network(ctx, out, da, data, 0);
  141|    443|	}
  142|       |
  143|  11.4k|	switch (vp->vp_type) {
  ------------------
  |  |  149|  11.4k|#define vp_type			data.type
  ------------------
  144|  6.22k|	case FR_TYPE_ATTR:
  ------------------
  |  Branch (144:2): [True: 6.22k, False: 5.21k]
  ------------------
  145|       |		/*
  146|       |		 *	Force the length of the data to be one,
  147|       |		 *	otherwise the "from network" call complains.
  148|       |		 *	Because we pass in the enumv as the _parent_
  149|       |		 *	and not the da.  The da is marked as "array",
  150|       |		 *	but the parent is not.
  151|       |		 */
  152|  6.22k|		end = p + 1;
  153|       |
  154|  6.22k|		fr_assert(da->parent->flags.is_root);
  ------------------
  |  |  194|  6.22k|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|  6.22k|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 6.22k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  155|       |
  156|  6.22k|		slen = fr_value_box_from_network(vp, &vp->data, vp->vp_type, da->parent,
  ------------------
  |  |  149|  6.22k|#define vp_type			data.type
  ------------------
  157|  6.22k|						 &FR_DBUFF_TMP(p, end - p), end - p, true);
  ------------------
  |  |  522|  6.22k|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|  6.22k|(fr_dbuff_t){ \
  |  |  524|  6.22k|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|  6.22k|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|  6.22k|	.end_i		= _Generic((_len_or_end), \
  |  |  527|  6.22k|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|  6.22k|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|  6.22k|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|  6.22k|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|  6.22k|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|  6.22k|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|  6.22k|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|  6.22k|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|  6.22k|			), \
  |  |  536|  6.22k|	.p_i		= _start, \
  |  |  537|  6.22k|	.is_const	= _Generic((_start), \
  |  |  538|  6.22k|				uint8_t *	: false, \
  |  |  539|  6.22k|				uint8_t const *	: true, \
  |  |  540|  6.22k|				char *		: false, \
  |  |  541|  6.22k|				char const *	: true \
  |  |  542|  6.22k|	       		) \
  |  |  543|  6.22k|}
  ------------------
  158|  6.22k|		if (slen <= 0) goto raw;
  ------------------
  |  Branch (158:7): [True: 0, False: 6.22k]
  ------------------
  159|       |
  160|  6.22k|		p++;
  161|  6.22k|		break;
  162|       |
  163|       |	/*
  164|       |	 *	Doesn't include scope, whereas the generic format can.
  165|       |	 */
  166|    220|	case FR_TYPE_IPV6_ADDR:
  ------------------
  |  Branch (166:2): [True: 220, False: 11.2k]
  ------------------
  167|    220|		slen = fr_value_box_ipaddr_from_network(&vp->data, da->type, da,
  168|    220|							128, p, (size_t) (end - p),
  169|    220|							exact, true);
  170|    220|		if (slen < 0) goto raw;
  ------------------
  |  Branch (170:7): [True: 127, False: 93]
  ------------------
  171|     93|		fr_assert(slen == sizeof(vp->vp_ipv6addr));
  ------------------
  |  |  194|     93|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|     93|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 93]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|       |
  173|     93|		p += sizeof(vp->vp_ipv6addr);
  ------------------
  |  |  120|     93|#define vp_ipv6addr		data.vb_ip.addr.v6.s6_addr
  |  |  ------------------
  |  |  |  |  264|     93|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  174|     93|		break;
  175|       |
  176|      0|	case FR_TYPE_IPV6_PREFIX:
  ------------------
  |  Branch (176:2): [True: 0, False: 11.4k]
  ------------------
  177|       |		/*
  178|       |		 *	Not enough room for the prefix length, that's an issue.
  179|       |		 *
  180|       |		 *	Note that there's actually no standard for IPv6 prefixes inside of DHCPv4.
  181|       |		 */
  182|      0|		if ((end - p) < 1) goto raw;
  ------------------
  |  Branch (182:7): [True: 0, False: 0]
  ------------------
  183|       |
  184|      0|		slen = fr_value_box_ipaddr_from_network(&vp->data, da->type, da,
  185|      0|							p[0], p + 1, ((size_t) (end - p)) - 1,
  186|      0|							exact, true);
  187|      0|		if (slen < 0) goto raw;
  ------------------
  |  Branch (187:7): [True: 0, False: 0]
  ------------------
  188|       |
  189|      0|		p += slen + 1;
  190|      0|		break;
  191|       |
  192|      0|	case FR_TYPE_STRUCTURAL:
  ------------------
  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  ------------------
  |  |  |  |  249|      0|	_beg(FR_TYPE_VSA) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  299|      0|#define CASE_BEG(_type)		_type:
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  250|      0|	FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|	_beg(FR_TYPE_GROUP) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.4k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  221|      0|	_mid(FR_TYPE_STRUCT) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.4k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  222|      0|	_mid(FR_TYPE_TLV) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.4k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|	_mid(FR_TYPE_UNION) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  300|      0|#define CASE_MID(_type)		case _type:
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (300:26): [True: 0, False: 11.4k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  224|      0|	_end(FR_TYPE_VENDOR)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  316|      0|#define FR_TYPE_STRUCTURAL			FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  301|      0|#define CASE_END(_type)		case _type
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (192:2): [True: 0, False: 11.4k]
  ------------------
  193|      0|		fr_strerror_printf("Cannot decode type '%s' as value", fr_type_to_str(vp->vp_type));
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  193|      0|		fr_strerror_printf("Cannot decode type '%s' as value", fr_type_to_str(vp->vp_type));
  |  |  |  |  ------------------
  |  |  |  |  |  |  149|      0|#define vp_type			data.type
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  194|      0|		talloc_free(vp);
  195|      0|		return 0;
  196|       |
  197|    421|	case FR_TYPE_IPV4_PREFIX:
  ------------------
  |  Branch (197:2): [True: 421, False: 11.0k]
  ------------------
  198|    421|		fr_value_box_init(&vp->data, FR_TYPE_IPV4_PREFIX, vp->da, true);
  ------------------
  |  |  610|    421|#define fr_value_box_init(_vb, _type, _enumv, _tainted) _fr_value_box_init(NDEBUG_LOCATION_EXP _vb, _type, _enumv, _tainted)
  |  |  ------------------
  |  |  |  |  285|    421|#  define NDEBUG_LOCATION_EXP			__FILE__, __LINE__,
  |  |  ------------------
  ------------------
  199|    421|		vp->vp_ip.af = AF_INET;
  ------------------
  |  |  121|    421|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|    421|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  200|       |
  201|       |		/*
  202|       |		 *	4 octets of address
  203|       |		 *	4 octets of mask
  204|       |		 */
  205|    421|		if (fr_dhcpv4_flag_prefix_split(da)) {
  ------------------
  |  |  162|    421|#define fr_dhcpv4_flag_prefix_split(_da)	(fr_dhcpv4_attr_flags(_da)->prefix == DHCPV4_FLAG_PREFIX_SPLIT)
  |  |  ------------------
  |  |  |  Branch (162:42): [True: 70, False: 351]
  |  |  ------------------
  ------------------
  206|     70|			uint32_t ipaddr, mask;
  207|       |
  208|     70|			if (data_len < 8) goto raw;
  ------------------
  |  Branch (208:8): [True: 12, False: 58]
  ------------------
  209|       |
  210|     58|			ipaddr = fr_nbo_to_uint32(p);
  211|     58|			mask = fr_nbo_to_uint32(p + 4);
  212|     58|			p += 8;
  213|       |
  214|       |			/*
  215|       |			 *	0/0 means a prefix of 0, too.
  216|       |			 */
  217|     58|			if (!mask) {
  ------------------
  |  Branch (217:8): [True: 42, False: 16]
  ------------------
  218|     42|				break;
  219|     42|			}
  220|       |
  221|       |			/*
  222|       |			 *	Try to figure out the prefix value from the mask.
  223|       |			 */
  224|    406|			while (mask) {
  ------------------
  |  Branch (224:11): [True: 390, False: 16]
  ------------------
  225|    390|				vp->vp_ip.prefix++;
  ------------------
  |  |  121|    390|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|    390|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  226|    390|				mask <<= 1;
  227|    390|			}
  228|       |
  229|       |			/*
  230|       |			 *	Mash the IP based on the calculated mask.  We don't really care if the mask
  231|       |			 *	has holes, or if the IP address overlaps with the mask.  We just fix it all up
  232|       |			 *	so it's sane.
  233|       |			 */
  234|     16|			mask = ~(uint32_t) 0;
  235|     16|			mask <<= (32 - vp->vp_ip.prefix);
  ------------------
  |  |  121|     16|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|     16|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  236|       |
  237|     16|			vp->vp_ipv4addr = htonl(ipaddr & mask);
  ------------------
  |  |  119|     16|#define vp_ipv4addr		data.vb_ip.addr.v4.s_addr
  |  |  ------------------
  |  |  |  |  264|     16|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  238|     16|			break;
  239|     58|		}
  240|       |
  241|    351|		if (fr_dhcpv4_flag_prefix_bits(vp->da)) {
  ------------------
  |  |  161|    351|#define fr_dhcpv4_flag_prefix_bits(_da)		(fr_dhcpv4_attr_flags(_da)->prefix == DHCPV4_FLAG_PREFIX_BITS)
  |  |  ------------------
  |  |  |  Branch (161:42): [True: 351, False: 0]
  |  |  ------------------
  ------------------
  242|    351|			size_t needs;
  243|       |
  244|    351|			if ((data_len == 0) || (*p > 32)) goto raw;
  ------------------
  |  Branch (244:8): [True: 0, False: 351]
  |  Branch (244:27): [True: 22, False: 329]
  ------------------
  245|       |
  246|    329|			needs = 1 + ((*p + 0x07) >> 3);
  247|    329|			if (data_len < needs) goto raw;
  ------------------
  |  Branch (247:8): [True: 271, False: 58]
  ------------------
  248|       |
  249|       |			/*
  250|       |			 *	Don't do exact checks here, as the content is variable-sized.
  251|       |			 */
  252|       |
  253|     58|			vp->vp_ip.prefix = *p;
  ------------------
  |  |  121|     58|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|     58|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  254|       |
  255|       |			/*
  256|       |			 *	If the IP address is longer than necessary, then only grab the pieces we need.
  257|       |			 */
  258|     58|			if (vp->vp_ip.prefix) {
  ------------------
  |  |  121|     58|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|     58|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  |  Branch (258:8): [True: 50, False: 8]
  ------------------
  259|     50|				uint32_t ipaddr, mask;
  260|       |
  261|     50|				mask = ~(uint32_t) 0;
  262|     50|				mask <<= (32 - vp->vp_ip.prefix);
  ------------------
  |  |  121|     50|#define vp_ip			data.vb_ip
  |  |  ------------------
  |  |  |  |  264|     50|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  263|       |
  264|     50|				if (*p > 24) {
  ------------------
  |  Branch (264:9): [True: 1, False: 49]
  ------------------
  265|      1|					ipaddr = fr_nbo_to_uint32(p + 1);
  266|       |
  267|     49|				} else if (*p > 16) {
  ------------------
  |  Branch (267:16): [True: 2, False: 47]
  ------------------
  268|      2|					ipaddr = fr_nbo_to_uint24(p + 1);
  269|      2|					ipaddr <<= 8;
  270|       |
  271|     47|				} else if (*p > 8) {
  ------------------
  |  Branch (271:16): [True: 33, False: 14]
  ------------------
  272|     33|					ipaddr = fr_nbo_to_uint16(p + 1);
  273|     33|					ipaddr <<= 16;
  274|       |
  275|     33|				} else { /* 1..8 */
  276|     14|					ipaddr = p[1];
  277|     14|					ipaddr <<= 24;
  278|     14|				}
  279|       |
  280|     50|				vp->vp_ipv4addr = htonl(ipaddr & mask);
  ------------------
  |  |  119|     50|#define vp_ipv4addr		data.vb_ip.addr.v4.s_addr
  |  |  ------------------
  |  |  |  |  264|     50|#define vb_ip					datum.ip
  |  |  ------------------
  ------------------
  281|     50|			} /* else *p==0, and we leave ipaddr set to zero */
  282|       |
  283|     58|			p += needs;
  284|     58|			break;
  285|    329|		}
  286|       |
  287|      0|		FALL_THROUGH;
  ------------------
  |  |  341|      0|#  define FALL_THROUGH		CC_HINT(fallthrough)
  |  |  ------------------
  |  |  |  |  395|      0|#  define CC_HINT(...)		__attribute__((__VA_ARGS__))
  |  |  ------------------
  ------------------
  288|       |
  289|  4.57k|	default:
  ------------------
  |  Branch (289:2): [True: 4.57k, False: 6.86k]
  ------------------
  290|  4.57k|		slen = fr_value_box_from_network(vp, &vp->data, vp->vp_type, da,
  ------------------
  |  |  149|  4.57k|#define vp_type			data.type
  ------------------
  291|  4.57k|						 &FR_DBUFF_TMP(p, end - p), end - p, true);
  ------------------
  |  |  522|  4.57k|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|  4.57k|(fr_dbuff_t){ \
  |  |  524|  4.57k|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|  4.57k|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|  4.57k|	.end_i		= _Generic((_len_or_end), \
  |  |  527|  4.57k|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|  4.57k|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|  4.57k|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|  4.57k|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|  4.57k|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|  4.57k|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|  4.57k|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|  4.57k|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|  4.57k|			), \
  |  |  536|  4.57k|	.p_i		= _start, \
  |  |  537|  4.57k|	.is_const	= _Generic((_start), \
  |  |  538|  4.57k|				uint8_t *	: false, \
  |  |  539|  4.57k|				uint8_t const *	: true, \
  |  |  540|  4.57k|				char *		: false, \
  |  |  541|  4.57k|				char const *	: true \
  |  |  542|  4.57k|	       		) \
  |  |  543|  4.57k|}
  ------------------
  292|  4.57k|		if (slen < 0) {
  ------------------
  |  Branch (292:7): [True: 917, False: 3.65k]
  ------------------
  293|  1.41k|		raw:
  294|  1.41k|			FR_PROTO_TRACE("decoding as unknown type");
  ------------------
  |  |   41|  1.41k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 1.41k]
  |  |  ------------------
  ------------------
  295|  1.41k|			if (fr_pair_raw_afrom_pair(vp, p, (end - p)) < 0) {
  ------------------
  |  Branch (295:8): [True: 0, False: 1.41k]
  ------------------
  296|      0|				return -1;
  297|      0|			}
  298|  1.41k|			p = end;
  299|  1.41k|			break;
  300|  1.41k|		}
  301|       |
  302|  3.65k|		if (exact && (slen != (end - p))) {
  ------------------
  |  Branch (302:7): [True: 1.46k, False: 2.19k]
  |  Branch (302:16): [True: 66, False: 1.39k]
  ------------------
  303|     66|			goto raw;
  304|     66|		}
  305|       |
  306|  3.59k|		p += (size_t) slen;
  307|  3.59k|		break;
  308|  11.4k|	}
  309|       |
  310|  11.7k|finish:
  311|  11.7k|	FR_PROTO_TRACE("decoding value complete, adding new pair and returning %zu byte(s)", (size_t) (p - data));
  ------------------
  |  |   41|  11.7k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 11.7k]
  |  |  ------------------
  ------------------
  312|  11.7k|	fr_pair_append(out, vp);
  313|       |
  314|  11.7k|	return p - data;
  315|  11.4k|}
decode.c:decode_value_trampoline:
   73|  4.22k|{
   74|  4.22k|	FR_PROTO_TRACE("decode_value_trampoline of %s with %zu bytes", parent->name, data_len);
  ------------------
  |  |   41|  4.22k|#  define FR_PROTO_TRACE(_fmt, ...)					if (fr_debug_lvl >= L_DBG_LVL_4) fr_proto_print(__FILE__, __LINE__, _fmt, ## __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (41:45): [True: 0, False: 4.22k]
  |  |  ------------------
  ------------------
   75|       |
   76|       |	/*
   77|       |	 *	@todo - we might need to limit this to only one DNS label.
   78|       |	 */
   79|  4.22k|	if ((parent->type == FR_TYPE_STRING) && fr_dhcpv4_flag_dns_label(parent)) {
  ------------------
  |  |  157|    454|#define fr_dhcpv4_flag_dns_label(_da)		(fr_dhcpv4_attr_flags(_da)->dns_label)
  |  |  ------------------
  |  |  |  Branch (157:40): [True: 436, False: 18]
  |  |  ------------------
  ------------------
  |  Branch (79:6): [True: 454, False: 3.76k]
  ------------------
   80|    436|		return fr_pair_dns_labels_from_network(ctx, out, parent, data, data, data_len, NULL, false);
   81|    436|	}
   82|       |
   83|  3.78k|	return decode_value(ctx, out, parent, data, data_len, decode_ctx);
   84|  4.22k|}
decode.c:decode_tlv_trampoline:
   60|     18|{
   61|     18|	return fr_pair_tlvs_from_network(ctx, out, parent, data, data_len, decode_ctx, decode_option, verify_tlvs, true);
   62|     18|}
decode.c:decode_test_ctx:
  743|  1.23k|{
  744|  1.23k|	fr_dhcpv4_ctx_t *test_ctx;
  745|       |
  746|  1.23k|	test_ctx = talloc_zero(ctx, fr_dhcpv4_ctx_t);
  747|  1.23k|	test_ctx->tmp_ctx = talloc(test_ctx, uint8_t);
  748|  1.23k|	test_ctx->root = root_da ? root_da : fr_dict_root(dict_dhcpv4);
  ------------------
  |  Branch (748:19): [True: 0, False: 1.23k]
  ------------------
  749|       |
  750|  1.23k|	*out = test_ctx;
  751|       |
  752|  1.23k|	return 0;
  753|  1.23k|}
decode.c:fr_dhcpv4_decode_proto:
  758|  1.23k|{
  759|  1.23k|	unsigned int	code;
  760|       |
  761|  1.23k|	if (!fr_dhcpv4_ok(data, data_len, NULL, NULL)) return -1;
  ------------------
  |  Branch (761:6): [True: 1.03k, False: 200]
  ------------------
  762|       |
  763|    200|	if (fr_dhcpv4_decode(ctx, out, data, data_len, &code) < 0) return -1;
  ------------------
  |  Branch (763:6): [True: 75, False: 125]
  ------------------
  764|       |
  765|    125|	return data_len;
  766|    200|}

decode.c:fr_dhcpv4_attr_flags:
  153|  2.64k|{
  154|  2.64k|	return fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC);
  155|  2.64k|}

encode.c:encode_test_ctx:
  813|  1.23k|{
  814|  1.23k|	fr_dhcpv4_ctx_t *test_ctx;
  815|       |
  816|  1.23k|	test_ctx = talloc_zero(ctx, fr_dhcpv4_ctx_t);
  817|  1.23k|	if (!test_ctx) return -1;
  ------------------
  |  Branch (817:6): [True: 0, False: 1.23k]
  ------------------
  818|  1.23k|	test_ctx->root = root_da ? root_da : fr_dict_root(dict_dhcpv4);
  ------------------
  |  Branch (818:19): [True: 0, False: 1.23k]
  ------------------
  819|       |
  820|  1.23k|	*out = test_ctx;
  821|       |
  822|  1.23k|	return 0;
  823|  1.23k|}

fr_dhcpv4_packet_get_option:
   38|    463|{
   39|    463|	int overload = 0;
   40|    463|	int field = DHCP_OPTION_FIELD;
  ------------------
  |  |   93|    463|#define DHCP_OPTION_FIELD	(0)
  ------------------
   41|    463|	size_t where, size;
   42|    463|	uint8_t const *data;
   43|       |
   44|    463|	if (packet_size < MIN_PACKET_SIZE) return NULL;
  ------------------
  |  |   88|    463|#define MIN_PACKET_SIZE		(244)
  ------------------
  |  Branch (44:6): [True: 0, False: 463]
  ------------------
   45|       |
   46|       |	/*
   47|       |	 *	This is needed for UBSAN on MacOS, that doesn't
   48|       |	 *	allow misaligned accesses.  Because the packet
   49|       |	 *	structure is flat, we don't need to deref the
   50|       |	 *	packet pointer at any point, we just need to
   51|       |	 *	calculate the offsets relative to the pointer
   52|       |	 *	value and use those... Whatever actually deals
   53|       |	 *	with the option is just expecting a uint8_t *.
   54|       |	 */
   55|    463|#define ALIGNED_ACCESS(packet, field) \
   56|    463|		(uint8_t const *)packet + offsetof(dhcp_packet_t, field)
   57|       |
   58|    463|	where = 0;
   59|    463|	size = packet_size - offsetof(dhcp_packet_t, options);
   60|       |
   61|       |	/*
   62|       |	 *	Alignment fix.  We can't just deref a pointer
   63|       |	 */
   64|    463|	data = ALIGNED_ACCESS(packet, options);
  ------------------
  |  |   56|    463|		(uint8_t const *)packet + offsetof(dhcp_packet_t, field)
  ------------------
   65|  9.43k|	while (where < size) {
  ------------------
  |  Branch (65:9): [True: 9.42k, False: 9]
  ------------------
   66|  9.42k|		if (data[0] == 0) { /* padding */
  ------------------
  |  Branch (66:7): [True: 2.44k, False: 6.98k]
  ------------------
   67|  2.44k|			where++;
   68|  2.44k|			data++;
   69|  2.44k|			continue;
   70|  2.44k|		}
   71|       |
   72|  6.98k|		if (data[0] == 255) { /* end of options */
  ------------------
  |  Branch (72:7): [True: 309, False: 6.67k]
  ------------------
   73|    309|			if ((field == DHCP_OPTION_FIELD) && (overload & DHCP_FILE_FIELD)) {
  ------------------
  |  |   93|    309|#define DHCP_OPTION_FIELD	(0)
  ------------------
              			if ((field == DHCP_OPTION_FIELD) && (overload & DHCP_FILE_FIELD)) {
  ------------------
  |  |   94|    293|#define DHCP_FILE_FIELD	  	(1)
  ------------------
  |  Branch (73:8): [True: 293, False: 16]
  |  Branch (73:40): [True: 290, False: 3]
  ------------------
   74|    290|				data = ALIGNED_ACCESS(packet, file);
  ------------------
  |  |   56|    290|		(uint8_t const *)packet + offsetof(dhcp_packet_t, field)
  ------------------
   75|    290|				where = 0;
   76|    290|				size = sizeof(packet->file);
   77|    290|				field = DHCP_FILE_FIELD;
  ------------------
  |  |   94|    290|#define DHCP_FILE_FIELD	  	(1)
  ------------------
   78|    290|				continue;
   79|       |
   80|    290|			} else if ((field == DHCP_FILE_FIELD || field == DHCP_OPTION_FIELD) && (overload & DHCP_SNAME_FIELD)) {
  ------------------
  |  |   94|     38|#define DHCP_FILE_FIELD	  	(1)
  ------------------
              			} else if ((field == DHCP_FILE_FIELD || field == DHCP_OPTION_FIELD) && (overload & DHCP_SNAME_FIELD)) {
  ------------------
  |  |   93|      3|#define DHCP_OPTION_FIELD	(0)
  ------------------
              			} else if ((field == DHCP_FILE_FIELD || field == DHCP_OPTION_FIELD) && (overload & DHCP_SNAME_FIELD)) {
  ------------------
  |  |   95|     19|#define DHCP_SNAME_FIELD  	(2)
  ------------------
  |  Branch (80:16): [True: 16, False: 3]
  |  Branch (80:44): [True: 3, False: 0]
  |  Branch (80:75): [True: 18, False: 1]
  ------------------
   81|     18|				data = ALIGNED_ACCESS(packet, sname);
  ------------------
  |  |   56|     18|		(uint8_t const *)packet + offsetof(dhcp_packet_t, field)
  ------------------
   82|     18|				where = 0;
   83|     18|				size = sizeof(packet->sname);
   84|     18|				field = DHCP_SNAME_FIELD;
  ------------------
  |  |   95|     18|#define DHCP_SNAME_FIELD  	(2)
  ------------------
   85|     18|				continue;
   86|     18|			}
   87|       |
   88|      1|			return NULL;
   89|    309|		}
   90|       |
   91|       |		/*
   92|       |		 *	We MUST have a real option here.
   93|       |		 */
   94|  6.67k|		if ((where + 2) > size) {
  ------------------
  |  Branch (94:7): [True: 1, False: 6.67k]
  ------------------
   95|      1|			fr_strerror_printf("Options overflow field at %u",
  ------------------
  |  |   65|      1|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
   96|      1|					   (unsigned int) (data - (uint8_t const *) packet));
   97|      1|			return NULL;
   98|      1|		}
   99|       |
  100|  6.67k|		if ((where + 2 + data[1]) > size) {
  ------------------
  |  Branch (100:7): [True: 11, False: 6.65k]
  ------------------
  101|     11|			fr_strerror_printf("Option length overflows field at %u",
  ------------------
  |  |   65|     11|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  102|     11|					   (unsigned int) (data - (uint8_t const *) packet));
  103|     11|			return NULL;
  104|     11|		}
  105|       |
  106|  6.65k|		if (data[0] == da->attr) return data;
  ------------------
  |  Branch (106:7): [True: 441, False: 6.21k]
  ------------------
  107|       |
  108|  6.21k|		if ((data[0] == 52) && (data[1] > 0)) { /* overload sname and/or file */
  ------------------
  |  Branch (108:7): [True: 815, False: 5.40k]
  |  Branch (108:26): [True: 567, False: 248]
  ------------------
  109|    567|			overload = data[2];
  110|    567|		}
  111|       |
  112|  6.21k|		where += data[1] + 2;
  113|  6.21k|		data += data[1] + 2;
  114|  6.21k|	}
  115|       |
  116|      9|	return NULL;
  117|    463|}
fr_dhcpv4_decode:
  120|    200|{
  121|    200|	size_t		i;
  122|    200|	uint8_t const  	*p = data;
  123|    200|	uint32_t	giaddr;
  124|    200|	fr_pair_list_t	tmp;
  125|    200|	fr_pair_t	*vp;
  126|    200|	fr_pair_t	*maxms, *mtu, *netaddr;
  127|    200|	fr_value_box_t	box;
  128|    200|	fr_dhcpv4_ctx_t *packet_ctx;
  129|       |
  130|    200|	fr_pair_list_init(&tmp);
  131|       |
  132|    200|	fr_assert(data_len >= MIN_PACKET_SIZE); /* fr_dhcpv4_ok() MUST be called first */
  ------------------
  |  |  194|    200|#  define	fr_assert(_x) if (unlikely(!((bool)(_x)))) _fr_assert_fail(__FILE__, __LINE__, #_x, NULL)
  |  |  ------------------
  |  |  |  |  397|    200|#  define unlikely(_x)		__builtin_expect((_x), 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:25): [True: 0, False: 200]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  133|       |
  134|    200|	if (data[1] > 1) {
  ------------------
  |  Branch (134:6): [True: 0, False: 200]
  ------------------
  135|      0|		fr_strerror_printf("Packet is not Ethernet: %u",
  ------------------
  |  |   65|      0|			_fr_strerror_printf(__FILE__, __LINE__, _fmt, ##__VA_ARGS__)
  ------------------
  136|      0|		      data[1]);
  137|      0|		return -1;
  138|      0|	}
  139|       |
  140|    200|	packet_ctx = talloc_zero(ctx, fr_dhcpv4_ctx_t);
  141|    200|	if (!packet_ctx) return -1;
  ------------------
  |  Branch (141:6): [True: 0, False: 200]
  ------------------
  142|    200|	packet_ctx->tmp_ctx = talloc(packet_ctx, uint8_t);
  143|    200|	packet_ctx->root = fr_dict_root(dict_dhcpv4);
  144|       |
  145|       |	/*
  146|       |	 *	Decode the header.
  147|       |	 */
  148|  3.00k|	for (i = 0; i < dhcp_header_attrs_len; i++) {
  ------------------
  |  Branch (148:14): [True: 2.80k, False: 200]
  ------------------
  149|  2.80k|		fr_dict_attr_t const *da = *dhcp_header_attrs[i];
  150|       |
  151|  2.80k|		vp = fr_pair_afrom_da(ctx, da);
  152|  2.80k|		if (!vp) {
  ------------------
  |  Branch (152:7): [True: 0, False: 2.80k]
  ------------------
  153|      0|			fr_strerror_const_push("Cannot decode packet due to internal error");
  ------------------
  |  |  227|      0|#define		fr_strerror_const_push(_msg) _fr_strerror_const_push(__FILE__, __LINE__, _msg)
  ------------------
  154|      0|		error_vp:
  155|      0|			talloc_free(vp);
  156|      0|		error:
  157|      0|			fr_pair_list_free(&tmp);
  158|      0|			talloc_free(packet_ctx);
  159|      0|			return -1;
  160|      0|		}
  161|       |
  162|  2.80k|		switch (vp->vp_type) {
  ------------------
  |  |  149|  2.80k|#define vp_type			data.type
  ------------------
  163|    400|		case FR_TYPE_STRING:
  ------------------
  |  Branch (163:3): [True: 400, False: 2.40k]
  ------------------
  164|       |			/*
  165|       |			 *	According to RFC 2131, these are null terminated strings.
  166|       |			 *	We don't trust everyone to abide by the RFC, though.
  167|       |			 */
  168|    400|			if (*p != '\0') {
  ------------------
  |  Branch (168:8): [True: 323, False: 77]
  ------------------
  169|    323|				uint8_t *q;
  170|       |
  171|    323|				q = memchr(p, '\0', dhcp_header_sizes[i]);
  172|    323|				fr_pair_value_bstrndup(vp, (char const *)p, q ? q - p : dhcp_header_sizes[i], true);
  ------------------
  |  Branch (172:49): [True: 310, False: 13]
  ------------------
  173|    323|			} else {
  174|     77|				TALLOC_FREE(vp);
  ------------------
  |  Branch (174:5): [True: 77, False: 0]
  |  Branch (174:5): [Folded, False: 77]
  ------------------
  175|     77|			}
  176|    400|			break;
  177|       |
  178|       |			/*
  179|       |			 *	The DHCP header size for CHADDR is not
  180|       |			 *	6, so the value_box function doesn't
  181|       |			 *	like it.  Just do the copy manually.
  182|       |			 */
  183|    200|		case FR_TYPE_ETHERNET:
  ------------------
  |  Branch (183:3): [True: 200, False: 2.60k]
  ------------------
  184|    200|			if ((data[1] != 1) || (data[2] != 6)) {
  ------------------
  |  Branch (184:8): [True: 0, False: 200]
  |  Branch (184:26): [True: 180, False: 20]
  ------------------
  185|    180|				TALLOC_FREE(vp);
  ------------------
  |  Branch (185:5): [True: 180, False: 0]
  |  Branch (185:5): [Folded, False: 180]
  ------------------
  186|    180|				break;
  187|    180|			}
  188|       |
  189|     20|			memcpy(vp->vp_ether, p, sizeof(vp->vp_ether));
  ------------------
  |  |  123|     20|#define vp_ether		data.vb_ether
  |  |  ------------------
  |  |  |  |  269|     20|#define vb_ether				datum.ether.addr
  |  |  ------------------
  ------------------
              			memcpy(vp->vp_ether, p, sizeof(vp->vp_ether));
  ------------------
  |  |  123|     20|#define vp_ether		data.vb_ether
  |  |  ------------------
  |  |  |  |  269|     20|#define vb_ether				datum.ether.addr
  |  |  ------------------
  ------------------
  190|     20|			break;
  191|       |
  192|  2.20k|		default:
  ------------------
  |  Branch (192:3): [True: 2.20k, False: 600]
  ------------------
  193|  2.20k|			if (fr_value_box_from_network(vp, &vp->data, vp->vp_type, vp->da,
  ------------------
  |  |  149|  2.20k|#define vp_type			data.type
  ------------------
  |  Branch (193:8): [True: 0, False: 2.20k]
  ------------------
  194|  2.20k|						      &FR_DBUFF_TMP(p, (size_t)dhcp_header_sizes[i]),
  ------------------
  |  |  522|  2.20k|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|  2.20k|(fr_dbuff_t){ \
  |  |  524|  2.20k|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|  2.20k|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|  2.20k|	.end_i		= _Generic((_len_or_end), \
  |  |  527|  2.20k|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|  2.20k|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|  2.20k|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|  2.20k|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|  2.20k|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|  2.20k|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|  2.20k|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|  2.20k|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|  2.20k|			), \
  |  |  536|  2.20k|	.p_i		= _start, \
  |  |  537|  2.20k|	.is_const	= _Generic((_start), \
  |  |  538|  2.20k|				uint8_t *	: false, \
  |  |  539|  2.20k|				uint8_t const *	: true, \
  |  |  540|  2.20k|				char *		: false, \
  |  |  541|  2.20k|				char const *	: true \
  |  |  542|  2.20k|	       		) \
  |  |  543|  2.20k|}
  ------------------
  195|  2.20k|						      dhcp_header_sizes[i], true) < 0) goto error_vp;
  196|  2.20k|			break;
  197|  2.80k|		}
  198|  2.80k|		p += dhcp_header_sizes[i];
  199|       |
  200|  2.80k|		if (!vp) continue;
  ------------------
  |  Branch (200:7): [True: 257, False: 2.54k]
  ------------------
  201|       |
  202|  2.54k|		fr_pair_append(&tmp, vp);
  203|  2.54k|	}
  204|       |
  205|       |	/*
  206|       |	 * 	Nothing uses tail after this call, if it does in the future
  207|       |	 *	it'll need to find the new tail...
  208|       |	 */
  209|    200|	{
  210|    200|		uint8_t const		*end;
  211|    200|		ssize_t			len;
  212|       |
  213|    200|		p = data + 240;
  214|    200|		end = p + (data_len - 240);
  215|       |
  216|       |		/*
  217|       |		 *	Loop over all the options data
  218|       |		 */
  219|  2.67k|		while (p < end) {
  ------------------
  |  Branch (219:10): [True: 2.49k, False: 182]
  ------------------
  220|  2.49k|			len = fr_dhcpv4_decode_option(ctx, &tmp, p, (end - p), packet_ctx);
  221|  2.49k|			if (len <= 0) {
  ------------------
  |  Branch (221:8): [True: 18, False: 2.47k]
  ------------------
  222|     75|			fail:
  223|     75|				fr_pair_list_free(&tmp);
  224|     75|				talloc_free(packet_ctx);
  225|     75|				return -1;
  226|     18|			}
  227|  2.47k|			p += len;
  228|  2.47k|		}
  229|       |
  230|    182|		if (code) {
  ------------------
  |  Branch (230:7): [True: 182, False: 0]
  ------------------
  231|    182|			vp = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_message_type);
  232|    182|			if (vp) {
  ------------------
  |  Branch (232:8): [True: 100, False: 82]
  ------------------
  233|    100|				*code = vp->vp_uint8;
  ------------------
  |  |  126|    100|#define vp_uint8		data.vb_uint8
  |  |  ------------------
  |  |  |  |  272|    100|#define vb_uint8				datum.uint8
  |  |  ------------------
  ------------------
  234|    100|			}
  235|    182|		}
  236|       |
  237|       |		/*
  238|       |		 *	If option Overload is present in the 'options' field, then fields 'file' and/or 'sname'
  239|       |		 *	are used to hold more options. They are partitioned and must be interpreted in sequence.
  240|       |		 */
  241|    182|		vp = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_overload);
  242|    182|		if (vp) {
  ------------------
  |  Branch (242:7): [True: 133, False: 49]
  ------------------
  243|    133|			if ((vp->vp_uint8 & 1) == 1) {
  ------------------
  |  |  126|    133|#define vp_uint8		data.vb_uint8
  |  |  ------------------
  |  |  |  |  272|    133|#define vb_uint8				datum.uint8
  |  |  ------------------
  ------------------
  |  Branch (243:8): [True: 133, False: 0]
  ------------------
  244|       |				/*
  245|       |				 *	The 'file' field is used to hold options.
  246|       |				 *	It must be interpreted before 'sname'.
  247|       |				 */
  248|    133|				p = data + offsetof(dhcp_packet_t, file);
  249|    133|				end = p + DHCP_FILE_LEN;
  ------------------
  |  |   39|    133|#define DHCP_FILE_LEN	(128)
  ------------------
  250|  3.05k|				while (p < end) {
  ------------------
  |  Branch (250:12): [True: 2.97k, False: 79]
  ------------------
  251|  2.97k|					len = fr_dhcpv4_decode_option(ctx, &tmp,
  252|  2.97k|								      p, end - p, packet_ctx);
  253|  2.97k|					if (len <= 0) goto fail;
  ------------------
  |  Branch (253:10): [True: 54, False: 2.92k]
  ------------------
  254|  2.92k|					p += len;
  255|  2.92k|				}
  256|     79|				fr_pair_delete_by_da(&tmp, attr_dhcp_boot_filename);
  257|     79|			}
  258|     79|			if ((vp->vp_uint8 & 2) == 2) {
  ------------------
  |  |  126|     79|#define vp_uint8		data.vb_uint8
  |  |  ------------------
  |  |  |  |  272|     79|#define vb_uint8				datum.uint8
  |  |  ------------------
  ------------------
  |  Branch (258:8): [True: 78, False: 1]
  ------------------
  259|       |				/*
  260|       |				 *	The 'sname' field is used to hold options.
  261|       |				 */
  262|     78|				p = data + offsetof(dhcp_packet_t, sname);
  263|     78|				end = p + DHCP_SNAME_LEN;
  ------------------
  |  |   38|     78|#define DHCP_SNAME_LEN	(64)
  ------------------
  264|    965|				while (p < end) {
  ------------------
  |  Branch (264:12): [True: 890, False: 75]
  ------------------
  265|    890|					len = fr_dhcpv4_decode_option(ctx, &tmp,
  266|    890|								      p, end - p, packet_ctx);
  267|    890|					if (len <= 0) goto fail;
  ------------------
  |  Branch (267:10): [True: 3, False: 887]
  ------------------
  268|    887|					p += len;
  269|    887|				}
  270|     75|				fr_pair_delete_by_da(&tmp, attr_dhcp_server_host_name);
  271|     75|			}
  272|     79|		}
  273|    182|	}
  274|       |
  275|       |	/*
  276|       |	 *	If DHCP request, set ciaddr to zero.
  277|       |	 */
  278|       |
  279|       |	/*
  280|       |	 *	Set broadcast flag for broken vendors, but only if
  281|       |	 *	giaddr isn't set.
  282|       |	 */
  283|    125|	memcpy(&giaddr, data + 24, sizeof(giaddr));
  284|    125|	if (giaddr == htonl(INADDR_ANY)) {
  ------------------
  |  Branch (284:6): [True: 6, False: 119]
  ------------------
  285|       |		/*
  286|       |		 *	DHCP Opcode is request
  287|       |		 */
  288|      6|		vp = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_opcode);
  289|      6|		if (vp && vp->vp_uint8 == 1) {
  ------------------
  |  |  126|      6|#define vp_uint8		data.vb_uint8
  |  |  ------------------
  |  |  |  |  272|      6|#define vb_uint8				datum.uint8
  |  |  ------------------
  ------------------
  |  Branch (289:7): [True: 6, False: 0]
  |  Branch (289:13): [True: 0, False: 6]
  ------------------
  290|       |			/*
  291|       |			 *	Vendor is "MSFT 98"
  292|       |			 */
  293|      0|			vp = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_vendor_class_identifier);
  294|      0|			if (vp && (vp->vp_length == 7) && (memcmp(vp->vp_strvalue, "MSFT 98", 7) == 0)) {
  ------------------
  |  |  117|      0|#define vp_length		data.vb_length
  |  |  ------------------
  |  |  |  |  292|      0|#define vb_length				datum.length
  |  |  ------------------
  ------------------
              			if (vp && (vp->vp_length == 7) && (memcmp(vp->vp_strvalue, "MSFT 98", 7) == 0)) {
  ------------------
  |  |  114|      0|#define vp_strvalue		data.vb_strvalue
  |  |  ------------------
  |  |  |  |  258|      0|#define vb_strvalue				datum.strvalue
  |  |  ------------------
  ------------------
  |  Branch (294:8): [True: 0, False: 0]
  |  Branch (294:14): [True: 0, False: 0]
  |  Branch (294:38): [True: 0, False: 0]
  ------------------
  295|      0|				vp = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_flags);
  296|       |
  297|       |				/*
  298|       |				 *	Reply should be broadcast.
  299|       |				 */
  300|      0|				if (vp) vp->vp_uint16 |= 0x8000;
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
  |  Branch (300:9): [True: 0, False: 0]
  ------------------
  301|      0|			}
  302|      0|		}
  303|      6|	}
  304|       |
  305|       |	/*
  306|       |	 *	Determine the address to use in looking up which subnet the
  307|       |	 *	client belongs to based on packet data.  The sequence here
  308|       |	 *	is based on ISC DHCP behaviour and RFCs 3527 and 3011.  We
  309|       |	 *	store the found address in an internal attribute of
  310|       |	 *	Network-Subnet
  311|       |	 *
  312|       |	 *
  313|       |	 *	All of these options / fields are type "ipv4addr", so
  314|       |	 *	we need to decode them as that.  And then cast it to
  315|       |	 *	"ipv4prefix".
  316|       |	 */
  317|    125|	vp = fr_pair_afrom_da(ctx, attr_dhcp_network_subnet);
  318|    125|	if (!vp) goto error;
  ------------------
  |  Branch (318:6): [True: 0, False: 125]
  ------------------
  319|       |
  320|       |	/*
  321|       |	 *	First look for Relay-Link-Selection
  322|       |	 */
  323|    125|	netaddr = fr_pair_find_by_da_nested(&tmp, NULL, attr_dhcp_relay_link_selection);
  324|    125|	if (!netaddr) {
  ------------------
  |  Branch (324:6): [True: 125, False: 0]
  ------------------
  325|       |		/*
  326|       |		 *	Next try Subnet-Selection-Option
  327|       |		 */
  328|    125|		netaddr = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_subnet_selection_option);
  329|    125|	}
  330|       |
  331|    125|	if (netaddr) {
  ------------------
  |  Branch (331:6): [True: 0, False: 125]
  ------------------
  332|       |		/*
  333|       |		 *	Store whichever address we found from options and ensure
  334|       |		 *	the data type matches the pair, i.e address to prefix
  335|       |		 *	conversion.
  336|       |		 */
  337|      0|		if (fr_value_box_cast(vp, &vp->data, vp->vp_type, vp->da, &netaddr->data) < 0) goto error_vp;
  ------------------
  |  |  149|      0|#define vp_type			data.type
  ------------------
  |  Branch (337:7): [True: 0, False: 0]
  ------------------
  338|       |
  339|    125|	} else if (giaddr != htonl(INADDR_ANY)) {
  ------------------
  |  Branch (339:13): [True: 119, False: 6]
  ------------------
  340|       |		/*
  341|       |		 *	Gateway address is set - use that one
  342|       |		 */
  343|    119|		if (fr_value_box_from_network(vp, &box, FR_TYPE_IPV4_ADDR, NULL,
  ------------------
  |  Branch (343:7): [True: 0, False: 119]
  ------------------
  344|    119|					  &FR_DBUFF_TMP(data + 24, 4), 4, true) < 0) goto error_vp;
  ------------------
  |  |  522|    119|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|    119|(fr_dbuff_t){ \
  |  |  524|    119|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|    119|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|    119|	.end_i		= _Generic((_len_or_end), \
  |  |  527|    119|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|    119|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|    119|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|    119|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|    119|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|    119|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|    119|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|    119|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|    119|			), \
  |  |  536|    119|	.p_i		= _start, \
  |  |  537|    119|	.is_const	= _Generic((_start), \
  |  |  538|    119|				uint8_t *	: false, \
  |  |  539|    119|				uint8_t const *	: true, \
  |  |  540|    119|				char *		: false, \
  |  |  541|    119|				char const *	: true \
  |  |  542|    119|	       		) \
  |  |  543|    119|}
  ------------------
  345|    119|		if (fr_value_box_cast(vp, &vp->data, vp->vp_type, vp->da, &box) < 0) goto error_vp;
  ------------------
  |  |  149|    119|#define vp_type			data.type
  ------------------
  |  Branch (345:7): [True: 0, False: 119]
  ------------------
  346|       |
  347|    119|	} else {
  348|       |		/*
  349|       |		 *	else, store client address whatever it is
  350|       |		 */
  351|      6|		if (fr_value_box_from_network(vp, &box, FR_TYPE_IPV4_ADDR, NULL,
  ------------------
  |  Branch (351:7): [True: 0, False: 6]
  ------------------
  352|      6|					  &FR_DBUFF_TMP(data + 12, 4), 4, true) < 0) goto error_vp;
  ------------------
  |  |  522|      6|#define FR_DBUFF_TMP(_start, _len_or_end) \
  |  |  523|      6|(fr_dbuff_t){ \
  |  |  524|      6|	.buff_i		= (uint8_t const *)(_start), \
  |  |  525|      6|	.start_i	= (uint8_t const *)(_start), \
  |  |  526|      6|	.end_i		= _Generic((_len_or_end), \
  |  |  527|      6|				size_t		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  528|      6|				long		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  529|      6|				int		: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  530|      6|				unsigned int	: (uint8_t const *)(_start) + (size_t)(_len_or_end), \
  |  |  531|      6|				uint8_t *	: (uint8_t const *)(_len_or_end), \
  |  |  532|      6|				uint8_t const *	: (uint8_t const *)(_len_or_end), \
  |  |  533|      6|				char *		: (uint8_t const *)(_len_or_end), \
  |  |  534|      6|				char const *	: (uint8_t const *)(_len_or_end) \
  |  |  535|      6|			), \
  |  |  536|      6|	.p_i		= _start, \
  |  |  537|      6|	.is_const	= _Generic((_start), \
  |  |  538|      6|				uint8_t *	: false, \
  |  |  539|      6|				uint8_t const *	: true, \
  |  |  540|      6|				char *		: false, \
  |  |  541|      6|				char const *	: true \
  |  |  542|      6|	       		) \
  |  |  543|      6|}
  ------------------
  353|      6|		if (fr_value_box_cast(vp, &vp->data, vp->vp_type, vp->da, &box) < 0) goto error_vp;
  ------------------
  |  |  149|      6|#define vp_type			data.type
  ------------------
  |  Branch (353:7): [True: 0, False: 6]
  ------------------
  354|      6|	}
  355|       |
  356|    125|	fr_pair_append(&tmp, vp);
  357|       |
  358|       |	/*
  359|       |	 *	Client can request a LARGER size, but not a smaller
  360|       |	 *	one.  They also cannot request a size larger than MTU.
  361|       |	 */
  362|    125|	maxms = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_dhcp_maximum_msg_size);
  363|    125|	mtu = fr_pair_find_by_da(&tmp, NULL, attr_dhcp_interface_mtu_size);
  364|       |
  365|    125|	if (mtu && (mtu->vp_uint16 < DEFAULT_PACKET_SIZE)) {
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
              	if (mtu && (mtu->vp_uint16 < DEFAULT_PACKET_SIZE)) {
  ------------------
  |  |   89|      0|#define DEFAULT_PACKET_SIZE	(300)
  ------------------
  |  Branch (365:6): [True: 0, False: 125]
  |  Branch (365:13): [True: 0, False: 0]
  ------------------
  366|      0|		fr_strerror_const("Client says MTU is smaller than minimum permitted by the specification");
  ------------------
  |  |  223|      0|#define		fr_strerror_const(_msg) _fr_strerror_const(__FILE__, __LINE__, _msg)
  ------------------
  367|      0|		goto error;
  368|      0|	}
  369|       |
  370|       |	/*
  371|       |	 *	Client says maximum message size is smaller than minimum permitted
  372|       |	 *	by the specification: fixing it.
  373|       |	 */
  374|    125|	if (maxms && (maxms->vp_uint16 < DEFAULT_PACKET_SIZE)) maxms->vp_uint16 = DEFAULT_PACKET_SIZE;
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
              	if (maxms && (maxms->vp_uint16 < DEFAULT_PACKET_SIZE)) maxms->vp_uint16 = DEFAULT_PACKET_SIZE;
  ------------------
  |  |   89|      0|#define DEFAULT_PACKET_SIZE	(300)
  ------------------
              	if (maxms && (maxms->vp_uint16 < DEFAULT_PACKET_SIZE)) maxms->vp_uint16 = DEFAULT_PACKET_SIZE;
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
              	if (maxms && (maxms->vp_uint16 < DEFAULT_PACKET_SIZE)) maxms->vp_uint16 = DEFAULT_PACKET_SIZE;
  ------------------
  |  |   89|      0|#define DEFAULT_PACKET_SIZE	(300)
  ------------------
  |  Branch (374:6): [True: 0, False: 125]
  |  Branch (374:15): [True: 0, False: 0]
  ------------------
  375|       |
  376|       |	/*
  377|       |	 *	Client says MTU is smaller than maximum message size: fixing it
  378|       |	 */
  379|    125|	if (maxms && mtu && (maxms->vp_uint16 > mtu->vp_uint16)) maxms->vp_uint16 = mtu->vp_uint16;
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
              	if (maxms && mtu && (maxms->vp_uint16 > mtu->vp_uint16)) maxms->vp_uint16 = mtu->vp_uint16;
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
              	if (maxms && mtu && (maxms->vp_uint16 > mtu->vp_uint16)) maxms->vp_uint16 = mtu->vp_uint16;
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
              	if (maxms && mtu && (maxms->vp_uint16 > mtu->vp_uint16)) maxms->vp_uint16 = mtu->vp_uint16;
  ------------------
  |  |  127|      0|#define vp_uint16		data.vb_uint16
  |  |  ------------------
  |  |  |  |  273|      0|#define vb_uint16				datum.uint16
  |  |  ------------------
  ------------------
  |  Branch (379:6): [True: 0, False: 125]
  |  Branch (379:15): [True: 0, False: 0]
  |  Branch (379:22): [True: 0, False: 0]
  ------------------
  380|       |
  381|       |	/*
  382|       |	 *	FIXME: Nuke attributes that aren't used in the normal
  383|       |	 *	header for discover/requests.
  384|       |	 */
  385|    125|	fr_pair_list_append(out, &tmp);
  386|       |
  387|    125|	return 0;
  388|    125|}

