ld_string.h 5.2 KB

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