- wxASSERT( IsOpened() );
-
- // scan the file lines
- size_t nUnix = 0, // number of '\n's alone
- nDos = 0, // number of '\r\n'
- nMac = 0; // number of '\r's
-
- // we take MAX_LINES_SCAN in the beginning, middle and the end of file
- #define MAX_LINES_SCAN (10)
- size_t nCount = m_aLines.Count() / 3,
- nScan = nCount > 3*MAX_LINES_SCAN ? MAX_LINES_SCAN : nCount / 3;
-
- #define AnalyseLine(n) \
- switch ( m_aTypes[n] ) { \
- case wxTextFileType_Unix: nUnix++; break; \
- case wxTextFileType_Dos: nDos++; break; \
- case wxTextFileType_Mac: nMac++; break; \
- default: wxFAIL_MSG(_("unknown line terminator")); \
- }
-
- size_t n;
- for ( n = 0; n < nScan; n++ ) // the beginning
- AnalyseLine(n);
- for ( n = (nCount - nScan)/2; n < (nCount + nScan)/2; n++ )
- AnalyseLine(n);
- for ( n = nCount - nScan; n < nCount; n++ )
- AnalyseLine(n);
-
- #undef AnalyseLine
-
- // interpret the results (FIXME far from being even 50% fool proof)
- if ( nDos + nUnix + nMac == 0 ) {
- // no newlines at all
- wxLogWarning(_("'%s' is probably a binary file."), m_strFile.c_str());
- }
- else {
- #define GREATER_OF(t1, t2) n##t1 == n##t2 ? typeDefault \
- : n##t1 > n##t2 \
- ? wxTextFileType_##t1 \
- : wxTextFileType_##t2
-
- // Watcom C++ doesn't seem to be able to handle the macro
-#if !defined(__WATCOMC__)
- if ( nDos > nUnix )
- return GREATER_OF(Dos, Mac);
- else if ( nDos < nUnix )
- return GREATER_OF(Unix, Mac);
- else {
- // nDos == nUnix
- return nMac > nDos ? wxTextFileType_Mac : typeDefault;
- }
-#endif // __WATCOMC__
-
- #undef GREATER_OF
- }
-
- return typeDefault;