Chameleon

Chameleon Svn Source Tree

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

Source at commit 284 created 13 years 10 months ago.
By blackosx, Amended my mistake by updating the Default theme images in the trunk. Now put them back as they were.. (Sorry)
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
260/* COPYRIGHT NOTICE: checksum8 from AppleSMBIOS */
261uint8_t checksum8( void * start, unsigned int length )
262{
263 uint8_t csum = 0;
264 uint8_t * cp = (uint8_t *) start;
265 unsigned int i;
266
267 for ( i = 0; i < length; i++)
268 csum += *cp++;
269
270 return csum;
271}
272
273

Archive Download this file

Revision: 284