3 * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>
4 * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without restriction,
9 * including without limitation the rights to use, copy, modify, merge,
10 * publish, distribute, sublicense, and/or sell copies of the Software,
11 * and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18 * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21 * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
22 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
25 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 /* Modifications by Jack Lange <jarusl@cs.northwestern.edu> */
33 * These are slow and simple implementations of a subset of
34 * the standard C library string functions.
35 * We also have an implementation of snprintf().
39 #include <palacios/vmm_types.h>
40 #include <palacios/vmm_string.h>
41 #include <palacios/vmm.h>
44 #ifdef CONFIG_BUILT_IN_MEMSET
45 void * memset(void * s, int c, size_t n) {
46 uchar_t * p = (uchar_t *) s;
57 #ifdef CONFIG_BUILT_IN_MEMCPY
58 void * memcpy(void * dst, const void * src, size_t n) {
59 uchar_t * d = (uchar_t *) dst;
60 const uchar_t * s = (const uchar_t *)src;
71 #ifdef CONFIG_BUILT_IN_MEMMOVE
72 void * memmove(void * dst, const void * src, size_t n) {
73 uint8_t * tmp = (uint8_t *)V3_Malloc(n);
84 #ifdef CONFIG_BUILT_IN_MEMCMP
85 int memcmp(const void * s1_, const void * s2_, size_t n) {
86 const char * s1 = s1_;
87 const char * s2 = s2_;
90 int cmp = (*s1 - *s2);
105 #ifdef CONFIG_BUILT_IN_STRLEN
106 size_t strlen(const char * s) {
109 while (*s++ != '\0') {
119 #ifdef CONFIG_BUILT_IN_STRNLEN
121 * This it a GNU extension.
122 * It is like strlen(), but it will check at most maxlen
123 * characters for the terminating nul character,
124 * returning maxlen if it doesn't find a nul.
125 * This is very useful for checking the length of untrusted
126 * strings (e.g., from user space).
128 size_t strnlen(const char * s, size_t maxlen) {
131 while ((len < maxlen) && (*s++ != '\0')) {
140 #ifdef CONFIG_BUILT_IN_STRCMP
141 int strcmp(const char * s1, const char * s2) {
143 int cmp = (*s1 - *s2);
145 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
156 #ifdef CONFIG_BUILT_IN_STRNCMP
157 int strncmp(const char * s1, const char * s2, size_t limit) {
161 int cmp = (*s1 - *s2);
163 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
172 /* limit reached and equal */
178 #ifdef CONFIG_BUILT_IN_STRCAT
179 char * strcat(char * s1, const char * s2) {
182 while (*s1) { s1++; }
183 while (*s2) { *s1++ = *s2++; }
192 #ifdef CONFIG_BUILT_IN_STRNCAT
193 char * strncat(char * s1, const char * s2, size_t limit) {
199 while (*s1) { s1++; }
214 #ifdef CONFIG_BUILT_IN_STRCPY
215 char * strcpy(char * dest, const char * src)
229 #ifdef CONFIG_BUILT_IN_STRNCPY
230 char * strncpy(char * dest, const char * src, size_t limit) {
233 while ((*src != '\0') && (limit > 0)) {
247 #ifdef CONFIG_BUILT_IN_STRDUP
248 char * strdup(const char * s1) {
251 ret = V3_Malloc(strlen(s1) + 1);
261 #ifdef CONFIG_BUILT_IN_ATOI
262 int atoi(const char * buf) {
265 while ((*buf >= '0') && (*buf <= '9')) {
276 int strtoi(const char * nptr, char ** endptr) {
278 char * buf = (char *)nptr;
280 while ((*buf >= '0') && (*buf <= '9')) {
294 uint64_t atox(const char * buf) {
297 while (isxdigit(*buf)) {
303 ret += tolower(*buf) - 'a' + 10;
312 uint64_t strtox(const char * nptr, char ** endptr) {
314 char * buf = (char *)nptr;
316 while (isxdigit(*buf)) {
322 ret += tolower(*buf) - 'a' + 10;
338 #ifdef CONFIG_BUILT_IN_STRCHR
339 char * strchr(const char * s, int c) {
350 #ifdef CONFIG_BUILT_IN_STRRCHR
351 char * strrchr(const char * s, int c) {
352 size_t len = strlen(s);
353 const char * p = s + len;
366 #ifdef CONFIG_BUILT_IN_STRPBRK
367 char * strpbrk(const char * s, const char * accept) {
368 size_t setLen = strlen(accept);
372 for (i = 0; i < setLen; ++i) {
373 if (*s == accept[i]) {
384 #ifdef CONFIG_BUILT_IN_STRSPN
385 size_t strspn(const char * s, const char * accept) {
389 int accept_len = strlen(accept);
394 for (i = 0; i < accept_len; i++) {
395 if (s[cnt] == accept[i]) {
408 #ifdef CONFIG_BUILT_IN_STRCSPN
409 size_t strcspn(const char * s, const char * reject) {
413 int reject_len = strlen(reject);
416 for (i = 0; i < reject_len; i++) {
417 if (s[cnt] == reject[i]) {
430 #ifdef CONFIG_BUILT_IN_STRSTR
431 char *strstr(const char *haystack, const char *needle)
441 if (!memcmp(s1, s2, l2))