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

1.1       paf         1: /** @file
                      2:        Parser: Charset connection decl.
                      3: 
1.31      paf         4:        Copyright (c) 2001-2005 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.38    ! misha      11: static const char * const IDENT_CHARSET_H="$Date: 2008-07-16 17:07:11 $";
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"
                     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: // helpers
                     43: 
1.24      paf        44: typedef Hash<const String::Body, String::Body> HashStringString;
1.23      paf        45: 
1.1       paf        46: /**    charset holds name & transcode tables 
1.23      paf        47:        registers libxml transcoders
1.1       paf        48: */
1.23      paf        49: class Charset: public PA_Object {
1.1       paf        50: public:
                     51: 
1.24      paf        52:        Charset(Request_charsets* charsets, const String::Body ANAME, const String* afile_spec);
1.1       paf        53:        
1.24      paf        54:        const String::Body NAME() const { return FNAME; }
1.30      paf        55:        const char* NAME_CSTR() const { return FNAME_CSTR; }
1.1       paf        56: 
                     57:        bool isUTF8() const { return fisUTF8; }
                     58: 
1.23      paf        59:        static String::C transcode(const String::C src,
1.36      misha      60:                const Charset& source_charset, 
1.38    ! misha      61:                const Charset& dest_charset);
1.21      paf        62: 
1.23      paf        63:        static String& transcode(const String& src,
1.21      paf        64:                const Charset& source_transcoder, 
1.23      paf        65:                const Charset& dest_transcoder);
1.21      paf        66: 
1.24      paf        67:        static String::Body transcode(const String::Body src,
1.21      paf        68:                const Charset& source_transcoder, 
1.23      paf        69:                const Charset& dest_transcoder);
1.21      paf        70: 
1.23      paf        71:        static void transcode(ArrayString& src,
1.21      paf        72:                const Charset& source_transcoder, 
1.23      paf        73:                const Charset& dest_transcoder);
                     74: 
                     75:        static void transcode(HashStringString& src,
                     76:                const Charset& source_transcoder, 
                     77:                const Charset& dest_transcoder);
1.1       paf        78: 
1.36      misha      79:        static String::C escape(const String::C src,
1.37      misha      80:                const Charset& source_charset);
1.36      misha      81: 
1.38    ! misha      82:        static String::Body escape(const String::Body src,
        !            83:                const Charset& source_charset);
        !            84: 
        !            85:        static String& escape(const String& src,
        !            86:                const Charset& source_charset);
        !            87: 
1.35      misha      88:        void store_Char(XMLByte*& outPtr, XMLCh src, XMLByte not_found);
1.33      misha      89: 
1.9       paf        90: #ifdef XML
1.24      paf        91:        xmlCharEncodingHandler& transcoder(const String::Body NAME);
1.9       paf        92: #endif
                     93: 
1.1       paf        94: public:
                     95: 
                     96:        unsigned char pcre_tables[tables_length];
                     97: 
                     98: private:
                     99: 
1.23      paf       100:        void load_definition(Request_charsets& charsets, const String& afile_spec);
1.1       paf       101:        void sort_ToTable();
                    102: 
1.23      paf       103:        const String::C transcodeToUTF8(const String::C src) const;
                    104:        const String::C transcodeFromUTF8(const String::C src) const;
                    105:        
                    106:        const String::C transcodeToCharset(const String::C src,
                    107:                const Charset& dest_transcoder) const;
1.1       paf       108: 
1.4       paf       109: public:
                    110: 
                    111:        struct Tables {
1.25      paf       112:                struct Rec {
                    113:                        XMLCh intCh;
                    114:                        XMLByte extCh;
                    115:                };
                    116: 
1.4       paf       117:                XMLCh fromTable[0x100];
1.25      paf       118:                Rec toTable[MAX_CHARSET_UNI_CODES];
1.4       paf       119:                uint toTableSize;
                    120:        };
                    121: 
1.25      paf       122:        struct UTF8CaseTable {
                    123:                struct Rec {
                    124:                        XMLCh from, to;
                    125:                };
                    126: 
                    127:                uint size;
                    128:                Rec* records;
                    129:        };
                    130: 
1.1       paf       131: private:
                    132: 
1.24      paf       133:        const String::Body FNAME;
1.23      paf       134:        char* FNAME_CSTR;
1.1       paf       135:        bool fisUTF8;
1.4       paf       136:        Tables tables;
1.1       paf       137: 
                    138: #ifdef XML
                    139: 
                    140: private:
1.23      paf       141:        void addEncoding(char* name_cstr);
1.24      paf       142:        void initTranscoder(const String::Body name, const char* name_cstr);
1.9       paf       143:        
1.1       paf       144: public:
1.23      paf       145:        /// converts xmlChar* null-terminated string to char* 
1.32      paf       146:        String::C transcode_cstr(const xmlChar* s);
1.8       paf       147:        /// converts xmlChar* null-terminated string to parser String
1.32      paf       148:        const String& transcode(const xmlChar* s);
1.23      paf       149: 
                    150:        /** converts sized char*  to xmlChar*
                    151:                @returns xmlChar*  WHICH CALLER SHOULD FREE
1.16      paf       152:        */
1.23      paf       153:        xmlChar* transcode_buf2xchar(const char* buf, size_t buf_size);
1.32      paf       154:        /// converts parser String to xmlChar*
                    155:        xmlChar* transcode(const String& s);
                    156:        /// converts parser String::Body to xmlChar*
                    157:        xmlChar* transcode(const String::Body s);
1.1       paf       158: 
                    159: private:
                    160: 
1.23      paf       161:        xmlCharEncodingHandler* ftranscoder;
1.1       paf       162: 
                    163: #endif
                    164: 
1.5       paf       165: };
1.25      paf       166: 
                    167: 
                    168: // externs
                    169: 
                    170: extern Charset::UTF8CaseTable UTF8CaseToUpper;
                    171: extern Charset::UTF8CaseTable UTF8CaseToLower;
1.28      paf       172: void change_case_UTF8(const XMLByte* srcData, size_t srcLen,
                    173:                                          XMLByte* toFill, size_t toFillLen,
1.25      paf       174:                                          const Charset::UTF8CaseTable& table);
1.37      misha     175: size_t getUTF8BytePos(const XMLByte* srcBegin, const XMLByte* srcEnd, size_t charPos/*position in characters*/);
                    176: size_t getUTF8CharPos(const XMLByte* srcBegin, const XMLByte* srcEnd, size_t bytePos/*position in bytes*/);
                    177: size_t lengthUTF8(const XMLByte* srcBegin, const XMLByte* srcEnd);
1.25      paf       178: 
1.1       paf       179: #endif

E-mail: