Annotation of parser3/src/include/pa_charset.h, revision 1.23
1.1 paf 1: /** @file
2: Parser: Charset connection decl.
3:
1.23 ! paf 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.14 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 paf 6: */
7:
8: #ifndef PA_CHARSET_H
9: #define PA_CHARSET_H
1.17 paf 10:
1.23 ! paf 11: static const char* IDENT_CHARSET_H="$Date: 2003/06/27 08:36:59 $";
! 12:
1.1 paf 13:
14: #include "pa_exception.h"
15: #include "pa_common.h"
1.23 ! paf 16: #include "pa_hash.h"
! 17: #include "pa_array.h"
1.1 paf 18:
19: // hiding into namespace so to avoid stupid conflict
20: namespace PCRE {
21: #include "pcre.h"
22: # include "internal.h"
23: };
24:
1.3 paf 25: #ifdef XML
26: #include "libxml/encoding.h"
27: #endif
28:
1.1 paf 29: // defines
30:
1.23 ! paf 31: #define MAX_CHARSETS 10
! 32:
! 33: #define MAX_CHARSET_UNI_CODES 500
! 34:
1.3 paf 35: # ifndef XMLCh
1.10 paf 36: typedef unsigned int XMLCh;
1.3 paf 37: # endif
38: # ifndef XMLByte
1.11 paf 39: typedef unsigned char XMLByte;
1.3 paf 40: # endif
41:
1.23 ! paf 42: // forwards
! 43:
! 44: class GdomeDOMString_auto_ptr;
! 45:
! 46: // helpers
! 47:
1.10 paf 48: struct Charset_TransRec {
49: XMLCh intCh;
50: XMLByte extCh;
51: };
1.1 paf 52:
1.23 ! paf 53: typedef Hash<const StringBody, StringBody> HashStringString;
! 54:
1.1 paf 55: /** charset holds name & transcode tables
1.23 ! paf 56: registers libxml transcoders
1.1 paf 57: */
1.23 ! paf 58: class Charset: public PA_Object {
1.1 paf 59: public:
60:
1.23 ! paf 61: Charset(Request_charsets* charsets, const StringBody ANAME, const String* afile_spec);
1.1 paf 62:
1.23 ! paf 63: const StringBody NAME() const { return FNAME; }
1.1 paf 64:
65: bool isUTF8() const { return fisUTF8; }
66:
1.23 ! paf 67: static String::C transcode(const String::C src,
! 68: const Charset& source_transcoder,
! 69: const Charset& dest_transcoder
1.1 paf 70: );
1.21 paf 71:
1.23 ! paf 72: static String& transcode(const String& src,
1.21 paf 73: const Charset& source_transcoder,
1.23 ! paf 74: const Charset& dest_transcoder);
1.21 paf 75:
1.23 ! paf 76: static StringBody transcode(const StringBody src,
1.21 paf 77: const Charset& source_transcoder,
1.23 ! paf 78: const Charset& dest_transcoder);
1.21 paf 79:
1.23 ! paf 80: static void transcode(ArrayString& src,
1.21 paf 81: const Charset& source_transcoder,
1.23 ! paf 82: const Charset& dest_transcoder);
! 83:
! 84: static void transcode(HashStringString& src,
! 85: const Charset& source_transcoder,
! 86: const Charset& dest_transcoder);
1.1 paf 87:
1.9 paf 88: #ifdef XML
1.23 ! paf 89: xmlCharEncodingHandler& transcoder(const StringBody NAME);
1.9 paf 90: #endif
91:
1.1 paf 92: public:
93:
94: unsigned char pcre_tables[tables_length];
95:
96: private:
97:
1.23 ! paf 98: void load_definition(Request_charsets& charsets, const String& afile_spec);
1.1 paf 99: void sort_ToTable();
100:
1.23 ! paf 101: const String::C transcodeToUTF8(const String::C src) const;
! 102: const String::C transcodeFromUTF8(const String::C src) const;
! 103:
! 104: const String::C transcodeToCharset(const String::C src,
! 105: const Charset& dest_transcoder) const;
1.1 paf 106:
1.4 paf 107: public:
108:
109: struct Tables {
110: XMLCh fromTable[0x100];
1.23 ! paf 111: Charset_TransRec toTable[MAX_CHARSET_UNI_CODES];
1.4 paf 112: uint toTableSize;
113: };
114:
1.1 paf 115: private:
116:
1.23 ! paf 117: const StringBody FNAME;
! 118: char* FNAME_CSTR;
1.1 paf 119: bool fisUTF8;
1.4 paf 120: Tables tables;
1.1 paf 121:
122: #ifdef XML
123:
124: private:
1.23 ! paf 125: void addEncoding(char* name_cstr);
! 126: void initTranscoder(const StringBody name, const char* name_cstr);
1.9 paf 127:
1.1 paf 128: public:
1.23 ! paf 129: /// converts GdomeDOMString string to char*
! 130: String::C transcode_cstr(GdomeDOMString* s);
1.3 paf 131: /// converts GdomeDOMString string to parser String
1.23 ! paf 132: const String& transcode(GdomeDOMString* s);
! 133: /// converts xmlChar* null-terminated string to char*
! 134: String::C transcode_cstr(xmlChar* s);
1.8 paf 135: /// converts xmlChar* null-terminated string to parser String
1.23 ! paf 136: const String& transcode(xmlChar* s);
! 137:
! 138: /** converts sized char* to xmlChar*
! 139: @returns xmlChar* WHICH CALLER SHOULD FREE
1.16 paf 140: */
1.23 ! paf 141: xmlChar* transcode_buf2xchar(const char* buf, size_t buf_size);
! 142: /// converts char* to GdomeDOMString
! 143: GdomeDOMString_auto_ptr transcode_buf2dom(const char* buf, size_t buf_size);
1.3 paf 144: /// converts parser String to GdomeDOMString
1.5 paf 145: GdomeDOMString_auto_ptr transcode(const String& s);
1.23 ! paf 146: /// converts parser StringBody to GdomeDOMString
! 147: GdomeDOMString_auto_ptr transcode(const StringBody s);
1.1 paf 148:
149: private:
150:
1.23 ! paf 151: xmlCharEncodingHandler* ftranscoder;
1.1 paf 152:
153: #endif
154:
1.5 paf 155: };
156:
1.12 paf 157: #ifdef XML
1.5 paf 158: /// Auto-object used to track GdomeDOMString usage
159: class GdomeDOMString_auto_ptr {
1.23 ! paf 160: GdomeDOMString* fstring;
1.5 paf 161: public:
1.23 ! paf 162: /// frees astring afterwards!!!
! 163: explicit GdomeDOMString_auto_ptr(xmlChar* astring) : fstring(gdome_str_mkref_xml(astring)) {}
! 164: explicit GdomeDOMString_auto_ptr(GdomeDOMString* astring=0) : fstring(astring) {
1.7 paf 165: // not ref-ing, owning
1.5 paf 166: }
167: ~GdomeDOMString_auto_ptr() {
1.23 ! paf 168: if(fstring)
! 169: gdome_str_unref(fstring);
1.5 paf 170: }
1.22 paf 171: /* GdomeDOMString* get() {
172: return fstring;
173: }*/
174: GdomeDOMString* use() {
175: if(fstring)
176: gdome_str_ref(fstring);
1.5 paf 177: return fstring;
178: }
179: GdomeDOMString* operator->() {
180: return fstring;
181: }
1.22 paf 182: /* GdomeDOMString& operator*() {
1.23 ! paf 183: return* fstring;
1.22 paf 184: }*/
1.5 paf 185:
186: // copying
187: GdomeDOMString_auto_ptr(const GdomeDOMString_auto_ptr& src) : fstring(src.fstring) {
188: gdome_str_ref(fstring);
189: }
190: GdomeDOMString_auto_ptr& operator =(const GdomeDOMString_auto_ptr& src) {
191: if(this == &src)
1.23 ! paf 192: return* this;
1.5 paf 193:
1.22 paf 194: if(fstring)
195: gdome_str_unref(fstring);
1.5 paf 196: fstring=src.fstring;
1.22 paf 197: if(fstring)
198: gdome_str_ref(fstring);
1.5 paf 199:
1.23 ! paf 200: return* this;
1.5 paf 201: }
1.1 paf 202: };
1.12 paf 203: #endif
1.1 paf 204:
205: #endif
E-mail: