source: icXML/icXML-devel/src/icxmlc/XMLDefaultCharacterSetAdapter.cpp @ 2720

Last change on this file since 2720 was 2720, checked in by cameron, 6 years ago

Initial check-in of icXML 0.8 source files

File size: 3.2 KB
Line 
1/*
2 *  Copyright © 2012 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icXML is a trademark of International Characters.
5 */
6
7/*
8 * @author Nigel Medforth, nigelm -at- interational-characters.com
9 * @version $Id: XMLDefaultCharacterSetAdapter.cpp 209 2012-12-02 21:17:04Z robc $
10 *
11 */
12
13#include <icxmlc/XMLDefaultCharacterSetAdapter.hpp>
14
15XERCES_CPP_NAMESPACE_BEGIN
16
17// ---------------------------------------------------------------------------
18//  XMLUTF8CharacterSetAdapter: Implementation of the transcoder API
19// ---------------------------------------------------------------------------
20
21XMLCh * XMLDefaultCharacterSetAdapter::parse
22(
23    const XMLByte * const               source
24    , const XMLSize_t                   offset
25    , const XMLSize_t                   avail
26    , const bool                                noMore
27    ,       ContentStream &             contentStream
28    ,       XMLSize_t                   contentOffset
29    ,       unsigned int &              markupCount
30    ,           SymbolArray &           symbolArray
31    ,           unsigned int &          symbolCount
32    ,           StringPtrArray &        stringEndArray
33    ,       unsigned int &              stringEndCount
34    ,       XMLLineColTracker & lineColTracker
35    ,       BitBlock *                  newLineOrSkipMaskStream
36    ,       BitBlock *                  delMaskStream
37    ,       unsigned int &              incompleteMarkupBytes
38    ,       unsigned int &              unusedSymbols
39    ,       unsigned int &              unusedContent
40    ,           unsigned int &          bytesEaten
41)
42{
43    XMLCh transcodedSource[BUFFER_BLOCKS * BLOCK_SIZE];
44    unsigned char charSizes[BUFFER_BLOCKS * BLOCK_SIZE];
45    XMLSize_t untranscodedBytesEaten;
46
47    DEBUG_MESSAGE(" --- transcoding " << fTranscoder->getEncodingName() << " to UTF16")
48
49    size_t transcodedAvail =
50        fInputTranscoder->transcodeFrom
51        (
52            &source[offset], avail - offset, transcodedSource, BUFFER_BLOCKS * BLOCK_SIZE, untranscodedBytesEaten, charSizes
53        );
54
55    DEBUG_MESSAGE(" --- untranscodedBytesEaten=" << untranscodedBytesEaten << ", transcodedAvail=" << transcodedAvail)
56
57    this->fSymbolTable->setTranscoder(&fUTF16Transcoder);
58
59    DEBUG_MESSAGE(" -- set symbol table transcoder to UTF16");
60
61    unsigned int transcodedBytesEaten;
62
63    XMLCh * contentStreamPtr =
64        XMLUTF16CharacterSetAdapter::parse
65        (
66            reinterpret_cast<const XMLByte*>(transcodedSource)
67            , 0
68            , transcodedAvail * sizeof(XMLCh)
69            , noMore
70            , contentStream
71            , contentOffset
72            , markupCount
73            , symbolArray
74            , symbolCount
75            , stringEndArray
76            , stringEndCount
77            , lineColTracker
78            , newLineOrSkipMaskStream
79            , delMaskStream
80            , incompleteMarkupBytes
81            , unusedSymbols
82            , unusedContent
83            , transcodedBytesEaten
84        );
85
86    this->fSymbolTable->setTranscoder(fInputTranscoder);
87
88    DEBUG_MESSAGE(" --- transcodedBytesEaten=" << transcodedBytesEaten)
89
90    for (size_t i = (transcodedBytesEaten / sizeof(XMLCh)); unlikely(i < transcodedAvail); i++)
91    {
92        untranscodedBytesEaten -= charSizes[i];
93    }
94
95
96
97    bytesEaten = untranscodedBytesEaten;
98
99    // return the final content end pointer
100    return contentStreamPtr;
101}
102
103XERCES_CPP_NAMESPACE_END
104
Note: See TracBrowser for help on using the repository browser.