From 4c8fbfed9055cefe562602f97e08c12e95b2d86b Mon Sep 17 00:00:00 2001 From: Rob Shearman Date: Fri, 23 Feb 2007 19:40:09 +0000 Subject: [PATCH] libwine: Eliminate duplicate function implementations in string.c by using macros to turn off inlining when including wine/unicode.h. --- include/wine/unicode.h | 130 ++++++++++++++-------------- libs/wine/string.c | 186 +---------------------------------------- 2 files changed, 69 insertions(+), 247 deletions(-) diff --git a/include/wine/unicode.h b/include/wine/unicode.h index 7f723b03d12..83a7d52bff6 100644 --- a/include/wine/unicode.h +++ b/include/wine/unicode.h @@ -35,6 +35,10 @@ #define WINE_UNICODE_API DECLSPEC_IMPORT #endif +#ifndef WINE_UNICODE_INLINE +#define WINE_UNICODE_INLINE extern inline +#endif + /* code page info common to SBCS and DBCS */ struct cp_info { @@ -99,21 +103,21 @@ extern int snprintfW( WCHAR *str, size_t len, const WCHAR *format, ... ); extern int vsprintfW( WCHAR *str, const WCHAR *format, va_list valist ); extern int vsnprintfW( WCHAR *str, size_t len, const WCHAR *format, va_list valist ); -extern inline int wine_is_dbcs_leadbyte( const union cptable *table, unsigned char ch ); -extern inline int wine_is_dbcs_leadbyte( const union cptable *table, unsigned char ch ) +WINE_UNICODE_INLINE int wine_is_dbcs_leadbyte( const union cptable *table, unsigned char ch ); +WINE_UNICODE_INLINE int wine_is_dbcs_leadbyte( const union cptable *table, unsigned char ch ) { return (table->info.char_size == 2) && (table->dbcs.cp2uni_leadbytes[ch]); } -extern inline WCHAR tolowerW( WCHAR ch ); -extern inline WCHAR tolowerW( WCHAR ch ) +WINE_UNICODE_INLINE WCHAR tolowerW( WCHAR ch ); +WINE_UNICODE_INLINE WCHAR tolowerW( WCHAR ch ) { extern WINE_UNICODE_API const WCHAR wine_casemap_lower[]; return ch + wine_casemap_lower[wine_casemap_lower[ch >> 8] + (ch & 0xff)]; } -extern inline WCHAR toupperW( WCHAR ch ); -extern inline WCHAR toupperW( WCHAR ch ) +WINE_UNICODE_INLINE WCHAR toupperW( WCHAR ch ); +WINE_UNICODE_INLINE WCHAR toupperW( WCHAR ch ) { extern WINE_UNICODE_API const WCHAR wine_casemap_upper[]; return ch + wine_casemap_upper[wine_casemap_upper[ch >> 8] + (ch & 0xff)]; @@ -121,91 +125,91 @@ extern inline WCHAR toupperW( WCHAR ch ) /* the character type contains the C1_* flags in the low 12 bits */ /* and the C2_* type in the high 4 bits */ -extern inline unsigned short get_char_typeW( WCHAR ch ); -extern inline unsigned short get_char_typeW( WCHAR ch ) +WINE_UNICODE_INLINE unsigned short get_char_typeW( WCHAR ch ); +WINE_UNICODE_INLINE unsigned short get_char_typeW( WCHAR ch ) { extern WINE_UNICODE_API const unsigned short wine_wctype_table[]; return wine_wctype_table[wine_wctype_table[ch >> 8] + (ch & 0xff)]; } -extern inline int iscntrlW( WCHAR wc ); -extern inline int iscntrlW( WCHAR wc ) +WINE_UNICODE_INLINE int iscntrlW( WCHAR wc ); +WINE_UNICODE_INLINE int iscntrlW( WCHAR wc ) { return get_char_typeW(wc) & C1_CNTRL; } -extern inline int ispunctW( WCHAR wc ); -extern inline int ispunctW( WCHAR wc ) +WINE_UNICODE_INLINE int ispunctW( WCHAR wc ); +WINE_UNICODE_INLINE int ispunctW( WCHAR wc ) { return get_char_typeW(wc) & C1_PUNCT; } -extern inline int isspaceW( WCHAR wc ); -extern inline int isspaceW( WCHAR wc ) +WINE_UNICODE_INLINE int isspaceW( WCHAR wc ); +WINE_UNICODE_INLINE int isspaceW( WCHAR wc ) { return get_char_typeW(wc) & C1_SPACE; } -extern inline int isdigitW( WCHAR wc ); -extern inline int isdigitW( WCHAR wc ) +WINE_UNICODE_INLINE int isdigitW( WCHAR wc ); +WINE_UNICODE_INLINE int isdigitW( WCHAR wc ) { return get_char_typeW(wc) & C1_DIGIT; } -extern inline int isxdigitW( WCHAR wc ); -extern inline int isxdigitW( WCHAR wc ) +WINE_UNICODE_INLINE int isxdigitW( WCHAR wc ); +WINE_UNICODE_INLINE int isxdigitW( WCHAR wc ) { return get_char_typeW(wc) & C1_XDIGIT; } -extern inline int islowerW( WCHAR wc ); -extern inline int islowerW( WCHAR wc ) +WINE_UNICODE_INLINE int islowerW( WCHAR wc ); +WINE_UNICODE_INLINE int islowerW( WCHAR wc ) { return get_char_typeW(wc) & C1_LOWER; } -extern inline int isupperW( WCHAR wc ); -extern inline int isupperW( WCHAR wc ) +WINE_UNICODE_INLINE int isupperW( WCHAR wc ); +WINE_UNICODE_INLINE int isupperW( WCHAR wc ) { return get_char_typeW(wc) & C1_UPPER; } -extern inline int isalnumW( WCHAR wc ); -extern inline int isalnumW( WCHAR wc ) +WINE_UNICODE_INLINE int isalnumW( WCHAR wc ); +WINE_UNICODE_INLINE int isalnumW( WCHAR wc ) { return get_char_typeW(wc) & (C1_ALPHA|C1_DIGIT|C1_LOWER|C1_UPPER); } -extern inline int isalphaW( WCHAR wc ); -extern inline int isalphaW( WCHAR wc ) +WINE_UNICODE_INLINE int isalphaW( WCHAR wc ); +WINE_UNICODE_INLINE int isalphaW( WCHAR wc ) { return get_char_typeW(wc) & (C1_ALPHA|C1_LOWER|C1_UPPER); } -extern inline int isgraphW( WCHAR wc ); -extern inline int isgraphW( WCHAR wc ) +WINE_UNICODE_INLINE int isgraphW( WCHAR wc ); +WINE_UNICODE_INLINE int isgraphW( WCHAR wc ) { return get_char_typeW(wc) & (C1_ALPHA|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER); } -extern inline int isprintW( WCHAR wc ); -extern inline int isprintW( WCHAR wc ) +WINE_UNICODE_INLINE int isprintW( WCHAR wc ); +WINE_UNICODE_INLINE int isprintW( WCHAR wc ) { return get_char_typeW(wc) & (C1_ALPHA|C1_BLANK|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER); } /* some useful string manipulation routines */ -extern inline unsigned int strlenW( const WCHAR *str ); -extern inline unsigned int strlenW( const WCHAR *str ) +WINE_UNICODE_INLINE unsigned int strlenW( const WCHAR *str ); +WINE_UNICODE_INLINE unsigned int strlenW( const WCHAR *str ) { const WCHAR *s = str; while (*s) s++; return s - str; } -extern inline WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ); -extern inline WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ) +WINE_UNICODE_INLINE WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ); +WINE_UNICODE_INLINE WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ) { WCHAR *p = dst; while ((*p++ = *src++)); @@ -215,108 +219,110 @@ extern inline WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ) /* strncpy doesn't do what you think, don't use it */ #define strncpyW(d,s,n) error do_not_use_strncpyW_use_lstrcpynW_or_memcpy_instead -extern inline int strcmpW( const WCHAR *str1, const WCHAR *str2 ); -extern inline int strcmpW( const WCHAR *str1, const WCHAR *str2 ) +WINE_UNICODE_INLINE int strcmpW( const WCHAR *str1, const WCHAR *str2 ); +WINE_UNICODE_INLINE int strcmpW( const WCHAR *str1, const WCHAR *str2 ) { while (*str1 && (*str1 == *str2)) { str1++; str2++; } return *str1 - *str2; } -extern inline int strncmpW( const WCHAR *str1, const WCHAR *str2, int n ); -extern inline int strncmpW( const WCHAR *str1, const WCHAR *str2, int n ) +WINE_UNICODE_INLINE int strncmpW( const WCHAR *str1, const WCHAR *str2, int n ); +WINE_UNICODE_INLINE int strncmpW( const WCHAR *str1, const WCHAR *str2, int n ) { if (n <= 0) return 0; while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; } return *str1 - *str2; } -extern inline WCHAR *strcatW( WCHAR *dst, const WCHAR *src ); -extern inline WCHAR *strcatW( WCHAR *dst, const WCHAR *src ) +WINE_UNICODE_INLINE WCHAR *strcatW( WCHAR *dst, const WCHAR *src ); +WINE_UNICODE_INLINE WCHAR *strcatW( WCHAR *dst, const WCHAR *src ) { strcpyW( dst + strlenW(dst), src ); return dst; } -extern inline WCHAR *strchrW( const WCHAR *str, WCHAR ch ); -extern inline WCHAR *strchrW( const WCHAR *str, WCHAR ch ) +WINE_UNICODE_INLINE WCHAR *strchrW( const WCHAR *str, WCHAR ch ); +WINE_UNICODE_INLINE WCHAR *strchrW( const WCHAR *str, WCHAR ch ) { do { if (*str == ch) return (WCHAR *)str; } while (*str++); return NULL; } -extern inline WCHAR *strrchrW( const WCHAR *str, WCHAR ch ); -extern inline WCHAR *strrchrW( const WCHAR *str, WCHAR ch ) +WINE_UNICODE_INLINE WCHAR *strrchrW( const WCHAR *str, WCHAR ch ); +WINE_UNICODE_INLINE WCHAR *strrchrW( const WCHAR *str, WCHAR ch ) { WCHAR *ret = NULL; do { if (*str == ch) ret = (WCHAR *)str; } while (*str++); return ret; } -extern inline WCHAR *strpbrkW( const WCHAR *str, const WCHAR *accept ); -extern inline WCHAR *strpbrkW( const WCHAR *str, const WCHAR *accept ) +WINE_UNICODE_INLINE WCHAR *strpbrkW( const WCHAR *str, const WCHAR *accept ); +WINE_UNICODE_INLINE WCHAR *strpbrkW( const WCHAR *str, const WCHAR *accept ) { for ( ; *str; str++) if (strchrW( accept, *str )) return (WCHAR *)str; return NULL; } -extern inline size_t strspnW( const WCHAR *str, const WCHAR *accept ); -extern inline size_t strspnW( const WCHAR *str, const WCHAR *accept ) +WINE_UNICODE_INLINE size_t strspnW( const WCHAR *str, const WCHAR *accept ); +WINE_UNICODE_INLINE size_t strspnW( const WCHAR *str, const WCHAR *accept ) { const WCHAR *ptr; for (ptr = str; *ptr; ptr++) if (!strchrW( accept, *ptr )) break; return ptr - str; } -extern inline size_t strcspnW( const WCHAR *str, const WCHAR *reject ); -extern inline size_t strcspnW( const WCHAR *str, const WCHAR *reject ) +WINE_UNICODE_INLINE size_t strcspnW( const WCHAR *str, const WCHAR *reject ); +WINE_UNICODE_INLINE size_t strcspnW( const WCHAR *str, const WCHAR *reject ) { const WCHAR *ptr; for (ptr = str; *ptr; ptr++) if (strchrW( reject, *ptr )) break; return ptr - str; } -extern inline WCHAR *strlwrW( WCHAR *str ); -extern inline WCHAR *strlwrW( WCHAR *str ) +WINE_UNICODE_INLINE WCHAR *strlwrW( WCHAR *str ); +WINE_UNICODE_INLINE WCHAR *strlwrW( WCHAR *str ) { WCHAR *ret = str; while ((*str = tolowerW(*str))) str++; return ret; } -extern inline WCHAR *struprW( WCHAR *str ); -extern inline WCHAR *struprW( WCHAR *str ) +WINE_UNICODE_INLINE WCHAR *struprW( WCHAR *str ); +WINE_UNICODE_INLINE WCHAR *struprW( WCHAR *str ) { WCHAR *ret = str; while ((*str = toupperW(*str))) str++; return ret; } -extern inline WCHAR *memchrW( const WCHAR *ptr, WCHAR ch, size_t n ); -extern inline WCHAR *memchrW( const WCHAR *ptr, WCHAR ch, size_t n ) +WINE_UNICODE_INLINE WCHAR *memchrW( const WCHAR *ptr, WCHAR ch, size_t n ); +WINE_UNICODE_INLINE WCHAR *memchrW( const WCHAR *ptr, WCHAR ch, size_t n ) { const WCHAR *end; for (end = ptr + n; ptr < end; ptr++) if (*ptr == ch) return (WCHAR *)ptr; return NULL; } -extern inline WCHAR *memrchrW( const WCHAR *ptr, WCHAR ch, size_t n ); -extern inline WCHAR *memrchrW( const WCHAR *ptr, WCHAR ch, size_t n ) +WINE_UNICODE_INLINE WCHAR *memrchrW( const WCHAR *ptr, WCHAR ch, size_t n ); +WINE_UNICODE_INLINE WCHAR *memrchrW( const WCHAR *ptr, WCHAR ch, size_t n ) { const WCHAR *end, *ret = NULL; for (end = ptr + n; ptr < end; ptr++) if (*ptr == ch) ret = ptr; return (WCHAR *)ret; } -extern inline long int atolW( const WCHAR *str ); -extern inline long int atolW( const WCHAR *str ) +WINE_UNICODE_INLINE long int atolW( const WCHAR *str ); +WINE_UNICODE_INLINE long int atolW( const WCHAR *str ) { return strtolW( str, (WCHAR **)0, 10 ); } -extern inline int atoiW( const WCHAR *str ); -extern inline int atoiW( const WCHAR *str ) +WINE_UNICODE_INLINE int atoiW( const WCHAR *str ); +WINE_UNICODE_INLINE int atoiW( const WCHAR *str ) { return (int)atolW( str ); } +#undef WINE_UNICODE_INLINE + #endif /* __WINE_WINE_UNICODE_H */ diff --git a/libs/wine/string.c b/libs/wine/string.c index 860e09d410b..195af6ca7ff 100644 --- a/libs/wine/string.c +++ b/libs/wine/string.c @@ -21,193 +21,9 @@ #include #include +#define WINE_UNICODE_INLINE /* nothing */ #include "wine/unicode.h" -extern const WCHAR wine_casemap_lower[]; -extern const WCHAR wine_casemap_upper[]; -extern const unsigned short wine_wctype_table[]; - -int wine_is_dbcs_leadbyte( const union cptable *table, unsigned char ch ) -{ - return (table->info.char_size == 2) && (table->dbcs.cp2uni_leadbytes[ch]); -} - -WCHAR tolowerW( WCHAR ch ) -{ - return ch + wine_casemap_lower[wine_casemap_lower[ch >> 8] + (ch & 0xff)]; -} - -WCHAR toupperW( WCHAR ch ) -{ - return ch + wine_casemap_upper[wine_casemap_upper[ch >> 8] + (ch & 0xff)]; -} - -/* the character type contains the C1_* flags in the low 12 bits */ -/* and the C2_* type in the high 4 bits */ -unsigned short get_char_typeW( WCHAR ch ) -{ - return wine_wctype_table[wine_wctype_table[ch >> 8] + (ch & 0xff)]; -} - -int iscntrlW( WCHAR wc ) -{ - return get_char_typeW(wc) & C1_CNTRL; -} - -int ispunctW( WCHAR wc ) -{ - return get_char_typeW(wc) & C1_PUNCT; -} - -int isspaceW( WCHAR wc ) -{ - return get_char_typeW(wc) & C1_SPACE; -} - -int isdigitW( WCHAR wc ) -{ - return get_char_typeW(wc) & C1_DIGIT; -} - -int isxdigitW( WCHAR wc ) -{ - return get_char_typeW(wc) & C1_XDIGIT; -} - -int islowerW( WCHAR wc ) -{ - return get_char_typeW(wc) & C1_LOWER; -} - -int isupperW( WCHAR wc ) -{ - return get_char_typeW(wc) & C1_UPPER; -} - -int isalnumW( WCHAR wc ) -{ - return get_char_typeW(wc) & (C1_ALPHA|C1_DIGIT|C1_LOWER|C1_UPPER); -} - -int isalphaW( WCHAR wc ) -{ - return get_char_typeW(wc) & (C1_ALPHA|C1_LOWER|C1_UPPER); -} - -int isgraphW( WCHAR wc ) -{ - return get_char_typeW(wc) & (C1_ALPHA|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER); -} - -int isprintW( WCHAR wc ) -{ - return get_char_typeW(wc) & (C1_ALPHA|C1_BLANK|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER); -} - -unsigned int strlenW( const WCHAR *str ) -{ - const WCHAR *s = str; - while (*s) s++; - return s - str; -} - -WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ) -{ - WCHAR *p = dst; - while ((*p++ = *src++)); - return dst; -} - -int strcmpW( const WCHAR *str1, const WCHAR *str2 ) -{ - while (*str1 && (*str1 == *str2)) { str1++; str2++; } - return *str1 - *str2; -} - -int strncmpW( const WCHAR *str1, const WCHAR *str2, int n ) -{ - if (n <= 0) return 0; - while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; } - return *str1 - *str2; -} - -WCHAR *strcatW( WCHAR *dst, const WCHAR *src ) -{ - strcpyW( dst + strlenW(dst), src ); - return dst; -} - -WCHAR *strchrW( const WCHAR *str, WCHAR ch ) -{ - do { if (*str == ch) return (WCHAR *)str; } while (*str++); - return NULL; -} - -WCHAR *strrchrW( const WCHAR *str, WCHAR ch ) -{ - WCHAR *ret = NULL; - do { if (*str == ch) ret = (WCHAR *)str; } while (*str++); - return ret; -} - -WCHAR *strpbrkW( const WCHAR *str, const WCHAR *accept ) -{ - for ( ; *str; str++) if (strchrW( accept, *str )) return (WCHAR *)str; - return NULL; -} - -size_t strspnW( const WCHAR *str, const WCHAR *accept ) -{ - const WCHAR *ptr; - for (ptr = str; *ptr; ptr++) if (!strchrW( accept, *ptr )) break; - return ptr - str; -} - -size_t strcspnW( const WCHAR *str, const WCHAR *reject ) -{ - const WCHAR *ptr; - for (ptr = str; *ptr; ptr++) if (strchrW( reject, *ptr )) break; - return ptr - str; -} - -WCHAR *strlwrW( WCHAR *str ) -{ - WCHAR *ret = str; - while ((*str = tolowerW(*str))) str++; - return ret; -} - -WCHAR *struprW( WCHAR *str ) -{ - WCHAR *ret = str; - while ((*str = toupperW(*str))) str++; - return ret; -} - -WCHAR *memchrW( const WCHAR *ptr, WCHAR ch, size_t n ) -{ - const WCHAR *end; - for (end = ptr + n; ptr < end; ptr++) if (*ptr == ch) return (WCHAR *)ptr; - return NULL; -} - -WCHAR *memrchrW( const WCHAR *ptr, WCHAR ch, size_t n ) -{ - const WCHAR *end, *ret = NULL; - for (end = ptr + n; ptr < end; ptr++) if (*ptr == ch) ret = ptr; - return (WCHAR *)ret; -} - -long int atolW( const WCHAR *str ) -{ - return strtolW( str, (WCHAR **)0, 10 ); -} - -int atoiW( const WCHAR *str ) -{ - return (int)atolW( str ); -} - int strcmpiW( const WCHAR *str1, const WCHAR *str2 ) { for (;;)