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().
43 #define NEED_STRNLEN 0
45 #define NEED_STRNCMP 0
47 #define NEED_STRNCAT 0
49 #define NEED_STRNCPY 0
53 #define NEED_STRRCHR 0
54 #define NEED_STRPBRK 0
58 #include <palacios/vmm_types.h>
59 #include <palacios/vmm_string.h>
60 #include <palacios/vmm.h>
64 void * memset(void * s, int c, size_t n) {
65 uchar_t * p = (uchar_t *) s;
77 void * memcpy(void * dst, const void * src, size_t n) {
78 uchar_t * d = (uchar_t *) dst;
79 const uchar_t * s = (const uchar_t *)src;
92 int memcmp(const void * s1_, const void * s2_, size_t n) {
93 const char * s1 = s1_;
94 const char * s2 = s2_;
97 int cmp = (*s1 - *s2);
113 size_t strlen(const char * s) {
116 while (*s++ != '\0') {
128 * This it a GNU extension.
129 * It is like strlen(), but it will check at most maxlen
130 * characters for the terminating nul character,
131 * returning maxlen if it doesn't find a nul.
132 * This is very useful for checking the length of untrusted
133 * strings (e.g., from user space).
135 size_t strnlen(const char * s, size_t maxlen) {
138 while ((len < maxlen) && (*s++ != '\0')) {
148 int strcmp(const char * s1, const char * s2) {
150 int cmp = (*s1 - *s2);
152 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
164 int strncmp(const char * s1, const char * s2, size_t limit) {
168 int cmp = (*s1 - *s2);
170 if ((cmp != 0) || (*s1 == '\0') || (*s2 == '\0')) {
179 /* limit reached and equal */
186 char * strcat(char * s1, const char * s2) {
189 while (*s1) { s1++; }
190 while (*s2) { *s1++ = *s2++; }
200 char * strncat(char * s1, const char * s2, size_t limit) {
206 while (*s1) { s1++; }
222 char * strcpy(char * dest, const char * src)
237 char * strncpy(char * dest, const char * src, size_t limit) {
240 while ((*src != '\0') && (limit > 0)) {
255 char * strdup(const char * s1) {
258 ret = V3_Malloc(strlen(s1) + 1);
269 int atoi(const char * buf) {
272 while ((*buf >= '0') && (*buf <= '9')) {
284 char * strchr(const char * s, int c) {
296 char * strrchr(const char * s, int c) {
297 size_t len = strlen(s);
298 const char * p = s + len;
312 char * strpbrk(const char * s, const char * accept) {
313 size_t setLen = strlen(accept);
317 for (i = 0; i < setLen; ++i) {
318 if (*s == accept[i]) {