1
0

cstring.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-01-12 Meco Man The first version.
  9. */
  10. #include "posix/string.h"
  11. #include <ctype.h>
  12. #include <rtthread.h>
  13. #include <stdlib.h>
  14. /**
  15. * @brief erases the data in the n bytes of the memory starting at the
  16. * location pointed to by s, by writing zeros (bytes containing '\0') to that area.
  17. *
  18. * @note The bzero() function is deprecated (marked as LEGACY in POSIX. 1-2001).
  19. */
  20. void bzero(void* s, size_t n)
  21. {
  22. rt_memset(s, 0, n);
  23. }
  24. void bcopy(const void* src, void* dest, size_t n)
  25. {
  26. rt_memcpy(dest, src, n);
  27. }
  28. int bcmp(const void* s1, const void* s2, size_t n)
  29. {
  30. return rt_memcmp(s1, s2, n);
  31. }
  32. void explicit_bzero(void* s, size_t n)
  33. {
  34. volatile char* vs = (volatile char*)s;
  35. while (n)
  36. {
  37. *vs++ = 0;
  38. n--;
  39. }
  40. }
  41. char* index(const char* s, int c)
  42. {
  43. return strchr(s, c);
  44. }
  45. char* rindex(const char* s, int c)
  46. {
  47. return strrchr(s, c);
  48. }
  49. int ffs(int i)
  50. {
  51. int bit;
  52. if (0 == i)
  53. return 0;
  54. for (bit = 1; !(i & 1); ++bit)
  55. i >>= 1;
  56. return bit;
  57. }
  58. int ffsl(long i)
  59. {
  60. int bit;
  61. if (0 == i)
  62. return 0;
  63. for (bit = 1; !(i & 1); ++bit)
  64. i >>= 1;
  65. return bit;
  66. }
  67. int ffsll(long long i)
  68. {
  69. int bit;
  70. if (0 == i)
  71. return 0;
  72. for (bit = 1; !(i & 1); ++bit)
  73. i >>= 1;
  74. return bit;
  75. }
  76. /**
  77. * @brief The memchr() function scans the initial n bytes of the memory area pointed to
  78. * by s for the first instance of c. Both c and the bytes of the memory area
  79. * pointed to by s are interpreted as unsigned char.
  80. *
  81. * @note This function is GNU extension, available since glibc 2.1.91.
  82. */
  83. void* memrchr(const void* ptr, int ch, size_t pos)
  84. {
  85. char* end = (char*)ptr + pos - 1;
  86. while (end != ptr)
  87. {
  88. if (*end == ch)
  89. return end;
  90. end--;
  91. }
  92. return (*end == ch) ? (end) : (NULL);
  93. }
  94. size_t strnlen(const char *s, size_t maxlen)
  95. {
  96. const char *sc;
  97. for (sc = s; maxlen != 0 && *sc != '\0'; maxlen--, ++sc);
  98. return sc - s;
  99. }
  100. char* strchrnul(const char* s, int c)
  101. {
  102. while (*s != '\0' && *s != c)
  103. s++;
  104. return (char*)s;
  105. }
  106. int strcasecmp(const char* s1, const char* s2)
  107. {
  108. const unsigned char* u1 = (const unsigned char*)s1;
  109. const unsigned char* u2 = (const unsigned char*)s2;
  110. int result;
  111. while ((result = tolower(*u1) - tolower(*u2)) == 0 && *u1 != 0)
  112. {
  113. u1++;
  114. u2++;
  115. }
  116. return result;
  117. }
  118. int strncasecmp(const char* s1, const char* s2, size_t n)
  119. {
  120. const unsigned char* u1 = (const unsigned char*)s1;
  121. const unsigned char* u2 = (const unsigned char*)s2;
  122. int result;
  123. for (; n != 0; n--)
  124. {
  125. result = tolower(*u1) - tolower(*u2);
  126. if (result)
  127. return result;
  128. if (*u1 == 0)
  129. return 0;
  130. u1++;
  131. u2++;
  132. }
  133. return 0;
  134. }
  135. char *strdup(const char *s)
  136. {
  137. char *news = (char *)malloc(strlen(s) + 1);
  138. if (news)
  139. {
  140. strcpy(news, s);
  141. }
  142. return news;
  143. }
  144. char *strndup(const char *s, size_t size)
  145. {
  146. size_t nsize = strnlen(s, size);
  147. char *news = (char *)malloc(nsize + 1);
  148. if (news)
  149. {
  150. rt_memcpy(news, s, nsize);
  151. news[nsize] = '\0';
  152. }
  153. return news;
  154. }
  155. rt_weak char *strtok_r(char *str, const char *delim, char **saveptr)
  156. {
  157. char *pbegin;
  158. char *pend = NULL;
  159. if (str)
  160. {
  161. pbegin = str;
  162. }
  163. else if (saveptr && *saveptr)
  164. {
  165. pbegin = *saveptr;
  166. }
  167. else
  168. {
  169. return NULL;
  170. }
  171. for (;*pbegin && strchr(delim, *pbegin) != NULL; pbegin++);
  172. if (!*pbegin)
  173. {
  174. return NULL;
  175. }
  176. for (pend = pbegin + 1; *pend && strchr(delim, *pend) == NULL; pend++);
  177. if (*pend)
  178. {
  179. *pend++ = '\0';
  180. }
  181. if (saveptr)
  182. {
  183. *saveptr = pend;
  184. }
  185. return pbegin;
  186. }