1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include <sys/types.h>
29 #include <sys/param.h>
30 #include <sys/systm.h>
31 
32 /*
33  * Standalone copies of some basic routines.  Note that these routines
34  * are transformed via Makefile -D flags into krtld_* routines.  So,
35  * this version of strcmp() will become krtld_strcmp() when built.
36  *
37  * This dubious practice is so that krtld can have its own private
38  * versions of these routines suitable for use during early boot,
39  * when kernel-based routines might not work.  Make sure to use 'nm'
40  * on your krtld to make sure it is calling the appropriate routines.
41  */
42 
43 int
44 strcmp(const char *s1, const char *s2)
45 {
46 	if (s1 == s2)
47 		return (0);
48 	while (*s1 == *s2++)
49 		if (*s1++ == '\0')
50 			return (0);
51 	return (*s1 - s2[-1]);
52 }
53 
54 /*
55  * Compare strings (at most n bytes): return *s1-*s2 for the last
56  * characters in s1 and s2 which were compared.
57  */
58 int
59 strncmp(const char *s1, const char *s2, size_t n)
60 {
61 	if (s1 == s2)
62 		return (0);
63 	n++;
64 	while (--n != 0 && *s1 == *s2++)
65 		if (*s1++ == '\0')
66 			return (0);
67 	return ((n == 0) ? 0 : *s1 - *--s2);
68 }
69 
70 size_t
71 strlen(const char *s)
72 {
73 	const char *s0 = s + 1;
74 
75 	while (*s++ != '\0')
76 		;
77 	return (s - s0);
78 }
79 
80 char *
81 strcpy(char *s1, const char *s2)
82 {
83 	char *os1 = s1;
84 
85 	while (*s1++ = *s2++)
86 		;
87 	return (os1);
88 }
89 
90 char *
91 strncpy(char *s1, const char *s2, size_t n)
92 {
93 	char *os1 = s1;
94 
95 	n++;
96 	while ((--n != 0) && ((*s1++ = *s2++) != '\0'))
97 		;
98 	if (n != 0)
99 		while (--n != 0)
100 			*s1++ = '\0';
101 	return (os1);
102 }
103 
104 char *
105 strcat(char *s1, const char *s2)
106 {
107 	char *os1 = s1;
108 
109 	while (*s1++)
110 		;
111 	--s1;
112 	while (*s1++ = *s2++)
113 		;
114 	return (os1);
115 }
116 
117 size_t
118 strlcat(char *dst, const char *src, size_t dstsize)
119 {
120 	char *df = dst;
121 	size_t left = dstsize;
122 	size_t l1;
123 	size_t l2 = strlen(src);
124 	size_t copied;
125 
126 	while (left-- != 0 && *df != '\0')
127 		df++;
128 	l1 = df - dst;
129 	if (dstsize == l1)
130 		return (l1 + l2);
131 
132 	copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
133 	bcopy(src, dst + l1, copied);
134 	dst[l1+copied] = '\0';
135 	return (l1 + l2);
136 }
137 
138 char *
139 strchr(const char *sp, int c)
140 {
141 
142 	do {
143 		if (*sp == (char)c)
144 			return ((char *)sp);
145 	} while (*sp++);
146 	return (NULL);
147 }
148 
149 void
150 bzero(void *p_arg, size_t count)
151 {
152 	char zero = 0;
153 	caddr_t p = p_arg;
154 
155 	while (count != 0)
156 		*p++ = zero, count--;	/* Avoid clr for 68000, still... */
157 }
158 
159 void
160 bcopy(const void *src_arg, void *dest_arg, size_t count)
161 {
162 	caddr_t src = (caddr_t)src_arg;
163 	caddr_t dest = dest_arg;
164 
165 	if (src < dest && (src + count) > dest) {
166 		/* overlap copy */
167 		while (--count != -1)
168 			*(dest + count) = *(src + count);
169 	} else {
170 		while (--count != -1)
171 			*dest++ = *src++;
172 	}
173 }
174