Initial revision
[kopensolaris-gnu/glibc.git] / sysdeps / generic / bzero.c
1 /* Copyright (C) 1991 Free Software Foundation, Inc.
2    Contributed by Torbjorn Granlund (tege@sics.se).
3    
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with the GNU C Library; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20 #include <ansidecl.h>
21 #include <bstring.h>
22 #include <memcopy.h>
23
24 /* Set N bytes of S to 0.  */
25 void
26 DEFUN(bzero, (s, n), PTR s AND size_t len)
27 {
28   long int dstp = (long int) s;
29   CONST op_t zero = 0;
30
31   if (len >= 8)
32     {
33       size_t xlen;
34
35       /* There are at least some bytes to zero.  No need to test
36          for LEN == 0 in this alignment loop.  */
37       while (dstp % OPSIZ != 0)
38         {
39           ((byte *) dstp)[0] = 0;
40           dstp += 1;
41           len -= 1;
42         }
43
44       /* Write 8 op_t per iteration until less than 8 op_t remain.  */
45       xlen = len / (OPSIZ * 8);
46       while (xlen != 0)
47         {
48           ((op_t *) dstp)[0] = zero;
49           ((op_t *) dstp)[1] = zero;
50           ((op_t *) dstp)[2] = zero;
51           ((op_t *) dstp)[3] = zero;
52           ((op_t *) dstp)[4] = zero;
53           ((op_t *) dstp)[5] = zero;
54           ((op_t *) dstp)[6] = zero;
55           ((op_t *) dstp)[7] = zero;
56           dstp += 8 * OPSIZ;
57           xlen -= 1;
58         }
59       len %= OPSIZ * 8;
60
61       /* Write 1 op_t per iteration until less than op_t remain.  */
62       xlen = len / OPSIZ;
63       while (xlen != 0)
64         {
65           ((op_t *) dstp)[0] = zero;
66           dstp += OPSIZ;
67           xlen -= 1;
68         }
69       len %= OPSIZ;
70     }
71
72   /* Write the last few bytes.  */
73   while (len != 0)
74     {
75       ((byte *) dstp)[0] = 0;
76       dstp += 1;
77       len -= 1;
78     }
79 }
80