3 <<memset>>---set an area of memory
10 void *memset(const void *<[dst]>, int <[c]>, size_t <[length]>);
14 void *memset(<[dst]>, <[c]>, <[length]>)
20 This function converts the argument <[c]> into an unsigned
21 char and fills the first <[length]> characters of the array
22 pointed to by <[dst]> to the value.
25 <<memset>> returns the value of <[m]>.
30 <<memset>> requires no supporting OS subroutines.
38 #define LBLOCKSIZE (sizeof(long))
39 #define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1))
40 #define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE)
43 _DEFUN (memset
, (m
, c
, n
),
48 #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
61 unsigned long *aligned_addr
;
62 unsigned int d
= c
& 0xff; /* To avoid sign extension, copy C to an
65 if (!TOO_SMALL (n
) && !UNALIGNED (m
))
67 /* If we get this far, we know that n is large and m is word-aligned. */
68 aligned_addr
= (unsigned long*)m
;
70 /* Store D into each char sized location in BUFFER so that
71 we can set large blocks quickly. */
74 buffer
= (d
<< 8) | d
;
75 buffer
|= (buffer
<< 16);
80 for (i
= 0; i
< LBLOCKSIZE
; i
++)
81 buffer
= (buffer
<< 8) | d
;
84 while (n
>= LBLOCKSIZE
*4)
86 *aligned_addr
++ = buffer
;
87 *aligned_addr
++ = buffer
;
88 *aligned_addr
++ = buffer
;
89 *aligned_addr
++ = buffer
;
93 while (n
>= LBLOCKSIZE
)
95 *aligned_addr
++ = buffer
;
98 /* Pick up the remainder with a bytewise loop. */
99 s
= (char*)aligned_addr
;
108 #endif /* not PREFER_SIZE_OVER_SPEED */