1 #ifndef _LINUX_STRING_H_
2 #define _LINUX_STRING_H_
4 #include <sys/types.h> /* for size_t */
6 extern void *_dl_malloc(int size);
7 extern char *_dl_getenv(const char *symbol, char **envp);
8 extern void _dl_unsetenv(const char *symbol, char **envp);
9 extern char *_dl_strdup(const char *string);
10 extern void _dl_dprintf(int, const char *, ...);
13 static size_t _dl_strlen(const char * str);
14 static char *_dl_strcat(char *dst, const char *src);
15 static char * _dl_strcpy(char * dst,const char *src);
16 static int _dl_strcmp(const char * s1,const char * s2);
17 static int _dl_strncmp(const char * s1,const char * s2,size_t len);
18 static char * _dl_strchr(const char * str,int c);
19 static char *_dl_strrchr(const char *str, int c);
20 static char *_dl_strstr(const char *s1, const char *s2);
21 static void * _dl_memcpy(void * dst, const void * src, size_t len);
22 static int _dl_memcmp(const void * s1,const void * s2,size_t len);
23 static void *_dl_memset(void * str,int c,size_t len);
24 static char *_dl_get_last_path_component(char *path);
25 static char *_dl_simple_ltoa(char * local, unsigned long i);
26 static char *_dl_simple_ltoahex(char * local, unsigned long i);
29 #define NULL ((void *) 0)
32 static inline size_t _dl_strlen(const char * str)
34 register char *ptr = (char *) str;
41 static inline char *_dl_strcat(char *dst, const char *src)
43 register char *ptr = dst;
55 static inline char * _dl_strcpy(char * dst,const char *src)
57 register char *ptr = dst;
66 static inline int _dl_strcmp(const char * s1,const char * s2)
68 register unsigned char c1, c2;
71 c1 = (unsigned char) *s1++;
72 c2 = (unsigned char) *s2++;
81 static inline int _dl_strncmp(const char * s1,const char * s2,size_t len)
83 register unsigned char c1 = '\0';
84 register unsigned char c2 = '\0';
87 c1 = (unsigned char) *s1++;
88 c2 = (unsigned char) *s2++;
89 if (c1 == '\0' || c1 != c2)
97 static inline char * _dl_strchr(const char * str,int c)
102 if ((ch = *str) == c)
111 static inline char *_dl_strrchr(const char *str, int c)
113 register char *prev = 0;
114 register char *ptr = (char *) str;
116 while (*ptr != '\0') {
127 static inline char *_dl_strstr(const char *s1, const char *s2)
129 register const char *s = s1;
130 register const char *p = s2;
149 static inline void * _dl_memcpy(void * dst, const void * src, size_t len)
151 register char *a = dst;
152 register const char *b = src;
161 static inline int _dl_memcmp(const void * s1,const void * s2,size_t len)
163 unsigned char *c1 = (unsigned char *)s1;
164 unsigned char *c2 = (unsigned char *)s2;
175 static inline void * _dl_memset(void * str,int c,size_t len)
177 register char *a = str;
185 static inline char *_dl_get_last_path_component(char *path)
188 register char *ptr = path;
189 register char *prev = 0;
195 /* strip trailing slashes */
196 while (s != path && *s == '/') {
200 /* find last component */
202 while (*ptr != '\0') {
209 if (s == NULL || s[1] == '\0')
215 /* Early on, we can't call printf, so use this to print out
216 * numbers using the SEND_STDERR() macro */
217 static inline char *_dl_simple_ltoa(char * local, unsigned long i)
219 /* 21 digits plus null terminator, good for 64-bit or smaller ints */
220 char *p = &local[22];
229 static inline char *_dl_simple_ltoahex(char * local, unsigned long i)
231 /* 21 digits plus null terminator, good for 64-bit or smaller ints */
232 char *p = &local[22];
235 char temp = i % 0x10;
239 *p-- = 'a' - 0x0a + temp;
248 #if defined mc68000 || defined __arm__ || defined __mips__ || defined __sh__
249 /* On some arches constant strings are referenced through the GOT. */
250 /* XXX Requires load_addr to be defined. */
251 #define SEND_STDERR(X) \
252 { const char *__s = (X); \
253 if (__s < (const char *) load_addr) __s += load_addr; \
254 _dl_write (2, __s, _dl_strlen (__s)); \
257 #define SEND_STDERR(X) _dl_write(2, X, _dl_strlen(X));
260 #define SEND_ADDRESS_STDERR(X, add_a_newline) { \
261 char tmp[22], *tmp1; \
262 _dl_memset(tmp, 0, sizeof(tmp)); \
263 tmp1=_dl_simple_ltoahex( tmp, (unsigned long)(X)); \
264 _dl_write(2, tmp1, _dl_strlen(tmp1)); \
265 if (add_a_newline) { \
267 _dl_write(2, tmp, 1); \
271 #define SEND_NUMBER_STDERR(X, add_a_newline) { \
272 char tmp[22], *tmp1; \
273 _dl_memset(tmp, 0, sizeof(tmp)); \
274 tmp1=_dl_simple_ltoa( tmp, (unsigned long)(X)); \
275 _dl_write(2, tmp1, _dl_strlen(tmp1)); \
276 if (add_a_newline) { \
278 _dl_write(2, tmp, 1); \