Rev 424 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*FUNCTION<<memset>>---set an area of memoryINDEXmemsetANSI_SYNOPSIS#include <string.h>void *memset(const void *<[dst]>, int <[c]>, size_t <[length]>);TRAD_SYNOPSIS#include <string.h>void *memset(<[dst]>, <[c]>, <[length]>)void *<[dst]>;int <[c]>;size_t <[length]>;DESCRIPTIONThis function converts the argument <[c]> into an unsignedchar and fills the first <[length]> characters of the arraypointed to by <[dst]> to the value.RETURNS<<memset>> returns the value of <[m]>.PORTABILITY<<memset>> is ANSI C.<<memset>> requires no supporting OS subroutines.QUICKREFmemset ansi pure*/#include "global.h"#include "include/string.h"#include "include/_ansi.h"#define LBLOCKSIZE (sizeof(long))#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1))#define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE)_PTR_DEFUN (memset, (m, c, n),_PTR m _ANDint c _ANDsize_t n){#if defined(PREFER_SIZE_OVER_SPEED)char *s = (char *) m;while (n-- != 0){*s++ = (char) c;}return m;#elsechar *s = (char *) m;unsigned int i;unsigned long buffer;unsigned long *aligned_addr;if (!TOO_SMALL (n) && !UNALIGNED (m)){/* If we get this far, we know that n is large and m is word-aligned. */aligned_addr = (unsigned long*)m;/* Store C into each char sized location in BUFFER so thatwe can set large blocks quickly. */c &= 0xff;if (LBLOCKSIZE == 4){buffer = (c << 8) | c;buffer |= (buffer << 16);}else{buffer = 0;for (i = 0; i < LBLOCKSIZE; i++)buffer = (buffer << 8) | c;}while (n >= LBLOCKSIZE*4){*aligned_addr++ = buffer;*aligned_addr++ = buffer;*aligned_addr++ = buffer;*aligned_addr++ = buffer;n -= 4*LBLOCKSIZE;}while (n >= LBLOCKSIZE){*aligned_addr++ = buffer;n -= LBLOCKSIZE;}/* Pick up the remainder with a bytewise loop. */s = (char*)aligned_addr;}while (n--){*s++ = (char)c;}return m;#endif /* not PREFER_SIZE_OVER_SPEED */}