mb/starlabs/{lite_adl,byte_adl}: Don't select MAINBOARD_HAS_TPM2
[coreboot2.git] / src / vendorcode / cavium / bdk / lame_string.c
blob61e48c68b8457064da244b7ec2f7ed2a503d35b6
1 /*
2 * Copyright (c) 2003-2017 Cavium Inc. (support@cavium.com). All rights
3 * reserved.
4 * Copyright 2018-present Facebook, Inc.
6 * SPDX-License-Identifier: BSD-3-Clause
8 * string.c: hastily cobbled-together string functions
9 */
11 #include <assert.h>
12 #include <ctype.h>
13 #include <string.h>
14 #include <lame_string.h>
16 static int char_to_val(char c)
18 if (c >= '0' && c <= '9') /* digits */
19 return c - '0';
20 if (c >= 'A' && c <= 'F') /* uppercase */
21 return c - 'A' + 10;
22 if (c >= 'a' && c <= 'f') /* lowercase */
23 return c - 'a' + 10;
24 return -1;
27 unsigned long long int strtoull(const char *nptr, char **endptr, int base)
29 unsigned long long int val;
30 size_t i, error = 0;
32 /* TODO: enforce lameness of this API for now... */
33 assert((base == 0) || (base == 16) || base == 10);
35 if (!nptr)
36 return 0;
38 /* Trim whitespace */
39 for (i = 0; i < strlen(nptr); i++)
40 if (nptr[i] != ' ')
41 break;
43 if (base == 0) {
44 /* Autodetect base */
45 if (strlen(&nptr[i]) >= 2 && ((nptr[i] == '0') &&
46 ((nptr[i + 1] == 'x') || (nptr[i + 1] == 'X')))) {
47 base = 16;
48 i += 2; /* start loop after prefix */
49 } else
50 base = 10;
53 val = 0;
54 for (; i < strlen(nptr); i++) {
55 if (base == 16) {
56 if (!isxdigit(nptr[i])) {
57 if (*endptr)
58 *endptr = (char *)&nptr[i];
59 error = 1;
60 break;
62 } else {
63 if (!isdigit(nptr[i])) {
64 if (*endptr)
65 *endptr = (char *)&nptr[i];
66 error = 1;
67 break;
71 val *= base;
72 val += char_to_val(nptr[i]);
75 if (error) {
76 printk(BIOS_ERR, "Failed to convert string '%s', base %d to "
77 "int\n", nptr, base);
78 return 0;
80 return val;
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;
93 int is_neg = 0;
94 const char *p;
95 long int ret;
97 if (nptr[0] == '-') {
98 is_neg = 1;
99 p = &nptr[1];
100 } else {
101 p = &nptr[0];
103 u = strtoull(p, NULL, base);
104 /* FIXME: check for overflow (u > max) */
105 if (is_neg)
106 ret = 0 - (long int)u;
107 else
108 ret = (long int)u;
109 return ret;
112 long long int strtoll(const char *nptr, char **endptr, int base)
114 unsigned long long int u;
115 int is_neg = 0;
116 const char *p;
117 long long int ret;
119 if (nptr[0] == '-') {
120 is_neg = 1;
121 p = &nptr[1];
122 } else {
123 p = &nptr[0];
125 u = strtoull(p, NULL, base);
126 /* FIXME: check for overflow (sign-bit set) */
127 if (is_neg)
128 ret = 0 - (long long int)u;
129 else
130 ret = (long long int)u;
131 return ret;
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);
139 return 1;
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);
147 return 1;