#! /bin/sh # -*- Mode: Shell-script -*- # ---------------------------------------------------------------------- # nested.test --- test nested option values # # Author: Bruce Korb ## ## This file is part of AutoOpts, a companion to AutoGen. ## AutoOpts is free software. ## AutoOpts is Copyright (C) 1992-2015 by Bruce Korb - all rights reserved ## ## AutoOpts is available under any one of two licenses. The license ## in use must be one of these two and the choice is under the control ## of the user of the license. ## ## The GNU Lesser General Public License, version 3 or later ## See the files "COPYING.lgplv3" and "COPYING.gplv3" ## ## The Modified Berkeley Software Distribution License ## See the file "COPYING.mbsd" ## ## These files have the following sha256 sums: ## ## 8584710e9b04216a394078dc156b781d0b47e1729104d666658aecef8ee32e95 COPYING.gplv3 ## 4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b COPYING.lgplv3 ## 13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239 COPYING.mbsd # # ---------------------------------------------------------------------- . ./defs # # # # # # # # # # DEFINITIONS FILE # # # # # # # # # exec 5> ${testname}.def cat >&5 <<- _EOF_ AutoGen definitions options; config-header = 'config.h'; prog-name = "test_${testname}"; prog-title = "Test AutoOpts for ${testname}"; homerc = ${testname}.d/${testname}.cfg; flag = { name = struct; value = s; max = NOLIMIT; descrip = 'structured argument val'; arg-type = nested; }; main = { main-type = main; _EOF_ test -d ${testname}.d || mkdir -p ${testname}.d echo ' main-text = <''<- _EOCode_' >&5 cat >&5 <<- _EOF_ { int ix = 0; const tOptionValue* pOV = optionFindValue(&DESC(STRUCT), NULL, NULL); do { printf("\nstruct opt #%d:\n", ++ix); res |= print_entry( pOV ); pOV = optionFindNextValue(&DESC(STRUCT), pOV, NULL, NULL); } while (pOV != NULL); } _EOF_ echo "_EOCode_; };" >&5 echo 'include = <''<- _EOSubr_' >&5 cat >&5 <<- _EOF_ #include int print_nested( const tOptionValue* pGV ); int print_entry( const tOptionValue* pGV ); int print_entry( const tOptionValue* pGV ) { if (pGV == NULL) { fprintf( stderr, "ENTRY NOT FOUND\n" ); return 1; } printf( "%-8s -- ", pGV->pzName ); switch (pGV->valType) { case OPARG_TYPE_NONE: fputs( "no value\n", stdout ); break; case OPARG_TYPE_STRING: printf( "string: %s\n", pGV->v.strVal ); break; case OPARG_TYPE_ENUMERATION: printf( "enum: %d\n", pGV->v.enumVal ); break; case OPARG_TYPE_BOOLEAN: printf( "bool: %s\n", pGV->v.boolVal ? "TRUE" : "false" ); break; case OPARG_TYPE_MEMBERSHIP: printf("members: 0x%08lX\n", (unsigned long)pGV->v.setVal); break; case OPARG_TYPE_NUMERIC: printf( "integer: %ld\n", pGV->v.longVal ); break; case OPARG_TYPE_HIERARCHY: printf( "nested: 0x%08lX\n", (unsigned long)pGV->v.nestVal ); return print_nested( pGV ); break; default: printf( "bad type: %d\n", pGV->valType ); return 1; } return 0; } int print_nested( const tOptionValue* pGV ) { int res = 0; const tOptionValue* pOV = optionGetValue( pGV, NULL ); while (pOV != NULL) { res |= print_entry( pOV ); pOV = optionNextValue( pGV, pOV ); } return res; } _EOF_ echo "_EOSubr_;" >&5 exec 5>&- # # # # # # # # # # CREATE PROGRAM # # # # # # # # # echo ${AG_L} ${testname}.def ${AG_L} ${testname}.def || \ failure AutoGen could not process compile "-?" # # # # # # # # # # HELP OUTPUT FILE # # # # # # # # # basehelp=${testname}-base.help echo creating ${basehelp} clean_help > ${basehelp} <<_EOF_ test_${testname} - Test AutoOpts for ${testname} Usage: ${testname} [ - [] ]... Flg Arg Option-Name Description -s Cpx struct structured argument val - may appear multiple times -? no help display extended usage information and exit -! no more-help extended usage information passed thru pager -> opt save-opts save the option state to a config file -< Str load-opts load options from a config file - disabled as '--no-load-opts' - may appear multiple times The following option preset mechanisms are supported: - reading file ${testname}.cfg _EOF_ ${SED} "/ - reading file/s/ file .*/ file ${testname}.cfg/" \ ${testname}.help > X$$ mv -f X$$ ${testname}.help cmp -s ${basehelp} ${testname}.help || \ failure "`diff ${basehelp} ${testname}.help`" # # # # # # # # # # SINGLE ARG TEST # # # # # # # # # cat > ${testname}-res1.base <<- _EOF_ struct opt #1: struct -- nested: 0xXXXXXXXX able -- no value bar -- integer: 1234 foo -- no value stumble -- no value _EOF_ ./${testname} -s 'stumble, foo, 1234 able' | \ ${SED} '/ nested:/s/ 0x.*/ 0xXXXXXXXX/' > ${testname}-res1.out || \ failure "FAILED: \ ./${testname} -s 'stumble, foo, 1234 baz'" cmp -s ${testname}-res1.* || \ failure "`diff ${testname}-res1.*`" # # # # # # # # # # DOUBLE ARG TEST # # # # # # # # # arg1="stumble, foo${ht}lish, 1234, able" arg2='foo, 4321 one, two=2, three' (./${testname} -s "${arg1}" -s "${arg2}" \ | ${SED} '/ nested:/s/ 0x.*/ 0xXXXXXXXX/' ) > ${testname}-res2.out || \ failure "FAILED: ./${testname} ${arg1} ${arg2}" cat > ${testname}-res2.base <<- _EOF_ struct opt #1: struct -- nested: 0xXXXXXXXX able -- no value bar -- integer: 1234 foo -- string: foo lish stumble -- no value struct opt #2: struct -- nested: 0xXXXXXXXX bar -- integer: 4321 foo -- no value gr -- nested: 0xXXXXXXXX one -- no value three -- no value two -- string: 2 _EOF_ cmp -s ${testname}-res2.* || \ failure "`diff ${testname}-res2.*`" ./${testname} -s "${arg1}" -s "${arg2}" '->' ${SED} -e '3s/.*/# ***DATE***/' ${testname}.d/${testname}.cfg > ${testname}.XX mv -f ${testname}.XX ${testname}.d/${testname}.cfg cat > ${testname}-res3.base <<- _EOF_ # test_nested - Test AutoOpts for nested # preset/initialization file # ***DATE*** # 0x4D2 foo lish 0x10E1 2 _EOF_ files=${testname}-res3.base\ ${testname}.d/${testname}.cfg cmp -s ${files} || \ failure "saved config${nl}`diff ${files}`" # Copy the config file and verify that the contents are the same. # ./${testname} "->${testname}.d/${testname}.cfg2" ${SED} -e '3s/.*/# ***DATE***/' ${testname}.d/${testname}.cfg2 > ${testname}.XX mv -f ${testname}.XX ${testname}.d/${testname}.cfg2 files=${testname}.d/${testname}.cfg\ ${testname}.d/${testname}.cfg2 cmp -s ${files} || \ failure "re-saved config${nl}`diff ${files}`" # # # # # # # # # # TEST OPERATION # # # # # # # # # # cleanup ## Local Variables: ## mode: shell-script ## indent-tabs-mode: nil ## sh-indentation: 2 ## End: # end of nested.test