Chameleon

Chameleon Svn Source Tree

Root/branches/chucko/i386/libsa/string.c

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{
113 const char* save = s;
114 while (*s++);
115 return (--s) - save;
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
141/* Derived from FreeBSD source */
142int strncmp(const char * s1, const char * s2, size_t n)
143{
144 if (!n)
145 return 0;
146 do {
147 if (*s1 != *s2++)
148 return (*(const unsigned char *)s1 -
149 *(const unsigned char *)(s2 - 1));
150 if (!*s1++)
151 break;
152 } while (--n);
153 return 0;
154}
155
156char *
157strcpy(char * s1, const char * s2)
158{
159register char *ret = s1;
160while ((*s1++ = *s2++))
161continue;
162return ret;
163}
164
165char *
166stpcpy(char * s1, const char * s2)
167{
168while ((*s1++ = *s2++))
169continue;
170return --s1;
171}
172
173char *
174strncpy(char * s1, const char * s2, size_t n)
175{
176register char *ret = s1;
177while (n && (*s1++ = *s2++))
178 --n;
179if (n > 0)
180 bzero(s1, n);
181return ret;
182}
183
184char *
185stpncpy(char * s1, const char * s2, size_t n)
186{
187while (n && (*s1++ = *s2++))
188 --n;
189if (n > 0)
190 bzero(s1, n);
191 return s1;
192}
193
194char *
195strstr(const char *in, const char *str)
196{
197 char c;
198 size_t len;
199
200 c = *str++;
201 if (!c)
202 return (char *) in;// Trivial empty string case
203
204 len = strlen(str);
205 do {
206 char sc;
207
208 do {
209 sc = *in++;
210 if (!sc)
211 return (char *) 0;
212 } while (sc != c);
213 } while (strncmp(in, str, len) != 0);
214
215 return (char *) (in - 1);
216}
217
218int
219ptol(const char *str)
220{
221register int c = *str;
222
223if (c <= '7' && c >= '0')
224c -= '0';
225else if (c <= 'h' && c >= 'a')
226c -= 'a';
227else c = 0;
228return c;
229}
230
231int
232atoi(const char *str)
233{
234register int sum = 0;
235while (*str == ' ' || *str == '\t')
236str++;
237while (*str >= '0' && *str <= '9') {
238sum *= 10;
239sum += *str++ - '0';
240}
241return sum;
242}
243
244char *strncat(char *s1, const char *s2, size_t n)
245{
246register char *ret = s1;
247while (*s1)
248s1++;
249while (n-- && (*s1++ = *s2++));
250return ret;
251}
252
253char *strcat(char *s1, const char *s2)
254{
255register char *ret = s1;
256while (*s1)
257s1++;
258while ((*s1++ = *s2++));
259return ret;
260}
261
262char *strdup(const char *s1)
263{
264return strcpy(malloc(strlen(s1) + 1), s1);
265}
266
267#if STRNCASECMP
268int strncasecmp(const char *s1, const char *s2, size_t len)
269{
270register int n = len;
271while (--n >= 0 && tolower(*s1) == tolower(*s2++))
272if (*s1++ == '\0')
273return(0);
274return(n<0 ? 0 : tolower(*s1) - tolower(*--s2));
275}
276#endif
277
278char* strchr(const char *str, int c)
279{
280 do
281 {
282 if(*str == c)
283 return (char*)str;
284 }
285 while(*(str++));
286
287 return 0;
288}
289
290char* strbreak(const char *str, char **next, long *len)
291{
292 char *start = (char*)str, *end;
293 bool quoted = false;
294
295 if ( !start || !len )
296 return 0;
297
298 *len = 0;
299
300 while ( isspace(*start) )
301 start++;
302
303 if (*start == '"')
304 {
305 start++;
306
307 end = strchr(start, '"');
308 if(end)
309 quoted = true;
310 else
311 end = strchr(start, '\0');
312 }
313 else
314 {
315 for ( end = start; *end && !isspace(*end); end++ )
316 {}
317 }
318
319 *len = end - start;
320
321 if(next)
322 *next = quoted ? end+1 : end;
323
324 return start;
325}
326
327/* COPYRIGHT NOTICE: checksum8 from AppleSMBIOS */
328uint8_t checksum8( void * start, unsigned int length )
329{
330 uint8_t csum = 0;
331 uint8_t * cp = (uint8_t *) start;
332 unsigned int i;
333
334 for ( i = 0; i < length; i++)
335 csum += *cp++;
336
337 return csum;
338}
339
340

Archive Download this file

Revision: 2335