1/* 2 * This file is part of the libpayload project. 3 * 4 * It has originally been taken from the HelenOS project 5 * (http://www.helenos.eu), and slightly modified for our purposes. 6 * 7 * Copyright (c) 2005 Martin Decky 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 14 * - Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * - Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * - The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <libpayload.h> 35 36void *memset(void *s, int c, size_t n) 37{ 38 char *os = s; 39 40 while (n--) 41 *(os++) = c; 42 43 return s; 44} 45 46void *memcpy(void *dst, const void *src, size_t n) 47{ 48 int i; 49 void *ret = dst; 50 51 for(i = 0; i < n % sizeof(unsigned long); i++) 52 ((unsigned char *) dst)[i] = ((unsigned char *) src)[i]; 53 54 n -= i; 55 src += i; 56 dst += i; 57 58 for(i = 0; i < n / sizeof(unsigned long); i++) 59 ((unsigned long *) dst)[i] = ((unsigned long *) src)[i]; 60 61 return ret; 62} 63 64void *memmove(void *dst, const void *src, size_t n) 65{ 66 int i; 67 unsigned long offs; 68 69 if (src > dst) 70 return memcpy(dst, src, n); 71 72 offs = n - (n % sizeof(unsigned long)); 73 74 for (i = (n % sizeof(unsigned long)) - 1; i >= 0; i--) 75 ((unsigned char *)dst)[i + offs] = 76 ((unsigned char *)src)[i + offs]; 77 78 for (i = n / sizeof(unsigned long) - 1; i >= 0; i--) 79 ((unsigned long *)dst)[i] = ((unsigned long *)src)[i]; 80 81 return dst; 82} 83 84/** 85 * Compare two memory areas. 86 * 87 * @param s1 Pointer to the first area to compare. 88 * @param s2 Pointer to the second area to compare. 89 * @param len Size of the first area in bytes (both must have the same length). 90 * @return If len is 0, return zero. If the areas match, return zero. 91 * Otherwise return non-zero. 92 */ 93int memcmp(const void *s1, const void *s2, size_t len) 94{ 95 for (; len && *(char *)s1++ == *(char *)s2++; len--) ; 96 return len; 97} 98

