Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
memset.c
Go to the documentation of this file.
1 /* Copyright (C) 1991, 1997 Free Software Foundation, Inc.
2  This file is part of the GNU C Library.
3 
4  The GNU C Library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Lesser General Public
6  License as published by the Free Software Foundation; either
7  version 2.1 of the License, or (at your option) any later version.
8 
9  The GNU C Library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with the GNU C Library; if not, write to the Free
16  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17  02111-1307 USA. */
18 
19 /* Slight modifications for pa-risc linux - Paul Bame <[email protected]> */
20 
21 #include <linux/types.h>
22 #include <asm/string.h>
23 
24 #define OPSIZ (BITS_PER_LONG/8)
25 typedef unsigned long op_t;
26 
27 void *
28 memset (void *dstpp, int sc, size_t len)
29 {
30  unsigned int c = sc;
31  long int dstp = (long int) dstpp;
32 
33  if (len >= 8)
34  {
35  size_t xlen;
36  op_t cccc;
37 
38  cccc = (unsigned char) c;
39  cccc |= cccc << 8;
40  cccc |= cccc << 16;
41  if (OPSIZ > 4)
42  /* Do the shift in two steps to avoid warning if long has 32 bits. */
43  cccc |= (cccc << 16) << 16;
44 
45  /* There are at least some bytes to set.
46  No need to test for LEN == 0 in this alignment loop. */
47  while (dstp % OPSIZ != 0)
48  {
49  ((unsigned char *) dstp)[0] = c;
50  dstp += 1;
51  len -= 1;
52  }
53 
54  /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
55  xlen = len / (OPSIZ * 8);
56  while (xlen > 0)
57  {
58  ((op_t *) dstp)[0] = cccc;
59  ((op_t *) dstp)[1] = cccc;
60  ((op_t *) dstp)[2] = cccc;
61  ((op_t *) dstp)[3] = cccc;
62  ((op_t *) dstp)[4] = cccc;
63  ((op_t *) dstp)[5] = cccc;
64  ((op_t *) dstp)[6] = cccc;
65  ((op_t *) dstp)[7] = cccc;
66  dstp += 8 * OPSIZ;
67  xlen -= 1;
68  }
69  len %= OPSIZ * 8;
70 
71  /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
72  xlen = len / OPSIZ;
73  while (xlen > 0)
74  {
75  ((op_t *) dstp)[0] = cccc;
76  dstp += OPSIZ;
77  xlen -= 1;
78  }
79  len %= OPSIZ;
80  }
81 
82  /* Write the last few bytes. */
83  while (len > 0)
84  {
85  ((unsigned char *) dstp)[0] = c;
86  dstp += 1;
87  len -= 1;
88  }
89 
90  return dstpp;
91 }