static void prt_nested(FILE * fp, tOptDesc * p) { int opt_ct; tArgList * al = p->optCookie; void ** opt_list; if (al == NULL) return; opt_ct = al->useCt; opt_list = (void **)al->apzArgs; if (opt_ct <= 0) return; do { tOptionValue const * base = *(opt_list++); tOptionValue const * ovp = optionGetValue(base, NULL); if (ovp == NULL) continue; fprintf(fp, NESTED_OPT_FMT, p->pz_Name); do { prt_value(fp, 1, p, ovp); } while (ovp = optionNextValue(base, ovp), ovp != NULL); fprintf(fp, "</%s>\n", p->pz_Name); } while (--opt_ct > 0); }
/*=export_func optionFindValue * * what: find a hierarcicaly valued option instance * arg: + const tOptDesc* + pOptDesc + an option with a nested arg type + * arg: + char const* + name + name of value to find + * arg: + char const* + value + the matching value + * * ret_type: const tOptionValue* * ret_desc: a compound value structure * * doc: * This routine will find an entry in a nested value option or configurable. * It will search through the list and return a matching entry. * * err: * The returned result is NULL and errno is set: * @itemize @bullet * @item * @code{EINVAL} - the @code{pOptValue} does not point to a valid * hierarchical option value. * @item * @code{ENOENT} - no entry matched the given name. * @end itemize =*/ const tOptionValue* optionFindValue( const tOptDesc* pOptDesc, char const* pzName, char const* pzVal ) { const tOptionValue* pRes = NULL; if ( (pOptDesc == NULL) || (OPTST_GET_ARGTYPE(pOptDesc->fOptState) != OPARG_TYPE_HIERARCHY)) { errno = EINVAL; } else if (pOptDesc->optCookie == NULL) { errno = ENOENT; } else do { tArgList* pAL = pOptDesc->optCookie; int ct = pAL->useCt; void** ppOV = (void**)(pAL->apzArgs); if (ct == 0) { errno = ENOENT; break; } if (pzName == NULL) { pRes = (tOptionValue*)*ppOV; break; } while (--ct >= 0) { const tOptionValue* pOV = *(ppOV++); const tOptionValue* pRV = optionGetValue( pOV, pzName ); if (pRV == NULL) continue; if (pzVal == NULL) { pRes = pOV; break; } } if (pRes == NULL) errno = ENOENT; } while (0); return pRes; }
/*=export_func optionFindValue * * what: find a hierarcicaly valued option instance * arg: + const tOptDesc* + odesc + an option with a nested arg type + * arg: + char const* + name + name of value to find + * arg: + char const* + val + the matching value + * * ret_type: const tOptionValue* * ret_desc: a compound value structure * * doc: * This routine will find an entry in a nested value option or configurable. * It will search through the list and return a matching entry. * * err: * The returned result is NULL and errno is set: * @itemize @bullet * @item * @code{EINVAL} - the @code{pOptValue} does not point to a valid * hierarchical option value. * @item * @code{ENOENT} - no entry matched the given name. * @end itemize =*/ const tOptionValue * optionFindValue(const tOptDesc * odesc, char const * name, char const * val) { const tOptionValue * res = NULL; if ( (odesc == NULL) || (OPTST_GET_ARGTYPE(odesc->fOptState) != OPARG_TYPE_HIERARCHY)) { errno = EINVAL; } else if (odesc->optCookie == NULL) { errno = ENOENT; } else do { tArgList* argl = odesc->optCookie; int argct = argl->useCt; void ** poptv = (void**)(argl->apzArgs); if (argct == 0) { errno = ENOENT; break; } if (name == NULL) { res = (tOptionValue*)*poptv; break; } while (--argct >= 0) { const tOptionValue * ov = *(poptv++); const tOptionValue * rv = optionGetValue(ov, name); if (rv == NULL) continue; if (val == NULL) { res = ov; break; } } if (res == NULL) errno = ENOENT; } while (false); return res; }