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