/platform/mcu/tc32_825x/common/string.c

https://github.com/alibaba/genie-bt-mesh-stack · C · 205 lines · 153 code · 30 blank · 22 comment · 40 complexity · f92fbbf8a3ebfb5dc7abcf6eaec653a7 MD5 · raw file

  1. /********************************************************************************************************
  2. * @file string.c
  3. *
  4. * @brief for TLSR chips
  5. *
  6. * @author public@telink-semi.com;
  7. * @date Sep. 30, 2010
  8. *
  9. * @par Copyright (c) Telink Semiconductor (Shanghai) Co., Ltd.
  10. * All rights reserved.
  11. *
  12. * The information contained herein is confidential and proprietary property of Telink
  13. * Semiconductor (Shanghai) Co., Ltd. and is available under the terms
  14. * of Commercial License Agreement between Telink Semiconductor (Shanghai)
  15. * Co., Ltd. and the licensee in separate contract or the terms described here-in.
  16. * This heading MUST NOT be removed from this file.
  17. *
  18. * Licensees are granted free, non-transferable use of the information in this
  19. * file under Mutual Non-Disclosure Agreement. NO WARRENTY of ANY KIND is provided.
  20. *
  21. *******************************************************************************************************/
  22. #include "types.h"
  23. #include "string.h"
  24. #include "../common/assert.h"
  25. #include "../tl_common.h"
  26. char* strcpy(char * dst0, const char * src0) {
  27. char *s = dst0;
  28. while ((*dst0++ = *src0++))
  29. ;
  30. return s;
  31. }
  32. char * strchr(const char *s, int c) {
  33. do {
  34. if (*s == c) {
  35. return (char*) s;
  36. }
  37. } while (*s++);
  38. return (0);
  39. }
  40. int memcmp(const void * m1, const void *m2, u32 len) {
  41. u8 *st1 = (u8 *) m1;
  42. u8 *st2 = (u8 *) m2;
  43. while(len--){
  44. if(*st1 != *st2){
  45. return (*st1 - *st2);
  46. }
  47. st1++;
  48. st2++;
  49. }
  50. return 0;
  51. }
  52. void * memchr(register const void * src_void, int c, unsigned int length) {
  53. const unsigned char *src = (const unsigned char *) src_void;
  54. while (length-- > 0) {
  55. if (*src == c)
  56. return (void *) src;
  57. src++;
  58. }
  59. return NULL;
  60. }
  61. void * memmove(void * dest, const void * src, unsigned int n) {
  62. char * d = (char *)dest;
  63. char * s = (char *)src;
  64. while (n--)
  65. *d++ = *s++;
  66. return dest;
  67. }
  68. void bbcopy(register char * src, register char * dest, int len) {
  69. if (dest < src)
  70. while (len--)
  71. *dest++ = *src++;
  72. else {
  73. char *lasts = src + (len - 1);
  74. char *lastd = dest + (len - 1);
  75. while (len--)
  76. *(char *) lastd-- = *(char *) lasts--;
  77. }
  78. }
  79. void bcopy(register char * src, register char * dest, int len) {
  80. bbcopy(src, dest, len);
  81. }
  82. void * memset(void * dest, int val, unsigned int len) {
  83. register unsigned char *ptr = (unsigned char*) dest;
  84. while (len-- > 0)
  85. *ptr++ = (unsigned char)val;
  86. return dest;
  87. }
  88. void * memcpy(void * out, const void * in, unsigned int length) {
  89. bcopy((char *) in, (char *) out, (int) length);
  90. return out;
  91. }
  92. // for performance, assume lenght % 4 == 0, and no memory overlapped
  93. void memcpy4(void * d, const void * s, unsigned int length){
  94. int* dst = (int*)d;
  95. int* src = (int*)s;
  96. assert((((int)dst) >> 2) << 2 == ((int)dst)); // address must alighn to 4
  97. assert((((int)src) >> 2) << 2 == ((int)src)); // address must alighn to 4
  98. assert((length >> 2) << 2 == length); // lenght % 4 == 0
  99. assert(( ((char*)dst) + length <= (const char*)src) || (((const char*)src) + length <= (char*)dst)); // no overlapped
  100. unsigned int len = length >> 2;
  101. while(len --){
  102. *dst++ = *src++;
  103. }
  104. }
  105. unsigned int strlen(const char *str) {
  106. unsigned int len = 0;
  107. if (str != NULL) {
  108. while (*str++) {
  109. len++;
  110. }
  111. }
  112. return len;
  113. }
  114. int strcmp(const char* firstString, const char* secondString) {
  115. while (*firstString == *secondString) {
  116. if (*firstString == '\0') {
  117. return 0;
  118. }
  119. ++firstString;
  120. ++secondString;
  121. }
  122. if (((unsigned char) *firstString - (unsigned char) *secondString) < 0) {
  123. return -1;
  124. }
  125. return 1;
  126. }
  127. char * strncpy(char *s, const char *t, unsigned int n) {
  128. char *p = s;
  129. unsigned int i = 0;
  130. if (!s)
  131. return s;
  132. while (t && i < n) {
  133. *s++ = *t++;
  134. i++;
  135. }
  136. if (!t) {
  137. do
  138. *s++ = '\0';
  139. while (i++ < n);
  140. }
  141. return p;
  142. }
  143. int ismemzero4(void *data, unsigned int len){
  144. int *p = (int*)data;
  145. len = len >> 2;
  146. for(int i = 0; i < len; ++i){
  147. if(*p){
  148. return 0;
  149. }
  150. ++p;
  151. }
  152. return 1;
  153. }
  154. int ismemf4(void *data, unsigned int len){
  155. int *p = (int*)data;
  156. len = len >> 2;
  157. for(int i = 0; i < len; ++i){
  158. if(*p != 0xffffffff){
  159. return 0;
  160. }
  161. ++p;
  162. }
  163. return 1;
  164. }
  165. void * memset4(void * dest, int val, unsigned int len) {
  166. int *p = (int*)dest;
  167. len = len >> 2;
  168. for(int i = 0; i < len; ++i){
  169. *p++ = val;
  170. }
  171. return dest;
  172. }
  173. void zeromem4(void *data, unsigned int len){
  174. memset4(data, 0, len);
  175. }