Diff for /parser3/src/main/pa_pool.C between versions 1.36 and 1.53

version 1.36, 2001/10/19 14:42:53 version 1.53, 2002/06/28 09:59:01
Line 1 Line 1
 /** @file  /** @file
         Parser: pool class.          Parser: pool class.
   
         Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
   
         $Id$          $Id$
 */  */
Line 10 Line 10
 #include "pa_pool.h"  #include "pa_pool.h"
 #include "pa_exception.h"  #include "pa_exception.h"
 #include "pa_common.h"  #include "pa_common.h"
   #include "pa_sapi.h"
 #ifdef XML  #include "pa_charset.h"
 #include <util/PlatformUtils.hpp>  
 #endif  
   
 Pool::Pool(void *astorage) :   Pool::Pool(void *astorage) : 
         fstorage(astorage), fcontext(0), ftag(0)          fstorage(astorage), fcontext(0)
 #ifdef XML          ftotal_allocated(0), ftotal_times(0),
         , transcoder(0)           source_charset(0), client_charset(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 {  void Pool::fail_alloc(size_t size) const {
         throw Exception(0, 0,          SAPI::die("out of pool memory: failed to allocate %u bytes; "
                 0,                  "already allocated on pool: %u bytes in %u times", 
                 "failed to allocate %u bytes", size);                  size, 
                   ftotal_allocated, ftotal_times);
 }  }
   
 void Pool::fail_register_cleanup() const {  void Pool::fail_register_cleanup() const {
         throw Exception(0, 0,          SAPI::die("failed to register cleanup");
                 0,  
                 "failed to register cleanup");  
 }  }
   
 void Pool::set_charset(const String &new_charset) {  void Pool::set_source_charset(Charset& acharset) { 
         if(new_charset!=*charset) {          source_charset=&acharset; 
 #ifdef XML  }
                 delete transcoder;  transcoder=0; // flag "we need new transcoder"  Charset& Pool::get_source_charset() { 
 #endif          if(!source_charset)
                 charset=&new_charset; // for this charset                  throw Exception(0,
         }                          0,
                           "no source charset defined yet");
           return *source_charset; 
   }
   
   void Pool::set_client_charset(Charset& acharset) { 
           client_charset=&acharset; 
   }
   Charset& Pool::get_client_charset() { 
           if(!client_charset)
                   throw Exception(0,
                           0,
                           "no client charset defined yet");
           return *client_charset; 
 }  }
   
 #ifdef XML  #ifdef XML
 void Pool::update_transcoder() {  
         if(transcoder)  const char *Pool::transcode_cstr(xmlChar *s) {
                 return;          return get_source_charset().transcode_cstr(s); 
   
         XMLTransService::Codes resValue;  
         transcoder=XMLPlatformUtils::fgTransService->makeNewTranscoderFor(charset->cstr(), resValue, 60);  
         if(!transcoder)  
                 throw Exception(0, 0,  
                         charset,  
                         "unsupported encoding");  
 }  
   
 const char *Pool::transcode_cstr(const XalanDOMString& s) {   
         update_transcoder();  
   
         const unsigned int len=s.size()*2;  
         XMLByte* dest=(XMLByte *)malloc((len+1)*sizeof(XMLByte));  
         bool error=true;  
         try {  
                 if(transcoder) {  
                         unsigned int charsEaten;  
                         unsigned int size=transcoder->transcodeTo(  
                                 s.c_str(), s.length(),  
                                 dest, len,  
                                 charsEaten,  
                                 XMLTranscoder::UnRep_RepChar //UnRep_Throw  
                         );  
                         dest[size]=0;  
                         error=false;  
                 }  
         } catch(XMLException& e) {  
                 Exception::convert(*this, 0, e);  
         }  
         return (const char *)dest;  
 }  
 String& Pool::transcode(const XalanDOMString& s) {   
         return *new(*this) String(*this, transcode_cstr(s));   
 }  
   
 std::auto_ptr<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));  
         std::auto_ptr<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=std::auto_ptr<XalanDOMString>(new XalanDOMString(dest, dest_size));  
                 }  
         } catch(XMLException& e) {  
                 Exception::convert(*this, 0, e);  
         }  
           
         return result;  
 }  }
 std::auto_ptr<XalanDOMString> Pool::transcode(const String& s) {   
         const char *cstr=s.cstr(String::UL_XML);  
   
         return transcode_buf(cstr, strlen(cstr));   String& Pool::transcode(xmlChar *s) {
           return get_source_charset().transcode(s); 
 }  }
   
   const char *Pool::transcode_cstr(GdomeDOMString *s) { 
           return get_source_charset().transcode_cstr(s); 
   }
   
   String& Pool::transcode(GdomeDOMString *s) { 
           return get_source_charset().transcode(s); 
   }
   
   xmlChar *Pool::transcode_buf2xchar(const char *buf, size_t buf_size) {
           return get_source_charset().transcode_buf2xchar(buf, buf_size); 
   }
   
   GdomeDOMString_auto_ptr Pool::transcode(const String& s) {
           return get_source_charset().transcode(s); 
   }
   
   
 #endif  #endif

Removed from v.1.36  
changed lines
  Added in v.1.53


E-mail: