sbi_string.c 3.0 KB

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