]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - lib/strto.c
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]);