1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#ifndef _LINUX_STRING_H_
#define _LINUX_STRING_H_
#include <sys/types.h> /* for size_t */
#ifndef NULL
#define NULL ((void *) 0)
#endif
extern inline char * _dl_strcpy(char * dst,const char *src)
{
register char *ptr = dst;
while (*src)
*dst++ = *src++;
*dst = '\0';
return ptr;
}
extern inline int _dl_strcmp(const char * s1,const char * s2)
{
unsigned register char c1, c2;
do {
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}
extern inline int _dl_strncmp(const char * s1,const char * s2,size_t len)
{
unsigned register char c1 = '\0';
unsigned register char c2 = '\0';
while (len > 0) {
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c1 - c2;
len--;
}
return c1 - c2;
}
extern inline char * _dl_strchr(const char * str,int c)
{
register char ch;
do {
if ((ch = *str) == c)
return (char *) str;
str++;
}
while (ch);
return 0;
}
extern inline size_t _dl_strlen(const char * str)
{
register char *ptr = (char *) str;
while (*ptr)
ptr++;
return (ptr - str);
}
extern inline void * _dl_memcpy(void * dst, const void * src, size_t len)
{
register char *a = dst;
register const char *b = src;
while (len--)
*a++ = *b++;
return dst;
}
extern inline int _dl_memcmp(const void * s1,const void * s2,size_t len)
{
unsigned char *c1 = (unsigned char *)s1;
unsigned char *c2 = (unsigned char *)s2;
while (len--) {
if (*c1 != *c2)
return *c1 - *c2;
c1++;
c2++;
}
return 0;
}
extern inline void * _dl_memset(void * str,int c,size_t len)
{
register char *a = str;
while (len--)
*a++ = c;
return str;
}
/* Early on, we can't call printf, so use this to print out
* numbers using the SEND_STDERR() macro */
static inline char *_dl_simple_itol(unsigned long i)
{
/* 21 digits plus null terminator, good for 64-bit or smaller ints */
static char local[22];
char *p = &local[21];
*p-- = '\0';
do {
*p-- = '0' + i % 10;
i /= 10;
} while (i > 0);
return p + 1;
}
#endif
|