blob: a7f8074fc7ec729aa10016259c0d0b23d17076ee [file] [log] [blame]
Martin Rothfb8876d2022-08-07 15:12:12 -06001/* SPDX-License-Identifier: GPL-2.0-only */
2
Julius Wernera66c9b82019-05-20 14:53:47 -07003#include <assert.h>
Joel Kitching393c71c2019-06-16 16:09:42 +08004#include <ctype.h>
Thomas Heijligen92043552019-01-29 12:48:01 +01005#include <string.h>
6#include <stddef.h>
7#include <stdlib.h>
8
9char *strdup(const char *s)
10{
Julius Wernera66c9b82019-05-20 14:53:47 -070011 if (!ENV_RAMSTAGE)
12 dead_code(); /* This can't be used without malloc(). */
13
Thomas Heijligen92043552019-01-29 12:48:01 +010014 size_t sz = strlen(s) + 1;
15 char *d = malloc(sz);
Thejaswani Putta6f5225c2019-04-11 18:36:08 -070016 if (d)
17 memcpy(d, s, sz);
Thomas Heijligen92043552019-01-29 12:48:01 +010018 return d;
19}
20
21char *strconcat(const char *s1, const char *s2)
22{
Julius Wernera66c9b82019-05-20 14:53:47 -070023 if (!ENV_RAMSTAGE)
24 dead_code(); /* This can't be used without malloc(). */
25
Thomas Heijligen92043552019-01-29 12:48:01 +010026 size_t sz_1 = strlen(s1);
27 size_t sz_2 = strlen(s2);
28 char *d = malloc(sz_1 + sz_2 + 1);
Thejaswani Putta6f5225c2019-04-11 18:36:08 -070029 if (d) {
30 memcpy(d, s1, sz_1);
31 memcpy(d + sz_1, s2, sz_2 + 1);
32 }
Thomas Heijligen92043552019-01-29 12:48:01 +010033 return d;
34}
Julius Wernera66c9b82019-05-20 14:53:47 -070035
36size_t strnlen(const char *src, size_t max)
37{
38 size_t i = 0;
39 while ((*src++) && (i < max))
40 i++;
41 return i;
42}
43
44size_t strlen(const char *src)
45{
46 size_t i = 0;
47 while (*src++)
48 i++;
49 return i;
50}
51
52char *strchr(const char *s, int c)
53{
54 do {
55 if (*s == c)
56 return (char *)s;
57 } while (*s++);
58
59 return NULL;
60}
61
62char *strrchr(const char *s, int c)
63{
64 char *p = NULL;
65
66 do {
67 if (*s == c)
68 p = (char *)s;
69 } while (*s++);
70
71 return p;
72}
73
Felix Heldf04e5f9a2024-06-26 17:59:29 +020074char *strncpy(char *to, const char *from, size_t count)
Julius Wernera66c9b82019-05-20 14:53:47 -070075{
76 char *ret = to;
77 char data;
78
79 while (count > 0) {
80 count--;
81 data = *from++;
82 *to++ = data;
83 if (data == '\0')
84 break;
85 }
86
87 while (count > 0) {
88 count--;
89 *to++ = '\0';
90 }
91 return ret;
92}
93
94char *strcpy(char *dst, const char *src)
95{
96 char *ptr = dst;
97
98 while (*src)
99 *dst++ = *src++;
100 *dst = '\0';
101
102 return ptr;
103}
104
105int strcmp(const char *s1, const char *s2)
106{
107 int r;
108
109 while ((r = (*s1 - *s2)) == 0 && *s1) {
110 s1++;
111 s2++;
112 }
113 return r;
114}
115
Felix Heldf04e5f9a2024-06-26 17:59:29 +0200116int strncmp(const char *s1, const char *s2, size_t maxlen)
Julius Wernera66c9b82019-05-20 14:53:47 -0700117{
Felix Helda3dc6c02024-06-26 20:29:59 +0200118 size_t i;
Julius Wernera66c9b82019-05-20 14:53:47 -0700119
120 for (i = 0; i < maxlen; i++) {
121 if ((s1[i] != s2[i]) || (s1[i] == '\0'))
122 return s1[i] - s2[i];
123 }
124
125 return 0;
126}
127
Felix Helda41e5f12024-06-26 18:03:28 +0200128size_t strspn(const char *str, const char *spn)
Yuji Sasaki6b212d82019-06-12 17:42:19 -0700129{
Felix Helda41e5f12024-06-26 18:03:28 +0200130 size_t ret = 0;
Yuji Sasaki6b212d82019-06-12 17:42:19 -0700131
132 while (*str != 0) {
133 const char *p;
134 for (p = spn; *str != *p; p++)
135 if (*p == '\0')
136 return ret;
137 ret++;
138 str++;
139 }
140 return ret;
141}
142
Felix Helda41e5f12024-06-26 18:03:28 +0200143size_t strcspn(const char *str, const char *spn)
Yuji Sasaki6b212d82019-06-12 17:42:19 -0700144{
Felix Helda41e5f12024-06-26 18:03:28 +0200145 size_t ret = 0;
Yuji Sasaki6b212d82019-06-12 17:42:19 -0700146
147 while (*str != 0) {
148 const char *p;
149 for (p = spn; *p != '\0'; p++)
150 if (*p == *str)
151 return ret;
152 ret++;
153 str++;
154 }
155 return ret;
156}
157
Jes Klinke683ac6f2020-07-31 09:58:49 -0700158char *strstr(const char *haystack, const char *needle)
159{
160 size_t needle_len = strlen(needle);
161 for (; *haystack; haystack++) {
162 if (!strncmp(haystack, needle, needle_len))
163 return (char *)haystack;
164 }
165 return NULL;
166}
167
harshit7a6f27c2020-05-15 10:40:02 +0530168char *strtok_r(char *str, const char *delim, char **ptr)
169{
170 char *start;
171 char *end;
172
173 if (str == NULL)
174 str = *ptr;
175 start = str + strspn(str, delim);
176 if (start[0] == '\0')
177 return NULL;
178
179 end = start + strcspn(start, delim);
180 *ptr = end;
181 if (end[0] != '\0')
182 *(*ptr)++ = '\0';
183 return start;
184}
185
186char *strtok(char *str, const char *delim)
187{
188 static char *strtok_ptr;
189
190 return strtok_r(str, delim, &strtok_ptr);
191}
192
Yuji Sasaki6b212d82019-06-12 17:42:19 -0700193long atol(const char *str)
194{
195 long ret = 0;
196 long sign = 1;
197
198 str += strspn(str, " \t\n\r\f\v");
199
200 if (*str == '+') {
201 sign = 1;
202 str++;
203 } else if (*str == '-') {
204 sign = -1;
205 str++;
206 }
207
208 while (isdigit(*str)) {
209 ret *= 10;
210 ret += *str++ - '0';
211 }
212 return ret * sign;
213}