PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/program/lib/stdlib/string.c

https://github.com/ElEHsiang/QuadrotorFlightControl
C | 153 lines | 123 code | 26 blank | 4 comment | 31 complexity | a8b3d414c72ed797b1641dacec1cbd90 MD5 | raw file
Possible License(s): GPL-2.0
  1. #include <stddef.h>
  2. #include <stdint.h>
  3. #include <limits.h>
  4. #include "string.h"
  5. #include "FreeRTOS.h"
  6. #define ALIGN (sizeof(size_t))
  7. #define ONES ((size_t)-1/UCHAR_MAX)
  8. #define HIGHS (ONES * (UCHAR_MAX/2+1))
  9. #define HASZERO(x) (((x)-ONES) & ~(x) & HIGHS)
  10. #define SS (sizeof(size_t))
  11. char *strchr(const char *s, int c)
  12. {
  13. for (; *s && *s != c; s++);
  14. return (*s == c) ? (char *)s : NULL;
  15. }
  16. char *strcpy(char *dest, const char *src)
  17. {
  18. const char *s = src;
  19. char *d = dest;
  20. while ((*d++ = *s++));
  21. return dest;
  22. }
  23. char *strncpy(char *dest, const char *src, size_t n)
  24. {
  25. const char *s = src;
  26. char *d = dest;
  27. while (n-- && (*d++ = *s++));
  28. return dest;
  29. }
  30. size_t strlen(const char *s)
  31. {
  32. const char *a = s;
  33. const size_t *w;
  34. for (; (uintptr_t) s % ALIGN; s++)
  35. if (!*s) return (s - a);
  36. for (w = (const void *) s; !HASZERO(*w); w++);
  37. for (s = (const void *) w; *s; s++);
  38. return (s - a);
  39. }
  40. int strcmp(const char* s1, const char* s2)
  41. {
  42. while(*s1 && (*s1==*s2))
  43. s1++,s2++;
  44. return *(const unsigned char*)s1-*(const unsigned char*)s2;
  45. }
  46. char *strcat(char* dst, char* src)
  47. {
  48. if(src == NULL)
  49. return NULL;
  50. char* retAddr = dst;
  51. /* --- Find last position --- */
  52. while (*dst++ != '\0');
  53. dst--;
  54. while ((*dst++ = *src++));
  55. return retAddr;
  56. }
  57. char *strdup(const char *str)
  58. {
  59. char *ptr;
  60. ptr = (char *)pvPortMalloc(strlen(str) + 1);
  61. if(ptr == NULL)
  62. return NULL;
  63. /*make the end of string have null character*/
  64. ptr[strlen(str)+1] = '\0';
  65. return memcpy(ptr, str, strlen(str)+1);
  66. }
  67. void *memset(void *dest, int c, size_t n)
  68. {
  69. unsigned char *s = dest;
  70. c = (unsigned char)c;
  71. for (; ((uintptr_t)s & ALIGN) && n; n--) *s++ = c;
  72. if (n) {
  73. size_t *w, k = ONES * c;
  74. for (w = (void *)s; n>=SS; n-=SS, w++) *w = k;
  75. for (s = (void *)w; n; n--, s++) *s = c;
  76. }
  77. return dest;
  78. }
  79. void *memcpy(void *dest, const void *src, size_t n)
  80. {
  81. void *ret = dest;
  82. //Cut rear
  83. uint8_t *dst8 = dest;
  84. const uint8_t *src8 = src;
  85. switch (n % 4) {
  86. case 3 : *dst8++ = *src8++;
  87. case 2 : *dst8++ = *src8++;
  88. case 1 : *dst8++ = *src8++;
  89. case 0 : ;
  90. }
  91. //stm32 data bus width
  92. uint32_t *dst32 = (void *)dst8;
  93. const uint32_t *src32 = (void *)src8;
  94. n = n / 4;
  95. while (n--) {
  96. *dst32++ = *src32++;
  97. }
  98. return ret;
  99. }
  100. void *memmove(void *dest, const void *src, size_t count)
  101. {
  102. char *tmp;
  103. const char *s;
  104. if(dest <= src) {
  105. tmp = dest;
  106. s = src;
  107. while(count--)
  108. *tmp++ = *s++;
  109. } else {
  110. tmp = dest;
  111. tmp += count;
  112. s= src;
  113. s += count;
  114. while(count--)
  115. *--tmp = *--s;
  116. }
  117. return dest;
  118. }
  119. int memcmp(const void *cs, const void *ct, unsigned long count)
  120. {
  121. const unsigned char *su1, *su2;
  122. int res = 0;
  123. for (su1=cs, su2=ct; 0<count; ++su1, ++su2, count--)
  124. if ((res = *su1 - *su2) != 0)
  125. break;
  126. return res;
  127. }