Annotation of embedaddon/bird2/lib/strtoul.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD Library -- Parse numbers
                      3:  *
                      4:  *     (c) 2019 Maria Matejka <mq@jmq.cz>
                      5:  *
                      6:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      7:  */
                      8: 
                      9: #include "nest/bird.h"
                     10: #include "lib/string.h"
                     11: 
                     12: #include <errno.h>
                     13: 
                     14: #define ULI_MAX_DIV10 (UINT64_MAX / 10)
                     15: #define ULI_MAX_MOD10 (UINT64_MAX % 10)
                     16: 
                     17: u64
                     18: bstrtoul10(const char *str, char **end)
                     19: {
                     20:   u64 out = 0;
                     21:   for (*end = (char *) str; (**end >= '0') && (**end <= '9'); (*end)++) {
                     22:     u64 digit = **end - '0';
                     23:     if ((out > ULI_MAX_DIV10) ||
                     24:        (out == ULI_MAX_DIV10) && (digit > ULI_MAX_MOD10)) {
                     25:       errno = ERANGE;
                     26:       return UINT64_MAX;
                     27:     }
                     28:     
                     29:     out *= 10;
                     30:     out += (**end) - '0';
                     31:   }
                     32:   return out;
                     33: }
                     34: 
                     35: u64
                     36: bstrtoul16(const char *str, char **end)
                     37: {
                     38:   u64 out = 0;
                     39:   for (int i=0; i<=(64/4); i++) {
                     40:     switch (str[i]) {
                     41:       case '0' ... '9':
                     42:        out *= 16;
                     43:        out += str[i] - '0';
                     44:        break;
                     45:       case 'a' ... 'f':
                     46:        out *= 16;
                     47:        out += str[i] + 10 - 'a';
                     48:        break;
                     49:       case 'A' ... 'F':
                     50:        out *= 16;
                     51:        out += str[i] + 10 - 'A';
                     52:        break;
                     53:       default:
                     54:        *end = (char *) &(str[i]);
                     55:        return out;
                     56:     }
                     57:   }
                     58: 
                     59:   errno = ERANGE;
                     60:   return UINT64_MAX;
                     61: }

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