summaryrefslogtreecommitdiffstats
path: root/sntp/libopts/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'sntp/libopts/stack.c')
-rw-r--r--sntp/libopts/stack.c113
1 files changed, 54 insertions, 59 deletions
diff --git a/sntp/libopts/stack.c b/sntp/libopts/stack.c
index 6d77f72..d930772 100644
--- a/sntp/libopts/stack.c
+++ b/sntp/libopts/stack.c
@@ -1,54 +1,31 @@
-/*
- * 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
+ *
+ * Time-stamp: "2010-07-17 10:42:27 bkorb"
*
* This is a special option processing routine that will save the
* argument to an option in a FIFO queue.
- */
-
-/*
- * 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
*
- * 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.
+ * 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.
*
- * 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.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * 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.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * 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.
+ * 43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
+ * 06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifdef WITH_LIBREGEX
@@ -72,14 +49,19 @@ optionUnstackArg(
{
int res;
- tArgList* pAL = (tArgList*)pOptDesc->optCookie;
+ tArgList* pAL;
+
+ if ((pOptDesc->fOptState & OPTST_RESET) != 0)
+ return;
+ 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)
+ if ((pOptDesc->fOptState & OPTST_INITENABLED) == 0)
pOptDesc->fOptState |= OPTST_DISABLED;
return;
}
@@ -89,7 +71,7 @@ optionUnstackArg(
regex_t re;
int i, ct, dIdx;
- if (regcomp( &re, pOptDesc->optArg.argString, REG_NOSUB ) != 0)
+ if (regcomp(&re, pOptDesc->optArg.argString, REG_NOSUB) != 0)
return;
/*
@@ -100,12 +82,12 @@ optionUnstackArg(
*/
for (i = 0, dIdx = 0, ct = pAL->useCt; --ct >= 0; i++) {
tCC* pzSrc = pAL->apzArgs[ i ];
- char* pzEq = strchr( pzSrc, '=' );
+ char* pzEq = strchr(pzSrc, '=');
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:
/*
@@ -132,7 +114,7 @@ optionUnstackArg(
}
}
- regfree( &re );
+ regfree(&re);
}
#else /* not WITH_LIBREGEX */
{
@@ -146,12 +128,12 @@ optionUnstackArg(
*/
for (i = 0, dIdx = 0, ct = pAL->useCt; --ct >= 0; i++) {
tCC* pzSrc = pAL->apzArgs[ i ];
- char* pzEq = strchr( pzSrc, '=' );
+ char* pzEq = strchr(pzSrc, '=');
if (pzEq != NULL)
*pzEq = NUL;
- if (strcmp( pzSrc, pOptDesc->optArg.argString ) == 0) {
+ if (strcmp(pzSrc, pOptDesc->optArg.argString) == 0) {
/*
* Remove this entry by reducing the in-use count
* and *not* putting the string pointer back into
@@ -180,9 +162,9 @@ optionUnstackArg(
*/
if (pAL->useCt == 0) {
pOptDesc->fOptState &= OPTST_PERSISTENT_MASK;
- if ( (pOptDesc->fOptState & OPTST_INITENABLED) == 0)
+ if ((pOptDesc->fOptState & OPTST_INITENABLED) == 0)
pOptDesc->fOptState |= OPTST_DISABLED;
- AGFREE( (void*)pAL );
+ AGFREE((void*)pAL);
pOptDesc->optCookie = NULL;
}
}
@@ -194,7 +176,7 @@ optionUnstackArg(
* as an opaque address.
*/
LOCAL void
-addArgListEntry( void** ppAL, void* entry )
+addArgListEntry(void** ppAL, void* entry)
{
tArgList* pAL = *(void**)ppAL;
@@ -203,7 +185,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,7 +198,7 @@ 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;
/*
@@ -224,7 +206,7 @@ addArgListEntry( void** ppAL, void* entry )
* 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" );
+ pAL = (tArgList*)AGREALOC((void*)pAL, sz, "expanded opt arg stack");
if (pAL == NULL)
return;
*ppAL = (void*)pAL;
@@ -254,11 +236,24 @@ optionStackArg(
{
char * pz;
- if (pOD->optArg.argString == NULL)
- return;
+ if ((pOD->fOptState & OPTST_RESET) != 0) {
+ tArgList* pAL = (void*)pOD->optCookie;
+ int ix;
+ if (pAL == NULL)
+ return;
- AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
- addArgListEntry( &(pOD->optCookie), (void*)pz );
+ ix = pAL->useCt;
+ while (--ix >= 0)
+ AGFREE(pAL->apzArgs[ix]);
+ AGFREE(pAL);
+
+ } else {
+ if (pOD->optArg.argString == NULL)
+ return;
+
+ AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
+ addArgListEntry(&(pOD->optCookie), (void*)pz);
+ }
}
/*
* Local Variables:
OpenPOWER on IntegriCloud