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 "context.hxx"
35 : : #include "converter.hxx"
36 : : #include "convertiso2022jp.hxx"
37 : : #include "tenchelp.hxx"
38 : : #include "unichars.hxx"
39 : :
40 : : namespace {
41 : :
42 : : enum ImplIso2022JpToUnicodeState // order is important:
43 : : {
44 : : IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII,
45 : : IMPL_ISO_2022_JP_TO_UNICODE_STATE_JIS_ROMAN,
46 : : IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208,
47 : : IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208_2,
48 : : IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC,
49 : : IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_LPAREN,
50 : : IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_DOLLAR
51 : : };
52 : :
53 : : struct ImplIso2022JpToUnicodeContext
54 : : {
55 : : ImplIso2022JpToUnicodeState m_eState;
56 : : sal_uInt32 m_nRow;
57 : : };
58 : :
59 : : struct ImplUnicodeToIso2022JpContext
60 : : {
61 : : sal_Unicode m_nHighSurrogate;
62 : : bool m_b0208;
63 : : };
64 : :
65 : : }
66 : :
67 : 0 : void * ImplCreateIso2022JpToUnicodeContext()
68 : : {
69 : : ImplIso2022JpToUnicodeContext * pContext =
70 : 0 : new ImplIso2022JpToUnicodeContext;
71 : 0 : pContext->m_eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
72 : 0 : return pContext;
73 : : }
74 : :
75 : 0 : void ImplResetIso2022JpToUnicodeContext(void * pContext)
76 : : {
77 [ # # ]: 0 : if (pContext)
78 : : static_cast< ImplIso2022JpToUnicodeContext * >(pContext)->m_eState
79 : 0 : = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
80 : 0 : }
81 : :
82 : 0 : void ImplDestroyIso2022JpToUnicodeContext(void * pContext)
83 : : {
84 : 0 : delete static_cast< ImplIso2022JpToUnicodeContext * >(pContext);
85 : 0 : }
86 : :
87 : 0 : sal_Size ImplConvertIso2022JpToUnicode(void const * pData,
88 : : void * pContext,
89 : : char const * pSrcBuf,
90 : : sal_Size nSrcBytes,
91 : : sal_Unicode * pDestBuf,
92 : : sal_Size nDestChars,
93 : : sal_uInt32 nFlags,
94 : : sal_uInt32 * pInfo,
95 : : sal_Size * pSrcCvtBytes)
96 : : {
97 : : ImplDBCSToUniLeadTab const * pJisX0208Data
98 : : = static_cast< ImplIso2022JpConverterData const * >(pData)->
99 : 0 : m_pJisX0208ToUnicodeData;
100 : : ImplIso2022JpToUnicodeState eState
101 : 0 : = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
102 : 0 : sal_uInt32 nRow = 0;
103 : 0 : sal_uInt32 nInfo = 0;
104 : 0 : sal_Size nConverted = 0;
105 : 0 : sal_Unicode * pDestBufPtr = pDestBuf;
106 : 0 : sal_Unicode * pDestBufEnd = pDestBuf + nDestChars;
107 : :
108 [ # # ]: 0 : if (pContext)
109 : : {
110 : 0 : eState = static_cast< ImplIso2022JpToUnicodeContext * >(pContext)->m_eState;
111 : 0 : nRow = static_cast< ImplIso2022JpToUnicodeContext * >(pContext)->m_nRow;
112 : : }
113 : :
114 [ # # ]: 0 : for (; nConverted < nSrcBytes; ++nConverted)
115 : : {
116 : 0 : bool bUndefined = true;
117 : 0 : sal_uInt32 nChar = *(sal_uChar const *) pSrcBuf++;
118 [ # # # # : 0 : switch (eState)
# # # # ]
119 : : {
120 : : case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII:
121 [ # # ]: 0 : if (nChar == 0x1B) // ESC
122 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC;
123 [ # # ]: 0 : else if (nChar < 0x80)
124 [ # # ]: 0 : if (pDestBufPtr != pDestBufEnd)
125 : 0 : *pDestBufPtr++ = (sal_Unicode) nChar;
126 : : else
127 : 0 : goto no_output;
128 : : else
129 : : {
130 : 0 : bUndefined = false;
131 : 0 : goto bad_input;
132 : : }
133 : 0 : break;
134 : :
135 : : case IMPL_ISO_2022_JP_TO_UNICODE_STATE_JIS_ROMAN:
136 [ # # ]: 0 : if (nChar == 0x1B) // ESC
137 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC;
138 [ # # ]: 0 : else if (nChar < 0x80)
139 [ # # ]: 0 : if (pDestBufPtr != pDestBufEnd)
140 : : {
141 [ # # # ]: 0 : switch (nChar)
142 : : {
143 : : case 0x5C: // REVERSE SOLIDUS (\)
144 : 0 : nChar = 0xA5; // YEN SIGN
145 : 0 : break;
146 : :
147 : : case 0x7E: // ~
148 : 0 : nChar = 0xAF; // MACRON
149 : 0 : break;
150 : : }
151 : 0 : *pDestBufPtr++ = (sal_Unicode) nChar;
152 : : }
153 : : else
154 : 0 : goto no_output;
155 : : else
156 : : {
157 : 0 : bUndefined = false;
158 : 0 : goto bad_input;
159 : : }
160 : 0 : break;
161 : :
162 : : case IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208:
163 [ # # ]: 0 : if (nChar == 0x1B) // ESC
164 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC;
165 [ # # ][ # # ]: 0 : else if (nChar >= 0x21 && nChar <= 0x7E)
166 : : {
167 : 0 : nRow = nChar;
168 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208_2;
169 : : }
170 : : else
171 : : {
172 : 0 : bUndefined = false;
173 : 0 : goto bad_input;
174 : : }
175 : 0 : break;
176 : :
177 : : case IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208_2:
178 [ # # ][ # # ]: 0 : if (nChar >= 0x21 && nChar <= 0x7E)
179 : : {
180 : 0 : sal_uInt16 nUnicode = 0;
181 : 0 : sal_uInt32 nFirst = pJisX0208Data[nRow].mnTrailStart;
182 [ # # ][ # # ]: 0 : if (nChar >= nFirst
183 : 0 : && nChar <= pJisX0208Data[nRow].mnTrailEnd)
184 : 0 : nUnicode = pJisX0208Data[nRow].
185 : 0 : mpToUniTrailTab[nChar - nFirst];
186 [ # # ]: 0 : if (nUnicode != 0)
187 [ # # ]: 0 : if (pDestBufPtr != pDestBufEnd)
188 : : {
189 : 0 : *pDestBufPtr++ = (sal_Unicode) nUnicode;
190 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208;
191 : : }
192 : : else
193 : 0 : goto no_output;
194 : : else
195 : 0 : goto bad_input;
196 : : }
197 : : else
198 : : {
199 : 0 : bUndefined = false;
200 : 0 : goto bad_input;
201 : : }
202 : 0 : break;
203 : :
204 : : case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC:
205 [ # # # ]: 0 : switch (nChar)
206 : : {
207 : : case 0x24: // $
208 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_DOLLAR;
209 : 0 : break;
210 : :
211 : : case 0x28: // (
212 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_LPAREN;
213 : 0 : break;
214 : :
215 : : default:
216 : 0 : bUndefined = false;
217 : 0 : goto bad_input;
218 : : }
219 : 0 : break;
220 : :
221 : : case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_LPAREN:
222 [ # # # ]: 0 : switch (nChar)
223 : : {
224 : : case 0x42: // A
225 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
226 : 0 : break;
227 : :
228 : : case 0x4A: // J
229 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_JIS_ROMAN;
230 : 0 : break;
231 : :
232 : : default:
233 : 0 : bUndefined = false;
234 : 0 : goto bad_input;
235 : : }
236 : 0 : break;
237 : :
238 : : case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_DOLLAR:
239 [ # # ]: 0 : switch (nChar)
240 : : {
241 : : case 0x40: // @
242 : : case 0x42: // B
243 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208;
244 : 0 : break;
245 : :
246 : : default:
247 : 0 : bUndefined = false;
248 : 0 : goto bad_input;
249 : : }
250 : 0 : break;
251 : : }
252 : 0 : continue;
253 : :
254 : : bad_input:
255 [ # # # # ]: 0 : switch (sal::detail::textenc::handleBadInputTextToUnicodeConversion(
256 : : bUndefined, true, 0, nFlags, &pDestBufPtr, pDestBufEnd,
257 [ # # ]: 0 : &nInfo))
258 : : {
259 : : case sal::detail::textenc::BAD_INPUT_STOP:
260 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
261 : 0 : break;
262 : :
263 : : case sal::detail::textenc::BAD_INPUT_CONTINUE:
264 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
265 : 0 : continue;
266 : :
267 : : case sal::detail::textenc::BAD_INPUT_NO_OUTPUT:
268 : 0 : goto no_output;
269 : : }
270 : 0 : break;
271 : :
272 : : no_output:
273 : 0 : --pSrcBuf;
274 : 0 : nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
275 : 0 : break;
276 : : }
277 : :
278 [ # # ][ # # ]: 0 : if (eState > IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208
279 : : && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
280 : : | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
281 : : == 0)
282 : : {
283 [ # # ]: 0 : if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
284 : 0 : nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
285 : : else
286 [ # # # ]: 0 : switch (sal::detail::textenc::handleBadInputTextToUnicodeConversion(
287 : : false, true, 0, nFlags, &pDestBufPtr, pDestBufEnd,
288 [ # # ]: 0 : &nInfo))
289 : : {
290 : : case sal::detail::textenc::BAD_INPUT_STOP:
291 : : case sal::detail::textenc::BAD_INPUT_CONTINUE:
292 : 0 : eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
293 : 0 : break;
294 : :
295 : : case sal::detail::textenc::BAD_INPUT_NO_OUTPUT:
296 : 0 : nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
297 : 0 : break;
298 : : }
299 : : }
300 : :
301 [ # # ]: 0 : if (pContext)
302 : : {
303 : 0 : static_cast< ImplIso2022JpToUnicodeContext * >(pContext)->m_eState = eState;
304 : 0 : static_cast< ImplIso2022JpToUnicodeContext * >(pContext)->m_nRow = nRow;
305 : : }
306 [ # # ]: 0 : if (pInfo)
307 : 0 : *pInfo = nInfo;
308 [ # # ]: 0 : if (pSrcCvtBytes)
309 : 0 : *pSrcCvtBytes = nConverted;
310 : :
311 : 0 : return pDestBufPtr - pDestBuf;
312 : : }
313 : :
314 : 0 : void * ImplCreateUnicodeToIso2022JpContext()
315 : : {
316 : : ImplUnicodeToIso2022JpContext * pContext =
317 : 0 : new ImplUnicodeToIso2022JpContext;
318 : 0 : pContext->m_nHighSurrogate = 0;
319 : 0 : pContext->m_b0208 = false;
320 : 0 : return pContext;
321 : : }
322 : :
323 : 0 : void ImplResetUnicodeToIso2022JpContext(void * pContext)
324 : : {
325 [ # # ]: 0 : if (pContext)
326 : : {
327 : 0 : static_cast< ImplUnicodeToIso2022JpContext * >(pContext)->m_nHighSurrogate = 0;
328 : 0 : static_cast< ImplUnicodeToIso2022JpContext * >(pContext)->m_b0208 = false;
329 : : }
330 : 0 : }
331 : :
332 : 0 : void ImplDestroyUnicodeToIso2022JpContext(void * pContext)
333 : : {
334 : 0 : delete static_cast< ImplUnicodeToIso2022JpContext * >(pContext);
335 : 0 : }
336 : :
337 : 30 : sal_Size ImplConvertUnicodeToIso2022Jp(void const * pData,
338 : : void * pContext,
339 : : sal_Unicode const * pSrcBuf,
340 : : sal_Size nSrcChars,
341 : : char * pDestBuf,
342 : : sal_Size nDestBytes,
343 : : sal_uInt32 nFlags,
344 : : sal_uInt32 * pInfo,
345 : : sal_Size * pSrcCvtChars)
346 : : {
347 : : ImplUniToDBCSHighTab const * pJisX0208Data
348 : : = static_cast< ImplIso2022JpConverterData const * >(pData)->
349 : 30 : m_pUnicodeToJisX0208Data;
350 : 30 : sal_Unicode nHighSurrogate = 0;
351 : 30 : bool b0208 = false;
352 : 30 : sal_uInt32 nInfo = 0;
353 : 30 : sal_Size nConverted = 0;
354 : 30 : char * pDestBufPtr = pDestBuf;
355 : 30 : char * pDestBufEnd = pDestBuf + nDestBytes;
356 : : bool bWritten;
357 : :
358 [ - + ]: 30 : if (pContext)
359 : : {
360 : : nHighSurrogate
361 : 0 : = static_cast< ImplUnicodeToIso2022JpContext * >(pContext)->m_nHighSurrogate;
362 : 0 : b0208 = static_cast< ImplUnicodeToIso2022JpContext * >(pContext)->m_b0208;
363 : : }
364 : :
365 [ + + ]: 50 : for (; nConverted < nSrcChars; ++nConverted)
366 : : {
367 : 40 : bool bUndefined = true;
368 : 40 : sal_uInt32 nChar = *pSrcBuf++;
369 [ + - ]: 40 : if (nHighSurrogate == 0)
370 : : {
371 [ - + ]: 40 : if (ImplIsHighSurrogate(nChar))
372 : : {
373 : 0 : nHighSurrogate = (sal_Unicode) nChar;
374 : 0 : continue;
375 : : }
376 : : }
377 [ # # ]: 0 : else if (ImplIsLowSurrogate(nChar))
378 : 0 : nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
379 : : else
380 : : {
381 : 0 : bUndefined = false;
382 : 0 : goto bad_input;
383 : : }
384 : :
385 [ + - ][ - + ]: 40 : if (ImplIsLowSurrogate(nChar) || ImplIsNoncharacter(nChar))
[ - + ]
386 : : {
387 : 0 : bUndefined = false;
388 : 0 : goto bad_input;
389 : : }
390 : :
391 [ + - ][ - + ]: 40 : if (nChar == 0x0A || nChar == 0x0D) // LF, CR
392 : : {
393 [ # # ]: 0 : if (b0208)
394 : : {
395 [ # # ]: 0 : if (pDestBufEnd - pDestBufPtr >= 3)
396 : : {
397 : 0 : *pDestBufPtr++ = 0x1B; // ESC
398 : 0 : *pDestBufPtr++ = 0x28; // (
399 : 0 : *pDestBufPtr++ = 0x42; // B
400 : 0 : b0208 = false;
401 : : }
402 : : else
403 : 0 : goto no_output;
404 : : }
405 [ # # ]: 0 : if (pDestBufPtr != pDestBufEnd)
406 : 0 : *pDestBufPtr++ = static_cast< char >(nChar);
407 : : else
408 : 0 : goto no_output;
409 : : }
410 [ - + ]: 40 : else if (nChar == 0x1B)
411 : 0 : goto bad_input;
412 [ - + ]: 40 : else if (nChar < 0x80)
413 : : {
414 [ # # ]: 0 : if (b0208)
415 : : {
416 [ # # ]: 0 : if (pDestBufEnd - pDestBufPtr >= 3)
417 : : {
418 : 0 : *pDestBufPtr++ = 0x1B; // ESC
419 : 0 : *pDestBufPtr++ = 0x28; // (
420 : 0 : *pDestBufPtr++ = 0x42; // B
421 : 0 : b0208 = false;
422 : : }
423 : : else
424 : 0 : goto no_output;
425 : : }
426 [ # # ]: 0 : if (pDestBufPtr != pDestBufEnd)
427 : 0 : *pDestBufPtr++ = static_cast< char >(nChar);
428 : : else
429 : 0 : goto no_output;
430 : : }
431 : : else
432 : : {
433 : 40 : sal_uInt16 nBytes = 0;
434 : 40 : sal_uInt32 nIndex1 = nChar >> 8;
435 [ + - ]: 40 : if (nIndex1 < 0x100)
436 : : {
437 : 40 : sal_uInt32 nIndex2 = nChar & 0xFF;
438 : 40 : sal_uInt32 nFirst = pJisX0208Data[nIndex1].mnLowStart;
439 [ + + ][ + - ]: 40 : if (nIndex2 >= nFirst
440 : 20 : && nIndex2 <= pJisX0208Data[nIndex1].mnLowEnd)
441 : : {
442 : 20 : nBytes = pJisX0208Data[nIndex1].
443 : 20 : mpToUniTrailTab[nIndex2 - nFirst];
444 [ - + ]: 20 : if (nBytes == 0)
445 : : // For some reason, the tables in tcvtjp4.tab do not
446 : : // include these two conversions:
447 [ # # # ]: 0 : switch (nChar)
448 : : {
449 : : case 0xA5: // YEN SIGN
450 : 0 : nBytes = 0x216F;
451 : 0 : break;
452 : :
453 : : case 0xAF: // MACRON
454 : 0 : nBytes = 0x2131;
455 : 0 : break;
456 : : }
457 : : }
458 : : }
459 [ + + ]: 40 : if (nBytes != 0)
460 : : {
461 [ + - ]: 20 : if (!b0208)
462 : : {
463 [ + - ]: 20 : if (pDestBufEnd - pDestBufPtr >= 3)
464 : : {
465 : 20 : *pDestBufPtr++ = 0x1B; // ESC
466 : 20 : *pDestBufPtr++ = 0x24; // $
467 : 20 : *pDestBufPtr++ = 0x42; // B
468 : 20 : b0208 = true;
469 : : }
470 : : else
471 : 0 : goto no_output;
472 : : }
473 [ + + ]: 20 : if (pDestBufEnd - pDestBufPtr >= 2)
474 : : {
475 : 10 : *pDestBufPtr++ = static_cast< char >(nBytes >> 8);
476 : 10 : *pDestBufPtr++ = static_cast< char >(nBytes & 0xFF);
477 : : }
478 : : else
479 : 10 : goto no_output;
480 : : }
481 : : else
482 : 20 : goto bad_input;
483 : : }
484 : 10 : nHighSurrogate = 0;
485 : 10 : continue;
486 : :
487 : : bad_input:
488 [ + + - - ]: 20 : switch (sal::detail::textenc::handleBadInputUnicodeToTextConversion(
489 : : bUndefined, nChar, nFlags, &pDestBufPtr, pDestBufEnd,
490 [ + + ][ + - ]: 20 : &nInfo, "\x1B(B", b0208 ? 3 : 0, &bWritten))
491 : : {
492 : : case sal::detail::textenc::BAD_INPUT_STOP:
493 : 10 : nHighSurrogate = 0;
494 : 10 : break;
495 : :
496 : : case sal::detail::textenc::BAD_INPUT_CONTINUE:
497 [ + - ]: 10 : if (bWritten)
498 : 10 : b0208 = false;
499 : 10 : nHighSurrogate = 0;
500 : 10 : continue;
501 : :
502 : : case sal::detail::textenc::BAD_INPUT_NO_OUTPUT:
503 : 0 : goto no_output;
504 : : }
505 : 10 : break;
506 : :
507 : : no_output:
508 : 10 : --pSrcBuf;
509 : 10 : nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
510 : 10 : break;
511 : : }
512 : :
513 [ + + ]: 30 : if ((nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
514 : : | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
515 : : == 0)
516 : : {
517 : 10 : bool bFlush = true;
518 [ - + ]: 10 : if (nHighSurrogate != 0)
519 : : {
520 [ # # ]: 0 : if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
521 : 0 : nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
522 : : else
523 [ # # # # ]: 0 : switch (sal::detail::textenc::handleBadInputUnicodeToTextConversion(
524 : : false, 0, nFlags, &pDestBufPtr, pDestBufEnd, &nInfo,
525 [ # # ][ # # ]: 0 : "\x1B(B", b0208 ? 3 : 0, &bWritten))
526 : : {
527 : : case sal::detail::textenc::BAD_INPUT_STOP:
528 : 0 : nHighSurrogate = 0;
529 : 0 : bFlush = false;
530 : 0 : break;
531 : :
532 : : case sal::detail::textenc::BAD_INPUT_CONTINUE:
533 [ # # ]: 0 : if (bWritten)
534 : 0 : b0208 = false;
535 : 0 : nHighSurrogate = 0;
536 : 0 : break;
537 : :
538 : : case sal::detail::textenc::BAD_INPUT_NO_OUTPUT:
539 : 0 : nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
540 : 0 : break;
541 : : }
542 : : }
543 [ + - ][ - + ]: 10 : if (bFlush
[ # # ]
544 : : && b0208
545 : : && (nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
546 : : {
547 [ # # ]: 0 : if (pDestBufEnd - pDestBufPtr >= 3)
548 : : {
549 : 0 : *pDestBufPtr++ = 0x1B; // ESC
550 : 0 : *pDestBufPtr++ = 0x28; // (
551 : 0 : *pDestBufPtr++ = 0x42; // B
552 : 0 : b0208 = false;
553 : : }
554 : : else
555 : 0 : nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
556 : : }
557 : : }
558 : :
559 [ - + ]: 30 : if (pContext)
560 : : {
561 : : static_cast< ImplUnicodeToIso2022JpContext * >(pContext)->m_nHighSurrogate
562 : 0 : = nHighSurrogate;
563 : 0 : static_cast< ImplUnicodeToIso2022JpContext * >(pContext)->m_b0208 = b0208;
564 : : }
565 [ + - ]: 30 : if (pInfo)
566 : 30 : *pInfo = nInfo;
567 [ + - ]: 30 : if (pSrcCvtChars)
568 : 30 : *pSrcCvtChars = nConverted;
569 : :
570 : 30 : return pDestBufPtr - pDestBuf;
571 : : }
572 : :
573 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|