+const wxChar *wxTextFile::GetEOL(wxTextFileType type)
+{
+ switch ( type ) {
+ default:
+ wxFAIL_MSG(wxT("bad file type in wxTextFile::GetEOL."));
+ // fall through nevertheless - we must return something...
+
+ case wxTextFileType_None: return wxT("");
+ case wxTextFileType_Unix: return wxT("\n");
+ case wxTextFileType_Dos: return wxT("\r\n");
+ case wxTextFileType_Mac: return wxT("\r");
+ }
+}
+
+wxString wxTextFile::Translate(const wxString& text, wxTextFileType type)
+{
+ // don't do anything if there is nothing to do
+ if ( type == wxTextFileType_None )
+ return text;
+
+ // GRG: don't do anything either if it is empty
+ if ( text.IsEmpty() )
+ return text;
+
+ wxString eol = GetEOL(type), result;
+
+ // optimization: we know that the length of the new string will be about
+ // the same as the length of the old one, so prealloc memory to aviod
+ // unnecessary relocations
+ result.Alloc(text.Len());
+
+ wxChar chLast = 0;
+ for ( const wxChar *pc = text.c_str(); *pc; pc++ )
+ {
+ wxChar ch = *pc;
+ switch ( ch ) {
+ case _T('\n'):
+ // Dos/Unix line termination
+ result += eol;
+ chLast = 0;
+ break;
+
+ case _T('\r'):
+ if ( chLast == _T('\r') ) {
+ // Mac empty line
+ result += eol;
+ }
+ else {
+ // just remember it: we don't know whether it is just "\r"
+ // or "\r\n" yet
+ chLast = _T('\r');
+ }
+ break;
+
+ default:
+ if ( chLast == _T('\r') ) {
+ // Mac line termination
+ result += eol;
+
+ // reset chLast to avoid inserting another eol before the
+ // next character
+ chLast = 0;
+ }
+
+ // add to the current line
+ result += ch;
+ }
+ }
+
+ if ( chLast ) {
+ // trailing '\r'
+ result += eol;
+ }
+
+ return result;
+}
+
+#if wxUSE_TEXTFILE