Annotation of embedaddon/mrouted/strtonum.c, revision 1.1.1.1

1.1       misho       1: /*     $OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $    */
                      2: 
                      3: /*
                      4:  * Copyright (c) 2004 Ted Unangst and Todd Miller
                      5:  * All rights reserved.
                      6:  *
                      7:  * Permission to use, copy, modify, and distribute this software for any
                      8:  * purpose with or without fee is hereby granted, provided that the above
                      9:  * copyright notice and this permission notice appear in all copies.
                     10:  *
                     11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     15:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     16:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     17:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     18:  */
                     19: 
                     20: #include <errno.h>
                     21: #include <limits.h>
                     22: #include <stdlib.h>
                     23: 
                     24: #define INVALID        1
                     25: #define TOOSMALL       2
                     26: #define TOOLARGE       3
                     27: 
                     28: /* Not defined in GLIBC */
                     29: #ifndef LLONG_MAX
                     30: # define LLONG_MAX 0x7fffffffffffffffLL
                     31: #endif
                     32: 
                     33: #ifndef LLONG_MIN
                     34: # define LLONG_MIN (-0x7fffffffffffffffLL-1)
                     35: #endif
                     36: 
                     37: long long
                     38: strtonum(const char *numstr, long long minval, long long maxval,
                     39:     const char **errstrp)
                     40: {
                     41:        long long ll = 0;
                     42:        char *ep;
                     43:        int error = 0;
                     44:        struct errval {
                     45:                const char *errstr;
                     46:                int err;
                     47:        } ev[4] = {
                     48:                { NULL,         0 },
                     49:                { "invalid",    EINVAL },
                     50:                { "too small",  ERANGE },
                     51:                { "too large",  ERANGE },
                     52:        };
                     53: 
                     54:        ev[0].err = errno;
                     55:        errno = 0;
                     56:        if (minval > maxval)
                     57:                error = INVALID;
                     58:        else {
                     59:                ll = strtoll(numstr, &ep, 10);
                     60:                if (numstr == ep || *ep != '\0')
                     61:                        error = INVALID;
                     62:                else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
                     63:                        error = TOOSMALL;
                     64:                else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
                     65:                        error = TOOLARGE;
                     66:        }
                     67:        if (errstrp != NULL)
                     68:                *errstrp = ev[error].errstr;
                     69:        errno = ev[error].err;
                     70:        if (error)
                     71:                ll = 0;
                     72: 
                     73:        return (ll);
                     74: }
                     75: 
                     76: /**
                     77:  * Local Variables:
                     78:  *  version-control: t
                     79:  *  c-file-style: "bsd"
                     80:  * End:
                     81:  */

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