Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
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.
15 : : *
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).
21 : : *
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.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "sal/config.h"
30 : :
31 : : #include "rtl/textcvt.h"
32 : : #include "sal/types.h"
33 : :
34 : : #include "converter.hxx"
35 : : #include "tenchelp.hxx"
36 : : #include "unichars.hxx"
37 : :
38 : : sal::detail::textenc::BadInputConversionAction
39 : 6575 : sal::detail::textenc::handleBadInputTextToUnicodeConversion(
40 : : bool bUndefined, bool bMultiByte, char cByte, sal_uInt32 nFlags,
41 : : sal_Unicode ** pDestBufPtr, sal_Unicode * pDestBufEnd, sal_uInt32 * pInfo)
42 : : {
43 : : *pInfo |= bUndefined
44 : : ? (bMultiByte
45 : : ? RTL_TEXTTOUNICODE_INFO_MBUNDEFINED
46 : : : RTL_TEXTTOUNICODE_INFO_UNDEFINED)
47 [ + + ][ + - ]: 6575 : : RTL_TEXTTOUNICODE_INFO_INVALID;
48 [ + + ][ + - ]: 6575 : switch (nFlags
[ - - - + ]
49 : : & (bUndefined
50 : : ? (bMultiByte
51 : : ? RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK
52 : : : RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK)
53 : : : RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK))
54 : : {
55 : : case RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR:
56 : : case RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR:
57 : : case RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR:
58 : 0 : *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
59 : 0 : return BAD_INPUT_STOP;
60 : :
61 : : case RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE:
62 : : case RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_IGNORE:
63 : : case RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE:
64 : 0 : return BAD_INPUT_CONTINUE;
65 : :
66 : : case RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE:
67 [ # # ]: 0 : if (*pDestBufPtr != pDestBufEnd)
68 : : {
69 : : *(*pDestBufPtr)++ = RTL_TEXTCVT_BYTE_PRIVATE_START
70 : 0 : | ((sal_uChar) cByte);
71 : 0 : return BAD_INPUT_CONTINUE;
72 : : }
73 : : else
74 : 0 : return BAD_INPUT_NO_OUTPUT;
75 : :
76 : : default: // RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT,
77 : : // RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT,
78 : : // RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT
79 [ + + ]: 6575 : if (*pDestBufPtr != pDestBufEnd)
80 : : {
81 : 6295 : *(*pDestBufPtr)++ = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
82 : 6295 : return BAD_INPUT_CONTINUE;
83 : : }
84 : : else
85 : 6575 : return BAD_INPUT_NO_OUTPUT;
86 : : }
87 : : }
88 : :
89 : : sal::detail::textenc::BadInputConversionAction
90 : 20 : sal::detail::textenc::handleBadInputUnicodeToTextConversion(
91 : : bool bUndefined, sal_uInt32 nUtf32, sal_uInt32 nFlags, char ** pDestBufPtr,
92 : : char * pDestBufEnd, sal_uInt32 * pInfo, char const * pPrefix,
93 : : sal_Size nPrefixLen, bool * pPrefixWritten)
94 : : {
95 : : // TODO! RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE
96 : : // RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR
97 : :
98 : : char cReplace;
99 : :
100 [ + - ]: 20 : if (bUndefined)
101 : : {
102 [ - + ]: 20 : if (ImplIsControlOrFormat(nUtf32))
103 : : {
104 [ # # ]: 0 : if ((nFlags & RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE) != 0)
105 : 0 : nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE;
106 : : }
107 [ - + ]: 20 : else if (ImplIsPrivateUse(nUtf32))
108 : : {
109 [ # # ]: 0 : if ((nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_IGNORE) != 0)
110 : 0 : nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE;
111 [ # # ]: 0 : else if ((nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0) != 0)
112 : 0 : nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0;
113 : : }
114 [ - + ]: 20 : else if (ImplIsZeroWidth(nUtf32))
115 : : {
116 [ # # ]: 0 : if ((nFlags & RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE) != 0)
117 : 0 : nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE;
118 : : }
119 : : }
120 : : *pInfo |= bUndefined ? RTL_UNICODETOTEXT_INFO_UNDEFINED :
121 [ + - ]: 20 : RTL_UNICODETOTEXT_INFO_INVALID;
122 [ + - ][ + - : 20 : switch (nFlags & (bUndefined ? RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK :
- + - ]
123 : : RTL_UNICODETOTEXT_FLAGS_INVALID_MASK))
124 : : {
125 : : case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR:
126 : : case RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR:
127 : 10 : *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR;
128 : 10 : return BAD_INPUT_STOP;
129 : :
130 : : case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE:
131 : : case RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE:
132 [ # # ]: 0 : if (pPrefixWritten)
133 : 0 : *pPrefixWritten = false;
134 : 0 : return BAD_INPUT_CONTINUE;
135 : :
136 : : case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0:
137 : : case RTL_UNICODETOTEXT_FLAGS_INVALID_0:
138 : 0 : cReplace = 0;
139 : 0 : break;
140 : :
141 : : case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK:
142 : : case RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK:
143 : : default: // RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT,
144 : : // RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT
145 : 10 : cReplace = '?';
146 : 10 : break;
147 : :
148 : : case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_UNDERLINE:
149 : : case RTL_UNICODETOTEXT_FLAGS_INVALID_UNDERLINE:
150 : 0 : cReplace = '_';
151 : 0 : break;
152 : : }
153 [ + - ]: 10 : if ((sal_Size) (pDestBufEnd - *pDestBufPtr) > nPrefixLen)
154 : : {
155 [ + + ]: 40 : while (nPrefixLen-- > 0)
156 : 30 : *(*pDestBufPtr)++ = *pPrefix++;
157 : 10 : *(*pDestBufPtr)++ = cReplace;
158 [ + - ]: 10 : if (pPrefixWritten)
159 : 10 : *pPrefixWritten = true;
160 : 10 : return BAD_INPUT_CONTINUE;
161 : : }
162 : : else
163 : 20 : return BAD_INPUT_NO_OUTPUT;
164 : : }
165 : :
166 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|