sbi_string.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2019 Western Digital Corporation or its affiliates.
  5. *
  6. * Authors:
  7. * Atish Patra <atish.patra@wdc.com>
  8. */
  9. /*
  10. * Simple libc functions. These are not optimized at all and might have some
  11. * bugs as well. Use any optimized routines from newlib or glibc if required.
  12. */
  13. #include <sbi/sbi_string.h>
  14. /*
  15. Provides sbi_strcmp for the completeness of supporting string functions.
  16. it is not recommended to use sbi_strcmp() but use sbi_strncmp instead.
  17. */
  18. int sbi_strcmp(const char *a, const char *b)
  19. {
  20. /* search first diff or end of string */
  21. for (; *a == *b && *a != '\0'; a++, b++)
  22. ;
  23. return *a - *b;
  24. }
  25. int sbi_strncmp(const char *a, const char *b, size_t count)
  26. {
  27. /* search first diff or end of string */
  28. for (; count > 0 && *a == *b && *a != '\0'; a++, b++, count--)
  29. ;
  30. return *a - *b;
  31. }
  32. size_t sbi_strlen(const char *str)
  33. {
  34. unsigned long ret = 0;
  35. while (*str != '\0') {
  36. ret++;
  37. str++;
  38. }
  39. return ret;
  40. }
  41. size_t sbi_strnlen(const char *str, size_t count)
  42. {
  43. unsigned long ret = 0;
  44. while (*str != '\0' && ret < count) {
  45. ret++;
  46. str++;
  47. count--;
  48. }
  49. return ret;
  50. }
  51. char *sbi_strcpy(char *dest, const char *src)
  52. {
  53. char *ret = dest;
  54. while (*src != '\0') {
  55. *dest++ = *src++;
  56. }
  57. return ret;
  58. }
  59. char *sbi_strncpy(char *dest, const char *src, size_t count)
  60. {
  61. char *ret = dest;
  62. while (count-- && *src != '\0') {
  63. *dest++ = *src++;
  64. }
  65. return ret;
  66. }
  67. char *sbi_strchr(const char *s, int c)
  68. {
  69. while (*s != '\0' && *s != (char)c)
  70. s++;
  71. if (*s == '\0')
  72. return NULL;
  73. else
  74. return (char *)s;
  75. }
  76. char *sbi_strrchr(const char *s, int c)
  77. {
  78. const char *last = s + sbi_strlen(s);
  79. while (last > s && *last != (char)c)
  80. last--;
  81. if (*last != (char)c)
  82. return NULL;
  83. else
  84. return (char *)last;
  85. }
  86. void *sbi_memset(void *s, int c, size_t count)
  87. {
  88. char *temp = s;
  89. while (count > 0) {
  90. count--;
  91. *temp++ = c;
  92. }
  93. return s;
  94. }
  95. void *sbi_memcpy(void *dest, const void *src, size_t count)
  96. {
  97. char *temp1 = dest;
  98. const char *temp2 = src;
  99. while (count > 0) {
  100. *temp1++ = *temp2++;
  101. count--;
  102. }
  103. return dest;
  104. }
  105. void *sbi_memmove(void *dest, const void *src, size_t count)
  106. {
  107. char *temp1 = (char *)dest;
  108. const char *temp2 = (char *)src;
  109. if (src == dest)
  110. return dest;
  111. if (dest < src) {
  112. while (count > 0) {
  113. *temp1++ = *temp2++;
  114. count--;
  115. }
  116. } else {
  117. temp1 = dest + count - 1;
  118. temp2 = src + count - 1;
  119. while (count > 0) {
  120. *temp1-- = *temp2--;
  121. count--;
  122. }
  123. }
  124. return dest;
  125. }
  126. int sbi_memcmp(const void *s1, const void *s2, size_t count)
  127. {
  128. const char *temp1 = s1;
  129. const char *temp2 = s2;
  130. for (; count > 0 && (*temp1 == *temp2); count--) {
  131. temp1++;
  132. temp2++;
  133. }
  134. if (count > 0)
  135. return *(unsigned char *)temp1 - *(unsigned char *)temp2;
  136. else
  137. return 0;
  138. }
  139. void *sbi_memchr(const void *s, int c, size_t count)
  140. {
  141. const unsigned char *temp = s;
  142. while (count > 0) {
  143. if ((unsigned char)c == *temp++) {
  144. return (void *)(temp - 1);
  145. }
  146. count--;
  147. }
  148. return NULL;
  149. }