coreboot/src/lib/string.c

222 lines
3.1 KiB
C

#include <assert.h>
#include <ctype.h>
#include <rules.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
char *strdup(const char *s)
{
if (!ENV_RAMSTAGE)
dead_code(); /* This can't be used without malloc(). */
size_t sz = strlen(s) + 1;
char *d = malloc(sz);
if (d)
memcpy(d, s, sz);
return d;
}
char *strconcat(const char *s1, const char *s2)
{
if (!ENV_RAMSTAGE)
dead_code(); /* This can't be used without malloc(). */
size_t sz_1 = strlen(s1);
size_t sz_2 = strlen(s2);
char *d = malloc(sz_1 + sz_2 + 1);
if (d) {
memcpy(d, s1, sz_1);
memcpy(d + sz_1, s2, sz_2 + 1);
}
return d;
}
size_t strnlen(const char *src, size_t max)
{
size_t i = 0;
while ((*src++) && (i < max))
i++;
return i;
}
size_t strlen(const char *src)
{
size_t i = 0;
while (*src++)
i++;
return i;
}
char *strchr(const char *s, int c)
{
do {
if (*s == c)
return (char *)s;
} while (*s++);
return NULL;
}
char *strrchr(const char *s, int c)
{
char *p = NULL;
do {
if (*s == c)
p = (char *)s;
} while (*s++);
return p;
}
char *strncpy(char *to, const char *from, int count)
{
char *ret = to;
char data;
while (count > 0) {
count--;
data = *from++;
*to++ = data;
if (data == '\0')
break;
}
while (count > 0) {
count--;
*to++ = '\0';
}
return ret;
}
char *strcpy(char *dst, const char *src)
{
char *ptr = dst;
while (*src)
*dst++ = *src++;
*dst = '\0';
return ptr;
}
int strcmp(const char *s1, const char *s2)
{
int r;
while ((r = (*s1 - *s2)) == 0 && *s1) {
s1++;
s2++;
}
return r;
}
int strncmp(const char *s1, const char *s2, int maxlen)
{
int i;
for (i = 0; i < maxlen; i++) {
if ((s1[i] != s2[i]) || (s1[i] == '\0'))
return s1[i] - s2[i];
}
return 0;
}
unsigned int skip_atoi(char **s)
{
unsigned int i = 0;
while (isdigit(**s))
i = i*10 + *((*s)++) - '0';
return i;
}
int strspn(const char *str, const char *spn)
{
int ret = 0;
while (*str != 0) {
const char *p;
for (p = spn; *str != *p; p++)
if (*p == '\0')
return ret;
ret++;
str++;
}
return ret;
}
int strcspn(const char *str, const char *spn)
{
int ret = 0;
while (*str != 0) {
const char *p;
for (p = spn; *p != '\0'; p++)
if (*p == *str)
return ret;
ret++;
str++;
}
return ret;
}
char *strstr(const char *haystack, const char *needle)
{
size_t needle_len = strlen(needle);
for (; *haystack; haystack++) {
if (!strncmp(haystack, needle, needle_len))
return (char *)haystack;
}
return NULL;
}
char *strtok_r(char *str, const char *delim, char **ptr)
{
char *start;
char *end;
if (str == NULL)
str = *ptr;
start = str + strspn(str, delim);
if (start[0] == '\0')
return NULL;
end = start + strcspn(start, delim);
*ptr = end;
if (end[0] != '\0')
*(*ptr)++ = '\0';
return start;
}
char *strtok(char *str, const char *delim)
{
static char *strtok_ptr;
return strtok_r(str, delim, &strtok_ptr);
}
long atol(const char *str)
{
long ret = 0;
long sign = 1;
str += strspn(str, " \t\n\r\f\v");
if (*str == '+') {
sign = 1;
str++;
} else if (*str == '-') {
sign = -1;
str++;
}
while (isdigit(*str)) {
ret *= 10;
ret += *str++ - '0';
}
return ret * sign;
}