xref: /kvm-unit-tests/lib/string.c (revision 69205bf19dcd1493476a5699d3c402c0a0e56eef)
17d36db35SAvi Kivity #include "libcflat.h"
27d36db35SAvi Kivity 
37d36db35SAvi Kivity unsigned long strlen(const char *buf)
47d36db35SAvi Kivity {
57d36db35SAvi Kivity     unsigned long len = 0;
67d36db35SAvi Kivity 
77d36db35SAvi Kivity     while (*buf++)
87d36db35SAvi Kivity 	++len;
97d36db35SAvi Kivity     return len;
107d36db35SAvi Kivity }
117d36db35SAvi Kivity 
127d36db35SAvi Kivity char *strcat(char *dest, const char *src)
137d36db35SAvi Kivity {
147d36db35SAvi Kivity     char *p = dest;
157d36db35SAvi Kivity 
167d36db35SAvi Kivity     while (*p)
177d36db35SAvi Kivity 	++p;
187d36db35SAvi Kivity     while ((*p++ = *src++) != 0)
197d36db35SAvi Kivity 	;
207d36db35SAvi Kivity     return dest;
217d36db35SAvi Kivity }
227d36db35SAvi Kivity 
23782ebe33SAndrew Jones char *strcpy(char *dest, const char *src)
24782ebe33SAndrew Jones {
25782ebe33SAndrew Jones     *dest = 0;
26782ebe33SAndrew Jones     return strcat(dest, src);
27782ebe33SAndrew Jones }
28782ebe33SAndrew Jones 
294fd53297SRadim Krčmář int strncmp(const char *a, const char *b, size_t n)
304fd53297SRadim Krčmář {
314fd53297SRadim Krčmář     for (; n--; ++a, ++b)
324fd53297SRadim Krčmář         if (*a != *b || *a == '\0')
334fd53297SRadim Krčmář             return *a - *b;
344fd53297SRadim Krčmář 
354fd53297SRadim Krčmář     return 0;
364fd53297SRadim Krčmář }
374fd53297SRadim Krčmář 
3869da6c87SAvi Kivity int strcmp(const char *a, const char *b)
3969da6c87SAvi Kivity {
404fd53297SRadim Krčmář     return strncmp(a, b, SIZE_MAX);
4169da6c87SAvi Kivity }
4269da6c87SAvi Kivity 
43782ebe33SAndrew Jones char *strchr(const char *s, int c)
44782ebe33SAndrew Jones {
45782ebe33SAndrew Jones     while (*s != (char)c)
46782ebe33SAndrew Jones 	if (*s++ == '\0')
47782ebe33SAndrew Jones 	    return NULL;
48782ebe33SAndrew Jones     return (char *)s;
49782ebe33SAndrew Jones }
50782ebe33SAndrew Jones 
5153da5cc0SAndrew Jones char *strstr(const char *s1, const char *s2)
5253da5cc0SAndrew Jones {
5353da5cc0SAndrew Jones     size_t l1, l2;
5453da5cc0SAndrew Jones 
5553da5cc0SAndrew Jones     l2 = strlen(s2);
5653da5cc0SAndrew Jones     if (!l2)
5753da5cc0SAndrew Jones 	return (char *)s1;
5853da5cc0SAndrew Jones     l1 = strlen(s1);
5953da5cc0SAndrew Jones     while (l1 >= l2) {
6053da5cc0SAndrew Jones 	l1--;
6153da5cc0SAndrew Jones 	if (!memcmp(s1, s2, l2))
6253da5cc0SAndrew Jones 	    return (char *)s1;
6353da5cc0SAndrew Jones 	s1++;
6453da5cc0SAndrew Jones     }
6553da5cc0SAndrew Jones     return NULL;
6653da5cc0SAndrew Jones }
6753da5cc0SAndrew Jones 
687d36db35SAvi Kivity void *memset(void *s, int c, size_t n)
697d36db35SAvi Kivity {
707d36db35SAvi Kivity     size_t i;
717d36db35SAvi Kivity     char *a = s;
727d36db35SAvi Kivity 
737d36db35SAvi Kivity     for (i = 0; i < n; ++i)
747d36db35SAvi Kivity         a[i] = c;
757d36db35SAvi Kivity 
767d36db35SAvi Kivity     return s;
777d36db35SAvi Kivity }
781b708e8cSJason Wang 
798d68030eSArthur Chunqi Li void *memcpy(void *dest, const void *src, size_t n)
808d68030eSArthur Chunqi Li {
818d68030eSArthur Chunqi Li     size_t i;
828d68030eSArthur Chunqi Li     char *a = dest;
838d68030eSArthur Chunqi Li     const char *b = src;
848d68030eSArthur Chunqi Li 
858d68030eSArthur Chunqi Li     for (i = 0; i < n; ++i)
868d68030eSArthur Chunqi Li         a[i] = b[i];
878d68030eSArthur Chunqi Li 
888d68030eSArthur Chunqi Li     return dest;
898d68030eSArthur Chunqi Li }
908d68030eSArthur Chunqi Li 
91782ebe33SAndrew Jones int memcmp(const void *s1, const void *s2, size_t n)
92782ebe33SAndrew Jones {
93782ebe33SAndrew Jones     const unsigned char *a = s1, *b = s2;
94782ebe33SAndrew Jones     int ret = 0;
95782ebe33SAndrew Jones 
96782ebe33SAndrew Jones     while (n--) {
97782ebe33SAndrew Jones 	ret = *a - *b;
98782ebe33SAndrew Jones 	if (ret)
99782ebe33SAndrew Jones 	    break;
100782ebe33SAndrew Jones 	++a, ++b;
101782ebe33SAndrew Jones     }
102782ebe33SAndrew Jones     return ret;
103782ebe33SAndrew Jones }
104782ebe33SAndrew Jones 
105782ebe33SAndrew Jones void *memmove(void *dest, const void *src, size_t n)
106782ebe33SAndrew Jones {
107782ebe33SAndrew Jones     const unsigned char *s = src;
108782ebe33SAndrew Jones     unsigned char *d = dest;
109782ebe33SAndrew Jones 
110782ebe33SAndrew Jones     if (d <= s) {
111782ebe33SAndrew Jones 	while (n--)
112782ebe33SAndrew Jones 	    *d++ = *s++;
113782ebe33SAndrew Jones     } else {
114782ebe33SAndrew Jones 	d += n, s += n;
115782ebe33SAndrew Jones 	while (n--)
116782ebe33SAndrew Jones 	    *--d = *--s;
117782ebe33SAndrew Jones     }
118782ebe33SAndrew Jones     return dest;
119782ebe33SAndrew Jones }
120782ebe33SAndrew Jones 
121782ebe33SAndrew Jones void *memchr(const void *s, int c, size_t n)
122782ebe33SAndrew Jones {
123782ebe33SAndrew Jones     const unsigned char *str = s, chr = (unsigned char)c;
124782ebe33SAndrew Jones 
125782ebe33SAndrew Jones     while (n--)
126782ebe33SAndrew Jones 	if (*str++ == chr)
127782ebe33SAndrew Jones 	    return (void *)(str - 1);
128782ebe33SAndrew Jones     return NULL;
129782ebe33SAndrew Jones }
130782ebe33SAndrew Jones 
1311b708e8cSJason Wang long atol(const char *ptr)
1321b708e8cSJason Wang {
1331b708e8cSJason Wang     long acc = 0;
1341b708e8cSJason Wang     const char *s = ptr;
1351b708e8cSJason Wang     int neg, c;
1361b708e8cSJason Wang 
1371b708e8cSJason Wang     while (*s == ' ' || *s == '\t')
1381b708e8cSJason Wang         s++;
1391b708e8cSJason Wang     if (*s == '-'){
1401b708e8cSJason Wang         neg = 1;
1411b708e8cSJason Wang         s++;
1421b708e8cSJason Wang     } else {
1431b708e8cSJason Wang         neg = 0;
1441b708e8cSJason Wang         if (*s == '+')
1451b708e8cSJason Wang             s++;
1461b708e8cSJason Wang     }
1471b708e8cSJason Wang 
1481b708e8cSJason Wang     while (*s) {
1491b708e8cSJason Wang         if (*s < '0' || *s > '9')
1501b708e8cSJason Wang             break;
1511b708e8cSJason Wang         c = *s - '0';
1521b708e8cSJason Wang         acc = acc * 10 + c;
1531b708e8cSJason Wang         s++;
1541b708e8cSJason Wang     }
1551b708e8cSJason Wang 
1561b708e8cSJason Wang     if (neg)
1571b708e8cSJason Wang         acc = -acc;
1581b708e8cSJason Wang 
1591b708e8cSJason Wang     return acc;
1601b708e8cSJason Wang }
161*69205bf1SAndrew Jones 
162*69205bf1SAndrew Jones extern char **environ;
163*69205bf1SAndrew Jones 
164*69205bf1SAndrew Jones char *getenv(const char *name)
165*69205bf1SAndrew Jones {
166*69205bf1SAndrew Jones     char **envp = environ, *delim;
167*69205bf1SAndrew Jones 
168*69205bf1SAndrew Jones     while (*envp) {
169*69205bf1SAndrew Jones         delim = strchr(*envp, '=');
170*69205bf1SAndrew Jones         if (delim && strncmp(name, *envp, delim - *envp) == 0)
171*69205bf1SAndrew Jones             return delim + 1;
172*69205bf1SAndrew Jones         ++envp;
173*69205bf1SAndrew Jones     }
174*69205bf1SAndrew Jones     return NULL;
175*69205bf1SAndrew Jones }
176