1/*
2 * Australian Public Licence B (OZPLB)
3 *
4 * Version 1-0
5 *
6 * Copyright (c) 2004 University of New South Wales
7 *
8 * All rights reserved.
9 *
10 * Developed by: Operating Systems and Distributed Systems Group (DiSy)
11 *               University of New South Wales
12 *               http://www.disy.cse.unsw.edu.au
13 *
14 * Permission is granted by University of New South Wales, free of charge, to
15 * any person obtaining a copy of this software and any associated
16 * documentation files (the "Software") to deal with the Software without
17 * restriction, including (without limitation) the rights to use, copy,
18 * modify, adapt, merge, publish, distribute, communicate to the public,
19 * sublicense, and/or sell, lend or rent out copies of the Software, and
20 * to permit persons to whom the Software is furnished to do so, subject
21 * to the following conditions:
22 *
23 *     * Redistributions of source code must retain the above copyright
24 *       notice, this list of conditions and the following disclaimers.
25 *
26 *     * Redistributions in binary form must reproduce the above
27 *       copyright notice, this list of conditions and the following
28 *       disclaimers in the documentation and/or other materials provided
29 *       with the distribution.
30 *
31 *     * Neither the name of University of New South Wales, nor the names of its
32 *       contributors, may be used to endorse or promote products derived
33 *       from this Software without specific prior written permission.
34 *
35 * EXCEPT AS EXPRESSLY STATED IN THIS LICENCE AND TO THE FULL EXTENT
36 * PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS-IS", AND
37 * NATIONAL ICT AUSTRALIA AND ITS CONTRIBUTORS MAKE NO REPRESENTATIONS,
38 * WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
39 * BUT NOT LIMITED TO ANY REPRESENTATIONS, WARRANTIES OR CONDITIONS
40 * REGARDING THE CONTENTS OR ACCURACY OF THE SOFTWARE, OR OF TITLE,
41 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT,
42 * THE ABSENCE OF LATENT OR OTHER DEFECTS, OR THE PRESENCE OR ABSENCE OF
43 * ERRORS, WHETHER OR NOT DISCOVERABLE.
44 *
45 * TO THE FULL EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
46 * NATIONAL ICT AUSTRALIA OR ITS CONTRIBUTORS BE LIABLE ON ANY LEGAL
47 * THEORY (INCLUDING, WITHOUT LIMITATION, IN AN ACTION OF CONTRACT,
48 * NEGLIGENCE OR OTHERWISE) FOR ANY CLAIM, LOSS, DAMAGES OR OTHER
49 * LIABILITY, INCLUDING (WITHOUT LIMITATION) LOSS OF PRODUCTION OR
50 * OPERATION TIME, LOSS, DAMAGE OR CORRUPTION OF DATA OR RECORDS; OR LOSS
51 * OF ANTICIPATED SAVINGS, OPPORTUNITY, REVENUE, PROFIT OR GOODWILL, OR
52 * OTHER ECONOMIC LOSS; OR ANY SPECIAL, INCIDENTAL, INDIRECT,
53 * CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES, ARISING OUT OF OR IN
54 * CONNECTION WITH THIS LICENCE, THE SOFTWARE OR THE USE OF OR OTHER
55 * DEALINGS WITH THE SOFTWARE, EVEN IF NATIONAL ICT AUSTRALIA OR ITS
56 * CONTRIBUTORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH CLAIM, LOSS,
57 * DAMAGES OR OTHER LIABILITY.
58 *
59 * If applicable legislation implies representations, warranties, or
60 * conditions, or imposes obligations or liability on University of New South
61 * Wales or one of its contributors in respect of the Software that
62 * cannot be wholly or partly excluded, restricted or modified, the
63 * liability of University of New South Wales or the contributor is limited, to
64 * the full extent permitted by the applicable legislation, at its
65 * option, to:
66 * a.  in the case of goods, any one or more of the following:
67 * i.  the replacement of the goods or the supply of equivalent goods;
68 * ii.  the repair of the goods;
69 * iii. the payment of the cost of replacing the goods or of acquiring
70 *  equivalent goods;
71 * iv.  the payment of the cost of having the goods repaired; or
72 * b.  in the case of services:
73 * i.  the supplying of the services again; or
74 * ii.  the payment of the cost of having the services supplied again.
75 *
76 * The construction, validity and performance of this licence is governed
77 * by the laws in force in New South Wales, Australia.
78 */
79/*
80 Author: Carl van Schaik
81*/
82#include <string.h>
83#include <stdint.h>
84#include <stdio.h>
85
86/*
87 * Fill memory at s with (n) * byte value 'c'
88 */
89void *
90memset(void *s, int c, size_t n)
91{
92	uintptr_t num, align, pattern, *p, x;
93	unsigned char *mem = s;
94
95	x = (unsigned char)c;
96	align = sizeof(uintptr_t)-1;
97
98	if ((uintptr_t)s & align)
99	{
100		num = n > align ? (sizeof(uintptr_t) - ((uintptr_t)s & align)) : n;
101		n -= num;
102		while (num--)
103			*mem++ = x;
104	}
105
106	num = (uintptr_t)n / sizeof(uintptr_t);
107
108	p = (uintptr_t*)mem;
109
110#if UINTPTR_MAX == UINT32_MAX
111	pattern = x | x << 8 | x << 16 | x << 24;
112#elif UINTPTR_MAX == UINT64_MAX
113	pattern = x | x << 8 | x << 16 | x << 24 |
114		x << 32 | x << 40 | x << 48 | x << 56;
115#else
116#error UINTPTR_MAX not valid
117#endif
118	while (num) {
119		/* simple hand unrolled loop */
120		if ((num & 3)==0) {
121			num -= 4;
122			*p++ = pattern;
123			*p++ = pattern;
124			*p++ = pattern;
125			*p++ = pattern;
126		} else {
127			num--;
128			*p++ = pattern;
129		}
130	}
131	mem = (unsigned char*)p;
132
133	num = n & align;
134	while (num--)
135		*mem++ = x;
136
137	return s;
138}
139