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, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright (c) 1991-1995, by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 /*
30 * The routines are NOT part of the interface, merely internal
31 * utilities which assist in making the interface standalone.
32 */
33
34 #include <sys/promif.h>
35 #include <sys/promimpl.h>
36
37 /*
38 * a version of string copy that is bounded
39 */
40 char *
prom_strncpy(register char * s1,register char * s2,size_t n)41 prom_strncpy(register char *s1, register char *s2, size_t n)
42 {
43 register char *os1 = s1;
44
45 n++;
46 while (--n != 0 && (*s1++ = *s2++) != '\0')
47 ;
48 if (n != 0)
49 while (--n != 0)
50 *s1++ = '\0';
51 return (os1);
52 }
53
54 /*
55 * and one that knows no bounds
56 */
57 char *
prom_strcpy(register char * s1,register char * s2)58 prom_strcpy(register char *s1, register char *s2)
59 {
60 register char *os1;
61
62 os1 = s1;
63 while (*s1++ = *s2++)
64 ;
65 return (os1);
66 }
67
68 /*
69 * a copy of string compare that is bounded
70 */
71 int
prom_strncmp(register char * s1,register char * s2,register size_t n)72 prom_strncmp(register char *s1, register char *s2, register size_t n)
73 {
74 n++;
75 if (s1 == s2)
76 return (0);
77 while (--n != 0 && *s1 == *s2++)
78 if (*s1++ == '\0')
79 return (0);
80 return ((n == 0) ? 0: (*s1 - s2[-1]));
81 }
82
83 /*
84 * and one that knows no bounds
85 */
86 int
prom_strcmp(register char * s1,register char * s2)87 prom_strcmp(register char *s1, register char *s2)
88 {
89 while (*s1 == *s2++)
90 if (*s1++ == '\0')
91 return (0);
92 return (*s1 - *--s2);
93 }
94
95 /*
96 * finds the length of a succession of non-NULL chars
97 */
98 int
prom_strlen(register char * s)99 prom_strlen(register char *s)
100 {
101 register int n = 0;
102
103 while (*s++)
104 n++;
105
106 return (n);
107 }
108
109 /*
110 * return the ptr in sp at which the character c last
111 * appears; 0 if not found
112 */
113 char *
prom_strrchr(register char * sp,register char c)114 prom_strrchr(register char *sp, register char c)
115 {
116 register char *r;
117
118 for (r = (char *)0; *sp != (char)0; ++sp)
119 if (*sp == c)
120 r = sp;
121 return (r);
122 }
123
124 /*
125 * Concatenate string s2 to string s1
126 */
127 char *
prom_strcat(register char * s1,register char * s2)128 prom_strcat(register char *s1, register char *s2)
129 {
130 char *os1 = s1;
131
132 while ((*s1) != ((char)0))
133 s1++; /* find the end of string s1 */
134
135 while (*s1++ = *s2++) /* Concatenate s2 */
136 ;
137 return (os1);
138 }
139
140 /*
141 * Return the ptr in sp at which the character c first
142 * appears; NULL if not found
143 */
144 char *
prom_strchr(register const char * sp,register int c)145 prom_strchr(register const char *sp, register int c)
146 {
147
148 do {
149 if (*sp == (char)c)
150 return ((char *)sp);
151 } while (*sp++);
152 return (NULL);
153 }
154