Annotation of parser3/src/include/pa_charset.h, revision 1.30

1.1       paf         1: /** @file
                      2:        Parser: Charset connection decl.
                      3: 
1.29      paf         4:        Copyright (c) 2001-2004 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.30    ! paf        11: static const char * const IDENT_CHARSET_H="$Date: 2004/02/11 15:33:13 $";
1.23      paf        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"
1.26      paf        27: #include "gdome.h"
1.3       paf        28: #endif
                     29: 
1.1       paf        30: // defines
                     31: 
1.23      paf        32: #define MAX_CHARSETS 10
                     33: 
                     34: #define MAX_CHARSET_UNI_CODES 500
                     35: 
1.3       paf        36: #      ifndef XMLCh 
1.10      paf        37:                typedef unsigned int XMLCh;
1.3       paf        38: #      endif
                     39: #      ifndef XMLByte
1.11      paf        40:                typedef unsigned char XMLByte;
1.3       paf        41: #      endif
                     42: 
1.23      paf        43: // forwards
                     44: 
                     45: class GdomeDOMString_auto_ptr;
                     46: 
                     47: // helpers
                     48: 
1.24      paf        49: typedef Hash<const String::Body, String::Body> HashStringString;
1.23      paf        50: 
1.1       paf        51: /**    charset holds name & transcode tables 
1.23      paf        52:        registers libxml transcoders
1.1       paf        53: */
1.23      paf        54: class Charset: public PA_Object {
1.1       paf        55: public:
                     56: 
1.24      paf        57:        Charset(Request_charsets* charsets, const String::Body ANAME, const String* afile_spec);
1.1       paf        58:        
1.24      paf        59:        const String::Body NAME() const { return FNAME; }
1.30    ! paf        60:        const char* NAME_CSTR() const { return FNAME_CSTR; }
1.1       paf        61: 
                     62:        bool isUTF8() const { return fisUTF8; }
                     63: 
1.23      paf        64:        static String::C transcode(const String::C src,
                     65:                const Charset& source_transcoder, 
                     66:                const Charset& dest_transcoder
1.1       paf        67:        );
1.21      paf        68: 
1.23      paf        69:        static String& transcode(const String& src,
1.21      paf        70:                const Charset& source_transcoder, 
1.23      paf        71:                const Charset& dest_transcoder);
1.21      paf        72: 
1.24      paf        73:        static String::Body transcode(const String::Body src,
1.21      paf        74:                const Charset& source_transcoder, 
1.23      paf        75:                const Charset& dest_transcoder);
1.21      paf        76: 
1.23      paf        77:        static void transcode(ArrayString& src,
1.21      paf        78:                const Charset& source_transcoder, 
1.23      paf        79:                const Charset& dest_transcoder);
                     80: 
                     81:        static void transcode(HashStringString& src,
                     82:                const Charset& source_transcoder, 
                     83:                const Charset& dest_transcoder);
1.1       paf        84: 
1.9       paf        85: #ifdef XML
1.24      paf        86:        xmlCharEncodingHandler& transcoder(const String::Body NAME);
1.9       paf        87: #endif
                     88: 
1.1       paf        89: public:
                     90: 
                     91:        unsigned char pcre_tables[tables_length];
                     92: 
                     93: private:
                     94: 
1.23      paf        95:        void load_definition(Request_charsets& charsets, const String& afile_spec);
1.1       paf        96:        void sort_ToTable();
                     97: 
1.23      paf        98:        const String::C transcodeToUTF8(const String::C src) const;
                     99:        const String::C transcodeFromUTF8(const String::C src) const;
                    100:        
                    101:        const String::C transcodeToCharset(const String::C src,
                    102:                const Charset& dest_transcoder) const;
1.1       paf       103: 
1.4       paf       104: public:
                    105: 
                    106:        struct Tables {
1.25      paf       107:                struct Rec {
                    108:                        XMLCh intCh;
                    109:                        XMLByte extCh;
                    110:                };
                    111: 
1.4       paf       112:                XMLCh fromTable[0x100];
1.25      paf       113:                Rec toTable[MAX_CHARSET_UNI_CODES];
1.4       paf       114:                uint toTableSize;
                    115:        };
                    116: 
1.25      paf       117:        struct UTF8CaseTable {
                    118:                struct Rec {
                    119:                        XMLCh from, to;
                    120:                };
                    121: 
                    122:                uint size;
                    123:                Rec* records;
                    124:        };
                    125: 
1.1       paf       126: private:
                    127: 
1.24      paf       128:        const String::Body FNAME;
1.23      paf       129:        char* FNAME_CSTR;
1.1       paf       130:        bool fisUTF8;
1.4       paf       131:        Tables tables;
1.1       paf       132: 
                    133: #ifdef XML
                    134: 
                    135: private:
1.23      paf       136:        void addEncoding(char* name_cstr);
1.24      paf       137:        void initTranscoder(const String::Body name, const char* name_cstr);
1.9       paf       138:        
1.1       paf       139: public:
1.23      paf       140:        /// converts GdomeDOMString string to char* 
                    141:        String::C transcode_cstr(GdomeDOMString* s);
1.3       paf       142:        /// converts GdomeDOMString string to parser String
1.23      paf       143:        const String& transcode(GdomeDOMString* s);
                    144:        /// converts xmlChar* null-terminated string to char* 
                    145:        String::C transcode_cstr(xmlChar* s);
1.8       paf       146:        /// converts xmlChar* null-terminated string to parser String
1.23      paf       147:        const String& transcode(xmlChar* s);
                    148: 
                    149:        /** converts sized char*  to xmlChar*
                    150:                @returns xmlChar*  WHICH CALLER SHOULD FREE
1.16      paf       151:        */
1.23      paf       152:        xmlChar* transcode_buf2xchar(const char* buf, size_t buf_size);
                    153:        /// converts char*  to GdomeDOMString
                    154:        GdomeDOMString_auto_ptr transcode_buf2dom(const char* buf, size_t buf_size);
1.3       paf       155:        /// converts parser String to GdomeDOMString
1.5       paf       156:        GdomeDOMString_auto_ptr transcode(const String& s);
1.24      paf       157:        /// converts parser String::Body to GdomeDOMString
                    158:        GdomeDOMString_auto_ptr transcode(const String::Body s);
1.1       paf       159: 
                    160: private:
                    161: 
1.23      paf       162:        xmlCharEncodingHandler* ftranscoder;
1.1       paf       163: 
                    164: #endif
                    165: 
1.5       paf       166: };
1.25      paf       167: 
                    168: 
                    169: // externs
                    170: 
                    171: extern Charset::UTF8CaseTable UTF8CaseToUpper;
                    172: extern Charset::UTF8CaseTable UTF8CaseToLower;
1.28      paf       173: void change_case_UTF8(const XMLByte* srcData, size_t srcLen,
                    174:                                          XMLByte* toFill, size_t toFillLen,
1.25      paf       175:                                          const Charset::UTF8CaseTable& table);
                    176: 
1.5       paf       177: 
1.12      paf       178: #ifdef XML
1.5       paf       179: /// Auto-object used to track GdomeDOMString usage
                    180: class GdomeDOMString_auto_ptr {
1.23      paf       181:        GdomeDOMString* fstring;
1.5       paf       182: public:
1.23      paf       183:        /// frees astring afterwards!!!
                    184:        explicit GdomeDOMString_auto_ptr(xmlChar* astring) : fstring(gdome_str_mkref_xml(astring)) {}
                    185:        explicit GdomeDOMString_auto_ptr(GdomeDOMString* astring=0) : fstring(astring) {
1.7       paf       186:                // not ref-ing, owning
1.5       paf       187:        }
                    188:        ~GdomeDOMString_auto_ptr() {
1.23      paf       189:                if(fstring)
                    190:                        gdome_str_unref(fstring);
1.5       paf       191:        }
1.22      paf       192: /*     GdomeDOMString* get() {
                    193:                return fstring;
                    194:        }*/
                    195:        GdomeDOMString* use() {
                    196:                if(fstring)
                    197:                        gdome_str_ref(fstring);
1.5       paf       198:                return fstring;
                    199:        }
                    200:        GdomeDOMString* operator->() {
                    201:                return fstring;
                    202:        }
1.22      paf       203: /*     GdomeDOMString& operator*() {
1.23      paf       204:                return* fstring;
1.22      paf       205:        }*/
1.5       paf       206: 
                    207:        // copying
                    208:        GdomeDOMString_auto_ptr(const GdomeDOMString_auto_ptr& src) : fstring(src.fstring) {
                    209:                gdome_str_ref(fstring);
                    210:        }
                    211:        GdomeDOMString_auto_ptr& operator =(const GdomeDOMString_auto_ptr& src) {
                    212:                if(this == &src)
1.23      paf       213:                        return* this;
1.5       paf       214: 
1.22      paf       215:                if(fstring)
                    216:                        gdome_str_unref(fstring);
1.5       paf       217:                fstring=src.fstring;
1.22      paf       218:                if(fstring)
                    219:                        gdome_str_ref(fstring);
1.5       paf       220: 
1.23      paf       221:                return* this;
1.5       paf       222:        }
1.1       paf       223: };
1.12      paf       224: #endif
1.1       paf       225: 
                    226: #endif

E-mail: