From b68aceef627950745be63fd499993f9b1dc90e33 Mon Sep 17 00:00:00 2001 From: Boudewijn Dekker Date: Wed, 14 Apr 1999 07:10:15 +0000 Subject: [PATCH] Added two header files for multi byte string functions svn path=/trunk/; revision=379 --- reactos/include/crtdll/alloc.h | 9 +- reactos/include/crtdll/ctype.h | 12 +- reactos/include/crtdll/float.h | 7 +- reactos/include/crtdll/internal/file.h | 15 +- reactos/include/crtdll/mbctype.h | 27 + reactos/include/crtdll/mbstring.h | 103 ++++ reactos/include/crtdll/setjmp.h | 46 ++ reactos/include/crtdll/stdio.h | 18 +- reactos/include/crtdll/stdlib.h | 14 +- reactos/include/crtdll/string.h | 738 +------------------------ 10 files changed, 230 insertions(+), 759 deletions(-) create mode 100644 reactos/include/crtdll/mbctype.h create mode 100644 reactos/include/crtdll/mbstring.h create mode 100644 reactos/include/crtdll/setjmp.h diff --git a/reactos/include/crtdll/alloc.h b/reactos/include/crtdll/alloc.h index a4e0f0514b3..c8f51b6372a 100644 --- a/reactos/include/crtdll/alloc.h +++ b/reactos/include/crtdll/alloc.h @@ -25,9 +25,9 @@ * DISCLAMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * $Author: ariadne $ - * $Date: 1999/04/02 21:42:06 $ + * $Date: 1999/04/14 07:10:15 $ * */ @@ -56,10 +56,13 @@ typedef struct _heapinfo } _HEAPINFO; int _heapwalk (_HEAPINFO* pHeapinfo); +void * _alloca(size_t size); + #ifndef _NO_OLDNAMES -int heapwalk (_HEAPINFO* pHeapinfo); +#define heapwalk(x) _heapwalk(x) +#define alloca(s) _alloca(s) #endif /* Not _NO_OLDNAMES */ #ifdef __cplusplus diff --git a/reactos/include/crtdll/ctype.h b/reactos/include/crtdll/ctype.h index 3a98fe24fb1..562f14d8eaf 100644 --- a/reactos/include/crtdll/ctype.h +++ b/reactos/include/crtdll/ctype.h @@ -18,9 +18,9 @@ * DISCLAMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * $Author: ariadne $ - * $Date: 1999/04/02 21:42:06 $ + * $Date: 1999/04/14 07:10:15 $ * */ #ifndef _LINUX_CTYPE_H @@ -127,10 +127,10 @@ int __iscsymf (int c); /* Valid first character in C symbol */ int __iscsym (int c); /* Valid character in C symbol (after first) */ #ifndef _NO_OLDNAMES -int isascii (int c); -int toascii (int c); -int iscsymf (int c); -int iscsym (int c); +#define isascii(c) __isascii(c) +#define toascii(c) _toascii(c) +#define iscsymf(c) __iscsymf(c) +#define iscsym(c) __iscsym(c) #endif /* Not _NO_OLDNAMES */ #endif /* Not __STRICT_ANSI__ */ diff --git a/reactos/include/crtdll/float.h b/reactos/include/crtdll/float.h index 6f11dc82653..0b3785d56ab 100644 --- a/reactos/include/crtdll/float.h +++ b/reactos/include/crtdll/float.h @@ -27,9 +27,9 @@ * DISCLAMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * $Author: ariadne $ - * $Date: 1999/04/02 21:42:06 $ + * $Date: 1999/04/14 07:10:15 $ * */ @@ -182,7 +182,10 @@ double _scalb (double x, long n); int _finite (double x); int _fpclass (double x); int _isnan (double x); +int _isinf (double x); // not exported +#define isnan(x) _isnan(x) +#define isinf(x) _isinf(x) #endif /* Not __STRICT_ANSI__ */ diff --git a/reactos/include/crtdll/internal/file.h b/reactos/include/crtdll/internal/file.h index 4d6bfa5663d..1e75d082ef6 100644 --- a/reactos/include/crtdll/internal/file.h +++ b/reactos/include/crtdll/internal/file.h @@ -55,11 +55,6 @@ time_t FileTimeToUnixTime( const FILETIME *filetime, DWORD *remainder ); #ifndef __dj_ENFORCE_FUNCTION_CALLS #endif /* !__dj_ENFORCE_FUNCTION_CALLS */ -#ifdef __cplusplus -} -#endif - -#endif /* __dj_include_libc_file_h__ */ #define __FILE_REC_MAX 20 typedef struct __file_rec @@ -71,3 +66,13 @@ typedef struct __file_rec extern __file_rec *__file_rec_list; + +#ifdef __cplusplus +} +#endif + + +#endif /* __dj_include_libc_file_h__ */ + + + diff --git a/reactos/include/crtdll/mbctype.h b/reactos/include/crtdll/mbctype.h new file mode 100644 index 00000000000..c287ed81ad7 --- /dev/null +++ b/reactos/include/crtdll/mbctype.h @@ -0,0 +1,27 @@ +#ifndef _MBCTYPE_H +#define _MBCTYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define _MS 0x01 +#define _MP 0x02 +#define _M1 0x04 +#define _M2 0x08 + +#define _MBC_SINGLE 0 +#define _MBC_LEAD 1 +#define _MBC_TRAIL 2 +#define _MBC_ILLEGAL -1 + +#define _MB_CP_SBCS 0 +#define _MB_CP_OEM -2 +#define _MB_CP_ANSI -3 +#define _MB_CP_LOCALE -4 + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/reactos/include/crtdll/mbstring.h b/reactos/include/crtdll/mbstring.h new file mode 100644 index 00000000000..2982380853e --- /dev/null +++ b/reactos/include/crtdll/mbstring.h @@ -0,0 +1,103 @@ +#ifndef _MBSTRING_H_ +#define _MBSTRING_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int _mbbtype(unsigned char c, int type); +int _mbsbtype( const unsigned char *str, size_t n ); + +unsigned int _mbbtombc(unsigned int c); +unsigned int _mbctombb(unsigned int c); + +unsigned char * _mbscat(unsigned char *dst, const unsigned char *src); +unsigned char * _mbschr(const unsigned char *str, unsigned int c); +int _mbscmp(const unsigned char *, const unsigned char *); +int _mbscoll(const unsigned char *, const unsigned char *); +unsigned char * _mbscpy(unsigned char *, const unsigned char *); +size_t _mbscspn(const unsigned char *, const unsigned char *); +unsigned char * _mbsdup(const unsigned char *str); +int _mbsicmp(const unsigned char *, const unsigned char *); +int _mbsicoll(const unsigned char *, const unsigned char *); +size_t _mbslen(const unsigned char *str); + +unsigned char * _mbsncat(unsigned char *, const unsigned char *, size_t); +unsigned char * _mbsnbcat(unsigned char *, const unsigned char *, size_t); + + +int _mbsncmp(const unsigned char *, const unsigned char *, size_t); +int _mbsnbcmp(const unsigned char *, const unsigned char *, size_t); + +int _mbsncoll(const unsigned char *, const unsigned char *, size_t); +int _mbsnbcoll(const unsigned char *, const unsigned char *, size_t); + + +unsigned char * _mbsncpy(unsigned char *, const unsigned char *, size_t); +unsigned char * _mbsnbcpy(unsigned char *, const unsigned char *, size_t); + +int _mbsnicmp(const unsigned char *, const unsigned char *, size_t); +int _mbsnbicmp(const unsigned char *, const unsigned char *, size_t); + +int _mbsnicoll(const unsigned char *, const unsigned char *, size_t); +int _mbsnbicoll(const unsigned char *, const unsigned char *, size_t); + +unsigned char * _mbsnset(unsigned char *, unsigned int, size_t); +unsigned char * _mbsnbset(unsigned char *, unsigned int, size_t); + +size_t _mbsnccnt(const unsigned char *, size_t); + + +unsigned char * _mbspbrk(const unsigned char *, const unsigned char *); +unsigned char * _mbsrchr(const unsigned char *, unsigned int); +unsigned char * _mbsrev(unsigned char *); +unsigned char * _mbsset(unsigned char *, unsigned int); +size_t _mbsspn(const unsigned char *, const unsigned char *); + +unsigned char * _mbsstr(const unsigned char *, const unsigned char *); +unsigned char * _mbstok(unsigned char *, const unsigned char *); + +unsigned char * _mbslwr(unsigned char *str); +unsigned char * _mbsupr(unsigned char *str); + +size_t _mbclen(const unsigned char *); +void _mbccpy(unsigned char *, const unsigned char *); + +/* tchar routines */ + +unsigned char * _mbsdec(const unsigned char *, const unsigned char *); +unsigned char * _mbsinc(const unsigned char *); +size_t _mbsnbcnt(const unsigned char *, size_t); +unsigned int _mbsnextc (const unsigned char *); +unsigned char * _mbsninc(const unsigned char *, size_t); +unsigned char * _mbsspnp(const unsigned char *, const unsigned char *); + +/* character routines */ + +int _ismbcalnum(unsigned int c); +int _ismbcalpha(unsigned int c); +int _ismbcdigit(unsigned int c); +int _ismbcgraph(unsigned int c); +int _ismbclegal(unsigned int c); +int _ismbclower(unsigned int c); +int _ismbcprint(unsigned int c); +int _ismbcpunct(unsigned int c); +int _ismbcspace(unsigned int c); +int _ismbcupper(unsigned int c); + +unsigned int _mbctolower(unsigned int); +unsigned int _mbctoupper(unsigned int); + + +int _ismbblead( unsigned int c); +int _ismbbtrail( unsigned int c); +int _ismbslead( const unsigned char *s, const unsigned char *c); +int _ismbstrail( const unsigned char *s, const unsigned char *c); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/reactos/include/crtdll/setjmp.h b/reactos/include/crtdll/setjmp.h new file mode 100644 index 00000000000..60335ddf927 --- /dev/null +++ b/reactos/include/crtdll/setjmp.h @@ -0,0 +1,46 @@ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _SETJMP_H_ +#define _SETJMP_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned long eax; + unsigned long ebx; + unsigned long ecx; + unsigned long edx; + unsigned long esi; + unsigned long edi; + unsigned long ebp; + unsigned long esp; + unsigned long eip; + unsigned short es; + unsigned short fs; + unsigned short gs; + unsigned short ss; +} jmp_buf[1]; + +extern int _setjmp(jmp_buf); +extern void longjmp(jmp_buf, int); + +#define setjmp(jmp_buf) _setjmp(jmp_buf) + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/reactos/include/crtdll/stdio.h b/reactos/include/crtdll/stdio.h index 53ad9ce6ecc..537662204f8 100644 --- a/reactos/include/crtdll/stdio.h +++ b/reactos/include/crtdll/stdio.h @@ -22,9 +22,9 @@ * DISCLAMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.6 $ - * $Author: dwelch $ - * $Date: 1999/04/14 00:46:22 $ + * $Revision: 1.7 $ + * $Author: ariadne $ + * $Date: 1999/04/14 07:10:15 $ * */ /* Appropriated for Reactos Crtdll by Ariadne */ @@ -42,6 +42,7 @@ extern "C" { #define __need_size_t #define __need_NULL #define __need_wchar_t +#define __need_wint_t #include @@ -85,6 +86,7 @@ typedef struct { int _ungotchar; int _bufsiz; char *_name_to_remove; + int _fillsize; } FILE; #define _FILE_DEFINED #endif @@ -241,9 +243,13 @@ int puts (const char* szOutput); int ungetc (int c, FILE* fileWasRead); /* Wide character versions */ -int fgetwc (FILE* fileRead); -int fputwc (wchar_t wc, FILE* fileWrite); -int ungetwc (wchar_t wc, FILE* fileWasRead); +wint_t fgetwc (FILE* fileRead); +wint_t fputwc (wchar_t wc, FILE* fileWrite); +wint_t getwc(FILE *fileRead); // not exported +wint_t ungetwc (wchar_t wc, FILE* fileWasRead); + +wint_t _filwbuf(FILE *f); +wint_t _flswbuf(wchar_t c, FILE *f); /* * Not exported by CRTDLL.DLL included for reference purposes. diff --git a/reactos/include/crtdll/stdlib.h b/reactos/include/crtdll/stdlib.h index f46138daad6..fe10c9ede87 100644 --- a/reactos/include/crtdll/stdlib.h +++ b/reactos/include/crtdll/stdlib.h @@ -18,9 +18,9 @@ * DISCLAMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * $Author: ariadne $ - * $Date: 1999/04/02 21:42:06 $ + * $Date: 1999/04/14 07:10:15 $ * */ /* Appropriated for Reactos Crtdll by Ariadne */ @@ -53,6 +53,8 @@ extern char*** _environ_dll; #define __need_NULL #include +#include + #ifndef __ATTRIB_NORETURN #ifdef __GNUC__ #define _ATTRIB_NORETURN __attribute__ ((noreturn)) @@ -168,6 +170,14 @@ char* _fullpath (char* caBuf, const char* szPath, size_t sizeMax); void _swab (const char* caFrom, char* caTo, size_t sizeToCopy); +unsigned int _rotl( unsigned int value, int shift ); +unsigned int _rotr( unsigned int value, int shift ); +unsigned long _lrotl( unsigned long value, int shift ); +unsigned long _lrotr( unsigned long value, int shift ); + + + + #ifndef _NO_OLDNAMES #define beep _beep #define seterrormode _seterrormode diff --git a/reactos/include/crtdll/string.h b/reactos/include/crtdll/string.h index d8be87efea5..ad670e8a2ad 100644 --- a/reactos/include/crtdll/string.h +++ b/reactos/include/crtdll/string.h @@ -18,19 +18,15 @@ * DISCLAMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * $Author: ariadne $ - * $Date: 1999/04/03 10:41:29 $ + * $Date: 1999/04/14 07:10:15 $ * */ /* Appropriated for Reactos Crtdll by Ariadne */ /* changed prototype for _strerror */ /* moved prototype for swab from string.h to stdlib.h */ -#ifndef _LINUX_WSTRING_H_ -#define _LINUX_WSTRING_H_ -#ifndef _LINUX_STRING_H_ -#define _LINUX_STRING_H_ #ifndef _STRING_H_ #define _STRING_H_ @@ -189,736 +185,8 @@ wchar_t* wcsupr (wchar_t* wsToConvert); #endif /* Not _NO_OLDNAMES */ #endif /* Not strict ANSI */ - -#if 0 -/* - * Include machine specific inline routines - */ -#ifndef _I386_STRING_H_ -#define _I386_STRING_H_ - -/* - * On a 486 or Pentium, we are better off not using the - * byte string operations. But on a 386 or a PPro the - * byte string ops are faster than doing it by hand - * (MUCH faster on a Pentium). - * - * Also, the byte strings actually work correctly. Forget - * the i486 routines for now as they may be broken.. - */ -#if FIXED_486_STRING && (CPU == 486 || CPU == 586) - #include -#else - -/* - * This string-include defines all string functions as inline - * functions. Use gcc. It also assumes ds=es=data space, this should be - * normal. Most of the string-functions are rather heavily hand-optimized, - * see especially strtok,strstr,str[c]spn. They should work, but are not - * very easy to understand. Everything is done entirely within the register - * set, making the functions fast and clean. String instructions have been - * used through-out, making for "slightly" unclear code :-) - * - * Copyright (C) 1991, 1992 Linus Torvalds - */ - -#define __HAVE_ARCH_STRCPY -extern inline char * strcpy(char * dest,const char *src) -{ -__asm__ __volatile__( - "cld\n" - "1:\tlodsb\n\t" - "stosb\n\t" - "testb %%al,%%al\n\t" - "jne 1b" - : /* no output */ - :"S" (src),"D" (dest):"si","di","ax","memory"); -return dest; -} - -#define __HAVE_ARCH_STRNCPY -extern inline char * strncpy(char * dest,const char *src,size_t count) -{ -__asm__ __volatile__( - "cld\n" - "1:\tdecl %2\n\t" - "js 2f\n\t" - "lodsb\n\t" - "stosb\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n\t" - "rep\n\t" - "stosb\n" - "2:" - : /* no output */ - :"S" (src),"D" (dest),"c" (count):"si","di","ax","cx","memory"); -return dest; -} - -#define __HAVE_ARCH_STRCAT -extern inline char * strcat(char * dest,const char * src) -{ -__asm__ __volatile__( - "cld\n\t" - "repne\n\t" - "scasb\n\t" - "decl %1\n" - "1:\tlodsb\n\t" - "stosb\n\t" - "testb %%al,%%al\n\t" - "jne 1b" - : /* no output */ - :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx"); -return dest; -} - -#define __HAVE_ARCH_STRNCAT -extern inline char * strncat(char * dest,const char * src,size_t count) -{ -__asm__ __volatile__( - "cld\n\t" - "repne\n\t" - "scasb\n\t" - "decl %1\n\t" - "movl %4,%3\n" - "1:\tdecl %3\n\t" - "js 2f\n\t" - "lodsb\n\t" - "stosb\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n" - "2:\txorl %2,%2\n\t" - "stosb" - : /* no output */ - :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count) - :"si","di","ax","cx","memory"); -return dest; -} - -#define __HAVE_ARCH_STRCMP -extern inline int strcmp(const char * cs,const char * ct) -{ -register int __res; -__asm__ __volatile__( - "cld\n" - "1:\tlodsb\n\t" - "scasb\n\t" - "jne 2f\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n\t" - "xorl %%eax,%%eax\n\t" - "jmp 3f\n" - "2:\tsbbl %%eax,%%eax\n\t" - "orb $1,%%eax\n" - "3:" - :"=a" (__res):"S" (cs),"D" (ct):"si","di"); -return __res; -} - -#define __HAVE_ARCH_STRNCMP -extern inline int strncmp(const char * cs,const char * ct,size_t count) -{ -register int __res; -__asm__ __volatile__( - "cld\n" - "1:\tdecl %3\n\t" - "js 2f\n\t" - "lodsb\n\t" - "scasb\n\t" - "jne 3f\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n" - "2:\txorl %%eax,%%eax\n\t" - "jmp 4f\n" - "3:\tsbbl %%eax,%%eax\n\t" - "orb $1,%%al\n" - "4:" - :"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx"); -return __res; -} - -#define __HAVE_ARCH_STRCHR -extern inline char * strchr(const char * s, int c) -{ -register char * __res; -__asm__ __volatile__( - "cld\n\t" - "movb %%al,%%ah\n" - "1:\tlodsb\n\t" - "cmpb %%ah,%%al\n\t" - "je 2f\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n\t" - "movl $1,%1\n" - "2:\tmovl %1,%0\n\t" - "decl %0" - :"=a" (__res):"S" (s),"0" (c):"si"); -return __res; -} - -#define __HAVE_ARCH_STRRCHR -extern inline char * strrchr(const char * s, int c) -{ -register char * __res; -__asm__ __volatile__( - "cld\n\t" - "movb %%al,%%ah\n" - "1:\tlodsb\n\t" - "cmpb %%ah,%%al\n\t" - "jne 2f\n\t" - "leal -1(%%esi),%0\n" - "2:\ttestb %%al,%%al\n\t" - "jne 1b" - :"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si"); -return __res; -} - -#define __HAVE_ARCH_STRSPN -extern inline size_t strspn(const char * cs, const char * ct) -{ -register char * __res; -__asm__ __volatile__( - "cld\n\t" - "movl %4,%%edi\n\t" - "repne\n\t" - "scasb\n\t" - "notl %%ecx\n\t" - "decl %%ecx\n\t" - "movl %%ecx,%%edx\n" - "1:\tlodsb\n\t" - "testb %%al,%%al\n\t" - "je 2f\n\t" - "movl %4,%%edi\n\t" - "movl %%edx,%%ecx\n\t" - "repne\n\t" - "scasb\n\t" - "je 1b\n" - "2:\tdecl %0" - :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) - :"ax","cx","dx","di"); -return __res-cs; -} - -#define __HAVE_ARCH_STRCSPN -extern inline size_t strcspn(const char * cs, const char * ct) -{ -register char * __res; -__asm__ __volatile__( - "cld\n\t" - "movl %4,%%edi\n\t" - "repne\n\t" - "scasb\n\t" - "notl %%ecx\n\t" - "decl %%ecx\n\t" - "movl %%ecx,%%edx\n" - "1:\tlodsb\n\t" - "testb %%al,%%al\n\t" - "je 2f\n\t" - "movl %4,%%edi\n\t" - "movl %%edx,%%ecx\n\t" - "repne\n\t" - "scasb\n\t" - "jne 1b\n" - "2:\tdecl %0" - :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) - :"ax","cx","dx","di"); -return __res-cs; -} - -#define __HAVE_ARCH_STRPBRK -extern inline char * strpbrk(const char * cs,const char * ct) -{ -register char * __res; -__asm__ __volatile__( - "cld\n\t" - "movl %4,%%edi\n\t" - "repne\n\t" - "scasb\n\t" - "notl %%ecx\n\t" - "decl %%ecx\n\t" - "movl %%ecx,%%edx\n" - "1:\tlodsb\n\t" - "testb %%al,%%al\n\t" - "je 2f\n\t" - "movl %4,%%edi\n\t" - "movl %%edx,%%ecx\n\t" - "repne\n\t" - "scasb\n\t" - "jne 1b\n\t" - "decl %0\n\t" - "jmp 3f\n" - "2:\txorl %0,%0\n" - "3:" - :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) - :"ax","cx","dx","di"); -return __res; -} - -#define __HAVE_ARCH_STRSTR -extern inline char * strstr(const char * cs,const char * ct) -{ -register char * __res; -__asm__ __volatile__( - "cld\n\t" \ - "movl %4,%%edi\n\t" - "repne\n\t" - "scasb\n\t" - "notl %%ecx\n\t" - "decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */ - "movl %%ecx,%%edx\n" - "1:\tmovl %4,%%edi\n\t" - "movl %%esi,%%eax\n\t" - "movl %%edx,%%ecx\n\t" - "repe\n\t" - "cmpsb\n\t" - "je 2f\n\t" /* also works for empty string, see above */ - "xchgl %%eax,%%esi\n\t" - "incl %%esi\n\t" - "cmpb $0,-1(%%eax)\n\t" - "jne 1b\n\t" - "xorl %%eax,%%eax\n\t" - "2:" - :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct) - :"cx","dx","di","si"); -return __res; -} - -#define __HAVE_ARCH_STRLEN -extern inline size_t strlen(const char * s) -{ -register int __res; -__asm__ __volatile__( - "cld\n\t" - "repne\n\t" - "scasb\n\t" - "notl %0\n\t" - "decl %0" - :"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di"); -return __res; -} - -#define __HAVE_ARCH_STRTOK -extern inline char * strtok(char * s,const char * ct) -{ -register char * __res; -__asm__ __volatile__( - "testl %1,%1\n\t" - "jne 1f\n\t" - "testl %0,%0\n\t" - "je 8f\n\t" - "movl %0,%1\n" - "1:\txorl %0,%0\n\t" - "movl $-1,%%ecx\n\t" - "xorl %%eax,%%eax\n\t" - "cld\n\t" - "movl %4,%%edi\n\t" - "repne\n\t" - "scasb\n\t" - "notl %%ecx\n\t" - "decl %%ecx\n\t" - "je 7f\n\t" /* empty delimiter-string */ - "movl %%ecx,%%edx\n" - "2:\tlodsb\n\t" - "testb %%al,%%al\n\t" - "je 7f\n\t" - "movl %4,%%edi\n\t" - "movl %%edx,%%ecx\n\t" - "repne\n\t" - "scasb\n\t" - "je 2b\n\t" - "decl %1\n\t" - "cmpb $0,(%1)\n\t" - "je 7f\n\t" - "movl %1,%0\n" - "3:\tlodsb\n\t" - "testb %%al,%%al\n\t" - "je 5f\n\t" - "movl %4,%%edi\n\t" - "movl %%edx,%%ecx\n\t" - "repne\n\t" - "scasb\n\t" - "jne 3b\n\t" - "decl %1\n\t" - "cmpb $0,(%1)\n\t" - "je 5f\n\t" - "movb $0,(%1)\n\t" - "incl %1\n\t" - "jmp 6f\n" - "5:\txorl %1,%1\n" - "6:\tcmpb $0,(%0)\n\t" - "jne 7f\n\t" - "xorl %0,%0\n" - "7:\ttestl %0,%0\n\t" - "jne 8f\n\t" - "movl %0,%1\n" - "8:" - :"=b" (__res),"=S" (___strtok) - :"0" (___strtok),"1" (s),"g" (ct) - :"ax","cx","dx","di","memory"); -return __res; -} - - -#define __HAVE_ARCH_STRICMP -extern inline int stricmp(const char* cs,const char * ct) -{ -register int __res; - - -__asm__ __volatile__( - "cld\n" - "1:\tmovb (%%esi), %%eax\n\t" - "movb (%%edi), %%dl \n\t" - "cmpb $0x5A, %%al\n\t" - "ja 2f\t\n" - "cmpb $0x40, %%al\t\n" - "jbe 2f\t\n" - "addb $0x20, %%al\t\n" - "2:\t cmpb $0x5A, %%dl\t\n" - "ja 3f\t\n" - "cmpb $0x40, %%dl\t\n" - "jbe 3f\t\n" - "addb $0x20, %%dl\t\n" - "3:\t inc %%esi\t\n" - "inc %%edi\t\n" - "cmpb %%al, %%dl\t\n" - "jne 4f\n\t" - "cmpb $00, %%al\n\t" - "jne 1b\n\t" - "xorl %%eax,%%eax\n\t" - "jmp 5f\n" - "4:\tsbbl %%eax,%%eax\n\t" - "orb $1,%%eax\n" - "5:" - :"=a" (__res):"S" (cs),"D" (ct):"si","di"); - -return __res; -} - - -#define __HAVE_ARCH_STRNICMP -extern inline int strnicmp(const char* cs,const char * ct, size_t count) -{ -register int __res; - - -__asm__ __volatile__( - "cld\n" - "1:\t decl %3\n\t" - "js 6f\n\t" - "movb (%%esi), %%al\n\t" - "movb (%%edi), %%dl \n\t" - "cmpb $0x5A, %%al\n\t" - "ja 2f\t\n" - "cmpb $0x40, %%al\t\n" - "jbe 2f\t\n" - "addb $0x20, %%al\t\n" - "2:\t cmpb $0x5A, %%dl\t\n" - "ja 3f\t\n" - "cmpb $0x40, %%dl\t\n" - "jbe 3f\t\n" - "addb $0x20, %%dl\t\n" - "3:\t inc %%esi\t\n" - "inc %%edi\t\n" - "cmpb %%al, %%dl\t\n" - "jne 4f\n\t" - "cmpb $00, %%al\n\t" - "jne 1b\n\t" - "6:xorl %%eax,%%eax\n\t" - "jmp 5f\n" - "4:\tsbbl %%eax,%%eax\n\t" - "orb $1,%%eax\n" - "5:" - :"=a" (__res):"S" (cs),"D" (ct), "c" (count):"si","di", "cx"); - - -return __res; -} - - - - - - -extern inline void * __memcpy(void * to, const void * from, size_t n) -{ -__asm__ __volatile__( - "cld\n\t" - "rep ; movsl\n\t" - "testb $2,%b1\n\t" - "je 1f\n\t" - "movsw\n" - "1:\ttestb $1,%b1\n\t" - "je 2f\n\t" - "movsb\n" - "2:" - : /* no output */ - :"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from) - : "cx","di","si","memory"); -return (to); -} - -/* - * This looks horribly ugly, but the compiler can optimize it totally, - * as the count is constant. - */ -extern inline void * __constant_memcpy(void * to, const void * from, size_t n) -{ - switch (n) { - case 0: - return to; - case 1: - *(unsigned char *)to = *(const unsigned char *)from; - return to; - case 2: - *(unsigned short *)to = *(const unsigned short *)from; - return to; - case 3: - *(unsigned short *)to = *(const unsigned short *)from; - *(2+(unsigned char *)to) = *(2+(const unsigned char *)from); - return to; - case 4: - *(unsigned long *)to = *(const unsigned long *)from; - return to; - case 8: - *(unsigned long *)to = *(const unsigned long *)from; - *(1+(unsigned long *)to) = *(1+(const unsigned long *)from); - return to; - case 12: - *(unsigned long *)to = *(const unsigned long *)from; - *(1+(unsigned long *)to) = *(1+(const unsigned long *)from); - *(2+(unsigned long *)to) = *(2+(const unsigned long *)from); - return to; - case 16: - *(unsigned long *)to = *(const unsigned long *)from; - *(1+(unsigned long *)to) = *(1+(const unsigned long *)from); - *(2+(unsigned long *)to) = *(2+(const unsigned long *)from); - *(3+(unsigned long *)to) = *(3+(const unsigned long *)from); - return to; - case 20: - *(unsigned long *)to = *(const unsigned long *)from; - *(1+(unsigned long *)to) = *(1+(const unsigned long *)from); - *(2+(unsigned long *)to) = *(2+(const unsigned long *)from); - *(3+(unsigned long *)to) = *(3+(const unsigned long *)from); - *(4+(unsigned long *)to) = *(4+(const unsigned long *)from); - return to; - } -#define COMMON(x) \ -__asm__("cld\n\t" \ - "rep ; movsl" \ - x \ - : /* no outputs */ \ - : "c" (n/4),"D" ((long) to),"S" ((long) from) \ - : "cx","di","si","memory"); - - switch (n % 4) { - case 0: COMMON(""); return to; - case 1: COMMON("\n\tmovsb"); return to; - case 2: COMMON("\n\tmovsw"); return to; - case 3: COMMON("\n\tmovsw\n\tmovsb"); return to; - } -#undef COMMON -} - -#define __HAVE_ARCH_MEMCPY -#define memcpy(t, f, n) \ -(__builtin_constant_p(n) ? \ - __constant_memcpy((t),(f),(n)) : \ - __memcpy((t),(f),(n))) - -#define __HAVE_ARCH_MEMMOVE -extern inline void * memmove(void * dest,const void * src, size_t n) -{ -if (dest