string.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #ifndef _LINUX_STRING_H_
  2. #define _LINUX_STRING_H_
  3. #include <sys/types.h> /* for size_t */
  4. extern void *_dl_malloc(int size);
  5. extern char *_dl_getenv(char *symbol, char **envp);
  6. extern void _dl_unsetenv(char *symbol, char **envp);
  7. extern char *_dl_strdup(const char *string);
  8. extern void _dl_dprintf(int, const char *, ...);
  9. static size_t _dl_strlen(const char * str);
  10. static char * _dl_strcpy(char * dst,const char *src);
  11. static int _dl_strcmp(const char * s1,const char * s2);
  12. static int _dl_strncmp(const char * s1,const char * s2,size_t len);
  13. static char * _dl_strchr(const char * str,int c);
  14. static char *_dl_strrchr(const char *str, int c);
  15. static void * _dl_memcpy(void * dst, const void * src, size_t len);
  16. static int _dl_memcmp(const void * s1,const void * s2,size_t len);
  17. static void * _dl_memset(void * str,int c,size_t len);
  18. static char *_dl_get_last_path_component(char *path);
  19. static char *_dl_simple_ltoa(char * local, unsigned long i);
  20. static char *_dl_simple_ltoahex(char * local, unsigned long i);
  21. #ifndef NULL
  22. #define NULL ((void *) 0)
  23. #endif
  24. static inline size_t _dl_strlen(const char * str)
  25. {
  26. register char *ptr = (char *) str;
  27. while (*ptr)
  28. ptr++;
  29. return (ptr - str);
  30. }
  31. static inline char * _dl_strcpy(char * dst,const char *src)
  32. {
  33. register char *ptr = dst;
  34. while (*src)
  35. *dst++ = *src++;
  36. *dst = '\0';
  37. return ptr;
  38. }
  39. static inline int _dl_strcmp(const char * s1,const char * s2)
  40. {
  41. unsigned register char c1, c2;
  42. do {
  43. c1 = (unsigned char) *s1++;
  44. c2 = (unsigned char) *s2++;
  45. if (c1 == '\0')
  46. return c1 - c2;
  47. }
  48. while (c1 == c2);
  49. return c1 - c2;
  50. }
  51. static inline int _dl_strncmp(const char * s1,const char * s2,size_t len)
  52. {
  53. unsigned register char c1 = '\0';
  54. unsigned register char c2 = '\0';
  55. while (len > 0) {
  56. c1 = (unsigned char) *s1++;
  57. c2 = (unsigned char) *s2++;
  58. if (c1 == '\0' || c1 != c2)
  59. return c1 - c2;
  60. len--;
  61. }
  62. return c1 - c2;
  63. }
  64. static inline char * _dl_strchr(const char * str,int c)
  65. {
  66. register char ch;
  67. do {
  68. if ((ch = *str) == c)
  69. return (char *) str;
  70. str++;
  71. }
  72. while (ch);
  73. return 0;
  74. }
  75. static inline char *_dl_strrchr(const char *str, int c)
  76. {
  77. register char *prev = 0;
  78. register char *ptr = (char *) str;
  79. while (*ptr != '\0') {
  80. if (*ptr == c)
  81. prev = ptr;
  82. ptr++;
  83. }
  84. if (c == '\0')
  85. return(ptr);
  86. return(prev);
  87. }
  88. static inline void * _dl_memcpy(void * dst, const void * src, size_t len)
  89. {
  90. register char *a = dst;
  91. register const char *b = src;
  92. while (len--)
  93. *a++ = *b++;
  94. return dst;
  95. }
  96. static inline int _dl_memcmp(const void * s1,const void * s2,size_t len)
  97. {
  98. unsigned char *c1 = (unsigned char *)s1;
  99. unsigned char *c2 = (unsigned char *)s2;
  100. while (len--) {
  101. if (*c1 != *c2)
  102. return *c1 - *c2;
  103. c1++;
  104. c2++;
  105. }
  106. return 0;
  107. }
  108. static inline void * _dl_memset(void * str,int c,size_t len)
  109. {
  110. register char *a = str;
  111. while (len--)
  112. *a++ = c;
  113. return str;
  114. }
  115. static inline char *_dl_get_last_path_component(char *path)
  116. {
  117. char *s;
  118. register char *ptr = path;
  119. register char *prev = 0;
  120. while (*ptr)
  121. ptr++;
  122. s = ptr - 1;
  123. /* strip trailing slashes */
  124. while (s != path && *s == '/') {
  125. *s-- = '\0';
  126. }
  127. /* find last component */
  128. ptr = path;
  129. while (*ptr != '\0') {
  130. if (*ptr == '/')
  131. prev = ptr;
  132. ptr++;
  133. }
  134. s = prev;
  135. if (s == NULL || s[1] == '\0')
  136. return path;
  137. else
  138. return s+1;
  139. }
  140. /* Early on, we can't call printf, so use this to print out
  141. * numbers using the SEND_STDERR() macro */
  142. static inline char *_dl_simple_ltoa(char * local, unsigned long i)
  143. {
  144. /* 21 digits plus null terminator, good for 64-bit or smaller ints */
  145. char *p = &local[21];
  146. *p-- = '\0';
  147. do {
  148. *p-- = '0' + i % 10;
  149. i /= 10;
  150. } while (i > 0);
  151. return p + 1;
  152. }
  153. static inline char *_dl_simple_ltoahex(char * local, unsigned long i)
  154. {
  155. /* 21 digits plus null terminator, good for 64-bit or smaller ints */
  156. char *p = &local[21];
  157. *p-- = '\0';
  158. do {
  159. char temp = i % 0x10;
  160. if (temp <= 0x09)
  161. *p-- = '0' + temp;
  162. else
  163. *p-- = 'a' - 0x0a + temp;
  164. i /= 0x10;
  165. } while (i > 0);
  166. *p-- = 'x';
  167. *p-- = '0';
  168. return p + 1;
  169. }
  170. #if defined mc68000 || defined __arm__
  171. /* On some arches constant strings are referenced through the GOT. */
  172. /* XXX Requires load_addr to be defined. */
  173. #define SEND_STDERR(X) \
  174. { const char *__s = (X); \
  175. if (__s < (const char *) load_addr) __s += load_addr; \
  176. _dl_write (2, __s, _dl_strlen (__s)); \
  177. }
  178. #else
  179. #define SEND_STDERR(X) _dl_write(2, X, _dl_strlen(X));
  180. #endif
  181. #define SEND_ADDRESS_STDERR(X, add_a_newline) { \
  182. char tmp[13], *tmp1; \
  183. _dl_memset(tmp, 0, sizeof(tmp)); \
  184. tmp1=_dl_simple_ltoahex( tmp, (unsigned long)(X)); \
  185. _dl_write(2, tmp1, _dl_strlen(tmp1)); \
  186. if (add_a_newline) { \
  187. tmp[0]='\n'; \
  188. _dl_write(2, tmp, 1); \
  189. } \
  190. };
  191. #define SEND_NUMBER_STDERR(X, add_a_newline) { \
  192. char tmp[13], *tmp1; \
  193. _dl_memset(tmp, 0, sizeof(tmp)); \
  194. tmp1=_dl_simple_ltoahex( tmp, (unsigned long)(X)); \
  195. _dl_write(2, tmp1, _dl_strlen(tmp1)); \
  196. if (add_a_newline) { \
  197. tmp[0]='\n'; \
  198. _dl_write(2, tmp, 1); \
  199. } \
  200. };
  201. #endif