Chameleon

Chameleon Svn Source Tree

Root/tags/2.0/i386/libsa/string.c

Source at commit 1808 created 12 years 3 months ago.
By blackosx, Revise layout of package installer 'Welcome' file so it looks cleaner. Change the copyright notice to begin from 2009 as seen in the Chameleon 2.0 r431 installer. Should this date be set earlier?
1/*
2 * Copyright (c) 1999-2003 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 2.0 (the "License"). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License.
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24/* string operations */
25
26#include "libsa.h"
27
28void * memset(void * dst, int val, size_t len)
29{
30 asm volatile ( "rep; stosb"
31 : "=c" (len), "=D" (dst)
32 : "0" (len), "1" (dst), "a" (val)
33 : "memory" );
34
35 return dst;
36}
37
38#if 0
39void * memcpy(void * dst, const void * src, size_t len)
40{
41 asm volatile ( "rep; movsb"
42 : "=c" (len), "=D" (dst), "=S" (src)
43 : "0" (len), "1" (dst), "2" (src)
44 : "memory" );
45
46 return dst;
47}
48
49void bcopy(const void * src, void * dst, size_t len)
50{
51memcpy(dst, src, len);
52}
53
54void bzero(void * dst, size_t len)
55{
56 memset(dst, 0, len);
57}
58
59#else
60void * memcpy(void * dst, const void * src, size_t len)
61{
62 asm volatile ( "cld \n\t"
63 "movl %%ecx, %%edx \n\t"
64 "shrl $2, %%ecx \n\t"
65 "rep; movsl \n\t"
66 "movl %%edx, %%ecx \n\t"
67 "andl $3, %%ecx \n\t"
68 "rep; movsb \n\t"
69 : "=D" (dst)
70 : "c" (len), "D" (dst), "S" (src)
71 : "memory", "%edx" );
72
73 return dst;
74}
75
76void bcopy(const void * src, void * dst, size_t len)
77{
78 asm volatile ( "cld \n\t"
79 "movl %%ecx, %%edx \n\t"
80 "shrl $2, %%ecx \n\t"
81 "rep; movsl \n\t"
82 "movl %%edx, %%ecx \n\t"
83 "andl $3, %%ecx \n\t"
84 "rep; movsb \n\t"
85 :
86 : "c" (len), "D" (dst), "S" (src)
87 : "memory", "%edx" );
88}
89
90void bzero(void * dst, size_t len)
91{
92 asm volatile ( "xorl %%eax, %%eax \n\t"
93 "cld \n\t"
94 "movl %%ecx, %%edx \n\t"
95 "shrl $2, %%ecx \n\t"
96 "rep; stosl \n\t"
97 "movl %%edx, %%ecx \n\t"
98 "andl $3, %%ecx \n\t"
99 "rep; stosb \n\t"
100 :
101 : "c" (len), "D" (dst)
102 : "memory", "%eax" );
103}
104#endif
105
106/* #if DONT_USE_GCC_BUILT_IN_STRLEN */
107
108#define tolower(c) ((int)((c) & ~0x20))
109#define toupper(c) ((int)((c) | 0x20))
110
111size_t strlen(const char * s)
112{
113int n = 0;
114while (*s++) n++;
115return(n);
116}
117
118/*#endif*/
119
120/* NOTE: Moved from ntfs.c */
121int
122memcmp(const void *p1, const void *p2, size_t len)
123{
124 while (len--) {
125 if (*(const char*)(p1++) != *(const char*)(p2++))
126 return -1;
127 }
128 return 0;
129}
130
131int
132strcmp(const char * s1, const char * s2)
133{
134while (*s1 && (*s1 == *s2)) {
135s1++;
136s2++;
137}
138return (*s1 - *s2);
139}
140
141int strncmp(const char * s1, const char * s2, size_t len)
142{
143register int n = len;
144while (--n >= 0 && *s1 == *s2++)
145if (*s1++ == '\0')
146return(0);
147return(n<0 ? 0 : *s1 - *--s2);
148}
149
150char *
151strcpy(char * s1, const char * s2)
152{
153register char *ret = s1;
154while (*s1++ = *s2++)
155continue;
156return ret;
157}
158
159char *
160strncpy(char * s1, const char * s2, size_t n)
161{
162register char *ret = s1;
163while (n && (*s1++ = *s2++))
164n--;
165return ret;
166}
167
168size_t
169strlcpy(char * s1, const char * s2, size_t n)
170{
171while (n && (*s1++ = *s2++))
172n--;
173if (!n) *--s1=0;
174return strlen(s2);
175}
176
177char *
178strstr(const char *in, const char *str)
179{
180 char c;
181 size_t len;
182
183 c = *str++;
184 if (!c)
185 return (char *) in;// Trivial empty string case
186
187 len = strlen(str);
188 do {
189 char sc;
190
191 do {
192 sc = *in++;
193 if (!sc)
194 return (char *) 0;
195 } while (sc != c);
196 } while (strncmp(in, str, len) != 0);
197
198 return (char *) (in - 1);
199}
200
201int
202ptol(const char *str)
203{
204register int c = *str;
205
206if (c <= '7' && c >= '0')
207c -= '0';
208else if (c <= 'h' && c >= 'a')
209c -= 'a';
210else c = 0;
211return c;
212}
213
214int
215atoi(const char *str)
216{
217register int sum = 0;
218while (*str == ' ' || *str == '\t')
219str++;
220while (*str >= '0' && *str <= '9') {
221sum *= 10;
222sum += *str++ - '0';
223}
224return sum;
225}
226
227char *strncat(char *s1, const char *s2, size_t n)
228{
229register char *ret = s1;
230while (*s1)
231s1++;
232while (n-- && *s2)
233*s1++ = *s2++;
234*s1 = '\0';
235return ret;
236}
237
238char *strcat(char *s1, const char *s2)
239{
240return(strncat(s1, s2, strlen(s2)));
241}
242
243char *strdup(const char *s1)
244{
245return strcpy(malloc(strlen(s1) + 1), s1);
246}
247
248#if STRNCASECMP
249int strncasecmp(const char *s1, const char *s2, size_t len)
250{
251register int n = len;
252while (--n >= 0 && tolower(*s1) == tolower(*s2++))
253if (*s1++ == '\0')
254return(0);
255return(n<0 ? 0 : tolower(*s1) - tolower(*--s2));
256}
257#endif
258
259char* strchr(const char *str, int c)
260{
261 do
262 {
263 if(*str == c)
264 return (char*)str;
265 }
266 while(*(str++));
267
268 return 0;
269}
270
271char* strbreak(const char *str, char **next, long *len)
272{
273 char *start = (char*)str, *end;
274 bool quoted = false;
275
276 if ( !start || !len )
277 return 0;
278
279 *len = 0;
280
281 while ( isspace(*start) )
282 start++;
283
284 if (*start == '"')
285 {
286 start++;
287
288 end = strchr(start, '"');
289 if(end)
290 quoted = true;
291 else
292 end = strchr(start, '\0');
293 }
294 else
295 {
296 for ( end = start; *end && !isspace(*end); end++ )
297 {}
298 }
299
300 *len = end - start;
301
302 if(next)
303 *next = quoted ? end+1 : end;
304
305 return start;
306}
307
308/* COPYRIGHT NOTICE: checksum8 from AppleSMBIOS */
309uint8_t checksum8( void * start, unsigned int length )
310{
311 uint8_t csum = 0;
312 uint8_t * cp = (uint8_t *) start;
313 unsigned int i;
314
315 for ( i = 0; i < length; i++)
316 csum += *cp++;
317
318 return csum;
319}
320
321

Archive Download this file

Revision: 1808