sbi_string.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. /* No difference till the end */
  31. if (!count)
  32. return 0;
  33. return *a - *b;
  34. }
  35. size_t sbi_strlen(const char *str)
  36. {
  37. unsigned long ret = 0;
  38. while (*str != '\0') {
  39. ret++;
  40. str++;
  41. }
  42. return ret;
  43. }
  44. size_t sbi_strnlen(const char *str, size_t count)
  45. {
  46. unsigned long ret = 0;
  47. while (*str != '\0' && ret < count) {
  48. ret++;
  49. str++;
  50. count--;
  51. }
  52. return ret;
  53. }
  54. char *sbi_strcpy(char *dest, const char *src)
  55. {
  56. char *ret = dest;
  57. while (*src != '\0') {
  58. *dest++ = *src++;
  59. }
  60. return ret;
  61. }
  62. char *sbi_strncpy(char *dest, const char *src, size_t count)
  63. {
  64. char *ret = dest;
  65. while (count-- && *src != '\0') {
  66. *dest++ = *src++;
  67. }
  68. return ret;
  69. }
  70. char *sbi_strchr(const char *s, int c)
  71. {
  72. while (*s != '\0' && *s != (char)c)
  73. s++;
  74. if (*s == '\0')
  75. return NULL;
  76. else
  77. return (char *)s;
  78. }
  79. char *sbi_strrchr(const char *s, int c)
  80. {
  81. const char *last = s + sbi_strlen(s);
  82. while (last > s && *last != (char)c)
  83. last--;
  84. if (*last != (char)c)
  85. return NULL;
  86. else
  87. return (char *)last;
  88. }
  89. void *sbi_memset(void *s, int c, size_t count)
  90. {
  91. char *temp = s;
  92. while (count > 0) {
  93. count--;
  94. *temp++ = c;
  95. }
  96. return s;
  97. }
  98. void *sbi_memcpy(void *dest, const void *src, size_t count)
  99. {
  100. char *temp1 = dest;
  101. const char *temp2 = src;
  102. while (count > 0) {
  103. *temp1++ = *temp2++;
  104. count--;
  105. }
  106. return dest;
  107. }
  108. void *sbi_memmove(void *dest, const void *src, size_t count)
  109. {
  110. char *temp1 = (char *)dest;
  111. const char *temp2 = (char *)src;
  112. if (src == dest)
  113. return dest;
  114. if (dest < src) {
  115. while (count > 0) {
  116. *temp1++ = *temp2++;
  117. count--;
  118. }
  119. } else {
  120. temp1 = dest + count - 1;
  121. temp2 = src + count - 1;
  122. while (count > 0) {
  123. *temp1-- = *temp2--;
  124. count--;
  125. }
  126. }
  127. return dest;
  128. }
  129. int sbi_memcmp(const void *s1, const void *s2, size_t count)
  130. {
  131. const char *temp1 = s1;
  132. const char *temp2 = s2;
  133. for (; count > 0 && (*temp1 == *temp2); count--) {
  134. temp1++;
  135. temp2++;
  136. }
  137. if (count > 0)
  138. return *(unsigned char *)temp1 - *(unsigned char *)temp2;
  139. else
  140. return 0;
  141. }
  142. void *sbi_memchr(const void *s, int c, size_t count)
  143. {
  144. const unsigned char *temp = s;
  145. while (count > 0) {
  146. if ((unsigned char)c == *temp++) {
  147. return (void *)(temp - 1);
  148. }
  149. count--;
  150. }
  151. return NULL;
  152. }