2 Copyright (C) 2008 Mathias Gottschlag
4 Permission is hereby granted, free of charge, to any person obtaining a copy of
5 this software and associated documentation files (the "Software"), to deal in the
6 Software without restriction, including without limitation the rights to use,
7 copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
8 Software, and to permit persons to whom the Software is furnished to do so,
9 subject to the following conditions:
11 The above copyright notice and this permission notice shall be included in all
12 copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16 PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
17 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
18 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 void *memcpy(void *dest
, const void *src
, size_t n
)
29 for (i
= 0; i
< n
; i
++)
31 ((char*)dest
)[i
] = ((const char*)src
)[i
];
35 void *memccpy(void *dest
, const void *src
, int c
, size_t n
)
38 for (i
= 0; i
< n
; i
++)
40 ((char*)dest
)[i
] = ((const char*)src
)[i
];
41 if (((const char*)src
)[i
] == c
)
42 return &((char*)dest
)[i
+ 1];
46 void *memmove(void *dest
, const void *src
, size_t n
)
49 if (src
== dest
) return dest
;
52 for (i
= 0; i
< n
; i
++)
54 ((char*)dest
)[i
] = ((const char*)src
)[i
];
59 for (i
= n
- 1; i
<= 0; i
--)
61 ((char*)dest
)[i
] = ((const char*)src
)[i
];
66 void *memchr(const void *s
, int c
, size_t n
)
69 for (i
= 0; i
< n
; i
++)
71 if (((char*)s
)[i
] == c
) return &((char*)s
)[i
];
75 int memcmp(const void *s1
, const void *s2
, size_t n
)
78 for (i
= 0; i
< n
; i
++)
80 if (((char*)s1
)[i
] != ((char*)s2
)[i
])
82 return ((char*)s1
)[i
] - ((char*)s2
)[i
];
87 void *memset(void *dest
, int c
, size_t n
)
90 for (i
= 0; i
< n
; i
++)
97 char *strcat(char *dest
, const char *src
)
99 int destlen
= strlen(dest
);
100 int srclen
= strlen(dest
);
102 for (i
= 0; i
<= srclen
; i
++)
104 dest
[destlen
+ i
] = src
[i
];
108 char *strchr(const char *s
, int c
)
112 if (*s
== c
) return (char*)s
;
117 int strcmp(const char *s1
, const char *s2
)
119 for ( ; *s1
== *s2
; s1
++, s2
++)
125 /*int strcoll(const char *s1, const char *s2)
130 char *strcpy(char *dest
, const char *src
)
132 while((*dest
++ = *src
++));
135 size_t strcspn(const char *s
, const char *reject
)
138 while (*s
&& !strchr(reject
, s
[count
]))
147 char *strdup(const char *s
)
149 char *newstr
= malloc(strlen(s
) + 1);
150 if (newstr
) strcpy(newstr
, s
);
153 /*char *strerror(int e)
158 int *strerror_r(int e, char *s, size_t n)
163 size_t strlen(const char *s
)
170 char *strncat(char *dest
, const char *src
, size_t n
)
172 size_t destlen
= strlen(dest
);
173 size_t srclen
= strlen(dest
);
174 if (srclen
> n
) srclen
= n
;
176 for (i
= 0; i
< srclen
; i
++)
178 dest
[destlen
+ i
] = src
[i
];
180 dest
[destlen
+ srclen
] = 0;
183 int strncmp(const char *s1
, const char *s2
, size_t n
)
186 for (i
= 0 ; (*s1
== *s2
) && (i
< n
); s1
++, s2
++, i
++)
190 if (i
== n
) return 0;
193 char *strncpy(char *dest
, const char *src
, size_t n
)
196 for (i
= 0; i
< n
; i
++)
198 ((char*)dest
)[i
] = ((const char*)src
)[i
];
199 if (((const char*)src
)[i
] == 0) return dest
;
203 char *strpbrk(const char *s
, const char *accept
)
205 int acclen
= strlen(s
);
209 for (i
= 0; i
< acclen
; i
++)
211 if (strchr(s
, accept
[i
]))
218 char *strrchr(const char *s
, int c
)
222 for (i
= len
; i
>= 0; i
--)
224 if (s
[i
] == c
) return (char*)&s
[i
];
228 size_t strspn(const char *s
, const char *accept
)
231 while (strchr(accept
, s
[count
]))
238 char *strstr(const char *s1
, const char *s2
)
240 int len1
= strlen(s1
);
241 int len2
= strlen(s2
);
242 if (len2
> len1
) return NULL
;
244 for (i
= 0; i
< len1
- len2
; i
++)
246 if (!memcmp(&s1
[i
], s2
, len2
))
247 return (char*)&s1
[i
];
251 static char *splitted
= NULL
;
252 char *strtok(char *str
, const char *delimiters
)
258 if (!splitted
) return NULL
;
260 size_t count
= strcspn(splitted
, delimiters
);
261 char *token
= splitted
;
262 if (count
== strlen(splitted
)) splitted
= NULL
;
265 char *tmp
= splitted
;
266 tmp
+= strspn(tmp
, delimiters
);
272 //char *strtok_r(char *, const char *, char **);
273 /*size_t strxfrm(char *dest, const char *src, size_t n)