[BACK]Return to compat_strtonum.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Annotation of mandoc/compat_strtonum.c, Revision 1.2

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

CVSweb