|
|
| version 1.60, 2008/07/15 12:53:10 | version 1.66, 2008/08/15 16:54:01 |
|---|---|
| Line 86 static void element2case(unsigned char f | Line 86 static void element2case(unsigned char f |
| // methods | // methods |
| extern "C" unsigned char pcre_default_tables[]; // pcre/chartables.c | |
| Charset::Charset(Request_charsets* charsets, const String::Body ANAME, const String* afile_spec): | Charset::Charset(Request_charsets* charsets, const String::Body ANAME, const String* afile_spec): |
| FNAME(ANAME), | FNAME(ANAME), |
| FNAME_CSTR(ANAME.cstrm()) { | FNAME_CSTR(ANAME.cstrm()) { |
| Line 100 Charset::Charset(Request_charsets* chars | Line 99 Charset::Charset(Request_charsets* chars |
| } else { | } else { |
| fisUTF8=true; | fisUTF8=true; |
| // grab default onces [for UTF-8 so to be able to make a-z =>A-Z | // grab default onces [for UTF-8 so to be able to make a-z =>A-Z |
| memcpy(pcre_tables, pcre_default_tables, sizeof(pcre_tables)); | memcpy(pcre_tables, _pcre_default_tables, sizeof(pcre_tables)); |
| } | } |
| #ifdef XML | #ifdef XML |
| Line 434 of ocetes consumed. | Line 433 of ocetes consumed. |
| static bool is_escaped(char c){ | static bool is_escaped(char c){ |
| return | return |
| !(c<=127 | !( |
| && ( | (c<=127) |
| ((c>='0') && (c<='9')) | && ( |
| || ((c>='A') && (c<='Z')) | ((c>='0') && (c<='9')) |
| || ((c>='a') && (c<='z')) | || ((c>='A') && (c<='Z')) |
| || strchr("*@-_+./", c)!=0 | || ((c>='a') && (c<='z')) |
| )); | || strchr("*@-_+./", c)!=0 |
| ) | |
| ); | |
| } | } |
| // read one utf8 character, return number of bytes needed for store it | // read one utf8 character, return number of bytes needed for store it |
| static unsigned int readChar(const XMLByte*& srcPtr, const XMLByte*& srcEnd, XMLByte& firstByte, XMLCh& UTF8Char){ | static unsigned int readChar(const XMLByte*& srcPtr, const XMLByte* srcEnd, XMLByte& firstByte, XMLCh& UTF8Char){ |
| if(!srcPtr || !*srcPtr || srcPtr>=srcEnd) | if(!srcPtr || !*srcPtr || srcPtr>=srcEnd) |
| return 0; | return 0; |
| Line 478 static unsigned int readChar(const XMLBy | Line 479 static unsigned int readChar(const XMLBy |
| return trailingBytes+1; | return trailingBytes+1; |
| } | } |
| static unsigned int skipChar(const XMLByte*& srcPtr, const XMLByte* srcEnd){ | |
| if(!srcPtr || !*srcPtr || srcPtr>=srcEnd) | |
| return 0; | |
| unsigned int trailingBytes=gUTFBytes[*srcPtr]+1; | |
| srcPtr+=trailingBytes; | |
| return trailingBytes; | |
| } | |
| // read char, return number of bytes needed for store it as UTF8 | // read char, return number of bytes needed for store it as UTF8 |
| static unsigned int readChar(const XMLByte*& srcPtr, const XMLByte*& srcEnd, XMLByte& firstByte, XMLCh& UTF8Char, const Charset::Tables& tables){ | static unsigned int readChar(const XMLByte*& srcPtr, const XMLByte* srcEnd, XMLByte& firstByte, XMLCh& UTF8Char, const Charset::Tables& tables){ |
| if(!srcPtr || !*srcPtr || srcPtr>=srcEnd) | if(!srcPtr || !*srcPtr || srcPtr>=srcEnd) |
| return 0; | return 0; |
| Line 623 String::C Charset::escape(const String:: | Line 634 String::C Charset::escape(const String:: |
| return String::C((char*)dest_body, dest_length); | return String::C((char*)dest_body, dest_length); |
| } | } |
| String::Body Charset::escape(const String::Body src, const Charset& source_charset) { | |
| const char *src_ptr=src.cstr(); | |
| size_t src_size=strlen(src_ptr); | |
| String::C dest=Charset::escape(String::C(src_ptr, src_size), | |
| source_charset); | |
| return String::Body(dest.str, dest.length); | |
| } | |
| String& Charset::escape(const String& src, const Charset& source_charset) { | |
| if(!src.length()) | |
| return *new String("", 0, false); | |
| return *new String(escape((String::Body)src, source_charset), String::L_CLEAN); | |
| } | |
| const String::C Charset::transcodeToUTF8(const String::C src) const { | const String::C Charset::transcodeToUTF8(const String::C src) const { |
| size_t src_length=src.length; | size_t src_length=src.length; |
| Line 1106 static void transcode_pair(const String: | Line 1133 static void transcode_pair(const String: |
| *info->source_transcoder, | *info->source_transcoder, |
| *info->dest_transcoder); | *info->dest_transcoder); |
| } | } |
| void Charset::transcode(HashStringString& src, | void Charset::transcode(HashStringString& src, |
| const Charset& source_transcoder, | const Charset& source_transcoder, |
| const Charset& dest_transcoder) { | const Charset& dest_transcoder) { |
| Transcode_pair_info info={&source_transcoder, &dest_transcoder}; | Transcode_pair_info info={&source_transcoder, &dest_transcoder}; |
| src.for_each_ref<Transcode_pair_info*>(transcode_pair, &info); | src.for_each_ref<Transcode_pair_info*>(transcode_pair, &info); |
| } | } |
| size_t getUTF8BytePos(const XMLByte* srcBegin, const XMLByte* srcEnd, size_t charPos){ | |
| const XMLByte* ptr=srcBegin; | |
| while(charPos-- && skipChar(ptr, srcEnd)); | |
| return ptr-srcBegin; | |
| } | |
| size_t getUTF8CharPos(const XMLByte* srcBegin, const XMLByte* srcEnd, size_t bytePos){ | |
| size_t charPos=0; | |
| const XMLByte* ptr=srcBegin; | |
| const XMLByte* ptrEnd=srcBegin+bytePos; | |
| while(skipChar(ptr, srcEnd)){ | |
| if(ptr>ptrEnd) | |
| return charPos; | |
| charPos++; | |
| } | |
| // scan till end but position in bytes still too low | |
| throw Exception(0, | |
| 0, | |
| "Error convertion byte pos to char pos"); | |
| } | |
| size_t lengthUTF8(const XMLByte* srcBegin, const XMLByte* srcEnd){ | |
| size_t size=0; | |
| while(skipChar(srcBegin, srcEnd)) | |
| size++; | |
| return size; | |
| } |