URI: 
       tstrtonum.c - ltk - Socket-based GUI for X11 (WIP)
  HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tstrtonum.c (1814B)
       ---
            1 /* Note: Taken from OpenBSD:
            2  * $OpenBSD: strtonum.c,v 1.8 2015/09/13 08:31:48 guenther Exp $
            3  */
            4 
            5 /*
            6  * Copyright (c) 2004 Ted Unangst and Todd Miller
            7  * All rights reserved.
            8  *
            9  * Permission to use, copy, modify, and/or distribute this software for any
           10  * purpose with or without fee is hereby granted, provided that the above
           11  * copyright notice and this permission notice appear in all copies.
           12  *
           13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
           14  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
           15  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
           16  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
           17  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
           18  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
           19  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
           20  */
           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 ltk_strtonum(
           32     const char *numstr, long long minval,
           33     long long maxval, const char **errstrp) {
           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 }