~linaro-toolchain-dev/linaro-toolchain-misc/kvm-boot-wrapper

32 by Peter Maydell
bootwrapper: Import C semihosting code
1
#include <string.h>
2
3
static void *__memmove_down(void *__dest, __const void *__src, size_t __n)
4
{
5
	unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src;
6
7
	while (__n--)
8
		*d++ = *s++;
9
10
	return __dest;
11
}
12
13
static void *__memmove_up(void *__dest, __const void *__src, size_t __n)
14
{
15
	unsigned char *d = (unsigned char *)__dest + __n - 1, *s = (unsigned char *)__src + __n - 1;
16
17
	while (__n--)
18
		*d-- = *s--;
19
20
	return __dest;
21
}
22
23
void *(memcpy)(void *__dest, __const void *__src, size_t __n)
24
{
25
	return __memmove_down(__dest, __src, __n);
26
}
27
28
void *(memmove)(void *__dest, __const void *__src, size_t __n)
29
{
30
	if(__dest > __src)
31
		return __memmove_up(__dest, __src, __n);
32
	else
33
		return __memmove_down(__dest, __src, __n);
34
}
35
36
void *(memchr)(void const *s, int c, size_t n)
37
{
38
	unsigned char const *_s = (unsigned char const *)s;
39
40
	while(n && *_s != c) {
41
		++_s;
42
		--n;
43
	}
44
45
	if(n)
46
		return (void *)_s;	/* the C library casts const away */
47
	else
48
		return (void *)0;
49
}
50
51
size_t (strlen)(const char *s)
52
{
53
	const char *sc = s;
54
55
	while (*sc != '\0')
56
		sc++;
57
	return sc - s;
58
}
59
60
void *(memset)(void *s, int c, size_t count)
61
{
62
	char *xs = s;
63
	while (count--)
64
		*xs++ = c;
65
	return s;
66
}
67
68
int (memcmp)(void const *p1, void const *p2, size_t n)
69
{
70
	unsigned char const *_p1 = p1;
71
	unsigned char const *_p2 = p2;
72
73
	while(n--) {
74
		if(*_p1 < *_p2)
75
			return -1;
76
		else if(*_p1 > *_p2)
77
			return 1;
78
79
		++_p1;
80
		++_p2;
81
	}
82
83
	return 0;
84
}
85
86
int (strcmp)(char const *s1, char const *s2)
87
{
88
	while(*s1 && *s2) {
89
		if(*s1 < *s2)
90
			return -1;
91
		else if(*s1 > *s2)
92
			return 1;
93
94
		++s1;
95
		++s2;
96
	}
97
98
	if(!*s1 && !*s2)
99
		return 0;
100
	else if(!*s1)
101
		return -1;
102
	else
103
		return 1;
104
}
105
106
int (strncmp)(char const *s1, char const *s2, size_t n)
107
{
108
	while(*s1 && *s2 && n--) {
109
		if(*s1 < *s2)
110
			return -1;
111
		else if(*s1 > *s2)
112
			return 1;
113
114
		++s1;
115
		++s2;
116
	}
117
118
	if(n == 0 || (!*s1 && !*s2))
119
		return 0;
120
	else if(!*s1)
121
		return -1;
122
	else
123
		return 1;
124
}
125
126
char *(strchr)(char const *s, int c)
127
{
128
	unsigned char const *_s = (unsigned char const *)s;
129
130
	while(*_s && *_s != c)
131
		++_s;
132
133
	if(*_s)
134
		return (char *)_s;	/* the C library casts const away */
135
	else
136
		return (char *)0;
137
}