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

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.34    ! parser      7:        $Id: pa_pool.C,v 1.33 2001/10/18 13:18:53 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 <util/PlatformUtils.hpp>
1.26      parser     16: #endif
1.22      parser     17: 
                     18: Pool::Pool(void *astorage) : 
1.34    ! parser     19:        fstorage(astorage), fcontext(0), ftag(0)
1.26      parser     20: #ifdef XML
                     21:        , transcoder(0) 
                     22: #endif
                     23:        {
                     24: #ifdef XML
1.25      parser     25:        charset=new(*this) String(*this, "UTF-8");
1.29      parser     26: #else
                     27:        charset=new(*this) String(*this, "");
1.26      parser     28: #endif
1.22      parser     29: }
                     30: 
1.24      parser     31: Pool::~Pool() {
1.26      parser     32: #ifdef XML
1.24      parser     33:        delete transcoder;
1.26      parser     34: #endif
1.22      parser     35: }
1.1       paf        36: 
1.21      parser     37: void Pool::fail_alloc(size_t size) const {
1.34    ! parser     38:        throw Exception(0, 0,
1.7       paf        39:                0,
1.9       paf        40:                "failed to allocate %u bytes", size);
1.7       paf        41: }
1.21      parser     42: 
                     43: void Pool::fail_register_cleanup() const {
1.34    ! parser     44:        throw Exception(0, 0,
1.21      parser     45:                0,
                     46:                "failed to register cleanup");
1.22      parser     47: }
                     48: 
1.25      parser     49: void Pool::set_charset(const String &new_charset) {
                     50:        if(new_charset!=*charset) {
1.29      parser     51: #ifdef XML
1.24      parser     52:                delete transcoder;  transcoder=0; // flag "we need new transcoder"
1.29      parser     53: #endif
1.25      parser     54:                charset=&new_charset; // for this charset
1.22      parser     55:        }
                     56: }
                     57: 
1.29      parser     58: #ifdef XML
1.22      parser     59: void Pool::update_transcoder() {
                     60:        if(transcoder)
                     61:                return;
                     62: 
                     63:        XMLTransService::Codes resValue;
1.25      parser     64:        transcoder=XMLPlatformUtils::fgTransService->makeNewTranscoderFor(charset->cstr(), resValue, 60);
1.24      parser     65:        if(!transcoder)
                     66:                THROW(0, 0,
1.25      parser     67:                        charset,
1.24      parser     68:                        "unsupported encoding");
1.22      parser     69: }
                     70: 
1.25      parser     71: const char *Pool::transcode_cstr(const XalanDOMString& s) { 
1.22      parser     72:        update_transcoder();
                     73: 
1.24      parser     74:        const unsigned int len=s.size()*2;
1.22      parser     75:        XMLByte* dest=(XMLByte *)malloc((len+1)*sizeof(XMLByte));
                     76:        bool error=true;
                     77:        try {
                     78:                if(transcoder) {
                     79:                        unsigned int charsEaten;
                     80:                        unsigned int size=transcoder->transcodeTo(
                     81:                                s.c_str(), s.length(),
1.24      parser     82:                                dest, len,
1.22      parser     83:                                charsEaten,
1.24      parser     84:                                XMLTranscoder::UnRep_RepChar //UnRep_Throw
1.22      parser     85:                        );
                     86:                        dest[size]=0;
                     87:                        error=false;
                     88:                }
1.32      parser     89:        } catch(XMLException& e) {
                     90:                exception()._throw(*this, 0, e);
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.32      parser     96: }
                     97: 
                     98: /// @test who would free up result?
                     99: XalanDOMString& Pool::transcode_buf(const char *buf, size_t buf_size) { 
                    100:        update_transcoder();
                    101: 
                    102:        unsigned int dest_size=0;
                    103:        XMLCh* dest=(XMLCh *)malloc((buf_size+1)*sizeof(XMLCh));
                    104:        unsigned char *charSizes=(unsigned char *)malloc(buf_size*sizeof(unsigned char));
                    105:        XalanDOMString *result;
                    106:        try {
                    107:                if(transcoder) {
                    108:                        unsigned int bytesEaten;
                    109:                        unsigned int dest_size=transcoder->transcodeFrom(
                    110:                                (unsigned char *)buf,
                    111:                                (const unsigned int)buf_size,
                    112:                                dest, (const unsigned int)buf_size,
                    113:                                bytesEaten,
                    114:                                charSizes
                    115:                        );
                    116:                        result=new XalanDOMString(dest, dest_size);
                    117:                }
                    118:        } catch(XMLException& e) {
                    119:                exception()._throw(*this, 0, e);
                    120:        }
                    121:        
                    122:        return *result;
                    123: }
                    124: XalanDOMString& Pool::transcode(const String& s) { 
                    125:        const char *cstr=s.cstr(String::UL_XML);
                    126: 
                    127:        return transcode_buf(cstr, strlen(cstr)); 
1.22      parser    128: }
1.26      parser    129: 
                    130: #endif

E-mail: