home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / EDITOR / NVI179B / NVI179B.ZIP / clib / memset.c < prev    next >
C/C++ Source or Header  |  1996-06-14  |  4KB  |  138 lines

  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.  * Mike Hibler and 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.  
  37. #include "config.h"
  38.  
  39. #if defined(LIBC_SCCS) && !defined(lint)
  40. static const char sccsid[] = "@(#)memset.c    8.1 (Berkeley) 6/4/93";
  41. #endif /* LIBC_SCCS and not lint */
  42.  
  43. #include <sys/types.h>
  44.  
  45. #include <limits.h>
  46. #include <string.h>
  47.  
  48. /*
  49.  * PUBLIC: #ifndef HAVE_MEMSET
  50.  * PUBLIC: void *memset __P((void *, int, size_t));
  51.  * PUBLIC: #endif
  52.  */
  53. #define    wsize    sizeof(u_int)
  54. #define    wmask    (wsize - 1)
  55.  
  56. #ifdef BZERO
  57. #define    RETURN    return
  58. #define    VAL    0
  59. #define    WIDEVAL    0
  60.  
  61. void
  62. bzero(dst0, length)
  63.     void *dst0;
  64.     register size_t length;
  65. #else
  66. #define    RETURN    return (dst0)
  67. #define    VAL    c0
  68. #define    WIDEVAL    c
  69.  
  70. void *
  71. memset(dst0, c0, length)
  72.     void *dst0;
  73.     register int c0;
  74.     register size_t length;
  75. #endif
  76. {
  77.     register size_t t;
  78.     register u_int c;
  79.     register u_char *dst;
  80.  
  81.     dst = dst0;
  82.     /*
  83.      * If not enough words, just fill bytes.  A length >= 2 words
  84.      * guarantees that at least one of them is `complete' after
  85.      * any necessary alignment.  For instance:
  86.      *
  87.      *    |-----------|-----------|-----------|
  88.      *    |00|01|02|03|04|05|06|07|08|09|0A|00|
  89.      *              ^---------------------^
  90.      *         dst         dst+length-1
  91.      *
  92.      * but we use a minimum of 3 here since the overhead of the code
  93.      * to do word writes is substantial.
  94.      */ 
  95.     if (length < 3 * wsize) {
  96.         while (length != 0) {
  97.             *dst++ = VAL;
  98.             --length;
  99.         }
  100.         RETURN;
  101.     }
  102.  
  103. #ifndef BZERO
  104.     if ((c = (u_char)c0) != 0) {    /* Fill the word. */
  105.         c = (c << 8) | c;    /* u_int is 16 bits. */
  106. #if UINT_MAX > 0xffff
  107.         c = (c << 16) | c;    /* u_int is 32 bits. */
  108. #endif
  109. #if UINT_MAX > 0xffffffff
  110.         c = (c << 32) | c;    /* u_int is 64 bits. */
  111. #endif
  112.     }
  113. #endif
  114.     /* Align destination by filling in bytes. */
  115.     if ((t = (int)dst & wmask) != 0) {
  116.         t = wsize - t;
  117.         length -= t;
  118.         do {
  119.             *dst++ = VAL;
  120.         } while (--t != 0);
  121.     }
  122.  
  123.     /* Fill words.  Length was >= 2*words so we know t >= 1 here. */
  124.     t = length / wsize;
  125.     do {
  126.         *(u_int *)dst = WIDEVAL;
  127.         dst += wsize;
  128.     } while (--t != 0);
  129.  
  130.     /* Mop up trailing bytes, if any. */
  131.     t = length & wmask;
  132.     if (t != 0)
  133.         do {
  134.             *dst++ = VAL;
  135.         } while (--t != 0);
  136.     RETURN;
  137. }
  138.