string.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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 <plat/string.h>
  14. int strcmp(const char *a, const char *b)
  15. {
  16. /* search first diff or end of string */
  17. for (; *a == *b && *a != '\0'; a++, b++)
  18. ;
  19. return *a - *b;
  20. }
  21. size_t strlen(const char *str)
  22. {
  23. unsigned long ret = 0;
  24. while (*str != '\0') {
  25. ret++;
  26. str++;
  27. }
  28. return ret;
  29. }
  30. size_t strnlen(const char *str, size_t count)
  31. {
  32. unsigned long ret = 0;
  33. while (*str != '\0' && ret < count) {
  34. ret++;
  35. str++;
  36. count--;
  37. }
  38. return ret;
  39. }
  40. char *strcpy(char *dest, const char *src)
  41. {
  42. char *ret = dest;
  43. while (*src != '\0') {
  44. *dest++ = *src++;
  45. }
  46. return ret;
  47. }
  48. char *strncpy(char *dest, const char *src, size_t count)
  49. {
  50. char *ret = dest;
  51. while (count-- && *src != '\0') {
  52. *dest++ = *src++;
  53. }
  54. return ret;
  55. }
  56. char *strchr(const char *s, int c)
  57. {
  58. while (*s != '\0' && *s != (char)c)
  59. s++;
  60. if (*s == '\0')
  61. return NULL;
  62. else
  63. return (char *)s;
  64. }
  65. char *strrchr(const char *s, int c)
  66. {
  67. const char *last = s + strlen(s);
  68. while (last > s && *last != (char)c)
  69. last--;
  70. if (*last != (char)c)
  71. return NULL;
  72. else
  73. return (char *)last;
  74. }
  75. void *memset(void *s, int c, size_t count)
  76. {
  77. char *temp = s;
  78. while (count > 0) {
  79. count--;
  80. *temp++ = c;
  81. }
  82. return s;
  83. }
  84. void *memcpy(void *dest, const void *src, size_t count)
  85. {
  86. char *temp1 = dest;
  87. const char *temp2 = src;
  88. while (count > 0) {
  89. *temp1++ = *temp2++;
  90. count--;
  91. }
  92. return dest;
  93. }
  94. void *memmove(void *dest, const void *src, size_t count)
  95. {
  96. char *temp1 = (char *)dest;
  97. const char *temp2 = (char *)src;
  98. if (src == dest)
  99. return dest;
  100. if (dest < src) {
  101. while (count > 0) {
  102. *temp1++ = *temp2++;
  103. count--;
  104. }
  105. } else {
  106. temp1 = dest + count - 1;
  107. temp2 = src + count - 1;
  108. while (count > 0) {
  109. *temp1-- = *temp2--;
  110. count--;
  111. }
  112. }
  113. return dest;
  114. }
  115. int memcmp(const void *s1, const void *s2, size_t count)
  116. {
  117. const char *temp1 = s1;
  118. const char *temp2 = s2;
  119. for (; count > 0 && (*temp1 == *temp2); count--) {
  120. temp1++;
  121. temp2++;
  122. }
  123. if (count > 0)
  124. return *(unsigned char *)temp1 - *(unsigned char *)temp2;
  125. else
  126. return 0;
  127. }
  128. void *memchr(const void *s, int c, size_t count)
  129. {
  130. const unsigned char *temp = s;
  131. while (count > 0) {
  132. if ((unsigned char)c == *temp++) {
  133. return (void *)(temp - 1);
  134. }
  135. count--;
  136. }
  137. return NULL;
  138. }