Annotation of parser3/src/main/pa_pool.C, revision 1.23
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.23 ! parser 8: static const char *RCSId="$Id: pa_pool.C,v 1.22 2001/09/20 14:25:06 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:
14: #include <PlatformSupport/DOMStringHelper.hpp>
15: #include <util/PlatformUtils.hpp>
16:
17: Pool::Pool(void *astorage) :
18: fstorage(astorage), fcontext(0), ftag(0), fexception(0),
19: charset("UTF-8"), transcoder(0) {
20: register_cleanup(Pool_cleanup, this);
21: }
22:
23: void Pool_cleanup(void *pool) {
24: //_asm int 3;
25: static_cast<Pool *>(pool)->cleanup();
26: }
1.1 paf 27:
1.21 parser 28: void Pool::fail_alloc(size_t size) const {
1.8 paf 29: fexception->_throw(0, 0,
1.7 paf 30: 0,
1.9 paf 31: "failed to allocate %u bytes", size);
1.7 paf 32: }
1.21 parser 33:
34: void Pool::fail_register_cleanup() const {
35: fexception->_throw(0, 0,
36: 0,
37: "failed to register cleanup");
1.22 parser 38: }
39:
40: void Pool::set_charset(const String &new_charset) {
41: set_charset(new_charset.cstr());
42: }
43: void Pool::set_charset(const char *new_charset) {
44: if(charset && strcasecmp(new_charset, charset)!=0) {
45: delete transcoder; transcoder=0;
46: charset=new_charset;
47: }
48: }
49:
50: void Pool::update_transcoder() {
51: if(transcoder)
52: return;
53:
54: XMLTransService::Codes resValue;
55: transcoder=XMLPlatformUtils::fgTransService->makeNewTranscoderFor(charset, resValue, 100);
56: }
57:
58:
59: const char *Pool::transcode(const XalanDOMString& s) {
60: update_transcoder();
61:
62: const unsigned int len=s.size(); // multibyte-char languages not supported for now
63: XMLByte* dest=(XMLByte *)malloc((len+1)*sizeof(XMLByte));
64: bool error=true;
65: try {
66: if(transcoder) {
67: unsigned int charsEaten;
68: unsigned int size=transcoder->transcodeTo(
69: s.c_str(), s.length(),
70: dest,
1.23 ! parser 71: len,
1.22 parser 72: charsEaten,
73: XMLTranscoder::UnRep_Throw
74: );
75: dest[size]=0;
76: error=false;
77: }
78: } catch(...) {
79: }
80: if(error) {
81: memset(dest, '?', len-1);
82: ((char *)dest)[len]=0;
83: }
84: return (const char *)dest;
85: }
86:
87: void Pool::_throw(const String *source, const XSLException& e) {
88: if(e.getURI().empty())
89: THROW(0, 0,
90: source,
91: "%s (%s)",
92: transcode(e.getMessage()), // message for exception
93: transcode(e.getType()) // type of exception
94: );
95: else
96: THROW(0, 0,
97: source,
98: "%s (%s) %s(%d:%d)'",
99: transcode(e.getMessage()), // message for exception
100: transcode(e.getType()), // type of exception
101:
102: transcode(e.getURI()), // URI for the associated document, if any
103: e.getLineNumber(), // line number, or -1 if unknown
104: e.getColumnNumber() // column number, or -1 if unknown
105: );
106: }
E-mail: