11573Srgrimes/*- 21573Srgrimes * Copyright (c) 1990, 1993 31573Srgrimes * The Regents of the University of California. All rights reserved. 41573Srgrimes * 51573Srgrimes * This code is derived from software contributed to Berkeley by 61573Srgrimes * Mike Hibler and Chris Torek. 71573Srgrimes * 81573Srgrimes * Redistribution and use in source and binary forms, with or without 91573Srgrimes * modification, are permitted provided that the following conditions 101573Srgrimes * are met: 111573Srgrimes * 1. Redistributions of source code must retain the above copyright 121573Srgrimes * notice, this list of conditions and the following disclaimer. 131573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 141573Srgrimes * notice, this list of conditions and the following disclaimer in the 151573Srgrimes * documentation and/or other materials provided with the distribution. 16251069Semaste * 3. Neither the name of the University nor the names of its contributors 171573Srgrimes * may be used to endorse or promote products derived from this software 181573Srgrimes * without specific prior written permission. 191573Srgrimes * 201573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 211573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 221573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 231573Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 241573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 251573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 261573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 271573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 281573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 291573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 301573Srgrimes * SUCH DAMAGE. 311573Srgrimes */ 321573Srgrimes 331573Srgrimes#if defined(LIBC_SCCS) && !defined(lint) 341573Srgrimesstatic char sccsid[] = "@(#)memset.c 8.1 (Berkeley) 6/4/93"; 351573Srgrimes#endif /* LIBC_SCCS and not lint */ 3686170Sobrien#include <sys/cdefs.h> 3786170Sobrien__FBSDID("$FreeBSD: releng/11.0/lib/libc/string/memset.c 251069 2013-05-28 20:57:40Z emaste $"); 381573Srgrimes 391573Srgrimes#include <sys/types.h> 401573Srgrimes 411573Srgrimes#include <limits.h> 421573Srgrimes 431573Srgrimes#define wsize sizeof(u_int) 441573Srgrimes#define wmask (wsize - 1) 451573Srgrimes 461573Srgrimes#ifdef BZERO 47102809Srobert#include <strings.h> 48102809Srobert 491573Srgrimes#define RETURN return 501573Srgrimes#define VAL 0 511573Srgrimes#define WIDEVAL 0 521573Srgrimes 531573Srgrimesvoid 54102809Srobertbzero(void *dst0, size_t length) 551573Srgrimes#else 56102809Srobert#include <string.h> 57102809Srobert 581573Srgrimes#define RETURN return (dst0) 591573Srgrimes#define VAL c0 601573Srgrimes#define WIDEVAL c 611573Srgrimes 621573Srgrimesvoid * 63102809Srobertmemset(void *dst0, int c0, size_t length) 641573Srgrimes#endif 651573Srgrimes{ 6692889Sobrien size_t t; 6746079Simp#ifndef BZERO 6892889Sobrien u_int c; 6946079Simp#endif 7092889Sobrien u_char *dst; 711573Srgrimes 721573Srgrimes dst = dst0; 731573Srgrimes /* 741573Srgrimes * If not enough words, just fill bytes. A length >= 2 words 751573Srgrimes * guarantees that at least one of them is `complete' after 761573Srgrimes * any necessary alignment. For instance: 771573Srgrimes * 781573Srgrimes * |-----------|-----------|-----------| 791573Srgrimes * |00|01|02|03|04|05|06|07|08|09|0A|00| 801573Srgrimes * ^---------------------^ 811573Srgrimes * dst dst+length-1 821573Srgrimes * 831573Srgrimes * but we use a minimum of 3 here since the overhead of the code 841573Srgrimes * to do word writes is substantial. 858870Srgrimes */ 861573Srgrimes if (length < 3 * wsize) { 871573Srgrimes while (length != 0) { 881573Srgrimes *dst++ = VAL; 891573Srgrimes --length; 901573Srgrimes } 911573Srgrimes RETURN; 921573Srgrimes } 931573Srgrimes 941573Srgrimes#ifndef BZERO 951573Srgrimes if ((c = (u_char)c0) != 0) { /* Fill the word. */ 961573Srgrimes c = (c << 8) | c; /* u_int is 16 bits. */ 971573Srgrimes#if UINT_MAX > 0xffff 981573Srgrimes c = (c << 16) | c; /* u_int is 32 bits. */ 991573Srgrimes#endif 1001573Srgrimes#if UINT_MAX > 0xffffffff 1011573Srgrimes c = (c << 32) | c; /* u_int is 64 bits. */ 1021573Srgrimes#endif 1031573Srgrimes } 1041573Srgrimes#endif 1051573Srgrimes /* Align destination by filling in bytes. */ 10635923Sjb if ((t = (long)dst & wmask) != 0) { 1071573Srgrimes t = wsize - t; 1081573Srgrimes length -= t; 1091573Srgrimes do { 1101573Srgrimes *dst++ = VAL; 1111573Srgrimes } while (--t != 0); 1121573Srgrimes } 1131573Srgrimes 1141573Srgrimes /* Fill words. Length was >= 2*words so we know t >= 1 here. */ 1151573Srgrimes t = length / wsize; 1161573Srgrimes do { 1171573Srgrimes *(u_int *)dst = WIDEVAL; 1181573Srgrimes dst += wsize; 1191573Srgrimes } while (--t != 0); 1201573Srgrimes 1211573Srgrimes /* Mop up trailing bytes, if any. */ 1221573Srgrimes t = length & wmask; 1231573Srgrimes if (t != 0) 1241573Srgrimes do { 1251573Srgrimes *dst++ = VAL; 1261573Srgrimes } while (--t != 0); 1271573Srgrimes RETURN; 1281573Srgrimes} 129