gehe zur Dokumentation dieser Datei00001 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 #include "wx/wxprec.h"
00046 
00047 #ifdef __BORLANDC__
00048 #pragma hdrstop
00049 #endif
00050 
00051 #if wxUSE_WCHAR_T
00052 
00053 #ifndef WX_PRECOMP
00054 #endif //WX_PRECOMP
00055 
00056 #include "muconvauto.h"
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 muConvAuto::BOMType muConvAuto::DetectBOM(const char *src, size_t srcLen)
00065 {
00066         DEBUGLOGTYPE(other,muConvAuto,_T("Detecting BOM at length %d"),srcLen);
00067         if (srcLen == wxNO_LEN) { 
00068                 for (srcLen = 0; src[srcLen] && srcLen <= 4; srcLen++); 
00069         }
00070         if ( srcLen < 2 ) {
00071                 
00072                 
00073                 return BOM_None;
00074         }
00075 
00076         
00077         
00078         
00079         switch ( *(src++) ) {
00080         case '\0':
00081                 
00082                 if ( srcLen >= 4 &&
00083                                 src[0] == '\0' &&
00084                                 src[1] == '\xfe' &&
00085                                 src[2] == '\xff' ) {
00086                         return BOM_UTF32BE;
00087                 }
00088                 break;
00089 
00090         case '\xfe':
00091                 
00092                 if ( *src++ == '\xff' ) {
00093                         return BOM_UTF16BE;
00094                 }
00095                 break;
00096 
00097         case '\xff':
00098                 
00099                 
00100                 if ( *(src++) == '\xfe' ) {
00101                         return srcLen >= 4 && src[0] == '\0' && src[1] == '\0'
00102                                ? BOM_UTF32LE
00103                                : BOM_UTF16LE;
00104                 }
00105                 break;
00106 
00107         case '\xef':
00108                 
00109                 if ( srcLen >= 3 && src[0] == '\xbb' && src[1] == '\xbf' ) {
00110                         return BOM_UTF8;
00111                 }
00112                 break;
00113         }
00114 
00115         return BOM_None;
00116 }
00117 
00118 void muConvAuto::InitFromBOM(BOMType bomType)
00119 {
00120         DEBUGLOG(other,_T(""));
00121         m_consumedBOM = false;
00122 
00123         switch ( bomType ) {
00124         case BOM_UTF32BE:
00125                 m_conv = new wxMBConvUTF32BE;
00126                 m_ownsConv = true;
00127                 break;
00128 
00129         case BOM_UTF32LE:
00130                 m_conv = new wxMBConvUTF32LE;
00131                 m_ownsConv = true;
00132                 break;
00133 
00134         case BOM_UTF16BE:
00135                 m_conv = new wxMBConvUTF16BE;
00136                 m_ownsConv = true;
00137                 break;
00138 
00139         case BOM_UTF16LE:
00140                 m_conv = new wxMBConvUTF16LE;
00141                 m_ownsConv = true;
00142                 break;
00143 
00144         case BOM_UTF8:
00145                 m_conv = &wxConvUTF8;
00146                 m_ownsConv = false;
00147                 break;
00148 
00149         default:
00150                 wxFAIL_MSG( _T("unexpected BOM type") );
00151                 
00152 
00153         case BOM_None:
00154                 InitWithDefault();
00155                 m_consumedBOM = true; 
00156         }
00157 }
00158 
00159 void muConvAuto::SkipBOM(const char **src, size_t *len) const
00160 {
00161         DEBUGLOG(other,_T(""));
00162         int ofs;
00163         switch ( m_bomType ) {
00164         case BOM_UTF32BE:
00165         case BOM_UTF32LE:
00166                 ofs = 4;
00167                 break;
00168 
00169         case BOM_UTF16BE:
00170         case BOM_UTF16LE:
00171                 ofs = 2;
00172                 break;
00173 
00174         case BOM_UTF8:
00175                 ofs = 3;
00176                 break;
00177 
00178         default:
00179                 wxFAIL_MSG( _T("unexpected BOM type") );
00180                 
00181 
00182         case BOM_None:
00183                 ofs = 0;
00184         }
00185 
00186         *src += ofs;
00187         if ( *len != wxNO_LEN )
00188                 *len -= ofs;
00189 }
00190 
00191 void muConvAuto::InitFromInput(const char **src, size_t *len)
00192 
00193 {
00194         DEBUGLOG(other,_T(""));
00195         m_bomType = DetectBOM(*src, *len);
00196         InitFromBOM(m_bomType);
00197         SkipBOM(src, len);
00198 }
00199 
00200 size_t muConvAuto::ToWChar(wchar_t *dst, size_t dstLen,
00201                     const char *src, size_t srcLen) const
00202 {
00203         DEBUGLOG(other,_T(""));
00204         
00205         
00206         
00207         
00208         
00209         muConvAuto *self = wx_const_cast(muConvAuto *, this);
00210         if ( !m_conv ) {
00211                 self->InitFromInput(&src, &srcLen);
00212                 if ( dst )
00213                         self->m_consumedBOM = true;
00214         }
00215 
00216         if ( !m_consumedBOM && dst ) {
00217                 self->m_consumedBOM = true;
00218                 SkipBOM(&src, &srcLen);
00219         }
00220 
00221         size_t result = m_conv->ToWChar(dst, dstLen, src, srcLen);
00222         if (result != wxCONV_FAILED) return result;
00223 
00224         self->m_conv = m_fallback; 
00225         self->m_ownsConv = false; 
00226         return m_conv->ToWChar(dst, dstLen, src, srcLen);
00227 }
00228 
00229 size_t muConvAuto::FromWChar(char *dst, size_t dstLen,
00230                       const wchar_t *src, size_t srcLen) const
00231 {
00232         DEBUGLOG(other,_T(""));
00233         if ( !m_conv ) {
00234                 
00235                 wx_const_cast(muConvAuto *, this)->InitWithDefault();
00236         }
00237         return m_conv->FromWChar(dst, dstLen, src, srcLen);
00238 }
00239 
00240 #endif // wxUSE_WCHAR_T
00241 
00242 wxMBConv * muConvAutoFallback = &wxConvISO8859_1;
00243