diff --git a/libs/port/Makefile.in b/libs/port/Makefile.in index ede38c574f..67fb9992e8 100644 --- a/libs/port/Makefile.in +++ b/libs/port/Makefile.in @@ -73,6 +73,7 @@ C_SRCS = \ c_936.c \ c_949.c \ c_950.c \ + cpsymbol.c \ cptable.c \ digitmap.c \ ffs.c \ diff --git a/libs/port/cpsymbol.c b/libs/port/cpsymbol.c new file mode 100644 index 0000000000..e35a35992f --- /dev/null +++ b/libs/port/cpsymbol.c @@ -0,0 +1,58 @@ +/* + * CP_SYMBOL support + * + * Copyright 2000 Alexandre Julliard + * Copyright 2004 Rein Klazes + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/unicode.h" + +/* return -1 on dst buffer overflow */ +int wine_cpsymbol_mbstowcs( const char *src, int srclen, WCHAR *dst, int dstlen) +{ + int len, i; + + if (dstlen == 0) return srclen; + len = dstlen > srclen ? srclen : dstlen; + for (i = 0; i < len; i++) + { + unsigned char c = src[i]; + dst[i] = (c < 0x20) ? c : c + 0xf000; + } + if (srclen > len) return -1; + return len; +} + +/* return -1 on dst buffer overflow, -2 on invalid character */ +int wine_cpsymbol_wcstombs( const WCHAR *src, int srclen, char *dst, int dstlen) +{ + int len, i; + + if (dstlen == 0) return srclen; + len = dstlen > srclen ? srclen : dstlen; + for (i = 0; i < len; i++) + { + if (src[i] < 0x20) + dst[i] = src[i]; + else if (src[i] >= 0xf020 && src[i] < 0xf100) + dst[i] = src[i] - 0xf000; + else + return -2; + } + if (srclen > len) return -1; + return len; +} diff --git a/libs/wine/mbtowc.c b/libs/wine/mbtowc.c index 6fc38cae1f..9267d9de9b 100644 --- a/libs/wine/mbtowc.c +++ b/libs/wine/mbtowc.c @@ -291,22 +291,3 @@ int wine_cp_mbstowcs( const union cptable *table, int flags, return mbstowcs_dbcs_decompose( &table->dbcs, src, srclen, dst, dstlen ); } } - -/* CP_SYMBOL implementation */ -/* return -1 on dst buffer overflow */ -int wine_cpsymbol_mbstowcs( const char *src, int srclen, WCHAR *dst, int dstlen) -{ - int len, i; - if( dstlen == 0) return srclen; - len = dstlen > srclen ? srclen : dstlen; - for( i = 0; i < len; i++) - { - unsigned char c = src [ i ]; - if( c < 0x20 ) - dst[i] = c; - else - dst[i] = c + 0xf000; - } - if( srclen > len) return -1; - return len; -} diff --git a/libs/wine/port.c b/libs/wine/port.c index dc08b712d0..070dfd996c 100644 --- a/libs/wine/port.c +++ b/libs/wine/port.c @@ -33,6 +33,8 @@ const void *libwine_port_functions[] = { wine_cp_enum_table, wine_cp_get_table, + wine_cpsymbol_mbstowcs, + wine_cpsymbol_wcstombs, wine_fold_string }; diff --git a/libs/wine/wctomb.c b/libs/wine/wctomb.c index 29a3d92014..62c0fc29d4 100644 --- a/libs/wine/wctomb.c +++ b/libs/wine/wctomb.c @@ -470,24 +470,3 @@ int wine_cp_wcstombs( const union cptable *table, int flags, return wcstombs_dbcs( &table->dbcs, src, srclen, dst, dstlen ); } } - -/* CP_SYMBOL implementation */ -/* return -1 on dst buffer overflow, -2 on invalid character */ -int wine_cpsymbol_wcstombs( const WCHAR *src, int srclen, char *dst, int dstlen) -{ - int len, i; - if( dstlen == 0) return srclen; - len = dstlen > srclen ? srclen : dstlen; - for( i = 0; i < len; i++) - { - WCHAR w = src [ i ]; - if( w < 0x20 ) - dst[i] = w; - else if( w >= 0xf020 && w < 0xf100) - dst[i] = w - 0xf000; - else - return -2; - } - if( srclen > len) return -1; - return len; -}