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