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

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.30    ! parser      7:        $Id: pa_pool.C,v 1.29 2001/10/02 17:05:49 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,
1.30    ! parser    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:                );
1.30    ! parser    121: }
        !           122: 
        !           123: void Pool::_throw(const String *source, const SAXException& e) {
        !           124:        THROW(0, 0,
        !           125:                source,
        !           126:                "%s",
        !           127:                        transcode_cstr(XalanDOMString(e.getMessage()))  // message for exception
        !           128:        );
        !           129: }
        !           130: void Pool::_throw(const String *source, const SAXParseException& e) {
        !           131:        THROW(0, 0,
        !           132:                source,
        !           133:                "%s. %s(%d:%d)",
        !           134:                        transcode_cstr(XalanDOMString(e.getMessage())),  // message for exception
        !           135:                        e.getSystemId()?transcode_cstr(XalanDOMString(e.getSystemId())):"block", // file of exception
        !           136:                        e.getLineNumber(), e.getColumnNumber() // line:col
        !           137:        );
        !           138: }
        !           139: 
        !           140: 
        !           141: void Pool::_throw(const String *source, const XMLException& e) {
        !           142:        THROW(0, 0,
        !           143:                source,
        !           144:                "%s (%s). %s(%d)'", 
        !           145:                        transcode_cstr(XalanDOMString(e.getMessage())),  // message for exception
        !           146:                        transcode_cstr(XalanDOMString((e.getType()))), // type of exception
        !           147:                        
        !           148:                        e.getSrcFile()?e.getSrcFile():"block", // file of exception
        !           149:                        e.getSrcLine()  // line number
        !           150:                        //e.getCode()
        !           151:        );
        !           152: }
        !           153: 
        !           154: void Pool::_throw(const String *source, const XalanDOMException& e) {
        !           155:        const char *s;
        !           156:        int code=(int)e.getExceptionCode();
        !           157:        switch(code) {
        !           158:        case 1: s="INDEX_SIZE_ERR"; break;
        !           159:        case 2: s="DOMSTRING_SIZE_ERR"; break;
        !           160:        case 3: s="HIERARCHY_REQUEST_ERR"; break;
        !           161:        case 4: s="WRONG_DOCUMENT_ERR"; break;
        !           162:        case 5: s="INVALID_CHARACTER_ERR"; break;
        !           163:        case 6: s="NO_DATA_ALLOWED_ERR"; break;
        !           164:        case 7: s="NO_MODIFICATION_ALLOWED_ERR"; break;
        !           165:        case 8: s="NOT_FOUND_ERR"; break;
        !           166:        case 9: s="NOT_SUPPORTED_ERR"; break;
        !           167:        case 10: s="INUSE_ATTRIBUTE_ERR"; break;
        !           168:        case 11: s="INVALID_STATE_ERR"; break;
        !           169:        case 12: s="SYNTAX_ERR"; break;
        !           170:        case 13: s="INVALID_MODIFICATION_ERR"; break;
        !           171:        case 14: s="NAMESPACE_ERR"; break;
        !           172:        case 15: s="INVALID_ACCESS_ERR"; break;
        !           173:        case 201: s="UNKNOWN_ERR"; break;
        !           174:        case 202: s="TRANSCODING_ERR"; break;
        !           175:        default: s="<UNKNOWN CODE>"; break;
        !           176:        }
        !           177:        THROW(0, 0,
        !           178:                source,
        !           179:                "XalanDOMException %s (%d)",
        !           180:                        s,  // decoded code of exception
        !           181:                        code // code of exception
        !           182:        );
1.22      parser    183: }
1.26      parser    184: 
                    185: #endif

E-mail: