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>