Home
       tstrtonum.c - ics2txt - convert icalendar .ics file to plain text
  HTML git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
       ---
       tstrtonum.c (1772B)
       ---
            1 /*        $OpenBSD: strtonum.c,v 1.8 2015/09/13 08:31:48 guenther 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 long long
           29 strtonum(const char *numstr, long long minval, long long maxval,
           30     const char **errstrp)
           31 {
           32         long long ll = 0;
           33         int error = 0;
           34         char *ep;
           35         struct errval {
           36                 const char *errstr;
           37                 int err;
           38         } ev[4] = {
           39                 { NULL,                0 },
           40                 { "invalid",        EINVAL },
           41                 { "too small",        ERANGE },
           42                 { "too large",        ERANGE },
           43         };
           44 
           45         ev[0].err = errno;
           46         errno = 0;
           47         if (minval > maxval) {
           48                 error = INVALID;
           49         } else {
           50                 ll = strtoll(numstr, &ep, 10);
           51                 if (numstr == ep || *ep != '\0')
           52                         error = INVALID;
           53                 else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
           54                         error = TOOSMALL;
           55                 else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
           56                         error = TOOLARGE;
           57         }
           58         if (errstrp != NULL)
           59                 *errstrp = ev[error].errstr;
           60         errno = ev[error].err;
           61         if (error)
           62                 ll = 0;
           63 
           64         return (ll);
           65 }