Annotation of parser3/src/main/pa_pool.C, revision 1.27

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

E-mail: