4 * Copyright (C) 1991, 1992 Linus Torvalds
7 /* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
9 * Wirzenius wrote this portably, Torvalds fucked it up :-)
15 #include <linux/ctype.h>
17 /* from lib/kstrtox.c */
18 static const char *_parse_integer_fixup_radix(const char *s, uint *basep)
20 /* Look for a 0x prefix */
22 int ch = tolower(s[1]);
28 /* Only select octal if we don't have a base */
33 /* Use decimal by default */
41 * decode_digit() - Decode a single character into its numeric digit value
45 * @ch: Character to convert (expects '0'..'9', 'a'..'f' or 'A'..'F')
46 * Return: value of digit (0..0xf) or 255 if the character is invalid
48 static uint decode_digit(int ch)
55 return ch <= '9' ? ch - '0' : ch - 'a' + 0xa;
58 ulong simple_strtoul(const char *cp, char **endp, uint base)
63 cp = _parse_integer_fixup_radix(cp, &base);
65 while (value = decode_digit(*cp), value < base) {
66 result = result * base + value;
76 ulong hextoul(const char *cp, char **endp)
78 return simple_strtoul(cp, endp, 16);
81 ulong dectoul(const char *cp, char **endp)
83 return simple_strtoul(cp, endp, 10);
86 int strict_strtoul(const char *cp, unsigned int base, unsigned long *res)
97 val = simple_strtoul(cp, &tail, base);
101 if ((*tail == '\0') ||
102 ((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) {
110 long simple_strtol(const char *cp, char **endp, unsigned int base)
113 return -simple_strtoul(cp + 1, endp, base);
115 return simple_strtoul(cp, endp, base);
118 unsigned long ustrtoul(const char *cp, char **endp, unsigned int base)
120 unsigned long result = simple_strtoul(cp, endp, base);
121 switch (tolower(**endp)) {
139 unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base)
141 unsigned long long result = simple_strtoull(cp, endp, base);
142 switch (tolower(**endp)) {
160 unsigned long long simple_strtoull(const char *cp, char **endp,
163 unsigned long long result = 0;
166 cp = _parse_integer_fixup_radix(cp, &base);
168 while (value = decode_digit(*cp), value < base) {
169 result = result * base + value;
179 long long simple_strtoll(const char *cp, char **endp, unsigned int base)
182 return -simple_strtoull(cp + 1, endp, base);
184 return simple_strtoull(cp, endp, base);
187 long trailing_strtoln_end(const char *str, const char *end, char const **endp)
192 end = str + strlen(str);
194 if (p > str && isdigit(*p)) {
196 if (!isdigit(p[-1])) {
199 return dectoul(p, NULL);
209 long trailing_strtoln(const char *str, const char *end)
211 return trailing_strtoln_end(str, end, NULL);
214 long trailing_strtol(const char *str)
216 return trailing_strtoln(str, NULL);
219 void str_to_upper(const char *in, char *out, size_t len)
221 for (; len > 0 && *in; len--)
222 *out++ = toupper(*in++);
227 const char **str_to_list(const char *instr)
233 /* don't allocate if the string is empty */
234 str = *instr ? strdup(instr) : (char *)instr;
238 /* count the number of space-separated strings */
239 for (count = *str != '\0', p = str; *p; p++) {
246 /* allocate the pointer array, allowing for a NULL terminator */
247 ptr = calloc(count + 1, sizeof(char *));
254 for (i = 0, p = str; i < count; p += strlen(p) + 1, i++)
260 void str_free_list(const char **ptr)
263 free((char *)ptr[0]);