--- parser3/src/main/pa_pool.C 2001/09/21 08:38:28 1.25 +++ parser3/src/main/pa_pool.C 2001/10/19 12:43:30 1.34 @@ -2,47 +2,60 @@ Parser: pool class. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: pa_pool.C,v 1.34 2001/10/19 12:43:30 parser Exp $ */ -static const char *RCSId="$Id: pa_pool.C,v 1.25 2001/09/21 08:38:28 parser Exp $"; #include "pa_pool.h" #include "pa_exception.h" #include "pa_common.h" -#include +#ifdef XML #include +#endif Pool::Pool(void *astorage) : - fstorage(astorage), fcontext(0), ftag(0), fexception(0), - transcoder(0) { + fstorage(astorage), fcontext(0), ftag(0) +#ifdef XML + , transcoder(0) +#endif + { +#ifdef XML charset=new(*this) String(*this, "UTF-8"); +#else + charset=new(*this) String(*this, ""); +#endif } Pool::~Pool() { +#ifdef XML delete transcoder; +#endif } 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"); } void Pool::set_charset(const String &new_charset) { if(new_charset!=*charset) { +#ifdef XML delete transcoder; transcoder=0; // flag "we need new transcoder" +#endif charset=&new_charset; // for this charset } } +#ifdef XML void Pool::update_transcoder() { if(transcoder) return; @@ -55,7 +68,6 @@ void Pool::update_transcoder() { "unsupported encoding"); } - const char *Pool::transcode_cstr(const XalanDOMString& s) { update_transcoder(); @@ -74,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()._throw(*this, 0, e); } return (const char *)dest; } @@ -86,23 +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(e.getMessage()), // message for exception - transcode(e.getType()) // type of exception - ); - else - THROW(0, 0, - source, - "%s (%s) %s(%d:%d)'", - transcode(e.getMessage()), // message for exception - transcode(e.getType()), // type of exception - - transcode(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 - ); +/// @test who would free up result? +XalanDOMString& 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()._throw(*this, 0, e); + } + + return *result; +} +XalanDOMString& Pool::transcode(const String& s) { + const char *cstr=s.cstr(String::UL_XML); + + return transcode_buf(cstr, strlen(cstr)); } + +#endif