Unicodification of wxTextFile

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11314 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2001-08-06 22:40:57 +00:00
parent 1facd32a75
commit adfed1ca92
2 changed files with 35 additions and 14 deletions

View File

@@ -79,9 +79,9 @@ public:
// same as Create() but with (another) file name // same as Create() but with (another) file name
bool Create(const wxString& strFile); bool Create(const wxString& strFile);
// Open() also loads file in memory on success // Open() also loads file in memory on success
bool Open(); bool Open(wxMBConv& conv = wxConvLibc);
// same as Open() but with (another) file name // same as Open() but with (another) file name
bool Open(const wxString& strFile); bool Open(const wxString& strFile, wxMBConv& conv = wxConvLibc);
// closes the file and frees memory, losing all changes // closes the file and frees memory, losing all changes
bool Close(); bool Close();
// is file currently opened? // is file currently opened?
@@ -135,7 +135,8 @@ public:
// change the file on disk (default argument means "don't change type") // change the file on disk (default argument means "don't change type")
// possibly in another format // possibly in another format
bool Write(wxTextFileType typeNew = wxTextFileType_None); bool Write(wxTextFileType typeNew = wxTextFileType_None,
wxMBConv& conv = wxConvLibc);
// dtor // dtor
~wxTextFile(); ~wxTextFile();
@@ -146,7 +147,7 @@ private:
wxTextFile& operator=(const wxTextFile&); wxTextFile& operator=(const wxTextFile&);
// read the file in memory (m_file is supposed to be just opened) // read the file in memory (m_file is supposed to be just opened)
bool Read(); bool Read(wxMBConv& conv);
wxFile m_file; // current file wxFile m_file; // current file

View File

@@ -189,14 +189,14 @@ bool wxTextFile::Create()
} }
} }
bool wxTextFile::Open(const wxString& strFile) bool wxTextFile::Open(const wxString& strFile, wxMBConv& conv)
{ {
m_strFile = strFile; m_strFile = strFile;
return Open(); return Open(conv);
} }
bool wxTextFile::Open() bool wxTextFile::Open(wxMBConv& conv)
{ {
// file name must be either given in ctor or in Open(const wxString&) // file name must be either given in ctor or in Open(const wxString&)
wxASSERT( !m_strFile.IsEmpty() ); wxASSERT( !m_strFile.IsEmpty() );
@@ -206,7 +206,7 @@ bool wxTextFile::Open()
return FALSE; return FALSE;
// read file into memory // read file into memory
m_isOpened = Read(); m_isOpened = Read(conv);
m_file.Close(); m_file.Close();
@@ -221,8 +221,8 @@ wxTextFileType wxTextFile::GuessType() const
// scan the file lines // scan the file lines
size_t nUnix = 0, // number of '\n's alone size_t nUnix = 0, // number of '\n's alone
nDos = 0, // number of '\r\n' nDos = 0, // number of '\r\n'
nMac = 0; // number of '\r's nMac = 0; // number of '\r's
// we take MAX_LINES_SCAN in the beginning, middle and the end of file // we take MAX_LINES_SCAN in the beginning, middle and the end of file
#define MAX_LINES_SCAN (10) #define MAX_LINES_SCAN (10)
@@ -248,7 +248,7 @@ wxTextFileType wxTextFile::GuessType() const
#undef AnalyseLine #undef AnalyseLine
// interpret the results (FIXME far from being even 50% fool proof) // interpret the results (FIXME far from being even 50% fool proof)
if ( nDos + nUnix + nMac == 0 ) { if ( nScan > 0 && nDos + nUnix + nMac == 0 ) {
// no newlines at all // no newlines at all
wxLogWarning(_("'%s' is probably a binary file."), m_strFile.c_str()); wxLogWarning(_("'%s' is probably a binary file."), m_strFile.c_str());
} }
@@ -276,11 +276,19 @@ wxTextFileType wxTextFile::GuessType() const
return typeDefault; return typeDefault;
} }
bool wxTextFile::Read() bool wxTextFile::Read(wxMBConv& conv)
{ {
// file should be opened and we must be in it's beginning // file should be opened and we must be in it's beginning
wxASSERT( m_file.IsOpened() && m_file.Tell() == 0 ); wxASSERT( m_file.IsOpened() && m_file.Tell() == 0 );
#if wxUSE_UNICODE
char conv_mbBuf[2];
wchar_t conv_wcBuf[2];
conv_mbBuf[1] = 0;
#else
(void)conv;
#endif
wxString str; wxString str;
char ch, chLast = '\0'; char ch, chLast = '\0';
char buf[1024]; char buf[1024];
@@ -320,11 +328,23 @@ bool wxTextFile::Read()
m_aLines.Add(str); m_aLines.Add(str);
m_aTypes.Add(wxTextFileType_Mac); m_aTypes.Add(wxTextFileType_Mac);
chLast = ch; chLast = ch;
#if wxUSE_UNICODE
if (conv.MB2WC(conv_wcBuf, conv_mbBuf, 2) == (size_t)-1)
conv_wcBuf[0] = ch;
str = conv_wcBuf[0];
#else
str = ch; str = ch;
#endif
} }
else { else {
// add to the current line // add to the current line
#if wxUSE_UNICODE
if (conv.MB2WC(conv_wcBuf, conv_mbBuf, 2) == (size_t)-1)
conv_wcBuf[0] = ch;
str += conv_wcBuf[0];
#else
str += ch; str += ch;
#endif
} }
} }
} }
@@ -349,7 +369,7 @@ bool wxTextFile::Close()
return TRUE; return TRUE;
} }
bool wxTextFile::Write(wxTextFileType typeNew) bool wxTextFile::Write(wxTextFileType typeNew, wxMBConv& conv)
{ {
wxTempFile fileTmp(m_strFile); wxTempFile fileTmp(m_strFile);
@@ -362,7 +382,7 @@ bool wxTextFile::Write(wxTextFileType typeNew)
for ( size_t n = 0; n < nCount; n++ ) { for ( size_t n = 0; n < nCount; n++ ) {
fileTmp.Write(m_aLines[n] + fileTmp.Write(m_aLines[n] +
GetEOL(typeNew == wxTextFileType_None ? m_aTypes[n] GetEOL(typeNew == wxTextFileType_None ? m_aTypes[n]
: typeNew)); : typeNew), conv);
} }
// replace the old file with this one // replace the old file with this one