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
;
63 if (!TOO_SMALL (n
) && !UNALIGNED (m
))
65 /* If we get this far, we know that n is large and m is word-aligned. */
67 aligned_addr
= (unsigned long*)m
;
69 /* Store C into each char sized location in BUFFER so that
70 we can set large blocks quickly. */
74 buffer
= (c
<< 8) | c
;
75 buffer
|= (buffer
<< 16);
80 for (i
= 0; i
< LBLOCKSIZE
; i
++)
81 buffer
= (buffer
<< 8) | c
;
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 */