User forums > Help
EOL issue, the EOL should be automatically detected, and make consistent
ollydbg:
--- Quote from: ollydbg on August 28, 2012, 10:29:53 am ---OK, I will did this in the next patch.
--- End quote ---
Ok, see this patch. Any further comments?
--- Code: ---Index: cbeditor.cpp
===================================================================
--- cbeditor.cpp (revision 8249)
+++ cbeditor.cpp (working copy)
@@ -731,6 +731,95 @@
END_EVENT_TABLE()
+// Count lines of EOL style in the opened file
+static void CountLineEnds(cbStyledTextCtrl* control, int &linesCR, int &linesLF, int &linesCRLF)
+{
+ linesCR = 0;
+ linesLF = 0;
+ linesCRLF = 0;
+
+ int lengthDoc = control->GetLength();
+ const int maxLengthDoc = 1000000;
+ char chPrev = ' ';
+ char chNext = control->GetCharAt(0);
+ for (int i = 0; i < lengthDoc; i++)
+ {
+ char ch = chNext;
+ chNext = control->GetCharAt(i + 1);
+ if (ch == '\r')
+ {
+ if (chNext == '\n')
+ linesCRLF++;
+ else
+ linesCR++;
+ }
+ else if (ch == '\n')
+ {
+ if (chPrev != '\r')
+ {
+ linesLF++;
+ }
+ }
+ else if (i > maxLengthDoc) // stop the loop if the file contains too many characters
+ return;
+
+ chPrev = ch;
+ }
+}
+
+static int DetectLineEnds(cbStyledTextCtrl* control)
+{
+ int eolMode;
+ wxString eolModeStr;
+ // initial EOL mode depend on OS
+ if (platform::windows)
+ {
+ eolMode = wxSCI_EOL_CRLF;
+ eolModeStr = _T("\"CR-LF\"");
+ }
+ else
+ {
+ eolMode = wxSCI_EOL_LF;
+ eolModeStr = _T("\"LF\"");
+ }
+
+ int linesCR;
+ int linesLF;
+ int linesCRLF;
+ // count lines of each EOL style
+ CountLineEnds(control, linesCR, linesLF, linesCRLF);
+
+ // voting logic
+ // if the file does not contain any line-feed or the most largest counts are equal( e.g.: linesLF=5,
+ // linesCRLF=5, linesCR=0 ), then we will use the initial EOL mode
+ if ( (linesLF > linesCR) && (linesLF > linesCRLF) )
+ {
+ eolMode = wxSCI_EOL_LF;
+ eolModeStr = _T("\"LF\"");
+ }
+ else if ( (linesCR > linesLF) && (linesCR > linesCRLF) )
+ {
+ eolMode = wxSCI_EOL_CR;
+ eolModeStr = _T("\"CR\"");
+ }
+ else if ( (linesCRLF > linesLF) && (linesCRLF > linesCR))
+ {
+ eolMode = wxSCI_EOL_CRLF;
+ eolModeStr = _T("\"CR-LF\"");
+ }
+
+ unsigned int delay = 2000;
+ if ( ( (linesCR>0) && (linesCRLF>0) )
+ || ( (linesLF>0) && (linesCRLF>0) )
+ || ( (linesCR>0) && (linesLF>0) ) )
+ {
+ //In mixed EOL file, give the user a beep and InfoWindow notification.
+ wxBell();
+ InfoWindow::Display(_("Mixed Line Endings"), _("Mixed line endings found, setting mode ") + eolModeStr, delay);
+ }
+ return eolMode;
+}
+
// class constructor
cbEditor::cbEditor(wxWindow* parent, const wxString& filename, EditorColourSet* theme)
: EditorBase(parent, filename),
@@ -1557,7 +1646,6 @@
control->SetMarginWidth(C_CHANGEBAR_MARGIN, 0);
// NOTE: duplicate line in editorconfigurationdlg.cpp (ctor)
- control->SetEOLMode( mgr->ReadInt(_T("/eol/eolmode"), platform::windows ? wxSCI_EOL_CRLF : wxSCI_EOL_LF)); // Windows takes CR+LF, other platforms LF only
control->SetScrollWidthTracking( mgr->ReadBool(_T("/margin/scroll_width_tracking"), false));
control->SetMultipleSelection( mgr->ReadBool(_T("/selection/multi_select"), false));
control->SetAdditionalSelectionTyping(mgr->ReadBool(_T("/selection/multi_typing"), false));
@@ -1575,6 +1663,14 @@
ConfigManager* mgr = Manager::Get()->GetConfigManager(_T("editor"));
+ // set the EOL, fall back value: Windows takes CR+LF, other platforms LF only
+ int eolMode = mgr->ReadInt(_T("/eol/eolmode"), platform::windows ? wxSCI_EOL_CRLF : wxSCI_EOL_LF);
+
+ if (eolMode == 3) //auto detect the EOL
+ eolMode = DetectLineEnds(control);
+
+ control->SetEOLMode(eolMode);
+
// Interpret #if/#else/#endif to grey out code that is not active
control->SetProperty(_T("lexer.cpp.track.preprocessor"), mgr->ReadBool(_T("/track_preprocessor"), true) ? _T("1") : _T("0"));
Index: resources/editor_configuration.xrc
===================================================================
--- resources/editor_configuration.xrc (revision 8249)
+++ resources/editor_configuration.xrc (working copy)
@@ -200,6 +200,7 @@
<item>CR LF</item>
<item>CR</item>
<item>LF</item>
+ <item>AUTO</item>
</content>
<style>wxCB_READONLY</style>
</object>
--- End code ---
Jenna:
--- Quote from: ollydbg on August 28, 2012, 04:43:16 pm ---
--- Code: ---+ // set the EOL, fall back value: Windows takes CR+LF, other platforms LF only
--- End code ---
--- End quote ---
The default line-ending on Mac is CR as far as I know.
Sorry to make it a little more complicated.
MortenMacFly:
--- Quote from: jens on August 28, 2012, 05:17:13 pm ---The default line-ending on Mac is CR as far as I know.
Sorry to make it a little more complicated.
--- End quote ---
EOL's and he 21st century... still feeling like stone-age... ::)
oBFusCATed:
I think CR or LF are supported on MacOSX, prior to 10.xx, the CR was the default and now with the FreeBSD heritage it is the LF.
But I think most softwares support both and users have files with both endings.
ollydbg:
--- Quote from: oBFusCATed on August 28, 2012, 09:06:04 pm ---I think CR or LF are supported on MacOSX, prior to 10.xx, the CR was the default and now with the FreeBSD heritage it is the LF.
But I think most softwares support both and users have files with both endings.
--- End quote ---
--- Quote from: jens on August 28, 2012, 05:17:13 pm ---The default line-ending on Mac is CR as far as I know.
--- End quote ---
Adding the fall-back on Mac as CR is quite easy. But I'm mostly follow what Scintilla did and a discussion on their forum:
See:[scintilla] default eol mode on OS X - Google Groups
And in the source code: Document.cxx
--- Code: ---Document::Document() {
refCount = 0;
#ifdef _WIN32
eolMode = SC_EOL_CRLF;
#else
eolMode = SC_EOL_LF;
#endif
...
...
--- End code ---
So, I believe Mac can support LF without any problem. :)
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version