1 //-----------------------------------------------------------------------------
2 // Jonathan Westhues, Sept 2005
4 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
5 // at your option, any later version. See the LICENSE.txt file for the text of
7 //-----------------------------------------------------------------------------
8 // Common string.h functions
9 //-----------------------------------------------------------------------------
12 void *memcpy(void *dest
, const void *src
, int len
) {
14 const uint8_t *s
= src
;
23 void *memmove(void *dest
, const void *src
, size_t len
) {
30 char *lasts
= (char *)s
+ (len
- 1);
31 char *lastd
= d
+ (len
- 1);
38 void *memset(void *dest
, uint8_t c
, int len
) {
47 int memcmp(const void *av
, const void *bv
, int len
) {
48 const uint8_t *a
= av
;
49 const uint8_t *b
= bv
;
61 void memxor(uint8_t *dest
, uint8_t *src
, size_t len
) {
62 for (; len
> 0; len
--, dest
++, src
++)
66 int strlen(const char *str
) {
68 for (p
= str
; *p
!= '\0'; ++p
) {};
72 char *strncat(char *dest
, const char *src
, unsigned int n
) {
73 int dest_len
= strlen(dest
);
76 for (i
= 0 ; i
< n
&& src
[i
] != '\0' ; i
++)
77 dest
[dest_len
+ i
] = src
[i
];
79 dest
[dest_len
+ i
] = '\0';
84 char *strcat(char *dest
, const char *src
) {
85 int dest_len
= strlen(dest
);
88 for (i
= 0 ; src
[i
] != '\0' ; i
++)
89 dest
[dest_len
+ i
] = src
[i
];
90 dest
[dest_len
+ i
] = '\0';
94 ////////////////////////////////////////// code to do 'itoa'
96 /* reverse: reverse string s in place */
97 void strreverse(char s
[]) {
98 int j
= strlen(s
) - 1;
100 for (int i
= 0; i
< j
; i
++, j
--) {
107 /* itoa: convert n to characters in s */
108 void itoa(int n
, char s
[]) {
110 if ((sign
= n
) < 0) /* record sign */
111 n
= -n
; /* make n positive */
114 do { /* generate digits in reverse order */
115 s
[i
++] = n
% 10 + '0'; /* get next digit */
116 } while ((n
/= 10) > 0); /* delete it */
123 //////////////////////////////////////// END 'itoa' CODE
127 char *strcpy(char *dst
, const char *src
) {
130 for (; (*dst
= *src
) != '\0'; ++src
, ++dst
);
134 char *strncpy(char *dst
, const char *src
, size_t n
) {
140 if ((*d
++ = *s
++) == 0) {
141 /* NUL pad the remaining n-1 bytes */
152 int strcmp(const char *s1
, const char *s2
) {
153 while (*s1
== *s2
++) {
158 return (*(unsigned char *) s1
- * (unsigned char *) --s2
);
161 char *__strtok_r(char *, const char *, char **);
163 char *__strtok_r(char *s
, const char *delim
, char **last
) {
167 if (s
== NULL
&& (s
= *last
) == NULL
)
171 * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
175 for (spanp
= (char *)delim
; (sc
= *spanp
++) != 0;) {
181 /* no non-delimiter characters */
188 * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
189 * Note that delim must have one NUL; we stop if we see that, too.
193 spanp
= (char *)delim
;
195 if ((sc
= *spanp
++) == c
) {
208 char *strtok(char *s
, const char *delim
) {
211 return (__strtok_r(s
, delim
, &last
));
215 char *strchr(const char *s
, int c
) {
216 while (*s
!= (char)c
)
222 size_t strspn(const char *s1
, const char *s2
) {
224 while (*s1
&& strchr(s2
, *s1
++))
229 char *strrchr(const char *s
, int c
) {
238 size_t strcspn(const char *s1
, const char *s2
) {
248 char *strpbrk(const char *s1
, const char *s2
) {
250 if (strchr(s2
, *s1
++))
255 int strncmp(const char *s1
, const char *s2
, size_t n
) {
258 return *(unsigned char *)(s1
- 1) - *(unsigned char *)(s2
- 1);
265 #define isspace(a) __extension__ ({ unsigned char bb__isspace = (a) - 9; bb__isspace == (' ' - 9) || bb__isspace <= (13 - 9); })
267 unsigned long strtoul(const char *p
, char **out_p
, int base
) {
272 if (((base
== 16) || (base
== 0)) &&
273 ((*p
== '0') && ((p
[1] == 'x') || (p
[1] == 'X')))) {
285 if ((c
>= '0') && (c
<= '9') && (c
- '0' < base
))
286 v
= (v
* base
) + (c
- '0');
287 else if ((c
>= 'a') && (c
<= 'z') && (c
- 'a' + 10 < base
))
288 v
= (v
* base
) + (c
- 'a' + 10);
289 else if ((c
>= 'A') && (c
<= 'Z') && (c
- 'A' + 10 < base
))
290 v
= (v
* base
) + (c
- 'A' + 10);
296 if (out_p
) *out_p
= (char *)p
;
300 long strtol(const char *p
, char **out_p
, int base
) {
310 if (((base
== 16) || (base
== 0)) &&
311 ((*p
== '0') && ((p
[1] == 'x') || (p
[1] == 'X')))) {
323 if ((c
>= '0') && (c
<= '9') && (c
- '0' < base
))
324 v
= (v
* base
) + (c
- '0');
325 else if ((c
>= 'a') && (c
<= 'z') && (c
- 'a' + 10 < base
))
326 v
= (v
* base
) + (c
- 'a' + 10);
327 else if ((c
>= 'A') && (c
<= 'Z') && (c
- 'A' + 10 < base
))
328 v
= (v
* base
) + (c
- 'A' + 10);
335 if (out_p
) *out_p
= (char *)p
;
339 char c_tolower(int c
) {
340 // (int)a = 97, (int)A = 65
341 // (a)97 - (A)65 = 32
342 // therefore 32 + 65 = a
343 return c
> 64 && c
< 91 ? c
+ 32 : c
;
346 char c_isprint(unsigned char c
) {
347 if (c
>= 0x20 && c
<= 0x7e)