Annotation of parser3/src/main/pa_pool.C, revision 1.27
1.13 paf 1: /** @file
1.14 paf 2: Parser: pool class.
3:
1.10 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.14 paf 5:
1.11 paf 6: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.2 paf 7: */
1.27 ! parser 8: static const char *RCSId="$Id: pa_pool.C,v 1.26 2001/09/21 14:46:09 parser Exp $";
1.1 paf 9:
10: #include "pa_pool.h"
1.7 paf 11: #include "pa_exception.h"
1.22 parser 12: #include "pa_common.h"
13:
1.26 parser 14: #ifdef XML
1.22 parser 15: #include <PlatformSupport/DOMStringHelper.hpp>
16: #include <util/PlatformUtils.hpp>
1.26 parser 17: #endif
1.22 parser 18:
19: Pool::Pool(void *astorage) :
1.26 parser 20: fstorage(astorage), fcontext(0), ftag(0), fexception(0)
21: #ifdef XML
22: , transcoder(0)
23: #endif
24: {
25: #ifdef XML
1.25 parser 26: charset=new(*this) String(*this, "UTF-8");
1.26 parser 27: #endif
1.22 parser 28: }
29:
1.24 parser 30: Pool::~Pool() {
1.26 parser 31: #ifdef XML
1.24 parser 32: delete transcoder;
1.26 parser 33: #endif
1.22 parser 34: }
1.1 paf 35:
1.21 parser 36: void Pool::fail_alloc(size_t size) const {
1.8 paf 37: fexception->_throw(0, 0,
1.7 paf 38: 0,
1.9 paf 39: "failed to allocate %u bytes", size);
1.7 paf 40: }
1.21 parser 41:
42: void Pool::fail_register_cleanup() const {
43: fexception->_throw(0, 0,
44: 0,
45: "failed to register cleanup");
1.22 parser 46: }
47:
1.26 parser 48: #ifdef XML
1.25 parser 49: void Pool::set_charset(const String &new_charset) {
50: if(new_charset!=*charset) {
1.24 parser 51: delete transcoder; transcoder=0; // flag "we need new transcoder"
1.25 parser 52: charset=&new_charset; // for this charset
1.22 parser 53: }
54: }
55:
56: void Pool::update_transcoder() {
57: if(transcoder)
58: return;
59:
60: XMLTransService::Codes resValue;
1.25 parser 61: transcoder=XMLPlatformUtils::fgTransService->makeNewTranscoderFor(charset->cstr(), resValue, 60);
1.24 parser 62: if(!transcoder)
63: THROW(0, 0,
1.25 parser 64: charset,
1.24 parser 65: "unsupported encoding");
1.22 parser 66: }
67:
1.25 parser 68: const char *Pool::transcode_cstr(const XalanDOMString& s) {
1.22 parser 69: update_transcoder();
70:
1.24 parser 71: const unsigned int len=s.size()*2;
1.22 parser 72: XMLByte* dest=(XMLByte *)malloc((len+1)*sizeof(XMLByte));
73: bool error=true;
74: try {
75: if(transcoder) {
76: unsigned int charsEaten;
77: unsigned int size=transcoder->transcodeTo(
78: s.c_str(), s.length(),
1.24 parser 79: dest, len,
1.22 parser 80: charsEaten,
1.24 parser 81: XMLTranscoder::UnRep_RepChar //UnRep_Throw
1.22 parser 82: );
83: dest[size]=0;
84: error=false;
85: }
86: } catch(...) {
87: }
88: if(error) {
1.24 parser 89: memset(dest, '?', s.size());
90: ((char *)dest)[s.size()]=0;
1.22 parser 91: }
92: return (const char *)dest;
1.25 parser 93: }
94: String& Pool::transcode(const XalanDOMString& s) {
95: return *new(*this) String(*this, transcode_cstr(s));
1.22 parser 96: }
97:
98: void Pool::_throw(const String *source, const XSLException& e) {
99: if(e.getURI().empty())
100: THROW(0, 0,
101: source,
102: "%s (%s)",
1.27 ! parser 103: transcode_cstr(e.getMessage()), // message for exception
! 104: transcode_cstr(e.getType()) // type of exception
1.22 parser 105: );
106: else
107: THROW(0, 0,
108: source,
109: "%s (%s) %s(%d:%d)'",
1.27 ! parser 110: transcode_cstr(e.getMessage()), // message for exception
! 111: transcode_cstr(e.getType()), // type of exception
1.22 parser 112:
1.27 ! parser 113: transcode_cstr(e.getURI()), // URI for the associated document, if any
1.22 parser 114: e.getLineNumber(), // line number, or -1 if unknown
115: e.getColumnNumber() // column number, or -1 if unknown
116: );
117: }
1.26 parser 118:
119: #endif
E-mail: