Annotation of embedaddon/pimd/libite/strtonum.c, revision 1.1.1.1

1.1       misho       1: /*     $OpenBSD: strtonum.c,v 1.7 2013/04/17 18:40:58 tedu 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: #ifndef strtonum
                     25: #define        INVALID         1
                     26: #define        TOOSMALL        2
                     27: #define        TOOLARGE        3
                     28: 
                     29: long long
                     30: strtonum(const char *numstr, long long minval, long long maxval,
                     31:     const char **errstrp)
                     32: {
                     33:        long long ll = 0;
                     34:        int error = 0;
                     35:        char *ep;
                     36:        struct errval {
                     37:                const char *errstr;
                     38:                int err;
                     39:        } ev[4] = {
                     40:                { NULL,         0 },
                     41:                { "invalid",    EINVAL },
                     42:                { "too small",  ERANGE },
                     43:                { "too large",  ERANGE },
                     44:        };
                     45: 
                     46:        ev[0].err = errno;
                     47:        errno = 0;
                     48:        if (minval > maxval) {
                     49:                error = INVALID;
                     50:        } else {
                     51:                ll = strtoll(numstr, &ep, 10);
                     52:                if (numstr == ep || *ep != '\0')
                     53:                        error = INVALID;
                     54:                else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
                     55:                        error = TOOSMALL;
                     56:                else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
                     57:                        error = TOOLARGE;
                     58:        }
                     59:        if (errstrp != NULL)
                     60:                *errstrp = ev[error].errstr;
                     61:        errno = ev[error].err;
                     62:        if (error)
                     63:                ll = 0;
                     64: 
                     65:        return (ll);
                     66: }
                     67: #endif

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