uc-sdk
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
string.h
Go to the documentation of this file.
1 #ifndef __STRING_H__
2 #define __STRING_H__
3 
4 #include <stdint.h>
5 #include <stddef.h>
6 #include <malloc.h>
7 
8 static inline void * memcpy(void * _s1, const void * _s2, size_t n) {
9  uint8_t * s1 = (uint8_t *) _s1;
10  const uint8_t * s2 = (uint8_t *) _s2;
11  size_t i;
12 
13  for (i = 0; i < n; i++)
14  *s1++ = *s2++;
15 
16  return _s1;
17 }
18 
19 static inline void * memmove(void * _s1, const void * _s2, size_t n) {
20  uint8_t * s1 = (uint8_t *) _s1;
21  const uint8_t * s2 = (uint8_t *) _s2;
22  size_t i;
23 
24  if (s1 < s2) {
25  for (i = 0; i < n; i++)
26  *s1++ = *s2++;
27  } else if (s1 > s2) {
28  s1 += n;
29  s2 += n;
30  for (i = 0; i < n; i++)
31  *--s1 = *--s2;
32  }
33 
34  return _s1;
35 }
36 
37 static inline int memcmp(const void * _s1, const void * _s2, size_t n) {
38  uint8_t * s1 = (uint8_t *) _s1;
39  const uint8_t * s2 = (uint8_t *) _s2;
40  size_t i;
41 
42  for (i = 0; i < n; i++, s1++, s2++) {
43  if (*s1 < *s2) {
44  return -1;
45  } else if (*s1 > *s2) {
46  return 1;
47  }
48  }
49 
50  return 0;
51 }
52 
53 static inline void * memset(void * _s, int c, size_t n) {
54  uint8_t * s = (uint8_t *) _s;
55  size_t i;
56 
57  for (i = 0; i < n; i++)
58  *s++ = (uint8_t) c;
59 
60  return _s;
61 }
62 
63 static inline const void * memchr(const void * _s, int c, size_t n) {
64  const uint8_t * s = (uint8_t *) _s;
65  size_t i;
66 
67  for (i = 0; i < n; i++, s++)
68  if (*s == c)
69  return s;
70 
71  return NULL;
72 }
73 
74 static inline char * strcat(char * s1, const char * s2) {
75  char * r = s1;
76 
77  while (*s1)
78  s1++;
79 
80  while (*s2)
81  *s1++ = *s2++;
82 
83  *s1 = 0;
84 
85  return r;
86 }
87 
88 static inline char * strcpy(char * s1, const char * s2) {
89  char * r = s1;
90 
91  while ((*s1++ = *s2++));
92 
93  return r;
94 }
95 
96 static inline char * strncpy(char * s1, const char * s2, size_t n) {
97  char * r = s1;
98  size_t i;
99 
100  for (i = 0; i < n; i++) {
101  if (*s2) {
102  *s1++ = *s2++;
103  } else {
104  *s1++ = 0;
105  }
106  }
107 
108  return r;
109 }
110 
111 static inline char * strchr(const char * s, char c) {
112  while (*s) {
113  if (*s == c)
114  return (char *) s;
115  s++;
116  }
117 
118  return NULL;
119 }
120 
121 static inline char * strrchr(const char * s, char c) {
122  const char * r = NULL;
123 
124  while (*s) {
125  if (*s == c)
126  r = s;
127  s++;
128  }
129 
130  return (char *) r;
131 }
132 
133 static inline size_t strlen(const char * s) {
134  size_t r = 0;
135 
136  while (*s++)
137  r++;
138 
139  return r;
140 }
141 
142 static inline char * strncat(char * s1, const char * s2, size_t n) {
143  char * r = s1;
144 
145  while (*s1)
146  s1++;
147  strncpy(s1, s2, n);
148 
149  return r;
150 }
151 
152 static inline int strcmp(const char * s1, const char * s2) {
153  while (*s1 && *s2) {
154  if (!*s1) {
155  return -1;
156  } else if (!*s2) {
157  return 1;
158  } else if (*s1 < *s2) {
159  return -1;
160  } else if (*s1 > *s2) {
161  return 1;
162  }
163  s1++;
164  s2++;
165  }
166 
167  return 0;
168 }
169 
170 static inline int strncmp(const char * s1, const char * s2, size_t n) {
171  while (*s1 && *s2 && n) {
172  if (!*s1) {
173  return -1;
174  } else if (!*s2) {
175  return 1;
176  } else if (*s1 < *s2) {
177  return -1;
178  } else if (*s1 > *s2) {
179  return 1;
180  }
181  s1++;
182  s2++;
183  n--;
184  }
185 
186  return 0;
187 }
188 
189 static inline char * strdup(const char * s) {
190  return strcpy((char *) malloc(strlen(s) + 1), s);
191 }
192 
193 static inline char * strstr(const char * s1, const char * s2) {
194  size_t l = strlen(s2);
195 
196  while (*s1) {
197  if (!strncmp(s1, s2, l))
198  return (char *) s1;
199  s1++;
200  }
201 
202  return NULL;
203 }
204 
205 #endif