Annotation of embedaddon/ntp/sntp/libopts/stack.c, revision 1.1
1.1 ! misho 1:
! 2: /**
! 3: * \file stack.c
! 4: *
! 5: * Time-stamp: "2010-07-17 10:42:27 bkorb"
! 6: *
! 7: * This is a special option processing routine that will save the
! 8: * argument to an option in a FIFO queue.
! 9: *
! 10: * This file is part of AutoOpts, a companion to AutoGen.
! 11: * AutoOpts is free software.
! 12: * AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
! 13: *
! 14: * AutoOpts is available under any one of two licenses. The license
! 15: * in use must be one of these two and the choice is under the control
! 16: * of the user of the license.
! 17: *
! 18: * The GNU Lesser General Public License, version 3 or later
! 19: * See the files "COPYING.lgplv3" and "COPYING.gplv3"
! 20: *
! 21: * The Modified Berkeley Software Distribution License
! 22: * See the file "COPYING.mbsd"
! 23: *
! 24: * These files have the following md5sums:
! 25: *
! 26: * 43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
! 27: * 06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
! 28: * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
! 29: */
! 30:
! 31: #ifdef WITH_LIBREGEX
! 32: # include REGEX_HEADER
! 33: #endif
! 34:
! 35: /*=export_func optionUnstackArg
! 36: * private:
! 37: *
! 38: * what: Remove option args from a stack
! 39: * arg: + tOptions* + pOpts + program options descriptor +
! 40: * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
! 41: *
! 42: * doc:
! 43: * Invoked for options that are equivalenced to stacked options.
! 44: =*/
! 45: void
! 46: optionUnstackArg(
! 47: tOptions* pOpts,
! 48: tOptDesc* pOptDesc )
! 49: {
! 50: int res;
! 51:
! 52: tArgList* pAL;
! 53:
! 54: if ((pOptDesc->fOptState & OPTST_RESET) != 0)
! 55: return;
! 56: pAL = (tArgList*)pOptDesc->optCookie;
! 57:
! 58: /*
! 59: * IF we don't have any stacked options,
! 60: * THEN indicate that we don't have any of these options
! 61: */
! 62: if (pAL == NULL) {
! 63: pOptDesc->fOptState &= OPTST_PERSISTENT_MASK;
! 64: if ((pOptDesc->fOptState & OPTST_INITENABLED) == 0)
! 65: pOptDesc->fOptState |= OPTST_DISABLED;
! 66: return;
! 67: }
! 68:
! 69: #ifdef WITH_LIBREGEX
! 70: {
! 71: regex_t re;
! 72: int i, ct, dIdx;
! 73:
! 74: if (regcomp(&re, pOptDesc->optArg.argString, REG_NOSUB) != 0)
! 75: return;
! 76:
! 77: /*
! 78: * search the list for the entry(s) to remove. Entries that
! 79: * are removed are *not* copied into the result. The source
! 80: * index is incremented every time. The destination only when
! 81: * we are keeping a define.
! 82: */
! 83: for (i = 0, dIdx = 0, ct = pAL->useCt; --ct >= 0; i++) {
! 84: tCC* pzSrc = pAL->apzArgs[ i ];
! 85: char* pzEq = strchr(pzSrc, '=');
! 86:
! 87: if (pzEq != NULL)
! 88: *pzEq = NUL;
! 89:
! 90: res = regexec(&re, pzSrc, (size_t)0, NULL, 0);
! 91: switch (res) {
! 92: case 0:
! 93: /*
! 94: * Remove this entry by reducing the in-use count
! 95: * and *not* putting the string pointer back into
! 96: * the list.
! 97: */
! 98: AGFREE(pzSrc);
! 99: pAL->useCt--;
! 100: break;
! 101:
! 102: default:
! 103: case REG_NOMATCH:
! 104: if (pzEq != NULL)
! 105: *pzEq = '=';
! 106:
! 107: /*
! 108: * IF we have dropped an entry
! 109: * THEN we have to move the current one.
! 110: */
! 111: if (dIdx != i)
! 112: pAL->apzArgs[ dIdx ] = pzSrc;
! 113: dIdx++;
! 114: }
! 115: }
! 116:
! 117: regfree(&re);
! 118: }
! 119: #else /* not WITH_LIBREGEX */
! 120: {
! 121: int i, ct, dIdx;
! 122:
! 123: /*
! 124: * search the list for the entry(s) to remove. Entries that
! 125: * are removed are *not* copied into the result. The source
! 126: * index is incremented every time. The destination only when
! 127: * we are keeping a define.
! 128: */
! 129: for (i = 0, dIdx = 0, ct = pAL->useCt; --ct >= 0; i++) {
! 130: tCC* pzSrc = pAL->apzArgs[ i ];
! 131: char* pzEq = strchr(pzSrc, '=');
! 132:
! 133: if (pzEq != NULL)
! 134: *pzEq = NUL;
! 135:
! 136: if (strcmp(pzSrc, pOptDesc->optArg.argString) == 0) {
! 137: /*
! 138: * Remove this entry by reducing the in-use count
! 139: * and *not* putting the string pointer back into
! 140: * the list.
! 141: */
! 142: AGFREE(pzSrc);
! 143: pAL->useCt--;
! 144: } else {
! 145: if (pzEq != NULL)
! 146: *pzEq = '=';
! 147:
! 148: /*
! 149: * IF we have dropped an entry
! 150: * THEN we have to move the current one.
! 151: */
! 152: if (dIdx != i)
! 153: pAL->apzArgs[ dIdx ] = pzSrc;
! 154: dIdx++;
! 155: }
! 156: }
! 157: }
! 158: #endif /* WITH_LIBREGEX */
! 159: /*
! 160: * IF we have unstacked everything,
! 161: * THEN indicate that we don't have any of these options
! 162: */
! 163: if (pAL->useCt == 0) {
! 164: pOptDesc->fOptState &= OPTST_PERSISTENT_MASK;
! 165: if ((pOptDesc->fOptState & OPTST_INITENABLED) == 0)
! 166: pOptDesc->fOptState |= OPTST_DISABLED;
! 167: AGFREE((void*)pAL);
! 168: pOptDesc->optCookie = NULL;
! 169: }
! 170: }
! 171:
! 172:
! 173: /*
! 174: * Put an entry into an argument list. The first argument points to
! 175: * a pointer to the argument list structure. It gets passed around
! 176: * as an opaque address.
! 177: */
! 178: LOCAL void
! 179: addArgListEntry(void** ppAL, void* entry)
! 180: {
! 181: tArgList* pAL = *(void**)ppAL;
! 182:
! 183: /*
! 184: * IF we have never allocated one of these,
! 185: * THEN allocate one now
! 186: */
! 187: if (pAL == NULL) {
! 188: pAL = (tArgList*)AGALOC(sizeof(*pAL), "new option arg stack");
! 189: if (pAL == NULL)
! 190: return;
! 191: pAL->useCt = 0;
! 192: pAL->allocCt = MIN_ARG_ALLOC_CT;
! 193: *ppAL = (void*)pAL;
! 194: }
! 195:
! 196: /*
! 197: * ELSE if we are out of room
! 198: * THEN make it bigger
! 199: */
! 200: else if (pAL->useCt >= pAL->allocCt) {
! 201: size_t sz = sizeof(*pAL);
! 202: pAL->allocCt += INCR_ARG_ALLOC_CT;
! 203:
! 204: /*
! 205: * The base structure contains space for MIN_ARG_ALLOC_CT
! 206: * pointers. We subtract it off to find our augment size.
! 207: */
! 208: sz += sizeof(char*) * (pAL->allocCt - MIN_ARG_ALLOC_CT);
! 209: pAL = (tArgList*)AGREALOC((void*)pAL, sz, "expanded opt arg stack");
! 210: if (pAL == NULL)
! 211: return;
! 212: *ppAL = (void*)pAL;
! 213: }
! 214:
! 215: /*
! 216: * Insert the new argument into the list
! 217: */
! 218: pAL->apzArgs[ (pAL->useCt)++ ] = entry;
! 219: }
! 220:
! 221:
! 222: /*=export_func optionStackArg
! 223: * private:
! 224: *
! 225: * what: put option args on a stack
! 226: * arg: + tOptions* + pOpts + program options descriptor +
! 227: * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
! 228: *
! 229: * doc:
! 230: * Keep an entry-ordered list of option arguments.
! 231: =*/
! 232: void
! 233: optionStackArg(
! 234: tOptions* pOpts,
! 235: tOptDesc* pOD )
! 236: {
! 237: char * pz;
! 238:
! 239: if ((pOD->fOptState & OPTST_RESET) != 0) {
! 240: tArgList* pAL = (void*)pOD->optCookie;
! 241: int ix;
! 242: if (pAL == NULL)
! 243: return;
! 244:
! 245: ix = pAL->useCt;
! 246: while (--ix >= 0)
! 247: AGFREE(pAL->apzArgs[ix]);
! 248: AGFREE(pAL);
! 249:
! 250: } else {
! 251: if (pOD->optArg.argString == NULL)
! 252: return;
! 253:
! 254: AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
! 255: addArgListEntry(&(pOD->optCookie), (void*)pz);
! 256: }
! 257: }
! 258: /*
! 259: * Local Variables:
! 260: * mode: C
! 261: * c-file-style: "stroustrup"
! 262: * indent-tabs-mode: nil
! 263: * End:
! 264: * end of autoopts/stack.c */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>