--- parser3/src/main/pa_pool.C 2001/10/05 17:33:50 1.30 +++ parser3/src/main/pa_pool.C 2001/11/05 11:46:28 1.39 @@ -2,9 +2,9 @@ Parser: pool class. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + Author: Alexander Petrosyan (http://paf.design.ru) - $Id: pa_pool.C,v 1.30 2001/10/05 17:33:50 parser Exp $ + $Id: pa_pool.C,v 1.39 2001/11/05 11:46:28 paf Exp $ */ #include "pa_pool.h" @@ -12,12 +12,11 @@ #include "pa_common.h" #ifdef XML -#include #include #endif Pool::Pool(void *astorage) : - fstorage(astorage), fcontext(0), ftag(0), fexception(0) + fstorage(astorage), fcontext(0), ftag(0) #ifdef XML , transcoder(0) #endif @@ -36,13 +35,13 @@ Pool::~Pool() { } void Pool::fail_alloc(size_t size) const { - fexception->_throw(0, 0, + throw Exception(0, 0, 0, "failed to allocate %u bytes", size); } void Pool::fail_register_cleanup() const { - fexception->_throw(0, 0, + throw Exception(0, 0, 0, "failed to register cleanup"); } @@ -64,7 +63,7 @@ void Pool::update_transcoder() { XMLTransService::Codes resValue; transcoder=XMLPlatformUtils::fgTransService->makeNewTranscoderFor(charset->cstr(), resValue, 60); if(!transcoder) - THROW(0, 0, + throw Exception(0, 0, charset, "unsupported encoding"); } @@ -87,11 +86,8 @@ const char *Pool::transcode_cstr(const X dest[size]=0; error=false; } - } catch(...) { - } - if(error) { - memset(dest, '?', s.size()); - ((char *)dest)[s.size()]=0; + } catch(XMLException& e) { + Exception::provide_source(*this, 0, e); } return (const char *)dest; } @@ -99,87 +95,36 @@ String& Pool::transcode(const XalanDOMSt return *new(*this) String(*this, transcode_cstr(s)); } -void Pool::_throw(const String *source, const XSLException& e) { - if(e.getURI().empty()) - THROW(0, 0, - source, - "%s (%s)", - transcode_cstr(e.getMessage()), // message for exception - transcode_cstr(e.getType()) // type of exception - ); - else - THROW(0, 0, - source, - "%s (%s). %s(%d:%d)'", - transcode_cstr(e.getMessage()), // message for exception - transcode_cstr(e.getType()), // type of exception - - transcode_cstr(e.getURI()), // URI for the associated document, if any - e.getLineNumber(), // line number, or -1 if unknown - e.getColumnNumber() // column number, or -1 if unknown - ); -} - -void Pool::_throw(const String *source, const SAXException& e) { - THROW(0, 0, - source, - "%s", - transcode_cstr(XalanDOMString(e.getMessage())) // message for exception - ); -} -void Pool::_throw(const String *source, const SAXParseException& e) { - THROW(0, 0, - source, - "%s. %s(%d:%d)", - transcode_cstr(XalanDOMString(e.getMessage())), // message for exception - e.getSystemId()?transcode_cstr(XalanDOMString(e.getSystemId())):"block", // file of exception - e.getLineNumber(), e.getColumnNumber() // line:col - ); -} - - -void Pool::_throw(const String *source, const XMLException& e) { - THROW(0, 0, - source, - "%s (%s). %s(%d)'", - transcode_cstr(XalanDOMString(e.getMessage())), // message for exception - transcode_cstr(XalanDOMString((e.getType()))), // type of exception - - e.getSrcFile()?e.getSrcFile():"block", // file of exception - e.getSrcLine() // line number - //e.getCode() - ); -} - -void Pool::_throw(const String *source, const XalanDOMException& e) { - const char *s; - int code=(int)e.getExceptionCode(); - switch(code) { - case 1: s="INDEX_SIZE_ERR"; break; - case 2: s="DOMSTRING_SIZE_ERR"; break; - case 3: s="HIERARCHY_REQUEST_ERR"; break; - case 4: s="WRONG_DOCUMENT_ERR"; break; - case 5: s="INVALID_CHARACTER_ERR"; break; - case 6: s="NO_DATA_ALLOWED_ERR"; break; - case 7: s="NO_MODIFICATION_ALLOWED_ERR"; break; - case 8: s="NOT_FOUND_ERR"; break; - case 9: s="NOT_SUPPORTED_ERR"; break; - case 10: s="INUSE_ATTRIBUTE_ERR"; break; - case 11: s="INVALID_STATE_ERR"; break; - case 12: s="SYNTAX_ERR"; break; - case 13: s="INVALID_MODIFICATION_ERR"; break; - case 14: s="NAMESPACE_ERR"; break; - case 15: s="INVALID_ACCESS_ERR"; break; - case 201: s="UNKNOWN_ERR"; break; - case 202: s="TRANSCODING_ERR"; break; - default: s=""; break; +std::auto_ptr Pool::transcode_buf(const char *buf, size_t buf_size) { + update_transcoder(); + + unsigned int dest_size=0; + XMLCh* dest=(XMLCh *)malloc((buf_size+1)*sizeof(XMLCh)); + unsigned char *charSizes=(unsigned char *)malloc(buf_size*sizeof(unsigned char)); + XalanDOMString *result; + try { + if(transcoder) { + unsigned int bytesEaten; + unsigned int dest_size=transcoder->transcodeFrom( + (unsigned char *)buf, + (const unsigned int)buf_size, + dest, (const unsigned int)buf_size, + bytesEaten, + charSizes + ); + result=new XalanDOMString(dest, dest_size); + } + } catch(XMLException& e) { + Exception::provide_source(*this, 0, e); + result=0; //calm, compiler } - THROW(0, 0, - source, - "XalanDOMException %s (%d)", - s, // decoded code of exception - code // code of exception - ); + + return std::auto_ptr(result); +} +std::auto_ptr Pool::transcode(const String& s) { + const char *cstr=s.cstr(String::UL_XML); + + return transcode_buf(cstr, strlen(cstr)); } #endif