Annotation of embedaddon/bird2/lib/strtoul.c, revision 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>