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: