File:  [parser3project] / parser3 / src / include / pa_charset.h
Revision 1.20.2.18.2.1: download - view: text, annotated - select for diffs - revision graph
Tue Mar 18 15:14:16 2003 UTC (23 years, 4 months ago) by paf
started porting to gc:
PA_Object done
lots of replacements also

/** @file
	Parser: Charset connection decl.

	Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
	Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
*/

#ifndef PA_CHARSET_H
#define PA_CHARSET_H

static const char* IDENT_CHARSET_H="$Date: 2003/03/18 15:14:16 $";


#include "pa_exception.h"
#include "pa_common.h"

// hiding into namespace so to avoid stupid conflict
namespace PCRE {
#include "pcre.h"
#	include "internal.h"
};

#ifdef XML
#include "libxml/encoding.h"
#endif

// defines

#define MAX_CHARSET_UNI_CODES 500

#	ifndef XMLCh 
		typedef unsigned int XMLCh;
#	endif
#	ifndef XMLByte
		typedef unsigned char XMLByte;
#	endif

// forwards

class GdomeDOMString_auto_ptr;

// helpers

struct Charset_TransRec {
	XMLCh intCh;
	XMLByte extCh;
};

/**	charset holds name & transcode tables 
	registers libxml transcoders
*/
class Charset: public PA_Object {
public:

	Charset(const String& aname, const String& afile_spec);
	override ~Charset();
	
	const String& name() const { return fname; }

	bool isUTF8() const { return fisUTF8; }

	static void transcode(
		const Charset& source_transcoder, const void* source_body, size_t source_content_length,
		const Charset& dest_transcoder, const void* & dest_body, size_t& dest_content_length
	);

#ifdef XML
	xmlCharEncodingHandler& transcoder(const String* source);
#endif

public:

	unsigned char pcre_tables[tables_length];

private:

	void load_definition(const String& afile_spec);
	void sort_ToTable();

	void transcodeToUTF8(
		const void* source_body, size_t source_content_length,
		const void* & dest_body, size_t& dest_content_length) const;
	void transcodeFromUTF8(
		const void* source_body, size_t source_content_length,
		const void* & dest_body, size_t& dest_content_length) const;
	
	void transcodeToCharset(
		const Charset& dest_transcoder,
		const void* source_body, size_t source_content_length,
		const void*& dest_body, size_t& dest_content_length) const;

public:

	struct Tables {
		XMLCh fromTable[0x100];
		Charset_TransRec toTable[MAX_CHARSET_UNI_CODES];
		uint toTableSize;
	};

private:

	const String& fname;
	const char* fname_cstr;
	bool fisUTF8;
	Tables tables;

#ifdef XML

private:
	void addEncoding(char* name_cstr);
	void initTranscoder(const String* source, const char* name_cstr);
	
public:
	/// converts GdomeDOMString string to char* 
	const char* transcode_cstr(GdomeDOMString* s);
	/// converts GdomeDOMString string to parser String
	const String& transcode(GdomeDOMString* s
#ifndef NO_STRING_ORIGIN
		, const String& origin
#endif
		);
	/// converts xmlChar* null-terminated string to char* 
	const char* transcode_cstr(xmlChar* s);
	/// converts xmlChar* null-terminated string to parser String
	const String& transcode(xmlChar* s
#ifndef NO_STRING_ORIGIN
		, const String& origin
#endif
		);

	/** converts sized char*  to xmlChar*
		@returns xmlChar*  WHICH CALLER SHOULD FREE
	*/
	xmlChar* transcode_buf2xchar(const char* buf, size_t buf_size);
	/** converts sized char*  to gchar*
		@returns gchar*  WHICH CALLER SHOULD FREE
	*/
	gchar* transcode_buf2gchar(const char* buf, size_t buf_size);
	/// converts char*  to GdomeDOMString
	GdomeDOMString_auto_ptr transcode_buf2dom(const char* buf, size_t buf_size);
	/// converts parser String to GdomeDOMString
	GdomeDOMString_auto_ptr transcode(const String& s);

private:

	typedef void* (*transcode_buf_malloc_func)(size_t size);
	void* transcode_buf2mchar(transcode_buf_malloc_func malloc_func, 
		const char* buf, size_t buf_size);

private:

	xmlCharEncodingHandler* ftranscoder;

#endif

};

#ifdef XML
/// Auto-object used to track GdomeDOMString usage
class GdomeDOMString_auto_ptr {
	GdomeDOMString* fstring;
public:
	/// frees astring afterwards!!!
	explicit GdomeDOMString_auto_ptr(gchar* astring) : fstring(gdome_str_mkref_own(astring)) {}
	explicit GdomeDOMString_auto_ptr(GdomeDOMString* astring=0) : fstring(astring) {
		// not ref-ing, owning
	}
	~GdomeDOMString_auto_ptr() {
		if(fstring)
			gdome_str_unref(fstring);
	}
	GdomeDOMString* get() {
		return fstring;
	}
	GdomeDOMString* operator->() {
		return fstring;
	}
	GdomeDOMString& operator*() {
		return* fstring;
	}

	// copying
	GdomeDOMString_auto_ptr(const GdomeDOMString_auto_ptr& src) : fstring(src.fstring) {
		gdome_str_ref(fstring);
	}
	GdomeDOMString_auto_ptr& operator =(const GdomeDOMString_auto_ptr& src) {
		if(this == &src)
			return* this;

		if(fstring)
			gdome_str_unref(fstring);
		fstring=src.fstring;
		if(fstring)
			gdome_str_ref(fstring);

		return* this;
	}
};
#endif

#endif

E-mail: