Use configmgr directly in SvxAsianConfig.
[LibreOffice.git] / sal / textenc / tenchelp.c
blobed924336fa17863bc4d49368921b5e5fc7a05acc
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * Copyright 2000, 2010 Oracle and/or its affiliates.
8 * OpenOffice.org - a multi-platform office productivity suite
10 * This file is part of OpenOffice.org.
12 * OpenOffice.org is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 3
14 * only, as published by the Free Software Foundation.
16 * OpenOffice.org is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License version 3 for more details
20 * (a copy is included in the LICENSE file that accompanied this code).
22 * You should have received a copy of the GNU Lesser General Public License
23 * version 3 along with OpenOffice.org. If not, see
24 * <http://www.openoffice.org/license.html>
25 * for a copy of the LGPLv3 License.
27 ************************************************************************/
29 #include "tenchelp.h"
30 #include "unichars.h"
31 #include "rtl/textcvt.h"
32 #include "sal/types.h"
34 static sal_Bool ImplGetUndefinedAsciiMultiByte(sal_uInt32 nFlags,
35 sal_Char * pBuf,
36 sal_Size nMaxLen);
38 static sal_Bool ImplGetInvalidAsciiMultiByte(sal_uInt32 nFlags,
39 sal_Char * pBuf,
40 sal_Size nMaxLen);
42 static int ImplIsUnicodeIgnoreChar(sal_Unicode c, sal_uInt32 nFlags);
44 sal_Bool ImplGetUndefinedAsciiMultiByte(sal_uInt32 nFlags,
45 sal_Char * pBuf,
46 sal_Size nMaxLen)
48 if (nMaxLen == 0)
49 return sal_False;
50 switch (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK)
52 case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0:
53 *pBuf = 0x00;
54 break;
56 case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK:
57 default: /* RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT */
58 *pBuf = 0x3F;
59 break;
61 case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_UNDERLINE:
62 *pBuf = 0x5F;
63 break;
65 return sal_True;
68 sal_Bool ImplGetInvalidAsciiMultiByte(sal_uInt32 nFlags,
69 sal_Char * pBuf,
70 sal_Size nMaxLen)
72 if (nMaxLen == 0)
73 return sal_False;
74 switch (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK)
76 case RTL_UNICODETOTEXT_FLAGS_INVALID_0:
77 *pBuf = 0x00;
78 break;
80 case RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK:
81 default: /* RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT */
82 *pBuf = 0x3F;
83 break;
85 case RTL_UNICODETOTEXT_FLAGS_INVALID_UNDERLINE:
86 *pBuf = 0x5F;
87 break;
89 return sal_True;
92 int ImplIsUnicodeIgnoreChar( sal_Unicode c, sal_uInt32 nFlags )
94 return
95 ((nFlags & RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE) != 0
96 && ImplIsZeroWidth(c))
97 || ((nFlags & RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE) != 0
98 && ImplIsControlOrFormat(c))
99 || ((nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_IGNORE) != 0
100 && ImplIsPrivateUse(c));
103 /* ======================================================================= */
105 sal_Unicode ImplGetUndefinedUnicodeChar(sal_uChar cChar, sal_uInt32 nFlags)
107 return ((nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK)
108 == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE) ?
109 RTL_TEXTCVT_BYTE_PRIVATE_START + cChar :
110 RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
113 /* ----------------------------------------------------------------------- */
115 sal_Bool
116 ImplHandleUndefinedUnicodeToTextChar(ImplTextConverterData const * pData,
117 sal_Unicode const ** ppSrcBuf,
118 sal_Unicode const * pEndSrcBuf,
119 sal_Char ** ppDestBuf,
120 sal_Char const * pEndDestBuf,
121 sal_uInt32 nFlags,
122 sal_uInt32 * pInfo)
124 sal_Unicode c = **ppSrcBuf;
126 (void) pData; /* unused */
128 /* Should the private character map to one byte */
129 if ( (c >= RTL_TEXTCVT_BYTE_PRIVATE_START) && (c <= RTL_TEXTCVT_BYTE_PRIVATE_END) )
131 if ( nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 )
133 **ppDestBuf = (sal_Char)(sal_uChar)(c-RTL_TEXTCVT_BYTE_PRIVATE_START);
134 (*ppDestBuf)++;
135 (*ppSrcBuf)++;
136 return sal_True;
140 /* Should this character ignored (Private, Non Spacing, Control) */
141 if ( ImplIsUnicodeIgnoreChar( c, nFlags ) )
143 (*ppSrcBuf)++;
144 return sal_True;
147 /* Surrogates Characters should result in */
148 /* one replacement character */
149 if (ImplIsHighSurrogate(c))
151 if ( *ppSrcBuf == pEndSrcBuf )
153 *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
154 return sal_False;
157 c = *((*ppSrcBuf)+1);
158 if (ImplIsLowSurrogate(c))
159 (*ppSrcBuf)++;
160 else
162 *pInfo |= RTL_UNICODETOTEXT_INFO_INVALID;
163 if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR )
165 *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR;
166 return sal_False;
168 else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE )
170 (*ppSrcBuf)++;
171 return sal_True;
173 else if (ImplGetInvalidAsciiMultiByte(nFlags,
174 *ppDestBuf,
175 pEndDestBuf - *ppDestBuf))
177 ++*ppSrcBuf;
178 ++*ppDestBuf;
179 return sal_True;
181 else
183 *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR
184 | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
185 return sal_False;
190 *pInfo |= RTL_UNICODETOTEXT_INFO_UNDEFINED;
191 if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR )
193 *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR;
194 return sal_False;
196 else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE )
197 (*ppSrcBuf)++;
198 else if (ImplGetUndefinedAsciiMultiByte(nFlags,
199 *ppDestBuf,
200 pEndDestBuf - *ppDestBuf))
202 ++*ppSrcBuf;
203 ++*ppDestBuf;
205 else
207 *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR
208 | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
209 return sal_False;
212 return sal_True;
215 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */