xref: /kvm-unit-tests/lib/string.c (revision 4b6da8266e20882f41cdbbe254b08b900a5b9fbe)
1*4b6da826SThomas Huth /*
2*4b6da826SThomas Huth  * libc string functions
3*4b6da826SThomas Huth  *
4*4b6da826SThomas Huth  * This code is free software; you can redistribute it and/or modify it
5*4b6da826SThomas Huth  * under the terms of the GNU Library General Public License version 2.
6*4b6da826SThomas Huth  */
7*4b6da826SThomas Huth 
87d36db35SAvi Kivity #include "libcflat.h"
97d36db35SAvi Kivity 
107d36db35SAvi Kivity unsigned long strlen(const char *buf)
117d36db35SAvi Kivity {
127d36db35SAvi Kivity     unsigned long len = 0;
137d36db35SAvi Kivity 
147d36db35SAvi Kivity     while (*buf++)
157d36db35SAvi Kivity 	++len;
167d36db35SAvi Kivity     return len;
177d36db35SAvi Kivity }
187d36db35SAvi Kivity 
197d36db35SAvi Kivity char *strcat(char *dest, const char *src)
207d36db35SAvi Kivity {
217d36db35SAvi Kivity     char *p = dest;
227d36db35SAvi Kivity 
237d36db35SAvi Kivity     while (*p)
247d36db35SAvi Kivity 	++p;
257d36db35SAvi Kivity     while ((*p++ = *src++) != 0)
267d36db35SAvi Kivity 	;
277d36db35SAvi Kivity     return dest;
287d36db35SAvi Kivity }
297d36db35SAvi Kivity 
30782ebe33SAndrew Jones char *strcpy(char *dest, const char *src)
31782ebe33SAndrew Jones {
32782ebe33SAndrew Jones     *dest = 0;
33782ebe33SAndrew Jones     return strcat(dest, src);
34782ebe33SAndrew Jones }
35782ebe33SAndrew Jones 
364fd53297SRadim Krčmář int strncmp(const char *a, const char *b, size_t n)
374fd53297SRadim Krčmář {
384fd53297SRadim Krčmář     for (; n--; ++a, ++b)
394fd53297SRadim Krčmář         if (*a != *b || *a == '\0')
404fd53297SRadim Krčmář             return *a - *b;
414fd53297SRadim Krčmář 
424fd53297SRadim Krčmář     return 0;
434fd53297SRadim Krčmář }
444fd53297SRadim Krčmář 
4569da6c87SAvi Kivity int strcmp(const char *a, const char *b)
4669da6c87SAvi Kivity {
474fd53297SRadim Krčmář     return strncmp(a, b, SIZE_MAX);
4869da6c87SAvi Kivity }
4969da6c87SAvi Kivity 
50782ebe33SAndrew Jones char *strchr(const char *s, int c)
51782ebe33SAndrew Jones {
52782ebe33SAndrew Jones     while (*s != (char)c)
53782ebe33SAndrew Jones 	if (*s++ == '\0')
54782ebe33SAndrew Jones 	    return NULL;
55782ebe33SAndrew Jones     return (char *)s;
56782ebe33SAndrew Jones }
57782ebe33SAndrew Jones 
5853da5cc0SAndrew Jones char *strstr(const char *s1, const char *s2)
5953da5cc0SAndrew Jones {
6053da5cc0SAndrew Jones     size_t l1, l2;
6153da5cc0SAndrew Jones 
6253da5cc0SAndrew Jones     l2 = strlen(s2);
6353da5cc0SAndrew Jones     if (!l2)
6453da5cc0SAndrew Jones 	return (char *)s1;
6553da5cc0SAndrew Jones     l1 = strlen(s1);
6653da5cc0SAndrew Jones     while (l1 >= l2) {
6753da5cc0SAndrew Jones 	l1--;
6853da5cc0SAndrew Jones 	if (!memcmp(s1, s2, l2))
6953da5cc0SAndrew Jones 	    return (char *)s1;
7053da5cc0SAndrew Jones 	s1++;
7153da5cc0SAndrew Jones     }
7253da5cc0SAndrew Jones     return NULL;
7353da5cc0SAndrew Jones }
7453da5cc0SAndrew Jones 
757d36db35SAvi Kivity void *memset(void *s, int c, size_t n)
767d36db35SAvi Kivity {
777d36db35SAvi Kivity     size_t i;
787d36db35SAvi Kivity     char *a = s;
797d36db35SAvi Kivity 
807d36db35SAvi Kivity     for (i = 0; i < n; ++i)
817d36db35SAvi Kivity         a[i] = c;
827d36db35SAvi Kivity 
837d36db35SAvi Kivity     return s;
847d36db35SAvi Kivity }
851b708e8cSJason Wang 
868d68030eSArthur Chunqi Li void *memcpy(void *dest, const void *src, size_t n)
878d68030eSArthur Chunqi Li {
888d68030eSArthur Chunqi Li     size_t i;
898d68030eSArthur Chunqi Li     char *a = dest;
908d68030eSArthur Chunqi Li     const char *b = src;
918d68030eSArthur Chunqi Li 
928d68030eSArthur Chunqi Li     for (i = 0; i < n; ++i)
938d68030eSArthur Chunqi Li         a[i] = b[i];
948d68030eSArthur Chunqi Li 
958d68030eSArthur Chunqi Li     return dest;
968d68030eSArthur Chunqi Li }
978d68030eSArthur Chunqi Li 
98782ebe33SAndrew Jones int memcmp(const void *s1, const void *s2, size_t n)
99782ebe33SAndrew Jones {
100782ebe33SAndrew Jones     const unsigned char *a = s1, *b = s2;
101782ebe33SAndrew Jones     int ret = 0;
102782ebe33SAndrew Jones 
103782ebe33SAndrew Jones     while (n--) {
104782ebe33SAndrew Jones 	ret = *a - *b;
105782ebe33SAndrew Jones 	if (ret)
106782ebe33SAndrew Jones 	    break;
107782ebe33SAndrew Jones 	++a, ++b;
108782ebe33SAndrew Jones     }
109782ebe33SAndrew Jones     return ret;
110782ebe33SAndrew Jones }
111782ebe33SAndrew Jones 
112782ebe33SAndrew Jones void *memmove(void *dest, const void *src, size_t n)
113782ebe33SAndrew Jones {
114782ebe33SAndrew Jones     const unsigned char *s = src;
115782ebe33SAndrew Jones     unsigned char *d = dest;
116782ebe33SAndrew Jones 
117782ebe33SAndrew Jones     if (d <= s) {
118782ebe33SAndrew Jones 	while (n--)
119782ebe33SAndrew Jones 	    *d++ = *s++;
120782ebe33SAndrew Jones     } else {
121782ebe33SAndrew Jones 	d += n, s += n;
122782ebe33SAndrew Jones 	while (n--)
123782ebe33SAndrew Jones 	    *--d = *--s;
124782ebe33SAndrew Jones     }
125782ebe33SAndrew Jones     return dest;
126782ebe33SAndrew Jones }
127782ebe33SAndrew Jones 
128782ebe33SAndrew Jones void *memchr(const void *s, int c, size_t n)
129782ebe33SAndrew Jones {
130782ebe33SAndrew Jones     const unsigned char *str = s, chr = (unsigned char)c;
131782ebe33SAndrew Jones 
132782ebe33SAndrew Jones     while (n--)
133782ebe33SAndrew Jones 	if (*str++ == chr)
134782ebe33SAndrew Jones 	    return (void *)(str - 1);
135782ebe33SAndrew Jones     return NULL;
136782ebe33SAndrew Jones }
137782ebe33SAndrew Jones 
1381b708e8cSJason Wang long atol(const char *ptr)
1391b708e8cSJason Wang {
1401b708e8cSJason Wang     long acc = 0;
1411b708e8cSJason Wang     const char *s = ptr;
1421b708e8cSJason Wang     int neg, c;
1431b708e8cSJason Wang 
1441b708e8cSJason Wang     while (*s == ' ' || *s == '\t')
1451b708e8cSJason Wang         s++;
1461b708e8cSJason Wang     if (*s == '-'){
1471b708e8cSJason Wang         neg = 1;
1481b708e8cSJason Wang         s++;
1491b708e8cSJason Wang     } else {
1501b708e8cSJason Wang         neg = 0;
1511b708e8cSJason Wang         if (*s == '+')
1521b708e8cSJason Wang             s++;
1531b708e8cSJason Wang     }
1541b708e8cSJason Wang 
1551b708e8cSJason Wang     while (*s) {
1561b708e8cSJason Wang         if (*s < '0' || *s > '9')
1571b708e8cSJason Wang             break;
1581b708e8cSJason Wang         c = *s - '0';
1591b708e8cSJason Wang         acc = acc * 10 + c;
1601b708e8cSJason Wang         s++;
1611b708e8cSJason Wang     }
1621b708e8cSJason Wang 
1631b708e8cSJason Wang     if (neg)
1641b708e8cSJason Wang         acc = -acc;
1651b708e8cSJason Wang 
1661b708e8cSJason Wang     return acc;
1671b708e8cSJason Wang }
16869205bf1SAndrew Jones 
16969205bf1SAndrew Jones extern char **environ;
17069205bf1SAndrew Jones 
17169205bf1SAndrew Jones char *getenv(const char *name)
17269205bf1SAndrew Jones {
17369205bf1SAndrew Jones     char **envp = environ, *delim;
17469205bf1SAndrew Jones 
17569205bf1SAndrew Jones     while (*envp) {
17669205bf1SAndrew Jones         delim = strchr(*envp, '=');
17769205bf1SAndrew Jones         if (delim && strncmp(name, *envp, delim - *envp) == 0)
17869205bf1SAndrew Jones             return delim + 1;
17969205bf1SAndrew Jones         ++envp;
18069205bf1SAndrew Jones     }
18169205bf1SAndrew Jones     return NULL;
18269205bf1SAndrew Jones }
183