/************************************************************************* * * $RCSfile: tenchelp.c,v $ * * $Revision: 1.2 $ * * last change: $Author: sb $ $Date: 2001-10-12 10:44:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * 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., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifndef INCLUDED_RTL_TEXTENC_TENCHELP_H #include "tenchelp.h" #endif #ifndef _RTL_TEXTCVT_H #include "rtl/textcvt.h" #endif #ifndef _SAL_TYPES_H_ #include "sal/types.h" #endif static sal_Bool ImplGetUndefinedAsciiMultiByte(sal_uInt32 nFlags, sal_Char * pBuf, sal_Size nMaxLen); static sal_Bool ImplGetInvalidAsciiMultiByte(sal_uInt32 nFlags, sal_Char * pBuf, sal_Size nMaxLen); static int ImplIsUnicodeIgnoreChar(sal_Unicode c, sal_uInt32 nFlags); sal_Bool ImplGetUndefinedAsciiMultiByte(sal_uInt32 nFlags, sal_Char * pBuf, sal_Size nMaxLen) { if (nMaxLen == 0) return sal_False; switch (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) { case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0: *pBuf = 0x00; break; case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK: default: /* RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT */ *pBuf = 0x3F; break; case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_UNDERLINE: *pBuf = 0x5F; break; } return sal_True; } sal_Bool ImplGetInvalidAsciiMultiByte(sal_uInt32 nFlags, sal_Char * pBuf, sal_Size nMaxLen) { if (nMaxLen == 0) return sal_False; switch (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) { case RTL_UNICODETOTEXT_FLAGS_INVALID_0: *pBuf = 0x00; break; case RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK: default: /* RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT */ *pBuf = 0x3F; break; case RTL_UNICODETOTEXT_FLAGS_INVALID_UNDERLINE: *pBuf = 0x5F; break; } return sal_True; } int ImplIsUnicodeIgnoreChar( sal_Unicode c, sal_uInt32 nFlags ) { if ( nFlags & RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE ) { /* !!! */ } if ( nFlags & RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE ) { /* !!! */ } if ( nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_IGNORE ) { if ( (c >= 0xE000) && (c <= 0xF8FF) ) return sal_True; } return sal_False; } /* ======================================================================= */ sal_Unicode ImplGetUndefinedUnicodeChar(sal_uChar cChar, sal_uInt32 nFlags) { return ((nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE) ? RTL_TEXTCVT_BYTE_PRIVATE_START + cChar : RTL_UNICODE_CHAR_DEFAULT; } /* ----------------------------------------------------------------------- */ sal_Bool ImplHandleUndefinedUnicodeToTextChar(ImplTextConverterData const * pData, sal_Unicode const ** ppSrcBuf, sal_Unicode const * pEndSrcBuf, sal_Char ** ppDestBuf, sal_Char const * pEndDestBuf, sal_uInt32 nFlags, sal_uInt32 * pInfo) { sal_Unicode c = **ppSrcBuf; /* Should the private character map to one byte */ if ( (c >= RTL_TEXTCVT_BYTE_PRIVATE_START) && (c <= RTL_TEXTCVT_BYTE_PRIVATE_END) ) { if ( nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 ) { **ppDestBuf = (sal_Char)(sal_uChar)(c-RTL_TEXTCVT_BYTE_PRIVATE_START); (*ppDestBuf)++; (*ppSrcBuf)++; return sal_True; } } /* Should this character ignored (Private, Non Spacing, Control) */ if ( ImplIsUnicodeIgnoreChar( c, nFlags ) ) { (*ppSrcBuf)++; return sal_True; } /* Surrogates Characters should result in */ /* one replacement character */ if ( (c >= RTL_UNICODE_START_HIGH_SURROGATES) && (c <= RTL_UNICODE_END_HIGH_SURROGATES) ) { if ( *ppSrcBuf == pEndSrcBuf ) { *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL; return sal_False; } c = *((*ppSrcBuf)+1); if ( (c >= RTL_UNICODE_START_LOW_SURROGATES) && (c <= RTL_UNICODE_END_LOW_SURROGATES) ) (*ppSrcBuf)++; else { *pInfo |= RTL_UNICODETOTEXT_INFO_INVALID; if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR ) { *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR; return sal_False; } else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE ) { (*ppSrcBuf)++; return sal_True; } else if (ImplGetInvalidAsciiMultiByte(nFlags, *ppDestBuf, pEndDestBuf - *ppDestBuf)) { ++*ppSrcBuf; ++*ppDestBuf; return sal_True; } else { *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; return sal_False; } } } *pInfo |= RTL_UNICODETOTEXT_INFO_UNDEFINED; if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR ) { *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR; return sal_False; } else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE ) (*ppSrcBuf)++; else if (ImplGetUndefinedAsciiMultiByte(nFlags, *ppDestBuf, pEndDestBuf - *ppDestBuf)) { ++*ppSrcBuf; ++*ppDestBuf; } else { *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; return sal_False; } return sal_True; }