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

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.29    ! parser      7:        $Id: pa_pool.C,v 1.28 2001/09/26 10:32:26 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,
                    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:                );
                    121: }
1.26      parser    122: 
                    123: #endif

E-mail: