Annotation of embedaddon/ntp/sntp/libopts/numeric.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /**
                      3:  * \file numeric.c
                      4:  *
                      5:  *  Time-stamp:      "2011-03-25 16:26:10 bkorb"
                      6:  *
                      7:  *  This file is part of AutoOpts, a companion to AutoGen.
                      8:  *  AutoOpts is free software.
                      9:  *  AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
                     10:  *
                     11:  *  AutoOpts is available under any one of two licenses.  The license
                     12:  *  in use must be one of these two and the choice is under the control
                     13:  *  of the user of the license.
                     14:  *
                     15:  *   The GNU Lesser General Public License, version 3 or later
                     16:  *      See the files "COPYING.lgplv3" and "COPYING.gplv3"
                     17:  *
                     18:  *   The Modified Berkeley Software Distribution License
                     19:  *      See the file "COPYING.mbsd"
                     20:  *
                     21:  *  These files have the following md5sums:
                     22:  *
                     23:  *  43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
                     24:  *  06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
                     25:  *  66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
                     26:  */
                     27: 
                     28: /*=export_func  optionShowRange
                     29:  * private:
                     30:  *
                     31:  * what:  
                     32:  * arg:   + tOptions* + pOpts     + program options descriptor  +
                     33:  * arg:   + tOptDesc* + pOptDesc  + the descriptor for this arg +
                     34:  * arg:   + void *    + rng_table + the value range tables      +
                     35:  * arg:   + int       + rng_count + the number of entries       +
                     36:  *
                     37:  * doc:
                     38:  *   Show information about a numeric option with range constraints.
                     39: =*/
                     40: void
                     41: optionShowRange(tOptions* pOpts, tOptDesc* pOD, void * rng_table, int rng_ct)
                     42: {
                     43:     static char const bullet[] = "\t\t\t\t- ";
                     44:     static char const deepin[] = "\t\t\t\t  ";
                     45:     static char const onetab[] = "\t";
                     46: 
                     47:     const struct {long const rmin, rmax;} * rng = rng_table;
                     48: 
                     49:     char const * pz_indent    = bullet;
                     50: 
                     51:     /*
                     52:      * The range is shown only for full usage requests and an error
                     53:      * in this particular option.
                     54:      */
                     55:     if (pOpts != OPTPROC_EMIT_USAGE) {
                     56:         if (pOpts <= OPTPROC_EMIT_LIMIT)
                     57:             return;
                     58:         pz_indent = onetab;
                     59: 
                     60:         fprintf(option_usage_fp, zRangeErr, pOpts->pzProgName,
                     61:                 pOD->pz_Name, pOD->optArg.argString);
                     62:         pz_indent = "";
                     63:     }
                     64: 
                     65:     if (pOD->fOptState & OPTST_SCALED_NUM)
                     66:         fprintf(option_usage_fp, zRangeScaled, pz_indent);
                     67: 
                     68:     fprintf(option_usage_fp, (rng_ct > 1) ? zRangeLie : zRangeOnly, pz_indent);
                     69:     pz_indent = (pOpts != OPTPROC_EMIT_USAGE) ? onetab : deepin;
                     70: 
                     71:     for (;;) {
                     72:         if (rng->rmax == LONG_MIN)
                     73:             fprintf(option_usage_fp, zRangeExact, pz_indent, rng->rmin);
                     74:         else if (rng->rmin == LONG_MIN)
                     75:             fprintf(option_usage_fp, zRangeUpto, pz_indent, rng->rmax);
                     76:         else if (rng->rmax == LONG_MAX)
                     77:             fprintf(option_usage_fp, zRangeAbove, pz_indent, rng->rmin);
                     78:         else
                     79:             fprintf(option_usage_fp, zRange, pz_indent, rng->rmin,
                     80:                     rng->rmax);
                     81: 
                     82:         if  (--rng_ct <= 0) {
                     83:             fputc('\n', option_usage_fp);
                     84:             break;
                     85:         }
                     86:         fputs(zRangeOr, option_usage_fp);
                     87:         rng++;
                     88:     }
                     89: 
                     90:     if (pOpts > OPTPROC_EMIT_LIMIT)
                     91:         pOpts->pUsageProc(pOpts, EXIT_FAILURE);
                     92: }
                     93: 
                     94: /*=export_func  optionNumericVal
                     95:  * private:
                     96:  *
                     97:  * what:  process an option with a numeric value.
                     98:  * arg:   + tOptions* + pOpts    + program options descriptor +
                     99:  * arg:   + tOptDesc* + pOptDesc + the descriptor for this arg +
                    100:  *
                    101:  * doc:
                    102:  *  Decipher a numeric value.
                    103: =*/
                    104: void
                    105: optionNumericVal(tOptions* pOpts, tOptDesc* pOD )
                    106: {
                    107:     char* pz;
                    108:     long  val;
                    109: 
                    110:     /*
                    111:      *  Numeric options may have a range associated with it.
                    112:      *  If it does, the usage procedure requests that it be
                    113:      *  emitted by passing a NULL pOD pointer.  Also bail out
                    114:      *  if there is no option argument or if we are being reset.
                    115:      */
                    116:     if (  (pOD == NULL)
                    117:        || (pOD->optArg.argString == NULL)
                    118:        || ((pOD->fOptState & OPTST_RESET) != 0))
                    119:         return;
                    120: 
                    121:     errno = 0;
                    122:     val = strtol(pOD->optArg.argString, &pz, 0);
                    123:     if ((pz == pOD->optArg.argString) || (errno != 0))
                    124:         goto bad_number;
                    125: 
                    126:     if ((pOD->fOptState & OPTST_SCALED_NUM) != 0)
                    127:         switch (*(pz++)) {
                    128:         case '\0': pz--; break;
                    129:         case 't':  val *= 1000;
                    130:         case 'g':  val *= 1000;
                    131:         case 'm':  val *= 1000;
                    132:         case 'k':  val *= 1000; break;
                    133: 
                    134:         case 'T':  val *= 1024;
                    135:         case 'G':  val *= 1024;
                    136:         case 'M':  val *= 1024;
                    137:         case 'K':  val *= 1024; break;
                    138: 
                    139:         default:   goto bad_number;
                    140:         }
                    141: 
                    142:     if (*pz != NUL)
                    143:         goto bad_number;
                    144: 
                    145:     if (pOD->fOptState & OPTST_ALLOC_ARG) {
                    146:         AGFREE(pOD->optArg.argString);
                    147:         pOD->fOptState &= ~OPTST_ALLOC_ARG;
                    148:     }
                    149: 
                    150:     pOD->optArg.argInt = val;
                    151:     return;
                    152: 
                    153:     bad_number:
                    154: 
                    155:     fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
                    156:     if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
                    157:         (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
                    158: 
                    159:     errno = EINVAL;
                    160:     pOD->optArg.argInt = ~0;
                    161: }
                    162: 
                    163: /*
                    164:  * Local Variables:
                    165:  * mode: C
                    166:  * c-file-style: "stroustrup"
                    167:  * indent-tabs-mode: nil
                    168:  * End:
                    169:  * end of autoopts/numeric.c */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>