. "$BST_LIB" # libconfuse is a configuration-file parser library: a caller declares an option # table (name, type, default, flags), libconfuse scans and parses a file against # it, and the caller reads typed values back out. It also writes the tree back # out (cfg_print), supports sections with titles, list-valued options, an # include directive, ${ENV} expansion, and five kinds of user callback. # # It is the THIRD .INI-family parser on this image and the largest -- inih (71) # streams a file through a callback, iniparser (72) loads it into a dictionary of # strings, and libconfuse type-checks against a declared schema and hands back # long int / double / cfg_bool_t / nested cfg_t. It is also the first of the three # with a WRITER and with file inclusion. # # The distro is static-only and libconfuse has NO CLI, so the installed payload # is one header plus one pkg-config file (-dev) and the archive libconfuse.a # (-staticdev). The main libconfuse package is EMPTY on this arm and is # deliberately not named in the image (an empty package emits no .deb, which # fails do_rootfs outright -- see the image recipe's libconfuse block). # # --------------------------------------------------------------------------- # WHY THIS SUITE RUNS A PROBE INSTEAD OF STOPPING AT PAYLOAD SHAPE # # inih, iniparser and libyaml verify the shipped artifact and stop, because with # no consumer on the image and no on-target C compiler there is nothing to run. # BRINTOS-217 is why that is not enough here: oniguruma COMPILED and PACKAGED # perfectly on this arm and then returned silently wrong offsets to every caller, # so a payload-only suite would have gone green on the exact defect the port # existed to find. libconfuse is the same shape of risk and then some -- its # scanner is flex-generated and walks a loop-carried cursor with its own # realloc'd token buffer, which is the pointer-arithmetic class hwjs-cc#24 broke # for onig. # # So data/libconfuse-probe is cross-linked with wasmcc-glibc against THE VERY # ARCHIVE THAT SHIPS (/usr/lib/libconfuse.a), staged to $TMPDIR and run here. # Its source is src/libconfuse_probe.c. EVERY EXPECTED VALUE IN IT IS THE VALUE A # NATIVE x86_64 BUILD OF THE IDENTICAL SOURCE PRODUCES: the probe scored 206/206 # natively before this suite was written, and correcting it to get there caught # 29 wrong expectations of mine -- so a red below is a platform difference, not a # guess of mine. The probe compares internally and prints its own verdict, and # the console dump carries the value for diagnosis. # # Six of its groups exist for platform reasons rather than for libconfuse's, and # are the ones to read first on a red run: # # run-lex-* every escape, comment and quoting form the flex scanner # implements, asserted to the byte. # run-buf-* cfg_parse_buf hands the scanner a glibc fmemopen() FILE*, so # these measure a memory stream on this arm. # run-num-* integers go through strtol(v,&e,0) and reals through strtod, # and cfg_print renders reals back through fprintf("%f") -- both # directions of libc number conversion. # run-cb-* libconfuse's whole extension surface is indirect calls through # stored function pointers, which a coroutinized arm reaches # through a table. cfg_error is also its one va_list API. # run-env-* / run-tilde-* the lexer expands ${VAR} through getenv, and # cfg_tilde_expand resolves ~user through getpwnam -- i.e. NSS, # which this image only has because BRINTOS-117 wired # glibc-nss-files. # run-incl-* include is a builtin cfg_func_t pushing one flex buffer and one # FILE* per level, guarded by a counter at MAX_INCLUDE_DEPTH=10. # # --------------------------------------------------------------------------- # WHY BUILTIN MATCHING INSTEAD OF check_out # # The probe runs ONCE and each payload file is read ONCE into a shell variable; # every assertion below is a `case` glob against those, so there is no fork per # case. The cjson suite next door was killed by the runner's per-suite bound at # 156 cases written as check_out+cat: on this runtime the forking IS the cost. # # THE TWO ARCHIVE MEMBERS ARE THE POINT OF THE ARCHIVE CASES # # libconfuse.a must carry exactly TWO compiled translation units, and which two # is the whole recipe story of this port. confuse.o is the parser; lexer.o is # generated from lexer.l by flex, and the stock meta-networking recipe DEPENDS on # no flex-native, so on a Yocto host (flex is in neither HOSTTOOLS nor # ASSUME_PROVIDED) `make` reached automake's `missing` script and died with # "flex: command not found". A libconfuse.a without lexer.o would not link, so # the member case below is the on-target witness for the one-line bbappend that # makes this port build at all. # # The absence of fmemopen.o and reallocarray.o is the other half: configure found # both in glibc (HAVE_FMEMOPEN, HAVE_REALLOCARRAY), so upstream's bundled # fallbacks are conditionally NOT compiled -- exactly two members, no more. # --------------------------------------------------------------------------- inc=/usr/include/confuse.h lib=/usr/lib/libconfuse.a pc=/usr/lib/pkgconfig/libconfuse.pc nl=' ' # hasfile -- ok iff is a non-empty regular file. # has -- ok iff contains the literal . hasfile() { if [ -s "$2" ]; then bst_ok "$1"; else bst_notok "$1" "absent or empty: $2"; fi; } has() { case "$3" in *"$2"*) bst_ok "$1" ;; *) bst_notok "$1" "not found: $2" ;; esac; } # --- the shipped payload ----------------------------------------------------- hasfile libconfuse/header "$inc" hasfile libconfuse/archive "$lib" hasfile libconfuse/pkgconfig "$pc" # The archive is an ar archive rather than, say, a stray text file: the first # eight bytes are the ar magic. This is the one structural claim about the # archive that holds for a bitcode one too. check_out libconfuse/archive-is-ar '!' head -c 8 "$lib" # There is deliberately no libconfuse/no-shared-object case: shared objects are # refused distro-wide on this arm, so an absent libconfuse.so is the distro's # property and not this port's, and every sibling library would assert it too. # There is also no main-package case: the main package is empty by construction # here and is not installed, which the image recipe records. # The pkg-config file is the one place on target that states this port's version # and link line, and it must describe THE IMAGE's layout rather than a build-host # one. pc-prefix and pc-libdir are the two cases that pin that: Yocto's configure # passes --prefix=/usr --libdir=/usr/lib explicitly, so autoconf substitutes the # absolute paths instead of the ${exec_prefix}-relative forms a plain ./configure # leaves behind. They are therefore the two cases whose expected text differs # between this suite and a native control of the same source -- deliberately, and # the native harness rewrites just these two. pctext=$(cat "$pc" 2>/dev/null) has libconfuse/pc-name "Name: confuse" "$pctext" has libconfuse/pc-version "Version: 3.3" "$pctext" has libconfuse/pc-desc "configuration file parser library" "$pctext" has libconfuse/pc-libs "-lconfuse" "$pctext" has libconfuse/pc-prefix "prefix=/usr" "$pctext" has libconfuse/pc-libdir "libdir=/usr/lib" "$pctext" has libconfuse/pc-cflags "Cflags: -I\${includedir}" "$pctext" # --- the installed header ---------------------------------------------------- hdr=$(cat "$inc" 2>/dev/null) has libconfuse/hdr-guard "define CONFUSE_H_" "$hdr" # Return codes: the four values every entry point below is asserted against. has libconfuse/hdr-rc-success "#define CFG_SUCCESS 0" "$hdr" has libconfuse/hdr-rc-fail "#define CFG_FAIL -1" "$hdr" has libconfuse/hdr-rc-file "#define CFG_FILE_ERROR -1" "$hdr" has libconfuse/hdr-rc-parse "#define CFG_PARSE_ERROR 1" "$hdr" # The option-declaration macros a caller's table is built from -- the API's real # surface, since the cfg_opt_t layout is reached only through these. has libconfuse/hdr-macro-str "#define CFG_STR(name, def, flags)" "$hdr" has libconfuse/hdr-macro-str-list "#define CFG_STR_LIST(name, def, flags)" "$hdr" has libconfuse/hdr-macro-int "#define CFG_INT(name, def, flags)" "$hdr" has libconfuse/hdr-macro-int-cb "#define CFG_INT_CB(name, def, flags, cb)" "$hdr" has libconfuse/hdr-macro-float "#define CFG_FLOAT(name, def, flags)" "$hdr" has libconfuse/hdr-macro-bool "#define CFG_BOOL(name, def, flags)" "$hdr" has libconfuse/hdr-macro-sec "#define CFG_SEC(name, opts, flags)" "$hdr" has libconfuse/hdr-macro-func "#define CFG_FUNC(name, func)" "$hdr" has libconfuse/hdr-macro-ptr-cb "#define CFG_PTR_CB(name, def, flags, parsecb, freecb)" "$hdr" has libconfuse/hdr-macro-end "#define CFG_END()" "$hdr" # The option flags the probe exercises, each asserted with its bit position so a # renumbering cannot pass. has libconfuse/hdr-flag-multi "#define CFGF_MULTI (1 << 0)" "$hdr" has libconfuse/hdr-flag-list "#define CFGF_LIST (1 << 1)" "$hdr" has libconfuse/hdr-flag-nocase "#define CFGF_NOCASE (1 << 2)" "$hdr" has libconfuse/hdr-flag-title "#define CFGF_TITLE (1 << 3)" "$hdr" has libconfuse/hdr-flag-nodefault "#define CFGF_NODEFAULT (1 << 4)" "$hdr" has libconfuse/hdr-flag-nodupes "#define CFGF_NO_TITLE_DUPES (1 << 5)" "$hdr" has libconfuse/hdr-flag-ignore "#define CFGF_IGNORE_UNKNOWN (1 << 8)" "$hdr" has libconfuse/hdr-flag-deprecated "#define CFGF_DEPRECATED (1 << 9)" "$hdr" has libconfuse/hdr-flag-comments "#define CFGF_COMMENTS (1 << 11)" "$hdr" # The five callback typedefs: every one of these is an indirect call the probe # makes the platform perform, so their shape is part of what is being asserted. has libconfuse/hdr-cb-func "typedef int (*cfg_func_t)(cfg_t *cfg, cfg_opt_t *opt, int argc, const char **argv);" "$hdr" has libconfuse/hdr-cb-value "typedef int (*cfg_callback_t)(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result);" "$hdr" has libconfuse/hdr-cb-validate "typedef int (*cfg_validate_callback_t)(cfg_t *cfg, cfg_opt_t *opt);" "$hdr" has libconfuse/hdr-cb-error "typedef void (*cfg_errfunc_t)(cfg_t *cfg, const char *fmt, va_list ap);" "$hdr" has libconfuse/hdr-cb-print "typedef void (*cfg_print_func_t)(cfg_opt_t *opt, unsigned int index, FILE *fp);" "$hdr" has libconfuse/hdr-cb-free "typedef void (*cfg_free_func_t)(void *value);" "$hdr" # Entry points matched WITH their return type, so a prose mention in a doxygen # comment cannot satisfy the case. has libconfuse/hdr-api-init "cfg_t *__export cfg_init(" "$hdr" has libconfuse/hdr-api-parse "int __export cfg_parse(" "$hdr" has libconfuse/hdr-api-parse-buf "int __export cfg_parse_buf(" "$hdr" has libconfuse/hdr-api-parse-fp "int __export cfg_parse_fp(" "$hdr" has libconfuse/hdr-api-getstr "char *__export cfg_getstr(" "$hdr" has libconfuse/hdr-api-getint "long int __export cfg_getint(" "$hdr" has libconfuse/hdr-api-getfloat "double __export cfg_getfloat(" "$hdr" has libconfuse/hdr-api-getbool "cfg_bool_t __export cfg_getbool(" "$hdr" has libconfuse/hdr-api-size "unsigned int __export cfg_size(" "$hdr" has libconfuse/hdr-api-getsec "cfg_t *__export cfg_getsec(" "$hdr" has libconfuse/hdr-api-title "const char *__export cfg_title(" "$hdr" has libconfuse/hdr-api-print "int __export cfg_print(" "$hdr" has libconfuse/hdr-api-setlist "int __export cfg_setlist(" "$hdr" has libconfuse/hdr-api-addlist "int __export cfg_addlist(" "$hdr" has libconfuse/hdr-api-include "int __export cfg_include(" "$hdr" has libconfuse/hdr-api-tilde "char *__export cfg_tilde_expand(" "$hdr" has libconfuse/hdr-api-searchpath "int __export cfg_add_searchpath(" "$hdr" has libconfuse/hdr-api-free "int __export cfg_free(" "$hdr" # --- symbol completeness, tracked from the INSTALLED header ------------------ # Every entry point the installed header declares must be present in the # installed archive, so a partial compile, a visibility mistake or a # header/library skew all fail this. The list is DERIVED from the header rather # than written here, so it survives a version bump; two grep pipelines are the # only forks in this whole section. apisyms=$(grep 'DLLIMPORT' "$inc" 2>/dev/null | grep -oE '\bcfg_[a-z0-9_]*\(' | sed 's/(//' | sort -u) napi=$(printf '%s\n' "$apisyms" | grep -c .) check_eq libconfuse/hdr-api-count 80 "$napi" arcsyms=$(grep -ao 'cfg_[a-z0-9_]*' "$lib" 2>/dev/null | sort -u) nmiss=0 missing="" for f in $apisyms; do case "$nl$arcsyms$nl" in *"$nl$f$nl"*) ;; *) nmiss=$((nmiss + 1)); missing="$missing $f" ;; esac done if [ "$nmiss" -eq 0 ]; then bst_ok libconfuse/symbols-complete else bst_notok libconfuse/symbols-complete "$nmiss missing:$missing" fi # A spot-check that the derivation above really read the archive, rather than an # empty string that would make the loop vacuously green. cfg_yylex and # cfg_scan_fp_begin come from the FLEX-GENERATED half specifically, so their # presence is the on-target witness that lexer.l was regenerated and compiled. hasline() { case "$nl$3$nl" in *"$nl$2$nl"*) bst_ok "$1" ;; *) bst_notok "$1" "not in archive: $2" ;; esac; } hasline libconfuse/sym-cfg_init cfg_init "$arcsyms" hasline libconfuse/sym-cfg_parse_buf cfg_parse_buf "$arcsyms" hasline libconfuse/sym-cfg_tilde_expand cfg_tilde_expand "$arcsyms" hasline libconfuse/sym-cfg_setlist cfg_setlist "$arcsyms" hasline libconfuse/sym-cfg_yylex cfg_yylex "$arcsyms" hasline libconfuse/sym-cfg_scan_fp_begin cfg_scan_fp_begin "$arcsyms" # The two compiled translation units, and only those two -- see the header block. members=$(grep -ao 'libconfuse_la-[a-z0-9_]*\.o' "$lib" 2>/dev/null | sort -u) hasline libconfuse/member-confuse libconfuse_la-confuse.o "$members" hasline libconfuse/member-lexer libconfuse_la-lexer.o "$members" check_eq libconfuse/member-count 2 "$(printf '%s\n' "$members" | grep -c .)" # --- the library RUNNING, via the cross-linked probe ------------------------- probe=${TMPDIR:-/tmp}/bst-libconfuse-probe.$$ if cp "$BST_DATA/libconfuse-probe" "$probe" 2>/dev/null && chmod +x "$probe" 2>/dev/null; then out=$("$probe" 2>&1) # context creation, the option table, and cfg_getopt has libconfuse/run-init "CFU-init OK" "$out" has libconfuse/run-init-name "CFU-init-name OK" "$out" has libconfuse/run-init-numopts "CFU-init-numopts OK" "$out" # the compiled-in defaults, before any file is read has libconfuse/run-def-str "CFU-def-str OK" "$out" has libconfuse/run-def-int "CFU-def-int OK" "$out" has libconfuse/run-def-float "CFU-def-float OK" "$out" has libconfuse/run-def-bool "CFU-def-bool OK" "$out" has libconfuse/run-def-list-size "CFU-def-list-size OK" "$out" has libconfuse/run-def-list-0 "CFU-def-list-0 OK" "$out" has libconfuse/run-def-list-1 "CFU-def-list-1 OK" "$out" has libconfuse/run-def-nodefault "CFU-def-nodefault OK" "$out" has libconfuse/run-def-cb-int "CFU-def-cb-int OK" "$out" # option lookup, and the diagnostic an unknown name produces has libconfuse/run-getopt-known "CFU-getopt-known OK" "$out" has libconfuse/run-getopt-name "CFU-getopt-name OK" "$out" has libconfuse/run-getopt-type "CFU-getopt-type OK" "$out" has libconfuse/run-getopt-unknown "CFU-getopt-unknown OK" "$out" has libconfuse/run-getopt-unknown-diag "CFU-getopt-unknown-diag OK" "$out" # cfg_parse_buf over a glibc fmemopen() memory stream has libconfuse/run-buf-rc "CFU-buf-rc OK" "$out" has libconfuse/run-buf-quiet "CFU-buf-quiet OK" "$out" has libconfuse/run-buf-str "CFU-buf-str OK" "$out" has libconfuse/run-buf-int "CFU-buf-int OK" "$out" has libconfuse/run-buf-float "CFU-buf-float OK" "$out" has libconfuse/run-buf-bool "CFU-buf-bool OK" "$out" has libconfuse/run-buf-strlist-size "CFU-buf-strlist-size OK" "$out" has libconfuse/run-buf-strlist-0 "CFU-buf-strlist-0 OK" "$out" has libconfuse/run-buf-strlist-2 "CFU-buf-strlist-2 OK" "$out" has libconfuse/run-buf-intlist "CFU-buf-intlist OK" "$out" has libconfuse/run-buf-floatlist "CFU-buf-floatlist OK" "$out" has libconfuse/run-buf-boollist "CFU-buf-boollist OK" "$out" has libconfuse/run-buf-empty "CFU-buf-empty OK" "$out" has libconfuse/run-buf-empty-default "CFU-buf-empty-default OK" "$out" has libconfuse/run-buf-comments-only "CFU-buf-comments-only OK" "$out" # strtol base-0 integers and strtod reals, both directions has libconfuse/run-num-hex "CFU-num-hex OK" "$out" has libconfuse/run-num-octal "CFU-num-octal OK" "$out" has libconfuse/run-num-negative "CFU-num-negative OK" "$out" has libconfuse/run-num-longmax "CFU-num-longmax OK" "$out" has libconfuse/run-num-long-bits "CFU-num-long-bits OK" "$out" has libconfuse/run-num-overflow "CFU-num-overflow OK" "$out" has libconfuse/run-num-bad-int "CFU-num-bad-int OK" "$out" has libconfuse/run-num-real-exp "CFU-num-real-exp OK" "$out" has libconfuse/run-num-real-big "CFU-num-real-big OK" "$out" has libconfuse/run-num-real-from-int "CFU-num-real-from-int OK" "$out" has libconfuse/run-num-bad-float "CFU-num-bad-float OK" "$out" # cfg_parse_boolean and the boolean option type has libconfuse/run-bool-true "CFU-bool-true OK" "$out" has libconfuse/run-bool-yes "CFU-bool-yes OK" "$out" has libconfuse/run-bool-on "CFU-bool-on OK" "$out" has libconfuse/run-bool-false "CFU-bool-false OK" "$out" has libconfuse/run-bool-no "CFU-bool-no OK" "$out" has libconfuse/run-bool-off "CFU-bool-off OK" "$out" has libconfuse/run-bool-nocase "CFU-bool-nocase OK" "$out" has libconfuse/run-bool-garbage "CFU-bool-garbage OK" "$out" has libconfuse/run-bool-parsed-off "CFU-bool-parsed-off OK" "$out" has libconfuse/run-bool-parsed-bad "CFU-bool-parsed-bad OK" "$out" # the flex scanner: every escape form, comment form and quoting rule has libconfuse/run-lex-dq-escapes "CFU-lex-dq-escapes OK" "$out" has libconfuse/run-lex-octal "CFU-lex-octal OK" "$out" has libconfuse/run-lex-hex "CFU-lex-hex OK" "$out" has libconfuse/run-lex-ctrl "CFU-lex-ctrl OK" "$out" has libconfuse/run-lex-octal-overflow "CFU-lex-octal-overflow OK" "$out" has libconfuse/run-lex-bad-escape "CFU-lex-bad-escape OK" "$out" has libconfuse/run-lex-dq-continuation "CFU-lex-dq-continuation OK" "$out" has libconfuse/run-lex-dq-embedded-nl "CFU-lex-dq-embedded-nl OK" "$out" has libconfuse/run-lex-sq-literal "CFU-lex-sq-literal OK" "$out" has libconfuse/run-lex-sq-quote "CFU-lex-sq-quote OK" "$out" has libconfuse/run-lex-sq-backslash "CFU-lex-sq-backslash OK" "$out" has libconfuse/run-lex-sq-unterminated "CFU-lex-sq-unterminated OK" "$out" has libconfuse/run-lex-unquoted "CFU-lex-unquoted OK" "$out" has libconfuse/run-lex-empty-string "CFU-lex-empty-string OK" "$out" has libconfuse/run-lex-comments "CFU-lex-comments OK" "$out" has libconfuse/run-lex-hash-run "CFU-lex-hash-run OK" "$out" has libconfuse/run-lex-long-token "CFU-lex-long-token OK" "$out" # ${VAR} and ${VAR:-default} expansion through getenv has libconfuse/run-env-unquoted "CFU-env-unquoted OK" "$out" has libconfuse/run-env-in-quotes "CFU-env-in-quotes OK" "$out" has libconfuse/run-env-unset-empty "CFU-env-unset-empty OK" "$out" has libconfuse/run-env-default "CFU-env-default OK" "$out" has libconfuse/run-env-default-unused "CFU-env-default-unused OK" "$out" # cfg_tilde_expand, i.e. getpwnam/getpwuid and NSS has libconfuse/run-tilde-user "CFU-tilde-user OK" "$out" has libconfuse/run-tilde-user-bare "CFU-tilde-user-bare OK" "$out" has libconfuse/run-tilde-unknown-user "CFU-tilde-unknown-user OK" "$out" has libconfuse/run-tilde-absolute "CFU-tilde-absolute OK" "$out" has libconfuse/run-tilde-relative "CFU-tilde-relative OK" "$out" has libconfuse/run-tilde-self "CFU-tilde-self OK" "$out" # list values, the += file syntax, and the varargs setters has libconfuse/run-list-append-syntax "CFU-list-append-syntax OK" "$out" has libconfuse/run-list-append-last "CFU-list-append-last OK" "$out" has libconfuse/run-list-setlist-rc "CFU-list-setlist-rc OK" "$out" has libconfuse/run-list-setlist-size "CFU-list-setlist-size OK" "$out" has libconfuse/run-list-setlist-0 "CFU-list-setlist-0 OK" "$out" has libconfuse/run-list-setlist-1 "CFU-list-setlist-1 OK" "$out" has libconfuse/run-list-addlist "CFU-list-addlist OK" "$out" has libconfuse/run-list-addlist-last "CFU-list-addlist-last OK" "$out" has libconfuse/run-list-setlist-int "CFU-list-setlist-int OK" "$out" has libconfuse/run-list-setlist-int-last "CFU-list-setlist-int-last OK" "$out" has libconfuse/run-list-setlist-float "CFU-list-setlist-float OK" "$out" has libconfuse/run-list-setlist-bool "CFU-list-setlist-bool OK" "$out" has libconfuse/run-list-setlist-nonlist "CFU-list-setlist-nonlist OK" "$out" has libconfuse/run-list-setlist-nonlist-intact "CFU-list-setlist-nonlist-intact OK" "$out" has libconfuse/run-list-setmulti "CFU-list-setmulti OK" "$out" has libconfuse/run-list-setmulti-1 "CFU-list-setmulti-1 OK" "$out" # the scalar setters, and the two surprising index semantics has libconfuse/run-set-str "CFU-set-str OK" "$out" has libconfuse/run-set-str-value "CFU-set-str-value OK" "$out" has libconfuse/run-set-int "CFU-set-int OK" "$out" has libconfuse/run-set-float "CFU-set-float OK" "$out" has libconfuse/run-set-bool "CFU-set-bool OK" "$out" has libconfuse/run-set-nstr-defaults-present "CFU-set-nstr-defaults-present OK" "$out" has libconfuse/run-set-nstr-rc "CFU-set-nstr-rc OK" "$out" has libconfuse/run-set-nstr-reset-drops-defaults "CFU-set-nstr-reset-drops-defaults OK" "$out" has libconfuse/run-set-nstr-value "CFU-set-nstr-value OK" "$out" has libconfuse/run-set-nstr-past-end-appends "CFU-set-nstr-past-end-appends OK" "$out" has libconfuse/run-set-nstr-past-end-value "CFU-set-nstr-past-end-value OK" "$out" # sections: nesting, titles, CFGF_MULTI, add and remove has libconfuse/run-sec-rc "CFU-sec-rc OK" "$out" has libconfuse/run-sec-getsec "CFU-sec-getsec OK" "$out" has libconfuse/run-sec-nested-str "CFU-sec-nested-str OK" "$out" has libconfuse/run-sec-nested-int "CFU-sec-nested-int OK" "$out" has libconfuse/run-sec-name "CFU-sec-name OK" "$out" has libconfuse/run-sec-two-deep "CFU-sec-two-deep OK" "$out" has libconfuse/run-sec-two-deep-tag "CFU-sec-two-deep-tag OK" "$out" has libconfuse/run-sec-multi-size "CFU-sec-multi-size OK" "$out" has libconfuse/run-sec-title-0 "CFU-sec-title-0 OK" "$out" has libconfuse/run-sec-title-1 "CFU-sec-title-1 OK" "$out" has libconfuse/run-sec-nsec-addr "CFU-sec-nsec-addr OK" "$out" has libconfuse/run-sec-nsec-default "CFU-sec-nsec-default OK" "$out" has libconfuse/run-sec-gettsec "CFU-sec-gettsec OK" "$out" has libconfuse/run-sec-gettsec-missing "CFU-sec-gettsec-missing OK" "$out" has libconfuse/run-sec-addtsec "CFU-sec-addtsec OK" "$out" has libconfuse/run-sec-addtsec-dup "CFU-sec-addtsec-dup OK" "$out" has libconfuse/run-sec-rmtsec "CFU-sec-rmtsec OK" "$out" has libconfuse/run-sec-rmnsec "CFU-sec-rmnsec OK" "$out" has libconfuse/run-sec-rmnsec-survivor "CFU-sec-rmnsec-survivor OK" "$out" # CFGF_ flags that change how a file is accepted has libconfuse/run-flag-no-title-dupes "CFU-flag-no-title-dupes OK" "$out" has libconfuse/run-flag-ignore-unknown "CFU-flag-ignore-unknown OK" "$out" has libconfuse/run-flag-ignore-unknown-known "CFU-flag-ignore-unknown-known OK" "$out" has libconfuse/run-flag-unknown-rejected "CFU-flag-unknown-rejected OK" "$out" has libconfuse/run-flag-deprecated "CFU-flag-deprecated OK" "$out" has libconfuse/run-flag-deprecated-new "CFU-flag-deprecated-new OK" "$out" has libconfuse/run-flag-nocase "CFU-flag-nocase OK" "$out" has libconfuse/run-flag-nocase-value "CFU-flag-nocase-value OK" "$out" # every indirect call: func, value-parse, validate, error, print has libconfuse/run-cb-int-value "CFU-cb-int-value OK" "$out" has libconfuse/run-cb-str-value "CFU-cb-str-value OK" "$out" has libconfuse/run-cb-ptr-value "CFU-cb-ptr-value OK" "$out" has libconfuse/run-cb-ptr-free "CFU-cb-ptr-free OK" "$out" has libconfuse/run-cb-func-rc "CFU-cb-func-rc OK" "$out" has libconfuse/run-cb-func-calls "CFU-cb-func-calls OK" "$out" has libconfuse/run-cb-func-argv "CFU-cb-func-argv OK" "$out" has libconfuse/run-cb-int-reject "CFU-cb-int-reject OK" "$out" has libconfuse/run-cb-validate-accept "CFU-cb-validate-accept OK" "$out" has libconfuse/run-cb-validate-reject "CFU-cb-validate-reject OK" "$out" has libconfuse/run-cb-validate-msg "CFU-cb-validate-msg OK" "$out" has libconfuse/run-cb-errfunc-varargs "CFU-cb-errfunc-varargs OK" "$out" has libconfuse/run-cb-errfunc-count "CFU-cb-errfunc-count OK" "$out" has libconfuse/run-cb-errfunc-returns-old "CFU-cb-errfunc-returns-old OK" "$out" has libconfuse/run-cb-print-func "CFU-cb-print-func OK" "$out" has libconfuse/run-cb-print-filter "CFU-cb-print-filter OK" "$out" # cfg_print's exact output shape and the round trip back in has libconfuse/run-print-parse-rc "CFU-print-parse-rc OK" "$out" has libconfuse/run-print-rc "CFU-print-rc OK" "$out" has libconfuse/run-print-has-str "CFU-print-has-str OK" "$out" has libconfuse/run-print-has-int "CFU-print-has-int OK" "$out" has libconfuse/run-print-has-bool "CFU-print-has-bool OK" "$out" has libconfuse/run-print-has-list "CFU-print-has-list OK" "$out" has libconfuse/run-print-has-sec "CFU-print-has-sec OK" "$out" has libconfuse/run-print-has-title "CFU-print-has-title OK" "$out" has libconfuse/run-print-unset-commented "CFU-print-unset-commented OK" "$out" has libconfuse/run-print-ptr-commented "CFU-print-ptr-commented OK" "$out" has libconfuse/run-print-real "CFU-print-real OK" "$out" has libconfuse/run-print-real-list "CFU-print-real-list OK" "$out" has libconfuse/run-print-roundtrip-rc "CFU-print-roundtrip-rc OK" "$out" has libconfuse/run-print-roundtrip-str "CFU-print-roundtrip-str OK" "$out" has libconfuse/run-print-roundtrip-int "CFU-print-roundtrip-int OK" "$out" has libconfuse/run-print-roundtrip-real "CFU-print-roundtrip-real OK" "$out" has libconfuse/run-print-roundtrip-list "CFU-print-roundtrip-list OK" "$out" has libconfuse/run-print-roundtrip-sec "CFU-print-roundtrip-sec OK" "$out" has libconfuse/run-print-roundtrip-title "CFU-print-roundtrip-title OK" "$out" has libconfuse/run-print-indent "CFU-print-indent OK" "$out" has libconfuse/run-print-opt "CFU-print-opt OK" "$out" # the CFGF_COMMENTS annotation layer has libconfuse/run-comment-parse-rc "CFU-comment-parse-rc OK" "$out" has libconfuse/run-comment-read "CFU-comment-read OK" "$out" has libconfuse/run-comment-set "CFU-comment-set OK" "$out" has libconfuse/run-comment-set-value "CFU-comment-set-value OK" "$out" has libconfuse/run-comment-printed "CFU-comment-printed OK" "$out" # cfg_parse and cfg_parse_fp against real files has libconfuse/run-file-write "CFU-file-write OK" "$out" has libconfuse/run-file-missing "CFU-file-missing OK" "$out" has libconfuse/run-file-parse-fp "CFU-file-parse-fp OK" "$out" # the include builtin: nesting, searchpath, and the depth guard has libconfuse/run-incl-rc "CFU-incl-rc OK" "$out" has libconfuse/run-incl-outer-value "CFU-incl-outer-value OK" "$out" has libconfuse/run-incl-inner-value "CFU-incl-inner-value OK" "$out" has libconfuse/run-incl-deep-rc "CFU-incl-deep-rc OK" "$out" has libconfuse/run-incl-deep-value "CFU-incl-deep-value OK" "$out" has libconfuse/run-incl-searchpath-add "CFU-incl-searchpath-add OK" "$out" has libconfuse/run-incl-searchpath-rc "CFU-incl-searchpath-rc OK" "$out" has libconfuse/run-incl-searchpath-value "CFU-incl-searchpath-value OK" "$out" has libconfuse/run-incl-searchpath-miss "CFU-incl-searchpath-miss OK" "$out" has libconfuse/run-incl-too-deep "CFU-incl-too-deep OK" "$out" has libconfuse/run-incl-too-deep-msg "CFU-incl-too-deep-msg OK" "$out" has libconfuse/run-incl-depth-sticky "CFU-incl-depth-sticky OK" "$out" has libconfuse/run-incl-depth-sticky-msg "CFU-incl-depth-sticky-msg OK" "$out" # structural errors that must be diagnosed, not crash has libconfuse/run-err-missing-equals "CFU-err-missing-equals OK" "$out" has libconfuse/run-err-title-required "CFU-err-title-required OK" "$out" has libconfuse/run-err-bad-in-section "CFU-err-bad-in-section OK" "$out" has libconfuse/run-err-unclosed-list "CFU-err-unclosed-list OK" "$out" # two shapes libconfuse deliberately accepts has libconfuse/run-lenient-eof-in-section "CFU-lenient-eof-in-section OK" "$out" has libconfuse/run-lenient-trailing-comma "CFU-lenient-trailing-comma OK" "$out" # a 1000-element list, every element read back has libconfuse/run-bulk-size "CFU-bulk-size OK" "$out" has libconfuse/run-bulk-readback "CFU-bulk-readback OK" "$out" # 200 parse/free cycles on one option table has libconfuse/run-cycle-stable "CFU-cycle-stable OK" "$out" has libconfuse/run-cycle-ptr-frees "CFU-cycle-ptr-frees OK" "$out" # cfg_free_value and a NULL context has libconfuse/run-free-value "CFU-free-value OK" "$out" has libconfuse/run-free-null "CFU-free-null OK" "$out" has libconfuse/run-free-null-errno "CFU-free-null-errno OK" "$out" # The probe's own tally, as a whole-run gate over the individual cases above. has libconfuse/run-summary "CFU-SUMMARY 206/206" "$out" rm -f "$probe" else bst_notok libconfuse/probe-stage "could not stage $BST_DATA/libconfuse-probe" fi