From 5ef43beff03aa2cd77c7248356b9cb2ae17137a1 Mon Sep 17 00:00:00 2001 From: Theodore Tso Date: Fri, 10 Jun 1994 18:33:58 +0000 Subject: Updated telnet to be the 94.02.07 version, with some bugfixes git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3704 dc483132-0cff-0310-8789-dd5450dbe970 --- src/appl/telnet/libtelnet/mem.c | 160 +++++++++++++++++++++++++++++++--------- 1 file changed, 127 insertions(+), 33 deletions(-) (limited to 'src/appl/telnet/libtelnet/mem.c') diff --git a/src/appl/telnet/libtelnet/mem.c b/src/appl/telnet/libtelnet/mem.c index 644f218..798b482 100644 --- a/src/appl/telnet/libtelnet/mem.c +++ b/src/appl/telnet/libtelnet/mem.c @@ -1,30 +1,44 @@ /*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)memcmp.c 5.5 (Berkeley) 5/15/90"; -static char sccsid[] = "@(#)memcpy.c 5.6 (Berkeley) 5/15/90"; -static char sccsid[] = "@(#)memmove.c 5.2 (Berkeley) 5/15/90"; -static char sccsid[] = "@(#)memset.c 5.5 (Berkeley) 5/15/90"; +static char sccsid[] = "@(#)memcmp.c 8.1 (Berkeley) 6/4/93"; +static char sccsid[] = "@(#)memset.c 8.1 (Berkeley) 6/4/93"; +static char sccsid[] = "@(#)memcpy.c 8.1 (Berkeley) 6/4/93"; +static char sccsid[] = "@(#)memmove.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #ifndef __STDC__ @@ -32,6 +46,15 @@ static char sccsid[] = "@(#)memset.c 5.5 (Berkeley) 5/15/90"; #endif typedef int size_t; +#include +#include +#ifdef NO_STRING_H +#include +#else +#include +#endif +#include + /* * Compare memory regions. */ @@ -41,15 +64,14 @@ memcmp(s1, s2, n) size_t n; { if (n != 0) { - register const unsigned char *p1 = (unsigned char *)s1, - *p2 = (unsigned char *)s2; + register const unsigned char *p1 = s1, *p2 = s2; do { if (*p1++ != *p2++) - return(*--p1 - *--p2); + return (*--p1 - *--p2); } while (--n != 0); } - return(0); + return (0); } /* @@ -78,19 +100,91 @@ memmove(dst, src, length) return(dst); } +#define wsize sizeof(u_int) +#define wmask (wsize - 1) + +#ifdef BZERO +#define RETURN return +#define VAL 0 +#define WIDEVAL 0 + +void +bzero(dst0, length) + void *dst0; + register size_t length; +#else +#define RETURN return (dst0) +#define VAL c0 +#define WIDEVAL c + void * -memset(dst, c, n) - void *dst; - register int c; - register size_t n; +memset(dst0, c0, length) + void *dst0; + register int c0; + register size_t length; +#endif { + register size_t t; + register u_int c; + register u_char *dst; - if (n != 0) { - register char *d = (char *)dst; + dst = dst0; + /* + * If not enough words, just fill bytes. A length >= 2 words + * guarantees that at least one of them is `complete' after + * any necessary alignment. For instance: + * + * |-----------|-----------|-----------| + * |00|01|02|03|04|05|06|07|08|09|0A|00| + * ^---------------------^ + * dst dst+length-1 + * + * but we use a minimum of 3 here since the overhead of the code + * to do word writes is substantial. + */ + if (length < 3 * wsize) { + while (length != 0) { + *dst++ = VAL; + --length; + } + RETURN; + } - do - *d++ = c; - while (--n != 0); +#ifndef BZERO + if ((c = (u_char)c0) != 0) { /* Fill the word. */ +#ifndef UINT_MAX + UINT_MAX must be defined, try 0xFFFFFFFF; +#endif + c = (c << 8) | c; /* u_int is 16 bits. */ +#if UINT_MAX > 0xffff + c = (c << 16) | c; /* u_int is 32 bits. */ +#endif +#if UINT_MAX > 0xffffffff + c = (c << 32) | c; /* u_int is 64 bits. */ +#endif } - return(dst); +#endif + /* Align destination by filling in bytes. */ + if ((t = (int)dst & wmask) != 0) { + t = wsize - t; + length -= t; + do { + *dst++ = VAL; + } while (--t != 0); + } + + /* Fill words. Length was >= 2*words so we know t >= 1 here. */ + t = length / wsize; + do { + *(u_int *)dst = WIDEVAL; + dst += wsize; + } while (--t != 0); + + /* Mop up trailing bytes, if any. */ + t = length & wmask; + if (t != 0) + do { + *dst++ = VAL; + } while (--t != 0); + RETURN; } -- cgit v1.1