Annotation of parser3/src/main/pa_pool.C, revision 1.30
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.30 ! parser 7: $Id: pa_pool.C,v 1.29 2001/10/02 17:05:49 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,
1.30 ! parser 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: );
1.30 ! parser 121: }
! 122:
! 123: void Pool::_throw(const String *source, const SAXException& e) {
! 124: THROW(0, 0,
! 125: source,
! 126: "%s",
! 127: transcode_cstr(XalanDOMString(e.getMessage())) // message for exception
! 128: );
! 129: }
! 130: void Pool::_throw(const String *source, const SAXParseException& e) {
! 131: THROW(0, 0,
! 132: source,
! 133: "%s. %s(%d:%d)",
! 134: transcode_cstr(XalanDOMString(e.getMessage())), // message for exception
! 135: e.getSystemId()?transcode_cstr(XalanDOMString(e.getSystemId())):"block", // file of exception
! 136: e.getLineNumber(), e.getColumnNumber() // line:col
! 137: );
! 138: }
! 139:
! 140:
! 141: void Pool::_throw(const String *source, const XMLException& e) {
! 142: THROW(0, 0,
! 143: source,
! 144: "%s (%s). %s(%d)'",
! 145: transcode_cstr(XalanDOMString(e.getMessage())), // message for exception
! 146: transcode_cstr(XalanDOMString((e.getType()))), // type of exception
! 147:
! 148: e.getSrcFile()?e.getSrcFile():"block", // file of exception
! 149: e.getSrcLine() // line number
! 150: //e.getCode()
! 151: );
! 152: }
! 153:
! 154: void Pool::_throw(const String *source, const XalanDOMException& e) {
! 155: const char *s;
! 156: int code=(int)e.getExceptionCode();
! 157: switch(code) {
! 158: case 1: s="INDEX_SIZE_ERR"; break;
! 159: case 2: s="DOMSTRING_SIZE_ERR"; break;
! 160: case 3: s="HIERARCHY_REQUEST_ERR"; break;
! 161: case 4: s="WRONG_DOCUMENT_ERR"; break;
! 162: case 5: s="INVALID_CHARACTER_ERR"; break;
! 163: case 6: s="NO_DATA_ALLOWED_ERR"; break;
! 164: case 7: s="NO_MODIFICATION_ALLOWED_ERR"; break;
! 165: case 8: s="NOT_FOUND_ERR"; break;
! 166: case 9: s="NOT_SUPPORTED_ERR"; break;
! 167: case 10: s="INUSE_ATTRIBUTE_ERR"; break;
! 168: case 11: s="INVALID_STATE_ERR"; break;
! 169: case 12: s="SYNTAX_ERR"; break;
! 170: case 13: s="INVALID_MODIFICATION_ERR"; break;
! 171: case 14: s="NAMESPACE_ERR"; break;
! 172: case 15: s="INVALID_ACCESS_ERR"; break;
! 173: case 201: s="UNKNOWN_ERR"; break;
! 174: case 202: s="TRANSCODING_ERR"; break;
! 175: default: s="<UNKNOWN CODE>"; break;
! 176: }
! 177: THROW(0, 0,
! 178: source,
! 179: "XalanDOMException %s (%d)",
! 180: s, // decoded code of exception
! 181: code // code of exception
! 182: );
1.22 parser 183: }
1.26 parser 184:
185: #endif
E-mail: