This source file includes following definitions.
- strcpy
- strncpy
- strcat
- strncat
- strcmp
- strncmp
- strchr
- strrchr
- strspn
- strcspn
- strpbrk
- strstr
- strlen
- strtok
- memcpy
- memmove
- memcmp
- memchr
- memset
1 #ifndef _STRING_H_
2 #define _STRING_H_
3
4 #ifndef NULL
5 #define NULL ((void *) 0)
6 #endif
7
8 #ifndef _SIZE_T
9 #define _SIZE_T
10 typedef unsigned int size_t;
11 #endif
12
13 extern char * strerror(int errno);
14
15
16
17
18
19
20
21
22
23
24
25
26
27 extern inline char * strcpy(char * dest,const char *src)
28 {
29 __asm__("cld\n"
30 "1:\tlodsb\n\t"
31 "stosb\n\t"
32 "testb %%al,%%al\n\t"
33 "jne 1b"
34 ::"S" (src),"D" (dest):"si","di","ax");
35 return dest;
36 }
37
38 extern inline char * strncpy(char * dest,const char *src,int count)
39 {
40 __asm__("cld\n"
41 "1:\tdecl %2\n\t"
42 "js 2f\n\t"
43 "lodsb\n\t"
44 "stosb\n\t"
45 "testb %%al,%%al\n\t"
46 "jne 1b\n\t"
47 "rep\n\t"
48 "stosb\n"
49 "2:"
50 ::"S" (src),"D" (dest),"c" (count):"si","di","ax","cx");
51 return dest;
52 }
53
54 extern inline char * strcat(char * dest,const char * src)
55 {
56 __asm__("cld\n\t"
57 "repne\n\t"
58 "scasb\n\t"
59 "decl %1\n"
60 "1:\tlodsb\n\t"
61 "stosb\n\t"
62 "testb %%al,%%al\n\t"
63 "jne 1b"
64 ::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx");
65 return dest;
66 }
67
68 extern inline char * strncat(char * dest,const char * src,int count)
69 {
70 __asm__("cld\n\t"
71 "repne\n\t"
72 "scasb\n\t"
73 "decl %1\n\t"
74 "movl %4,%3\n"
75 "1:\tdecl %3\n\t"
76 "js 2f\n\t"
77 "lodsb\n\t"
78 "stosb\n\t"
79 "testb %%al,%%al\n\t"
80 "jne 1b\n"
81 "2:\txorl %2,%2\n\t"
82 "stosb"
83 ::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
84 :"si","di","ax","cx");
85 return dest;
86 }
87
88 extern inline int strcmp(const char * cs,const char * ct)
89 {
90 register int __res __asm__("ax");
91 __asm__("cld\n"
92 "1:\tlodsb\n\t"
93 "scasb\n\t"
94 "jne 2f\n\t"
95 "testb %%al,%%al\n\t"
96 "jne 1b\n\t"
97 "xorl %%eax,%%eax\n\t"
98 "jmp 3f\n"
99 "2:\tmovl $1,%%eax\n\t"
100 "jl 3f\n\t"
101 "negl %%eax\n"
102 "3:"
103 :"=a" (__res):"D" (cs),"S" (ct):"si","di");
104 return __res;
105 }
106
107 extern inline int strncmp(const char * cs,const char * ct,int count)
108 {
109 register int __res __asm__("ax");
110 __asm__("cld\n"
111 "1:\tdecl %3\n\t"
112 "js 2f\n\t"
113 "lodsb\n\t"
114 "scasb\n\t"
115 "jne 3f\n\t"
116 "testb %%al,%%al\n\t"
117 "jne 1b\n"
118 "2:\txorl %%eax,%%eax\n\t"
119 "jmp 4f\n"
120 "3:\tmovl $1,%%eax\n\t"
121 "jl 4f\n\t"
122 "negl %%eax\n"
123 "4:"
124 :"=a" (__res):"D" (cs),"S" (ct),"c" (count):"si","di","cx");
125 return __res;
126 }
127
128 extern inline char * strchr(const char * s,char c)
129 {
130 register char * __res __asm__("ax");
131 __asm__("cld\n\t"
132 "movb %%al,%%ah\n"
133 "1:\tlodsb\n\t"
134 "cmpb %%ah,%%al\n\t"
135 "je 2f\n\t"
136 "testb %%al,%%al\n\t"
137 "jne 1b\n\t"
138 "movl $1,%1\n"
139 "2:\tmovl %1,%0\n\t"
140 "decl %0"
141 :"=a" (__res):"S" (s),"0" (c):"si");
142 return __res;
143 }
144
145 extern inline char * strrchr(const char * s,char c)
146 {
147 register char * __res __asm__("dx");
148 __asm__("cld\n\t"
149 "movb %%al,%%ah\n"
150 "1:\tlodsb\n\t"
151 "cmpb %%ah,%%al\n\t"
152 "jne 2f\n\t"
153 "movl %%esi,%0\n\t"
154 "decl %0\n"
155 "2:\ttestb %%al,%%al\n\t"
156 "jne 1b"
157 :"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si");
158 return __res;
159 }
160
161 extern inline int strspn(const char * cs, const char * ct)
162 {
163 register char * __res __asm__("si");
164 __asm__("cld\n\t"
165 "movl %4,%%edi\n\t"
166 "repne\n\t"
167 "scasb\n\t"
168 "notl %%ecx\n\t"
169 "decl %%ecx\n\t"
170 "movl %%ecx,%%edx\n"
171 "1:\tlodsb\n\t"
172 "testb %%al,%%al\n\t"
173 "je 2f\n\t"
174 "movl %4,%%edi\n\t"
175 "movl %%edx,%%ecx\n\t"
176 "repne\n\t"
177 "scasb\n\t"
178 "je 1b\n"
179 "2:\tdecl %0"
180 :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
181 :"ax","cx","dx","di");
182 return __res-cs;
183 }
184
185 extern inline int strcspn(const char * cs, const char * ct)
186 {
187 register char * __res __asm__("si");
188 __asm__("cld\n\t"
189 "movl %4,%%edi\n\t"
190 "repne\n\t"
191 "scasb\n\t"
192 "notl %%ecx\n\t"
193 "decl %%ecx\n\t"
194 "movl %%ecx,%%edx\n"
195 "1:\tlodsb\n\t"
196 "testb %%al,%%al\n\t"
197 "je 2f\n\t"
198 "movl %4,%%edi\n\t"
199 "movl %%edx,%%ecx\n\t"
200 "repne\n\t"
201 "scasb\n\t"
202 "jne 1b\n"
203 "2:\tdecl %0"
204 :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
205 :"ax","cx","dx","di");
206 return __res-cs;
207 }
208
209 extern inline char * strpbrk(const char * cs,const char * ct)
210 {
211 register char * __res __asm__("si");
212 __asm__("cld\n\t"
213 "movl %4,%%edi\n\t"
214 "repne\n\t"
215 "scasb\n\t"
216 "notl %%ecx\n\t"
217 "decl %%ecx\n\t"
218 "movl %%ecx,%%edx\n"
219 "1:\tlodsb\n\t"
220 "testb %%al,%%al\n\t"
221 "je 2f\n\t"
222 "movl %4,%%edi\n\t"
223 "movl %%edx,%%ecx\n\t"
224 "repne\n\t"
225 "scasb\n\t"
226 "jne 1b\n\t"
227 "decl %0\n\t"
228 "jmp 3f\n"
229 "2:\txorl %0,%0\n"
230 "3:"
231 :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
232 :"ax","cx","dx","di");
233 return __res;
234 }
235
236 extern inline char * strstr(const char * cs,const char * ct)
237 {
238 register char * __res __asm__("ax");
239 __asm__("cld\n\t" \
240 "movl %4,%%edi\n\t"
241 "repne\n\t"
242 "scasb\n\t"
243 "notl %%ecx\n\t"
244 "decl %%ecx\n\t"
245 "movl %%ecx,%%edx\n"
246 "1:\tmovl %4,%%edi\n\t"
247 "movl %%esi,%%eax\n\t"
248 "movl %%edx,%%ecx\n\t"
249 "repe\n\t"
250 "cmpsb\n\t"
251 "je 2f\n\t"
252 "xchgl %%eax,%%esi\n\t"
253 "incl %%esi\n\t"
254 "cmpb $0,-1(%%eax)\n\t"
255 "jne 1b\n\t"
256 "xorl %%eax,%%eax\n\t"
257 "2:"
258 :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct)
259 :"cx","dx","di","si");
260 return __res;
261 }
262
263 extern inline int strlen(const char * s)
264 {
265 register int __res __asm__("cx");
266 __asm__("cld\n\t"
267 "repne\n\t"
268 "scasb\n\t"
269 "notl %0\n\t"
270 "decl %0"
271 :"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di");
272 return __res;
273 }
274
275 extern char * ___strtok;
276
277 extern inline char * strtok(char * s,const char * ct)
278 {
279 register char * __res __asm__("si");
280 __asm__("testl %1,%1\n\t"
281 "jne 1f\n\t"
282 "testl %0,%0\n\t"
283 "je 8f\n\t"
284 "movl %0,%1\n"
285 "1:\txorl %0,%0\n\t"
286 "movl $-1,%%ecx\n\t"
287 "xorl %%eax,%%eax\n\t"
288 "cld\n\t"
289 "movl %4,%%edi\n\t"
290 "repne\n\t"
291 "scasb\n\t"
292 "notl %%ecx\n\t"
293 "decl %%ecx\n\t"
294 "je 7f\n\t"
295 "movl %%ecx,%%edx\n"
296 "2:\tlodsb\n\t"
297 "testb %%al,%%al\n\t"
298 "je 7f\n\t"
299 "movl %4,%%edi\n\t"
300 "movl %%edx,%%ecx\n\t"
301 "repne\n\t"
302 "scasb\n\t"
303 "je 2b\n\t"
304 "decl %1\n\t"
305 "cmpb $0,(%1)\n\t"
306 "je 7f\n\t"
307 "movl %1,%0\n"
308 "3:\tlodsb\n\t"
309 "testb %%al,%%al\n\t"
310 "je 5f\n\t"
311 "movl %4,%%edi\n\t"
312 "movl %%edx,%%ecx\n\t"
313 "repne\n\t"
314 "scasb\n\t"
315 "jne 3b\n\t"
316 "decl %1\n\t"
317 "cmpb $0,(%1)\n\t"
318 "je 5f\n\t"
319 "movb $0,(%1)\n\t"
320 "incl %1\n\t"
321 "jmp 6f\n"
322 "5:\txorl %1,%1\n"
323 "6:\tcmpb $0,(%0)\n\t"
324 "jne 7f\n\t"
325 "xorl %0,%0\n"
326 "7:\ttestl %0,%0\n\t"
327 "jne 8f\n\t"
328 "movl %0,%1\n"
329 "8:"
330 :"=b" (__res),"=S" (___strtok)
331 :"0" (___strtok),"1" (s),"g" (ct)
332 :"ax","cx","dx","di");
333 return __res;
334 }
335
336 extern inline void * memcpy(void * dest,const void * src, int n)
337 {
338 __asm__("cld\n\t"
339 "rep\n\t"
340 "movsb"
341 ::"c" (n),"S" (src),"D" (dest)
342 :"cx","si","di");
343 return dest;
344 }
345
346 extern inline void * memmove(void * dest,const void * src, int n)
347 {
348 if (dest<src)
349 __asm__("cld\n\t"
350 "rep\n\t"
351 "movsb"
352 ::"c" (n),"S" (src),"D" (dest)
353 :"cx","si","di");
354 else
355 __asm__("std\n\t"
356 "rep\n\t"
357 "movsb"
358 ::"c" (n),"S" (src+n-1),"D" (dest+n-1)
359 :"cx","si","di");
360 return dest;
361 }
362
363 extern inline int memcmp(const void * cs,const void * ct,int count)
364 {
365 register int __res __asm__("ax");
366 __asm__("cld\n\t"
367 "repe\n\t"
368 "cmpsb\n\t"
369 "je 1f\n\t"
370 "movl $1,%%eax\n\t"
371 "jl 1f\n\t"
372 "negl %%eax\n"
373 "1:"
374 :"=a" (__res):"0" (0),"D" (cs),"S" (ct),"c" (count)
375 :"si","di","cx");
376 return __res;
377 }
378
379 extern inline void * memchr(const void * cs,char c,int count)
380 {
381 register void * __res __asm__("di");
382 if (!count)
383 return NULL;
384 __asm__("cld\n\t"
385 "repne\n\t"
386 "scasb\n\t"
387 "je 1f\n\t"
388 "movl $1,%0\n"
389 "1:\tdecl %0"
390 :"=D" (__res):"a" (c),"D" (cs),"c" (count)
391 :"cx");
392 return __res;
393 }
394
395 extern inline void * memset(void * s,char c,int count)
396 {
397 __asm__("cld\n\t"
398 "rep\n\t"
399 "stosb"
400 ::"a" (c),"D" (s),"c" (count)
401 :"cx","di");
402 return s;
403 }
404
405 #endif