Blame view
lib/strto.c
3.07 KB
e4c5383e4 lib: split out st... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * linux/lib/vsprintf.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ /* * Wirzenius wrote this portably, Torvalds fucked it up :-) */ #include <common.h> #include <errno.h> #include <linux/ctype.h> |
2e7946148 lib: strto: fix i... |
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/* from lib/kstrtox.c */ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base) { if (*base == 0) { if (s[0] == '0') { if (tolower(s[1]) == 'x' && isxdigit(s[2])) *base = 16; else *base = 8; } else *base = 10; } if (*base == 16 && s[0] == '0' && tolower(s[1]) == 'x') s += 2; return s; } |
e4c5383e4 lib: split out st... |
31 32 33 34 35 |
unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base) { unsigned long result = 0; unsigned long value; |
2e7946148 lib: strto: fix i... |
36 |
cp = _parse_integer_fixup_radix(cp, &base); |
e4c5383e4 lib: split out st... |
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp) ? toupper(*cp) : *cp)-'A'+10) < base) { result = result*base + value; cp++; } if (endp) *endp = (char *)cp; return result; } int strict_strtoul(const char *cp, unsigned int base, unsigned long *res) { char *tail; unsigned long val; size_t len; *res = 0; len = strlen(cp); if (len == 0) return -EINVAL; val = simple_strtoul(cp, &tail, base); if (tail == cp) return -EINVAL; if ((*tail == '\0') || ((len == (size_t)(tail - cp) + 1) && (*tail == ' '))) { *res = val; return 0; } return -EINVAL; } long simple_strtol(const char *cp, char **endp, unsigned int base) { if (*cp == '-') return -simple_strtoul(cp + 1, endp, base); return simple_strtoul(cp, endp, base); } unsigned long ustrtoul(const char *cp, char **endp, unsigned int base) { unsigned long result = simple_strtoul(cp, endp, base); switch (**endp) { case 'G': result *= 1024; /* fall through */ case 'M': result *= 1024; /* fall through */ case 'K': case 'k': result *= 1024; if ((*endp)[1] == 'i') { if ((*endp)[2] == 'B') (*endp) += 3; else (*endp) += 2; } } return result; } unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base) { unsigned long long result = simple_strtoull(cp, endp, base); switch (**endp) { case 'G': result *= 1024; /* fall through */ case 'M': result *= 1024; /* fall through */ case 'K': case 'k': result *= 1024; if ((*endp)[1] == 'i') { if ((*endp)[2] == 'B') (*endp) += 3; else (*endp) += 2; } } return result; } unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) { unsigned long long result = 0, value; |
2e7946148 lib: strto: fix i... |
133 |
cp = _parse_integer_fixup_radix(cp, &base); |
e4c5383e4 lib: split out st... |
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp - '0' : (islower(*cp) ? toupper(*cp) : *cp) - 'A' + 10) < base) { result = result * base + value; cp++; } if (endp) *endp = (char *) cp; return result; } long trailing_strtoln(const char *str, const char *end) { const char *p; if (!end) end = str + strlen(str); |
b91c6a120 Fix return value ... |
153 154 155 156 157 |
if (isdigit(end[-1])) { for (p = end - 1; p > str; p--) { if (!isdigit(*p)) return simple_strtoul(p + 1, NULL, 10); } |
e4c5383e4 lib: split out st... |
158 159 160 161 162 163 164 165 166 |
} return -1; } long trailing_strtol(const char *str) { return trailing_strtoln(str, NULL); } |