xref: /kvm-unit-tests/lib/string.c (revision 9c51d8c9715dcde00525266f094e3fb0fe6a7950)
1 #include "libcflat.h"
2 
3 unsigned long strlen(const char *buf)
4 {
5     unsigned long len = 0;
6 
7     while (*buf++)
8 	++len;
9     return len;
10 }
11 
12 char *strcat(char *dest, const char *src)
13 {
14     char *p = dest;
15 
16     while (*p)
17 	++p;
18     while ((*p++ = *src++) != 0)
19 	;
20     return dest;
21 }
22 
23 char *strcpy(char *dest, const char *src)
24 {
25     *dest = 0;
26     return strcat(dest, src);
27 }
28 
29 int strncmp(const char *a, const char *b, size_t n)
30 {
31     for (; n--; ++a, ++b)
32         if (*a != *b || *a == '\0')
33             return *a - *b;
34 
35     return 0;
36 }
37 
38 int strcmp(const char *a, const char *b)
39 {
40     return strncmp(a, b, SIZE_MAX);
41 }
42 
43 char *strchr(const char *s, int c)
44 {
45     while (*s != (char)c)
46 	if (*s++ == '\0')
47 	    return NULL;
48     return (char *)s;
49 }
50 
51 char *strstr(const char *s1, const char *s2)
52 {
53     size_t l1, l2;
54 
55     l2 = strlen(s2);
56     if (!l2)
57 	return (char *)s1;
58     l1 = strlen(s1);
59     while (l1 >= l2) {
60 	l1--;
61 	if (!memcmp(s1, s2, l2))
62 	    return (char *)s1;
63 	s1++;
64     }
65     return NULL;
66 }
67 
68 void *memset(void *s, int c, size_t n)
69 {
70     size_t i;
71     char *a = s;
72 
73     for (i = 0; i < n; ++i)
74         a[i] = c;
75 
76     return s;
77 }
78 
79 void *memcpy(void *dest, const void *src, size_t n)
80 {
81     size_t i;
82     char *a = dest;
83     const char *b = src;
84 
85     for (i = 0; i < n; ++i)
86         a[i] = b[i];
87 
88     return dest;
89 }
90 
91 int memcmp(const void *s1, const void *s2, size_t n)
92 {
93     const unsigned char *a = s1, *b = s2;
94     int ret = 0;
95 
96     while (n--) {
97 	ret = *a - *b;
98 	if (ret)
99 	    break;
100 	++a, ++b;
101     }
102     return ret;
103 }
104 
105 void *memmove(void *dest, const void *src, size_t n)
106 {
107     const unsigned char *s = src;
108     unsigned char *d = dest;
109 
110     if (d <= s) {
111 	while (n--)
112 	    *d++ = *s++;
113     } else {
114 	d += n, s += n;
115 	while (n--)
116 	    *--d = *--s;
117     }
118     return dest;
119 }
120 
121 void *memchr(const void *s, int c, size_t n)
122 {
123     const unsigned char *str = s, chr = (unsigned char)c;
124 
125     while (n--)
126 	if (*str++ == chr)
127 	    return (void *)(str - 1);
128     return NULL;
129 }
130 
131 long atol(const char *ptr)
132 {
133     long acc = 0;
134     const char *s = ptr;
135     int neg, c;
136 
137     while (*s == ' ' || *s == '\t')
138         s++;
139     if (*s == '-'){
140         neg = 1;
141         s++;
142     } else {
143         neg = 0;
144         if (*s == '+')
145             s++;
146     }
147 
148     while (*s) {
149         if (*s < '0' || *s > '9')
150             break;
151         c = *s - '0';
152         acc = acc * 10 + c;
153         s++;
154     }
155 
156     if (neg)
157         acc = -acc;
158 
159     return acc;
160 }
161