--- parser3/src/main/pa_pool.C 2001/10/05 17:33:50 1.30 +++ parser3/src/main/pa_pool.C 2003/01/22 15:39:08 1.59.2.1 @@ -1,185 +1,142 @@ /** @file Parser: pool class. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) - - $Id: pa_pool.C,v 1.30 2001/10/05 17:33:50 parser Exp $ + Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexandr Petrosian (http://paf.design.ru) */ +static const char* IDENT_POOL_C="$Date: 2003/01/22 15:39:08 $"; + #include "pa_pool.h" #include "pa_exception.h" #include "pa_common.h" +#include "pa_sapi.h" +//#include "pa_charset.h" -#ifdef XML -#include -#include -#endif +static void *fail_alloc(char *what, size_t size) { + SAPI::die("out of memory: failed to %s %u bytes", + what, size); + + // never reached + return 0; +} +void *pa_malloc(size_t size) { + if(void *result=malloc(size)) + return result; + + return fail_alloc("allocate", size); +} + +void *pa_calloc(size_t size) { + if(void *result=calloc(1, size)) + return result; + + return fail_alloc("allocate", size); +} +void pa_free(void *ptr) { + free(ptr); +} + +void *pa_realloc(void *ptr, size_t size) { + if(void *result=realloc(ptr, size)) + return result; + + return fail_alloc("reallocate to", size); +} + +/* Pool::Pool(void *astorage) : - fstorage(astorage), fcontext(0), ftag(0), fexception(0) -#ifdef XML - , transcoder(0) -#endif + fstorage(astorage), fcontext(0), + ftotal_allocated(0), ftotal_times(0), + source_charset(0), client_charset(0) { -#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::copy(const void *buf, const size_t size) { + if(!buf || !size) + return 0; + + void *result=malloc(size); + memcpy(result, buf, size); + return result; } +char *Pool::copy(const char *cstr) { + if(cstr) { + size_t size=strlen(cstr)+1; + return (char *)copy(cstr, size); + } + return 0; +} + + void Pool::fail_alloc(size_t size) const { - fexception->_throw(0, 0, - 0, - "failed to allocate %u bytes", size); + SAPI::die("out of pool memory: failed to allocate %u bytes; " + "already allocated on pool: %u bytes in %u times", + size, + ftotal_allocated, ftotal_times); } void Pool::fail_register_cleanup() const { - fexception->_throw(0, 0, - 0, - "failed to register cleanup"); + SAPI::die("failed to register cleanup"); +} + +void Pool::set_source_charset(Charset& acharset) { + source_charset=&acharset; +} +Charset& Pool::get_source_charset() { + if(!source_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; } -void Pool::set_charset(const String &new_charset) { - if(new_charset!=*charset) { #ifdef XML - delete transcoder; transcoder=0; // flag "we need new transcoder" + +const char *Pool::transcode_cstr(xmlChar *s) { + return get_source_charset().transcode_cstr(s); +} + +String& Pool::transcode(xmlChar *s +#ifndef NO_STRING_ORIGIN + , const String *origin #endif - charset=&new_charset; // for this charset - } + ) { + return get_source_charset().transcode(s, origin); } -#ifdef XML -void Pool::update_transcoder() { - if(transcoder) - return; - - XMLTransService::Codes resValue; - transcoder=XMLPlatformUtils::fgTransService->makeNewTranscoderFor(charset->cstr(), resValue, 60); - if(!transcoder) - THROW(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(...) { - } - if(error) { - memset(dest, '?', s.size()); - ((char *)dest)[s.size()]=0; - } - return (const char *)dest; +const char *Pool::transcode_cstr(GdomeDOMString *s) { + return get_source_charset().transcode_cstr(s); } -String& Pool::transcode(const XalanDOMString& s) { - return *new(*this) String(*this, transcode_cstr(s)); + +String& Pool::transcode(GdomeDOMString *s +#ifndef NO_STRING_ORIGIN + , const String *origin +#endif + ) { + return get_source_charset().transcode(s, origin); } -void Pool::_throw(const String *source, const XSLException& e) { - if(e.getURI().empty()) - THROW(0, 0, - source, - "%s (%s)", - transcode_cstr(e.getMessage()), // message for exception - transcode_cstr(e.getType()) // type of exception - ); - else - THROW(0, 0, - source, - "%s (%s). %s(%d:%d)'", - transcode_cstr(e.getMessage()), // message for exception - transcode_cstr(e.getType()), // type of exception - - transcode_cstr(e.getURI()), // URI for the associated document, if any - e.getLineNumber(), // line number, or -1 if unknown - e.getColumnNumber() // column number, or -1 if unknown - ); -} - -void Pool::_throw(const String *source, const SAXException& e) { - THROW(0, 0, - source, - "%s", - transcode_cstr(XalanDOMString(e.getMessage())) // message for exception - ); -} -void Pool::_throw(const String *source, const SAXParseException& e) { - THROW(0, 0, - source, - "%s. %s(%d:%d)", - transcode_cstr(XalanDOMString(e.getMessage())), // message for exception - e.getSystemId()?transcode_cstr(XalanDOMString(e.getSystemId())):"block", // file of exception - e.getLineNumber(), e.getColumnNumber() // line:col - ); -} - - -void Pool::_throw(const String *source, const XMLException& e) { - THROW(0, 0, - source, - "%s (%s). %s(%d)'", - transcode_cstr(XalanDOMString(e.getMessage())), // message for exception - transcode_cstr(XalanDOMString((e.getType()))), // type of exception - - e.getSrcFile()?e.getSrcFile():"block", // file of exception - e.getSrcLine() // line number - //e.getCode() - ); -} - -void Pool::_throw(const String *source, const XalanDOMException& e) { - const char *s; - int code=(int)e.getExceptionCode(); - switch(code) { - case 1: s="INDEX_SIZE_ERR"; break; - case 2: s="DOMSTRING_SIZE_ERR"; break; - case 3: s="HIERARCHY_REQUEST_ERR"; break; - case 4: s="WRONG_DOCUMENT_ERR"; break; - case 5: s="INVALID_CHARACTER_ERR"; break; - case 6: s="NO_DATA_ALLOWED_ERR"; break; - case 7: s="NO_MODIFICATION_ALLOWED_ERR"; break; - case 8: s="NOT_FOUND_ERR"; break; - case 9: s="NOT_SUPPORTED_ERR"; break; - case 10: s="INUSE_ATTRIBUTE_ERR"; break; - case 11: s="INVALID_STATE_ERR"; break; - case 12: s="SYNTAX_ERR"; break; - case 13: s="INVALID_MODIFICATION_ERR"; break; - case 14: s="NAMESPACE_ERR"; break; - case 15: s="INVALID_ACCESS_ERR"; break; - case 201: s="UNKNOWN_ERR"; break; - case 202: s="TRANSCODING_ERR"; break; - default: s=""; break; - } - THROW(0, 0, - source, - "XalanDOMException %s (%d)", - s, // decoded code of exception - code // code of exception - ); +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 +*/