Chameleon Applications

Chameleon Applications Svn Source Tree

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

Source at commit 214 created 13 years 5 months ago.
By ifabio, update to chameleon trunk 630, and now the pakage folder is the same as blackosx branch, also add Icon "building" into buildpkg script, and add mint theme info into the English localizable.strings.
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
111int 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, int 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
168char *
169strlcpy(char * s1, const char * s2, size_t n)
170{
171register char *ret = s1;
172while (n && (*s1++ = *s2++))
173n--;
174if (!n) *--s1=0;
175return ret;
176}
177
178char *
179strstr(const char *in, const char *str)
180{
181 char c;
182 size_t len;
183
184 c = *str++;
185 if (!c)
186 return (char *) in;// Trivial empty string case
187
188 len = strlen(str);
189 do {
190 char sc;
191
192 do {
193 sc = *in++;
194 if (!sc)
195 return (char *) 0;
196 } while (sc != c);
197 } while (strncmp(in, str, len) != 0);
198
199 return (char *) (in - 1);
200}
201
202int
203ptol(const char *str)
204{
205register int c = *str;
206
207if (c <= '7' && c >= '0')
208c -= '0';
209else if (c <= 'h' && c >= 'a')
210c -= 'a';
211else c = 0;
212return c;
213}
214
215int
216atoi(const char *str)
217{
218register int sum = 0;
219while (*str == ' ' || *str == '\t')
220str++;
221while (*str >= '0' && *str <= '9') {
222sum *= 10;
223sum += *str++ - '0';
224}
225return sum;
226}
227
228char *strncat(char *s1, const char *s2, size_t n)
229{
230register char *ret = s1;
231while (*s1)
232s1++;
233while (n-- && *s2)
234*s1++ = *s2++;
235*s1 = '\0';
236return ret;
237}
238
239char *strcat(char *s1, const char *s2)
240{
241return(strncat(s1, s2, strlen(s2)));
242}
243
244char *strdup(const char *s1)
245{
246return strcpy(malloc(strlen(s1) + 1), s1);
247}
248
249#if STRNCASECMP
250int strncasecmp(const char *s1, const char *s2, size_t len)
251{
252register int n = len;
253while (--n >= 0 && tolower(*s1) == tolower(*s2++))
254if (*s1++ == '\0')
255return(0);
256return(n<0 ? 0 : tolower(*s1) - tolower(*--s2));
257}
258#endif
259
260char* strchr(const char *str, int c)
261{
262 do
263 {
264 if(*str == c)
265 return (char*)str;
266 }
267 while(*(str++));
268
269 return 0;
270}
271
272char* strbreak(const char *str, char **next, long *len)
273{
274 char *start = (char*)str, *end;
275 bool quoted = false;
276
277 if ( !start || !len )
278 return 0;
279
280 *len = 0;
281
282 while ( isspace(*start) )
283 start++;
284
285 if (*start == '"')
286 {
287 start++;
288
289 end = strchr(start, '"');
290 if(end)
291 quoted = true;
292 else
293 end = strchr(start, '\0');
294 }
295 else
296 {
297 for ( end = start; *end && !isspace(*end); end++ )
298 {}
299 }
300
301 *len = end - start;
302
303 if(next)
304 *next = quoted ? end+1 : end;
305
306 return start;
307}
308
309/* COPYRIGHT NOTICE: checksum8 from AppleSMBIOS */
310uint8_t checksum8( void * start, unsigned int length )
311{
312 uint8_t csum = 0;
313 uint8_t * cp = (uint8_t *) start;
314 unsigned int i;
315
316 for ( i = 0; i < length; i++)
317 csum += *cp++;
318
319 return csum;
320}
321
322

Archive Download this file

Revision: 214