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 V3_CONFIG_BUILT_IN_MEMSET
45 void * memset(void * s, int c, size_t n) {
46 uchar_t * p = (uchar_t *) s;
57 #ifdef V3_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 V3_CONFIG_BUILT_IN_MEMMOVE
72 void * memmove(void * dst, const void * src, size_t n) {
73 uint8_t * tmp = (uint8_t *)V3_Malloc(n);
76 PrintError("Cannot allocate in built-in memmove\n");
89 #ifdef V3_CONFIG_BUILT_IN_MEMCMP
90 int memcmp(const void * s1_, const void * s2_, size_t n) {
91 const char * s1 = s1_;
92 const char * s2 = s2_;
95 int cmp = (*s1 - *s2);
110 #ifdef V3_CONFIG_BUILT_IN_STRLEN
111 size_t strlen(const char * s) {
114 while (*s++ != '\0') {
124 #ifdef V3_CONFIG_BUILT_IN_STRNLEN
126 * This it a GNU extension.
127 * It is like strlen(), but it will check at most maxlen
128 * characters for the terminating nul character,
129 * returning maxlen if it doesn't find a nul.
130 * This is very useful for checking the length of untrusted
131 * strings (e.g., from user space).
133 size_t strnlen(const char * s, size_t maxlen) {
136 while ((len < maxlen) && (*s++ != '\0')) {
145 #ifdef V3_CONFIG_BUILT_IN_STRCMP
146 int strcmp(const char * s1, const char * s2) {
148 int cmp = (*s1 - *s2);
150 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
160 #ifdef V3_CONFIG_BUILT_IN_STRCASECMP
161 int strcasecmp(const char * s1, const char * s2) {
163 int cmp = (tolower(*s1) - tolower(*s2));
165 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
177 #ifdef V3_CONFIG_BUILT_IN_STRNCMP
178 int strncmp(const char * s1, const char * s2, size_t limit) {
182 int cmp = (*s1 - *s2);
184 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
193 /* limit reached and equal */
198 #ifdef V3_CONFIG_BUILT_IN_STRNCASECMP
199 int strncasecmp(const char * s1, const char * s2, size_t limit) {
203 int cmp = (tolower(*s1) - tolower(*s2));
205 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
219 #ifdef V3_CONFIG_BUILT_IN_STRCAT
220 char * strcat(char * s1, const char * s2) {
223 while (*s1) { s1++; }
224 while (*s2) { *s1++ = *s2++; }
233 #ifdef V3_CONFIG_BUILT_IN_STRNCAT
234 char * strncat(char * s1, const char * s2, size_t limit) {
240 while (*s1) { s1++; }
255 #ifdef V3_CONFIG_BUILT_IN_STRCPY
256 char * strcpy(char * dest, const char * src)
270 #ifdef V3_CONFIG_BUILT_IN_STRNCPY
271 char * strncpy(char * dest, const char * src, size_t limit) {
274 while ((*src != '\0') && (limit > 0)) {
288 #ifdef V3_CONFIG_BUILT_IN_STRDUP
289 char * strdup(const char * s1) {
292 ret = V3_Malloc(strlen(s1) + 1);
295 PrintError("Cannot allocate in built-in strdup\n");
308 #ifdef V3_CONFIG_BUILT_IN_ATOI
309 int atoi(const char * buf) {
312 while ((*buf >= '0') && (*buf <= '9')) {
323 int strtoi(const char * nptr, char ** endptr) {
325 char * buf = (char *)nptr;
327 while ((*buf >= '0') && (*buf <= '9')) {
341 uint64_t atox(const char * buf) {
344 if (*(buf + 1) == 'x') {
348 while (isxdigit(*buf)) {
354 ret += tolower(*buf) - 'a' + 10;
363 uint64_t strtox(const char * nptr, char ** endptr) {
365 char * buf = (char *)nptr;
367 if (*(buf + 1) == 'x') {
371 while (isxdigit(*buf)) {
377 ret += tolower(*buf) - 'a' + 10;
393 #ifdef V3_CONFIG_BUILT_IN_STRCHR
394 char * strchr(const char * s, int c) {
405 #ifdef V3_CONFIG_BUILT_IN_STRRCHR
406 char * strrchr(const char * s, int c) {
407 size_t len = strlen(s);
408 const char * p = s + len;
421 #ifdef V3_CONFIG_BUILT_IN_STRPBRK
422 char * strpbrk(const char * s, const char * accept) {
423 size_t setLen = strlen(accept);
427 for (i = 0; i < setLen; ++i) {
428 if (*s == accept[i]) {
439 #ifdef V3_CONFIG_BUILT_IN_STRSPN
440 size_t strspn(const char * s, const char * accept) {
444 int accept_len = strlen(accept);
449 for (i = 0; i < accept_len; i++) {
450 if (s[cnt] == accept[i]) {
463 #ifdef V3_CONFIG_BUILT_IN_STRCSPN
464 size_t strcspn(const char * s, const char * reject) {
468 int reject_len = strlen(reject);
471 for (i = 0; i < reject_len; i++) {
472 if (s[cnt] == reject[i]) {
489 #ifdef V3_CONFIG_BUILT_IN_STRSTR
490 char *strstr(const char *haystack, const char *needle)
500 if (!memcmp(s1, s2, l2))
509 void str_tolower(char * s) {
510 while (isalpha(*s)) {
519 void str_toupper(char * s) {
520 while (isalpha(*s)) {