2 * Copyright (c) 2003-2017 Cavium Inc. (support@cavium.com). All rights
4 * Copyright 2018-present Facebook, Inc.
6 * SPDX-License-Identifier: BSD-3-Clause
8 * string.c: hastily cobbled-together string functions
14 #include <lame_string.h>
16 static int char_to_val(char c
)
18 if (c
>= '0' && c
<= '9') /* digits */
20 if (c
>= 'A' && c
<= 'F') /* uppercase */
22 if (c
>= 'a' && c
<= 'f') /* lowercase */
27 unsigned long long int strtoull(const char *nptr
, char **endptr
, int base
)
29 unsigned long long int val
;
32 /* TODO: enforce lameness of this API for now... */
33 assert((base
== 0) || (base
== 16) || base
== 10);
39 for (i
= 0; i
< strlen(nptr
); i
++)
45 if (strlen(&nptr
[i
]) >= 2 && ((nptr
[i
] == '0') &&
46 ((nptr
[i
+ 1] == 'x') || (nptr
[i
+ 1] == 'X')))) {
48 i
+= 2; /* start loop after prefix */
54 for (; i
< strlen(nptr
); i
++) {
56 if (!isxdigit(nptr
[i
])) {
58 *endptr
= (char *)&nptr
[i
];
63 if (!isdigit(nptr
[i
])) {
65 *endptr
= (char *)&nptr
[i
];
72 val
+= char_to_val(nptr
[i
]);
76 printk(BIOS_ERR
, "Failed to convert string '%s', base %d to "
83 unsigned long int strtoul(const char *nptr
, char **endptr
, int base
)
85 unsigned long long int u
= strtol(nptr
, endptr
, base
);
86 /* FIXME: check for overflow (u > max) */
87 return (unsigned long int)u
;
90 long int strtol(const char *nptr
, char **endptr
, int base
)
92 unsigned long long int u
;
103 u
= strtoull(p
, NULL
, base
);
104 /* FIXME: check for overflow (u > max) */
106 ret
= 0 - (long int)u
;
112 long long int strtoll(const char *nptr
, char **endptr
, int base
)
114 unsigned long long int u
;
119 if (nptr
[0] == '-') {
125 u
= strtoull(p
, NULL
, base
);
126 /* FIXME: check for overflow (sign-bit set) */
128 ret
= 0 - (long long int)u
;
130 ret
= (long long int)u
;
134 /* FIXME: replace sscanf() usage for bdk_config_get_int. returns number of
135 * strings converted, so 1 if successful and 0 if not */
136 int str_to_int(const char *str
, int64_t *val
)
138 *val
= strtol(str
, NULL
, 10);
142 /* FIXME: replace sscanf() usage for bdk_config_get_int. returns number of
143 * strings converted, so 1 if successful and 0 if not */
144 int str_to_hex(const char *str
, int64_t *val
)
146 *val
= strtol(str
, NULL
, 16);