mem.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*-
  2.  * Copyright (c) 1990, 1993
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Chris Torek.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  * This product includes software developed by the University of
  19.  * California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36. #include "config.h"
  37. #ifdef SHOW_SCCSIDS
  38. static char sccsid[] = "@(#)memcmp.c 8.1 (Berkeley) 6/4/93";
  39. static char sccsid[] = "@(#)memset.c 8.1 (Berkeley) 6/4/93";
  40. static char sccsid[] = "@(#)memcpy.c 8.1 (Berkeley) 6/4/93";
  41. static char sccsid[] = "@(#)memmove.c 8.1 (Berkeley) 6/4/93";
  42. #endif
  43. #include <sys/types.h>
  44. #ifdef HAVE_STRING_H
  45. #include <string.h>
  46. #endif
  47. #ifdef HAVE_STRINGS_H
  48. #include <strings.h>
  49. #endif
  50. #ifndef HAVE_MEMCMP
  51. /* Compare memory regions. */
  52. int memcmp(s1, s2, n)
  53.     const void *s1, *s2;
  54.     size_t n;
  55. {
  56.     register const unsigned char *p1 = s1, *p2 = s2;
  57.     for (; n != 0; n--) if (*p1++ != *p2++) return (*--p1 - *--p2);
  58.     return (0);
  59. }
  60. #endif
  61. #ifndef HAVE_MEMMOVE
  62. /* Copy a block of memory, handling overlap. */
  63. void *memmove(dst, src, length)
  64.     void *dst;
  65.     const void *src;
  66.     register size_t length;
  67. {
  68.     bcopy((const char *)src, (char *)dst, length);
  69.     return(dst);
  70. }
  71. #endif
  72. #define wsize sizeof(u_int)
  73. #define wmask (wsize - 1)
  74. #ifndef HAVE_MEMSET
  75. void *memset(dst0, c0, length)
  76.     void *dst0;
  77.     register int c0;
  78.     register size_t length;
  79. {
  80.     register size_t t;
  81.     register u_int c;
  82.     register u_char *dst;
  83.     
  84.     dst = dst0;
  85.     /* If not enough words, just fill bytes.  A length >= 2 words            */
  86.     /* guarantees that at least one of them is `complete' after              */
  87.     /* any necessary alignment.  For instance:                               */
  88.     /*                                                                       */
  89.     /* |-----------|-----------|-----------|                                 */
  90.     /* |00|01|02|03|04|05|06|07|08|09|0A|00|                                 */
  91.     /*           ^---------------------^                                     */
  92.     /*           dst            dst+length-1                                 */
  93.     /*                                                                       */
  94.     /* but we use a minimum of 3 here since the overhead of the code         */
  95.     /* to do word writes is substantial.                                     */
  96.     if (length < 3 * wsize) {
  97. while (length != 0) {
  98.     *dst++ = c0;
  99.     --length;
  100. }
  101. return (dst0);
  102.     }
  103.     if ((c = (u_char)c0) != 0) { /* Fill the word.                    */
  104. #ifndef UINT_MAX
  105. UINT_MAX must be defined, try 0xFFFFFFFF;
  106. #endif
  107. c = (c << 8) | c; /* u_int is 16 bits.                 */
  108. #if UINT_MAX > 65535
  109. c = (c << 16) | c; /* u_int is 32 bits.                 */
  110. #endif
  111. #if UINT_MAX > 2147483647
  112. c = (c << 32) | c; /* u_int is 64 bits.                 */
  113. #endif
  114.     }
  115.     /* Align destination by filling in bytes.                                */
  116.     if ((t = (int)dst & wmask) != 0) {
  117. for (t = wsize-t, length -= t; t; t--) {
  118.     *dst++ = c0;
  119. }
  120.     }
  121.     /* Fill words.  Length was >= 2*words so we know t >= 1 here.            */
  122.     for (t = length / wsize; t; t--) {
  123. *(u_int *)dst = c;
  124. dst += wsize;
  125.     } 
  126.     /* Mop up trailing bytes, if any.                                        */
  127.     for (t = length & wmask; t; t--) {
  128. *dst++ = c0;
  129.     }
  130.     return (dst0);
  131. }
  132. #endif