diff options
Diffstat (limited to 'contrib/ntp/sntp/libopts/stack.c')
-rw-r--r-- | contrib/ntp/sntp/libopts/stack.c | 168 |
1 files changed, 83 insertions, 85 deletions
diff --git a/contrib/ntp/sntp/libopts/stack.c b/contrib/ntp/sntp/libopts/stack.c index 6d77f72..d2ce165 100644 --- a/contrib/ntp/sntp/libopts/stack.c +++ b/contrib/ntp/sntp/libopts/stack.c @@ -1,54 +1,33 @@ -/* - * stack.c - * $Id: stack.c,v 4.13 2007/02/04 17:44:12 bkorb Exp $ - * Time-stamp: "2007-01-13 10:43:21 bkorb" +/** + * \file stack.c * * This is a special option processing routine that will save the * argument to an option in a FIFO queue. + * + * @addtogroup autoopts + * @{ */ - /* - * Automated Options copyright 1992-2007 Bruce Korb - * - * Automated Options is free software. - * You may redistribute it and/or modify it under the terms of the - * GNU General Public License, as published by the Free Software - * Foundation; either version 2, or (at your option) any later version. - * - * Automated Options is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This file is part of AutoOpts, a companion to AutoGen. + * AutoOpts is free software. + * AutoOpts is Copyright (C) 1992-2014 by Bruce Korb - all rights reserved * - * You should have received a copy of the GNU General Public License - * along with Automated Options. See the file "COPYING". If not, - * write to: The Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. + * 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. * - * As a special exception, Bruce Korb gives permission for additional - * uses of the text contained in his release of AutoOpts. + * The GNU Lesser General Public License, version 3 or later + * See the files "COPYING.lgplv3" and "COPYING.gplv3" * - * The exception is that, if you link the AutoOpts library with other - * files to produce an executable, this does not by itself cause the - * resulting executable to be covered by the GNU General Public License. - * Your use of that executable is in no way restricted on account of - * linking the AutoOpts library code into it. + * The Modified Berkeley Software Distribution License + * See the file "COPYING.mbsd" * - * This exception does not however invalidate any other reasons why - * the executable file might be covered by the GNU General Public License. + * These files have the following sha256 sums: * - * This exception applies only to the code released by Bruce Korb under - * the name AutoOpts. If you copy code from other sources under the - * General Public License into a copy of AutoOpts, as the General Public - * License permits, the exception does not apply to the code that you add - * in this way. To avoid misleading anyone as to the status of such - * modified files, you must delete this exception notice from them. - * - * If you write modifications of your own for AutoOpts, it is your choice - * whether to permit this exception to apply to your modifications. - * If you do not wish that, delete this exception notice. + * 8584710e9b04216a394078dc156b781d0b47e1729104d666658aecef8ee32e95 COPYING.gplv3 + * 4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b COPYING.lgplv3 + * 13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239 COPYING.mbsd */ #ifdef WITH_LIBREGEX @@ -59,28 +38,30 @@ * private: * * what: Remove option args from a stack - * arg: + tOptions* + pOpts + program options descriptor + - * arg: + tOptDesc* + pOptDesc + the descriptor for this arg + + * arg: + tOptions* + opts + program options descriptor + + * arg: + tOptDesc* + od + the descriptor for this arg + * * doc: * Invoked for options that are equivalenced to stacked options. =*/ void -optionUnstackArg( - tOptions* pOpts, - tOptDesc* pOptDesc ) +optionUnstackArg(tOptions * opts, tOptDesc * od) { - int res; + tArgList * arg_list; + + if (INQUERY_CALL(opts, od)) + return; + + arg_list = (tArgList*)od->optCookie; - tArgList* pAL = (tArgList*)pOptDesc->optCookie; /* * IF we don't have any stacked options, * THEN indicate that we don't have any of these options */ - if (pAL == NULL) { - pOptDesc->fOptState &= OPTST_PERSISTENT_MASK; - if ( (pOptDesc->fOptState & OPTST_INITENABLED) == 0) - pOptDesc->fOptState |= OPTST_DISABLED; + if (arg_list == NULL) { + od->fOptState &= OPTST_PERSISTENT_MASK; + if ((od->fOptState & OPTST_INITENABLED) == 0) + od->fOptState |= OPTST_DISABLED; return; } @@ -89,7 +70,7 @@ optionUnstackArg( regex_t re; int i, ct, dIdx; - if (regcomp( &re, pOptDesc->optArg.argString, REG_NOSUB ) != 0) + if (regcomp(&re, od->optArg.argString, REG_NOSUB) != 0) return; /* @@ -98,14 +79,16 @@ optionUnstackArg( * index is incremented every time. The destination only when * we are keeping a define. */ - for (i = 0, dIdx = 0, ct = pAL->useCt; --ct >= 0; i++) { - tCC* pzSrc = pAL->apzArgs[ i ]; - char* pzEq = strchr( pzSrc, '=' ); + for (i = 0, dIdx = 0, ct = arg_list->useCt; --ct >= 0; i++) { + char const * pzSrc = arg_list->apzArgs[ i ]; + char * pzEq = strchr(pzSrc, '='); + int res; + if (pzEq != NULL) *pzEq = NUL; - res = regexec( &re, pzSrc, (size_t)0, NULL, 0 ); + res = regexec(&re, pzSrc, (size_t)0, NULL, 0); switch (res) { case 0: /* @@ -114,7 +97,7 @@ optionUnstackArg( * the list. */ AGFREE(pzSrc); - pAL->useCt--; + arg_list->useCt--; break; default: @@ -127,12 +110,12 @@ optionUnstackArg( * THEN we have to move the current one. */ if (dIdx != i) - pAL->apzArgs[ dIdx ] = pzSrc; + arg_list->apzArgs[ dIdx ] = pzSrc; dIdx++; } } - regfree( &re ); + regfree(&re); } #else /* not WITH_LIBREGEX */ { @@ -144,21 +127,21 @@ optionUnstackArg( * index is incremented every time. The destination only when * we are keeping a define. */ - for (i = 0, dIdx = 0, ct = pAL->useCt; --ct >= 0; i++) { - tCC* pzSrc = pAL->apzArgs[ i ]; - char* pzEq = strchr( pzSrc, '=' ); + for (i = 0, dIdx = 0, ct = arg_list->useCt; --ct >= 0; i++) { + const char * pzSrc = arg_list->apzArgs[ i ]; + char * pzEq = strchr(pzSrc, '='); if (pzEq != NULL) *pzEq = NUL; - if (strcmp( pzSrc, pOptDesc->optArg.argString ) == 0) { + if (strcmp(pzSrc, od->optArg.argString) == 0) { /* * Remove this entry by reducing the in-use count * and *not* putting the string pointer back into * the list. */ AGFREE(pzSrc); - pAL->useCt--; + arg_list->useCt--; } else { if (pzEq != NULL) *pzEq = '='; @@ -168,7 +151,7 @@ optionUnstackArg( * THEN we have to move the current one. */ if (dIdx != i) - pAL->apzArgs[ dIdx ] = pzSrc; + arg_list->apzArgs[ dIdx ] = pzSrc; dIdx++; } } @@ -178,12 +161,12 @@ optionUnstackArg( * IF we have unstacked everything, * THEN indicate that we don't have any of these options */ - if (pAL->useCt == 0) { - pOptDesc->fOptState &= OPTST_PERSISTENT_MASK; - if ( (pOptDesc->fOptState & OPTST_INITENABLED) == 0) - pOptDesc->fOptState |= OPTST_DISABLED; - AGFREE( (void*)pAL ); - pOptDesc->optCookie = NULL; + if (arg_list->useCt == 0) { + od->fOptState &= OPTST_PERSISTENT_MASK; + if ((od->fOptState & OPTST_INITENABLED) == 0) + od->fOptState |= OPTST_DISABLED; + AGFREE((void *)arg_list); + od->optCookie = NULL; } } @@ -194,7 +177,7 @@ optionUnstackArg( * as an opaque address. */ LOCAL void -addArgListEntry( void** ppAL, void* entry ) +addArgListEntry(void ** ppAL, void * entry) { tArgList* pAL = *(void**)ppAL; @@ -203,7 +186,7 @@ addArgListEntry( void** ppAL, void* entry ) * THEN allocate one now */ if (pAL == NULL) { - pAL = (tArgList*)AGALOC( sizeof( *pAL ), "new option arg stack" ); + pAL = (tArgList*)AGALOC(sizeof(*pAL), "new option arg stack"); if (pAL == NULL) return; pAL->useCt = 0; @@ -216,15 +199,15 @@ addArgListEntry( void** ppAL, void* entry ) * THEN make it bigger */ else if (pAL->useCt >= pAL->allocCt) { - size_t sz = sizeof( *pAL ); + size_t sz = sizeof(*pAL); pAL->allocCt += INCR_ARG_ALLOC_CT; /* * The base structure contains space for MIN_ARG_ALLOC_CT * pointers. We subtract it off to find our augment size. */ - sz += sizeof(char*) * (pAL->allocCt - MIN_ARG_ALLOC_CT); - pAL = (tArgList*)AGREALOC( (void*)pAL, sz, "expanded opt arg stack" ); + sz += sizeof(char*) * ((size_t)pAL->allocCt - MIN_ARG_ALLOC_CT); + pAL = (tArgList*)AGREALOC((void*)pAL, sz, "expanded opt arg stack"); if (pAL == NULL) return; *ppAL = (void*)pAL; @@ -241,26 +224,41 @@ addArgListEntry( void** ppAL, void* entry ) * private: * * what: put option args on a stack - * arg: + tOptions* + pOpts + program options descriptor + - * arg: + tOptDesc* + pOptDesc + the descriptor for this arg + + * arg: + tOptions* + opts + program options descriptor + + * arg: + tOptDesc* + od + the descriptor for this arg + * * doc: * Keep an entry-ordered list of option arguments. =*/ void -optionStackArg( - tOptions* pOpts, - tOptDesc* pOD ) +optionStackArg(tOptions * opts, tOptDesc * od) { char * pz; - if (pOD->optArg.argString == NULL) + if (INQUERY_CALL(opts, od)) return; - AGDUPSTR(pz, pOD->optArg.argString, "stack arg"); - addArgListEntry( &(pOD->optCookie), (void*)pz ); + if ((od->fOptState & OPTST_RESET) != 0) { + tArgList * arg_list = (void*)od->optCookie; + int ix; + if (arg_list == NULL) + return; + + ix = arg_list->useCt; + while (--ix >= 0) + AGFREE(arg_list->apzArgs[ix]); + AGFREE(arg_list); + + } else { + if (od->optArg.argString == NULL) + return; + + AGDUPSTR(pz, od->optArg.argString, "stack arg"); + addArgListEntry(&(od->optCookie), (void*)pz); + } } -/* +/** @} + * * Local Variables: * mode: C * c-file-style: "stroustrup" |