From b8b0e4022e105e102b5c7044638972a3fef38dc1 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 18 Oct 2001 01:24:58 +0000 Subject: [PATCH] Updated to version 1.40 of Scintilla git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12050 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/include/wx/stc/stc.h | 37 +- contrib/src/stc/Makefile.in | 2 + contrib/src/stc/PlatWX.cpp | 14 +- contrib/src/stc/ScintillaWX.cpp | 13 +- contrib/src/stc/makefile.b32 | 69 +-- contrib/src/stc/makefile.g95 | 58 ++- contrib/src/stc/makefile.vc | 69 +-- contrib/src/stc/scintilla/README.txt | 2 +- contrib/src/stc/scintilla/include/SciLexer.h | 26 +- contrib/src/stc/scintilla/include/Scintilla.h | 15 +- .../src/stc/scintilla/include/Scintilla.iface | 204 ++------ .../stc/scintilla/include/ScintillaWidget.h | 11 - contrib/src/stc/scintilla/include/WinDefs.h | 197 -------- contrib/src/stc/scintilla/src/Document.cxx | 4 +- contrib/src/stc/scintilla/src/Editor.cxx | 367 ++------------ contrib/src/stc/scintilla/src/Editor.h | 45 +- contrib/src/stc/scintilla/src/KeyWords.cxx | 27 +- contrib/src/stc/scintilla/src/LexCPP.cxx | 392 ++++++--------- contrib/src/stc/scintilla/src/LexCrontab.cxx | 204 ++++++++ contrib/src/stc/scintilla/src/LexEiffel.cxx | 185 ++----- contrib/src/stc/scintilla/src/LexHTML.cxx | 475 ++++++++++++------ contrib/src/stc/scintilla/src/LexPython.cxx | 387 +++++++------- contrib/src/stc/scintilla/src/LineMarker.cxx | 11 +- contrib/src/stc/scintilla/src/LineMarker.h | 2 +- contrib/src/stc/scintilla/src/RESearch.cxx | 5 +- .../src/stc/scintilla/src/ScintillaBase.cxx | 5 + contrib/src/stc/scintilla/src/ScintillaBase.h | 3 +- .../src/stc/scintilla/src/StyleContext.cxx | 51 ++ contrib/src/stc/scintilla/src/StyleContext.h | 127 +++++ contrib/src/stc/stc.cpp | 6 +- contrib/src/stc/stc.cpp.in | 2 + include/wx/stc/stc.h | 37 +- src/stc/Makefile.in | 2 + src/stc/PlatWX.cpp | 14 +- src/stc/ScintillaWX.cpp | 13 +- src/stc/makefile.b32 | 69 +-- src/stc/makefile.g95 | 58 ++- src/stc/makefile.vc | 69 +-- src/stc/scintilla/README.txt | 2 +- src/stc/scintilla/include/SciLexer.h | 26 +- src/stc/scintilla/include/Scintilla.h | 15 +- src/stc/scintilla/include/Scintilla.iface | 204 ++------ src/stc/scintilla/include/ScintillaWidget.h | 11 - src/stc/scintilla/include/WinDefs.h | 197 -------- src/stc/scintilla/src/Document.cxx | 4 +- src/stc/scintilla/src/Editor.cxx | 367 ++------------ src/stc/scintilla/src/Editor.h | 45 +- src/stc/scintilla/src/KeyWords.cxx | 27 +- src/stc/scintilla/src/LexCPP.cxx | 392 ++++++--------- src/stc/scintilla/src/LexCrontab.cxx | 204 ++++++++ src/stc/scintilla/src/LexEiffel.cxx | 185 ++----- src/stc/scintilla/src/LexHTML.cxx | 475 ++++++++++++------ src/stc/scintilla/src/LexPython.cxx | 387 +++++++------- src/stc/scintilla/src/LineMarker.cxx | 11 +- src/stc/scintilla/src/LineMarker.h | 2 +- src/stc/scintilla/src/RESearch.cxx | 5 +- src/stc/scintilla/src/ScintillaBase.cxx | 5 + src/stc/scintilla/src/ScintillaBase.h | 3 +- src/stc/scintilla/src/StyleContext.cxx | 51 ++ src/stc/scintilla/src/StyleContext.h | 127 +++++ src/stc/stc.cpp | 6 +- src/stc/stc.cpp.in | 2 + 62 files changed, 2854 insertions(+), 3176 deletions(-) delete mode 100644 contrib/src/stc/scintilla/include/WinDefs.h create mode 100644 contrib/src/stc/scintilla/src/LexCrontab.cxx create mode 100644 contrib/src/stc/scintilla/src/StyleContext.cxx create mode 100644 contrib/src/stc/scintilla/src/StyleContext.h delete mode 100644 src/stc/scintilla/include/WinDefs.h create mode 100644 src/stc/scintilla/src/LexCrontab.cxx create mode 100644 src/stc/scintilla/src/StyleContext.cxx create mode 100644 src/stc/scintilla/src/StyleContext.h diff --git a/contrib/include/wx/stc/stc.h b/contrib/include/wx/stc/stc.h index 46dcb91225..99553d810b 100644 --- a/contrib/include/wx/stc/stc.h +++ b/contrib/include/wx/stc/stc.h @@ -72,6 +72,7 @@ #define wxSTC_MARK_CIRCLEPLUSCONNECTED 19 #define wxSTC_MARK_CIRCLEMINUS 20 #define wxSTC_MARK_CIRCLEMINUSCONNECTED 21 +#define wxSTC_MARK_CHARACTER 10000 // Markers used for outlining column #define wxSTC_MARKNUM_FOLDEREND 25 @@ -83,12 +84,16 @@ #define wxSTC_MARKNUM_FOLDEROPEN 31 #define wxSTC_MARGIN_SYMBOL 0 #define wxSTC_MARGIN_NUMBER 1 + +// Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles. +// Styles 38 and 39 are for future use. #define wxSTC_STYLE_DEFAULT 32 #define wxSTC_STYLE_LINENUMBER 33 #define wxSTC_STYLE_BRACELIGHT 34 #define wxSTC_STYLE_BRACEBAD 35 #define wxSTC_STYLE_CONTROLCHAR 36 #define wxSTC_STYLE_INDENTGUIDE 37 +#define wxSTC_STYLE_LASTPREDEFINED 39 #define wxSTC_STYLE_MAX 127 // Character set identifiers are used in StyleSetCharacterSet. @@ -295,6 +300,7 @@ #define wxSTC_LEX_EIFFEL 23 #define wxSTC_LEX_EIFFELKW 24 #define wxSTC_LEX_TCL 25 +#define wxSTC_LEX_NNCRONTAB 26 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a // value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -334,6 +340,8 @@ #define wxSTC_C_REGEX 14 #define wxSTC_C_COMMENTLINEDOC 15 #define wxSTC_C_WORD2 16 +#define wxSTC_C_COMMENTDOCKEYWORD 17 +#define wxSTC_C_COMMENTDOCKEYWORDERROR 18 // Lexical states for SCLEX_HTML, SCLEX_XML #define wxSTC_H_DEFAULT 0 @@ -365,7 +373,17 @@ #define wxSTC_H_XCCOMMENT 20 // SGML -#define wxSTC_H_SGML 21 +#define wxSTC_H_SGML_DEFAULT 21 +#define wxSTC_H_SGML_COMMAND 22 +#define wxSTC_H_SGML_1ST_PARAM 23 +#define wxSTC_H_SGML_DOUBLESTRING 24 +#define wxSTC_H_SGML_SIMPLESTRING 25 +#define wxSTC_H_SGML_ERROR 26 +#define wxSTC_H_SGML_SPECIAL 27 +#define wxSTC_H_SGML_ENTITY 28 +#define wxSTC_H_SGML_COMMENT 29 +#define wxSTC_H_SGML_1ST_PARAM_COMMENT 30 +#define wxSTC_H_SGML_BLOCK_DEFAULT 31 // Embedded Javascript #define wxSTC_HJ_START 40 @@ -604,6 +622,19 @@ #define wxSTC_EIFFEL_IDENTIFIER 7 #define wxSTC_EIFFEL_STRINGEOL 8 +// Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer) +#define wxSTC_NNCRONTAB_DEFAULT 0 +#define wxSTC_NNCRONTAB_COMMENT 1 +#define wxSTC_NNCRONTAB_TASK 2 +#define wxSTC_NNCRONTAB_SECTION 3 +#define wxSTC_NNCRONTAB_KEYWORD 4 +#define wxSTC_NNCRONTAB_MODIFIER 5 +#define wxSTC_NNCRONTAB_ASTERISK 6 +#define wxSTC_NNCRONTAB_NUMBER 7 +#define wxSTC_NNCRONTAB_STRING 8 +#define wxSTC_NNCRONTAB_ENVIRONMENT 9 +#define wxSTC_NNCRONTAB_IDENTIFIER 10 + // END of generated section //---------------------------------------------------------------------- // Others @@ -1223,10 +1254,12 @@ public: int GetTargetEnd(); // Replace the target text with the argument text. + // Text is counted so it can contain nulls. // Returns the length of the replacement text. int ReplaceTarget(const wxString& text); // Replace the target text with the argument text after \d processing. + // Text is counted so it can contain nulls. // Looks for \d where d is between 1 and 9 and replaces these with the strings // matched in the last search operation which were surrounded by \( and \). // Returns the length of the replacement text including any change @@ -1234,7 +1267,7 @@ public: int ReplaceTargetRE(const wxString& text); // Search for a counted string in the target and set the target to the found - // range. + // range. Text is counted so it can contain nulls. // Returns length of range or -1 for failure in which case target is not moved. int SearchInTarget(const wxString& text); diff --git a/contrib/src/stc/Makefile.in b/contrib/src/stc/Makefile.in index 3deb9ba6ba..d6fdd6bc60 100644 --- a/contrib/src/stc/Makefile.in +++ b/contrib/src/stc/Makefile.in @@ -37,6 +37,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \ LexAda.o \ LexCPP.o \ LexConf.o \ + LexCrontab.o \ LexEiffel.o \ LexHTML.o \ LexLisp.o \ @@ -53,6 +54,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \ RESearch.o \ ScintillaBase.o \ Style.o \ + StyleContext.o \ UniConversion.o \ ViewStyle.o \ WindowAccessor.o \ diff --git a/contrib/src/stc/PlatWX.cpp b/contrib/src/stc/PlatWX.cpp index 0e73907414..35a85e67ae 100644 --- a/contrib/src/stc/PlatWX.cpp +++ b/contrib/src/stc/PlatWX.cpp @@ -531,24 +531,20 @@ ListBox::~ListBox() { void ListBox::Create(Window &parent, int ctrlID) { id = new wxSTCListBox(parent.id, ctrlID); -// id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize, -// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER); } void ListBox::SetVisibleRows(int rows) { desiredVisibleRows = rows; - printf("SetVisibleRows: %d\n", rows); } PRectangle ListBox::GetDesiredRect() { wxSize sz = ((wxListBox*)id)->GetBestSize(); - printf("GetDesiredRect: %d, %d\n", sz.x, sz.y); PRectangle rc; rc.top = 0; rc.left = 0; if (sz.x > 400) sz.x = 400; - if (sz.y > 150) + if (sz.y > 150) // TODO: Use desiredVisibleRows?? sz.y = 150; rc.right = sz.x; rc.bottom = sz.y; @@ -592,13 +588,7 @@ int ListBox::GetSelection() { } int ListBox::Find(const char *prefix) { - if (prefix) { - for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) { - wxString text = ((wxListBox*)id)->GetString(x); - if (text.StartsWith(prefix)) - return x; - } - } + // No longer used return -1; } diff --git a/contrib/src/stc/ScintillaWX.cpp b/contrib/src/stc/ScintillaWX.cpp index 103ce92796..d5f2648dd1 100644 --- a/contrib/src/stc/ScintillaWX.cpp +++ b/contrib/src/stc/ScintillaWX.cpp @@ -122,9 +122,10 @@ void ScintillaWX::Finalise() { void ScintillaWX::StartDrag() { wxDropSource source(wMain.GetID()); - wxTextDataObject data(dragChars); + wxTextDataObject data(wxString(drag.s, drag.len)); wxDragResult result; + dropWentOutside = true; source.SetData(data); result = source.DoDragDrop(TRUE); if (result == wxDragMove && dropWentOutside) @@ -217,9 +218,10 @@ void ScintillaWX::NotifyParent(SCNotification scn) { void ScintillaWX::Copy() { if (currentPos != anchor) { - char* text = CopySelectionRange(); + SelectionText st; + CopySelectionRange(&st); wxTheClipboard->Open(); - wxTheClipboard->SetData(new wxTextDataObject(text)); + wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len))); wxTheClipboard->Close(); } } @@ -494,14 +496,15 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { wxDragResult ScintillaWX::DoDragEnter(wxCoord x, wxCoord y, wxDragResult def) { - return def; + dragResult = def; + return dragResult; } wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { SetDragPosition(PositionFromLocation(Point(x, y))); dragResult = def; - return def; + return dragResult; } diff --git a/contrib/src/stc/makefile.b32 b/contrib/src/stc/makefile.b32 index 492b4e26df..7a74f314af 100644 --- a/contrib/src/stc/makefile.b32 +++ b/contrib/src/stc/makefile.b32 @@ -22,36 +22,45 @@ STCEXTRACPPFLAGS=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S) LIBTARGET=$(WXDIR)\contrib\lib\stc.lib OBJECTS = \ - AutoComplete.obj \ - CallTip.obj \ - CellBuffer.obj \ - ContractionState.obj \ - Document.obj \ - DocumentAccessor.obj \ - Editor.obj \ - Indicator.obj \ - KeyMap.obj \ - KeyWords.obj \ - LexCPP.obj \ - LexHTML.obj \ - LexLua.obj \ - LexOthers.obj \ - LexPerl.obj \ - LexPython.obj \ - LexSQL.obj \ - LexVB.obj \ - LineMarker.obj \ - PosRegExp.obj \ - PropSet.obj \ - ScintillaBase.obj \ - Style.obj \ - UniConversion.obj \ - ViewStyle.obj \ - WindowAccessor.obj \ - \ - PlatWX.obj \ - ScintillaWX.obj \ - stc.obj \ + AutoComplete.obj \ + CallTip.obj \ + CellBuffer.obj \ + ContractionState.obj \ + Document.obj \ + DocumentAccessor.obj \ + Editor.obj \ + Indicator.obj \ + KeyMap.obj \ + KeyWords.obj \ + LexAVE.obj \ + LexAda.obj \ + LexCPP.obj \ + LexConf.obj \ + LexCrontab.obj \ + LexEiffel.obj \ + LexHTML.obj \ + LexLisp.obj \ + LexLua.obj \ + LexOthers.obj \ + LexPascal.obj \ + LexPerl.obj \ + LexPython.obj \ + LexRuby.obj \ + LexSQL.obj \ + LexVB.obj \ + LineMarker.obj \ + PropSet.obj \ + RESearch.obj \ + ScintillaBase.obj \ + Style.obj \ + StyleContext.obj \ + UniConversion.obj \ + ViewStyle.obj \ + WindowAccessor.obj \ + \ + PlatWX.obj \ + ScintillaWX.obj \ + stc.obj \ !include $(WXDIR)\src\makelib.b32 diff --git a/contrib/src/stc/makefile.g95 b/contrib/src/stc/makefile.g95 index ea3cbd9c0c..cf708ed801 100644 --- a/contrib/src/stc/makefile.g95 +++ b/contrib/src/stc/makefile.g95 @@ -10,32 +10,42 @@ S=$(SCINTILLA)/src EXTRAINC=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S) -I. -I$(WXDIR)/contrib/include OBJECTS = \ - $(S)/AutoComplete.$(OBJSUFF) \ - $(S)/CallTip.$(OBJSUFF) \ - $(S)/CellBuffer.$(OBJSUFF) \ - $(S)/ContractionState.$(OBJSUFF)\ - $(S)/Document.$(OBJSUFF) \ - $(S)/Editor.$(OBJSUFF) \ - $(S)/Indicator.$(OBJSUFF) \ - $(S)/KeyMap.$(OBJSUFF) \ - $(S)/KeyWords.$(OBJSUFF) \ - $(S)/LineMarker.$(OBJSUFF) \ - $(S)/PropSet.$(OBJSUFF) \ - $(S)/ScintillaBase.$(OBJSUFF) \ - $(S)/Style.$(OBJSUFF) \ - $(S)/ViewStyle.$(OBJSUFF) \ - $(S)/LexCPP.$(OBJSUFF) \ - $(S)/LexHTML.$(OBJSUFF) \ - $(S)/LexLua.$(OBJSUFF) \ - $(S)/LexOthers.$(OBJSUFF) \ - $(S)/LexPerl.$(OBJSUFF) \ - $(S)/LexPython.$(OBJSUFF) \ - $(S)/LexSQL.$(OBJSUFF) \ - $(S)/LexVB.$(OBJSUFF) \ - $(S)/DocumentAccessor.$(OBJSUFF)\ + $(S)/AutoComplete.$(OBJSUFF) \ + $(S)/CallTip.$(OBJSUFF) \ + $(S)/CellBuffer.$(OBJSUFF) \ + $(S)/ContractionState.$(OBJSUFF) \ + $(S)/Document.$(OBJSUFF) \ + $(S)/DocumentAccessor.$(OBJSUFF) \ + $(S)/Editor.$(OBJSUFF) \ + $(S)/Indicator.$(OBJSUFF) \ + $(S)/KeyMap.$(OBJSUFF) \ + $(S)/KeyWords.$(OBJSUFF) \ + $(S)/LexAVE.$(OBJSUFF) \ + $(S)/LexAda.$(OBJSUFF) \ + $(S)/LexCPP.$(OBJSUFF) \ + $(S)/LexConf.$(OBJSUFF) \ + $(S)/LexCrontab.$(OBJSUFF) \ + $(S)/LexEiffel.$(OBJSUFF) \ + $(S)/LexHTML.$(OBJSUFF) \ + $(S)/LexLisp.$(OBJSUFF) \ + $(S)/LexLua.$(OBJSUFF) \ + $(S)/LexOthers.$(OBJSUFF) \ + $(S)/LexPascal.$(OBJSUFF) \ + $(S)/LexPerl.$(OBJSUFF) \ + $(S)/LexPython.$(OBJSUFF) \ + $(S)/LexRuby.$(OBJSUFF) \ + $(S)/LexSQL.$(OBJSUFF) \ + $(S)/LexVB.$(OBJSUFF) \ + $(S)/LineMarker.$(OBJSUFF) \ + $(S)/PropSet.$(OBJSUFF) \ + $(S)/RESearch.$(OBJSUFF) \ + $(S)/ScintillaBase.$(OBJSUFF) \ + $(S)/Style.$(OBJSUFF) \ + $(S)/StyleContext.$(OBJSUFF) \ $(S)/UniConversion.$(OBJSUFF) \ + $(S)/ViewStyle.$(OBJSUFF) \ $(S)/WindowAccessor.$(OBJSUFF) \ - $(S)/PosRegExp.$(OBJSUFF) \ + \ PlatWX.$(OBJSUFF) \ ScintillaWX.$(OBJSUFF) \ stc.$(OBJSUFF) diff --git a/contrib/src/stc/makefile.vc b/contrib/src/stc/makefile.vc index fa0f4a7e77..9c6d478b87 100644 --- a/contrib/src/stc/makefile.vc +++ b/contrib/src/stc/makefile.vc @@ -15,40 +15,41 @@ NOPCH=1 !include $(WXDIR)\src\makevc.env OBJECTS = \ - $(D)\AutoComplete.obj \ - $(D)\CallTip.obj \ - $(D)\CellBuffer.obj \ - $(D)\ContractionState.obj\ - $(D)\Document.obj \ - $(D)\DocumentAccessor.obj\ - $(D)\Editor.obj \ - $(D)\Indicator.obj \ - $(D)\KeyMap.obj \ - $(D)\KeyWords.obj \ - $(D)\LineMarker.obj \ - $(D)\PropSet.obj \ - $(D)\RESearch.obj \ - $(D)\ScintillaBase.obj \ - $(D)\Style.obj \ - $(D)\UniConversion.obj \ - $(D)\ViewStyle.obj \ - $(D)\WindowAccessor.obj \ - \ - $(D)\LexAda.obj \ - $(D)\LexAVE.obj \ - $(D)\LexConf.obj \ - $(D)\LexCPP.obj \ - $(D)\LexEiffel.obj \ - $(D)\LexHTML.obj \ - $(D)\LexLisp.obj \ - $(D)\LexLua.obj \ - $(D)\LexOthers.obj \ - $(D)\LexPascal.obj \ - $(D)\LexPerl.obj \ - $(D)\LexPython.obj \ - $(D)\LexRuby.obj \ - $(D)\LexSQL.obj \ - $(D)\LexVB.obj \ + $(D)\AutoComplete.obj \ + $(D)\CallTip.obj \ + $(D)\CellBuffer.obj \ + $(D)\ContractionState.obj \ + $(D)\Document.obj \ + $(D)\DocumentAccessor.obj \ + $(D)\Editor.obj \ + $(D)\Indicator.obj \ + $(D)\KeyMap.obj \ + $(D)\KeyWords.obj \ + $(D)\LexAVE.obj \ + $(D)\LexAda.obj \ + $(D)\LexCPP.obj \ + $(D)\LexConf.obj \ + $(D)\LexCrontab.obj \ + $(D)\LexEiffel.obj \ + $(D)\LexHTML.obj \ + $(D)\LexLisp.obj \ + $(D)\LexLua.obj \ + $(D)\LexOthers.obj \ + $(D)\LexPascal.obj \ + $(D)\LexPerl.obj \ + $(D)\LexPython.obj \ + $(D)\LexRuby.obj \ + $(D)\LexSQL.obj \ + $(D)\LexVB.obj \ + $(D)\LineMarker.obj \ + $(D)\PropSet.obj \ + $(D)\RESearch.obj \ + $(D)\ScintillaBase.obj \ + $(D)\Style.obj \ + $(D)\StyleContext.obj \ + $(D)\UniConversion.obj \ + $(D)\ViewStyle.obj \ + $(D)\WindowAccessor.obj \ \ $(D)\PlatWX.obj \ $(D)\ScintillaWX.obj \ diff --git a/contrib/src/stc/scintilla/README.txt b/contrib/src/stc/scintilla/README.txt index 598da70f58..98c4018245 100644 --- a/contrib/src/stc/scintilla/README.txt +++ b/contrib/src/stc/scintilla/README.txt @@ -3,5 +3,5 @@ scintilla/include directories from the Scintilla/SCiTE source distribution. All other code needed to implement Scintilla on top of wxWindows is located in the directory above this one. -The current version of the Scintilla code is 1.39 +The current version of the Scintilla code is 1.40 diff --git a/contrib/src/stc/scintilla/include/SciLexer.h b/contrib/src/stc/scintilla/include/SciLexer.h index 591bd06aa1..680cb15138 100644 --- a/contrib/src/stc/scintilla/include/SciLexer.h +++ b/contrib/src/stc/scintilla/include/SciLexer.h @@ -40,6 +40,7 @@ #define SCLEX_EIFFEL 23 #define SCLEX_EIFFELKW 24 #define SCLEX_TCL 25 +#define SCLEX_NNCRONTAB 26 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -72,6 +73,8 @@ #define SCE_C_REGEX 14 #define SCE_C_COMMENTLINEDOC 15 #define SCE_C_WORD2 16 +#define SCE_C_COMMENTDOCKEYWORD 17 +#define SCE_C_COMMENTDOCKEYWORDERROR 18 #define SCE_H_DEFAULT 0 #define SCE_H_TAG 1 #define SCE_H_TAGUNKNOWN 2 @@ -93,7 +96,17 @@ #define SCE_H_QUESTION 18 #define SCE_H_VALUE 19 #define SCE_H_XCCOMMENT 20 -#define SCE_H_SGML 21 +#define SCE_H_SGML_DEFAULT 21 +#define SCE_H_SGML_COMMAND 22 +#define SCE_H_SGML_1ST_PARAM 23 +#define SCE_H_SGML_DOUBLESTRING 24 +#define SCE_H_SGML_SIMPLESTRING 25 +#define SCE_H_SGML_ERROR 26 +#define SCE_H_SGML_SPECIAL 27 +#define SCE_H_SGML_ENTITY 28 +#define SCE_H_SGML_COMMENT 29 +#define SCE_H_SGML_1ST_PARAM_COMMENT 30 +#define SCE_H_SGML_BLOCK_DEFAULT 31 #define SCE_HJ_START 40 #define SCE_HJ_DEFAULT 41 #define SCE_HJ_COMMENT 42 @@ -295,6 +308,17 @@ #define SCE_EIFFEL_OPERATOR 6 #define SCE_EIFFEL_IDENTIFIER 7 #define SCE_EIFFEL_STRINGEOL 8 +#define SCE_NNCRONTAB_DEFAULT 0 +#define SCE_NNCRONTAB_COMMENT 1 +#define SCE_NNCRONTAB_TASK 2 +#define SCE_NNCRONTAB_SECTION 3 +#define SCE_NNCRONTAB_KEYWORD 4 +#define SCE_NNCRONTAB_MODIFIER 5 +#define SCE_NNCRONTAB_ASTERISK 6 +#define SCE_NNCRONTAB_NUMBER 7 +#define SCE_NNCRONTAB_STRING 8 +#define SCE_NNCRONTAB_ENVIRONMENT 9 +#define SCE_NNCRONTAB_IDENTIFIER 10 //--Autogenerated -- end of section automatically generated from Scintilla.iface #endif diff --git a/contrib/src/stc/scintilla/include/Scintilla.h b/contrib/src/stc/scintilla/include/Scintilla.h index 0185d3e5be..abe1581a49 100644 --- a/contrib/src/stc/scintilla/include/Scintilla.h +++ b/contrib/src/stc/scintilla/include/Scintilla.h @@ -11,9 +11,6 @@ #ifndef SCINTILLA_H #define SCINTILLA_H -// Compile-time configuration options -#define MACRO_SUPPORT 1 // Comment out to remove macro hooks - #if PLAT_WIN #ifdef STATIC_BUILD void Scintilla_RegisterClasses(HINSTANCE hInstance); @@ -102,6 +99,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SC_MARK_CIRCLEPLUSCONNECTED 19 #define SC_MARK_CIRCLEMINUS 20 #define SC_MARK_CIRCLEMINUSCONNECTED 21 +#define SC_MARK_CHARACTER 10000 #define SC_MARKNUM_FOLDEREND 25 #define SC_MARKNUM_FOLDEROPENMID 26 #define SC_MARKNUM_FOLDERMIDTAIL 27 @@ -134,6 +132,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define STYLE_BRACEBAD 35 #define STYLE_CONTROLCHAR 36 #define STYLE_INDENTGUIDE 37 +#define STYLE_LASTPREDEFINED 39 #define STYLE_MAX 127 #define SC_CHARSET_ANSI 0 #define SC_CHARSET_DEFAULT 1 @@ -507,12 +506,6 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCN_DWELLEND 2017 //--Autogenerated -- end of section automatically generated from Scintilla.iface -// Optional module for macro recording -#ifdef MACRO_SUPPORT -typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam, - long lParam, void *userData); -#endif - // These structures are defined to be exactly the same shape as the Win32 // CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs. // So older code that treats Scintilla as a RichEdit will work. @@ -566,11 +559,9 @@ struct SCNotification { const char *text; // SCN_MODIFIED int length; // SCN_MODIFIED int linesAdded; // SCN_MODIFIED -#ifdef MACRO_SUPPORT int message; // SCN_MACRORECORD uptr_t wParam; // SCN_MACRORECORD - sptr_t lParam; // SCN_MACRORECORD -#endif + sptr_t lParam; // SCN_MACRORECORD int line; // SCN_MODIFIED int foldLevelNow; // SCN_MODIFIED int foldLevelPrev; // SCN_MODIFIED diff --git a/contrib/src/stc/scintilla/include/Scintilla.iface b/contrib/src/stc/scintilla/include/Scintilla.iface index 90360076fa..7724efdb00 100644 --- a/contrib/src/stc/scintilla/include/Scintilla.iface +++ b/contrib/src/stc/scintilla/include/Scintilla.iface @@ -229,6 +229,8 @@ val SC_MARK_CIRCLEPLUSCONNECTED=19 val SC_MARK_CIRCLEMINUS=20 val SC_MARK_CIRCLEMINUSCONNECTED=21 +val SC_MARK_CHARACTER=10000 + # Markers used for outlining column val SC_MARKNUM_FOLDEREND=25 val SC_MARKNUM_FOLDEROPENMID=26 @@ -292,12 +294,15 @@ set void SetMarginSensitiveN=2246(int margin, bool sensitive) # Retrieve the mouse click sensitivity of a margin. get bool GetMarginSensitiveN=2247(int margin,) +# Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles. +# Styles 38 and 39 are for future use. val STYLE_DEFAULT=32 val STYLE_LINENUMBER=33 val STYLE_BRACELIGHT=34 val STYLE_BRACEBAD=35 val STYLE_CONTROLCHAR=36 val STYLE_INDENTGUIDE=37 +val STYLE_LASTPREDEFINED=39 val STYLE_MAX=127 # Character set identifiers are used in StyleSetCharacterSet. @@ -759,10 +764,12 @@ set void SetTargetEnd=2192(position pos,) get position GetTargetEnd=2193(,) # Replace the target text with the argument text. +# Text is counted so it can contain nulls. # Returns the length of the replacement text. fun int ReplaceTarget=2194(int length, string text) # Replace the target text with the argument text after \d processing. +# Text is counted so it can contain nulls. # Looks for \d where d is between 1 and 9 and replaces these with the strings # matched in the last search operation which were surrounded by \( and \). # Returns the length of the replacement text including any change @@ -770,7 +777,7 @@ fun int ReplaceTarget=2194(int length, string text) fun int ReplaceTargetRE=2195(int length, string text) # Search for a counted string in the target and set the target to the found -# range. +# range. Text is counted so it can contain nulls. # Returns length of range or -1 for failure in which case target is not moved. fun int SearchInTarget=2197(int length, string text) @@ -1265,6 +1272,7 @@ val SCLEX_RUBY=22 val SCLEX_EIFFEL=23 val SCLEX_EIFFELKW=24 val SCLEX_TCL=25 +val SCLEX_NNCRONTAB=26 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a # value assigned in sequence from SCLEX_AUTOMATIC+1. val SCLEX_AUTOMATIC=1000 @@ -1301,6 +1309,8 @@ val SCE_C_VERBATIM=13 val SCE_C_REGEX=14 val SCE_C_COMMENTLINEDOC=15 val SCE_C_WORD2=16 +val SCE_C_COMMENTDOCKEYWORD=17 +val SCE_C_COMMENTDOCKEYWORDERROR=18 # Lexical states for SCLEX_HTML, SCLEX_XML val SCE_H_DEFAULT=0 val SCE_H_TAG=1 @@ -1327,7 +1337,17 @@ val SCE_H_VALUE=19 # X-Code val SCE_H_XCCOMMENT=20 # SGML -val SCE_H_SGML=21 +val SCE_H_SGML_DEFAULT=21 +val SCE_H_SGML_COMMAND=22 +val SCE_H_SGML_1ST_PARAM=23 +val SCE_H_SGML_DOUBLESTRING=24 +val SCE_H_SGML_SIMPLESTRING=25 +val SCE_H_SGML_ERROR=26 +val SCE_H_SGML_SPECIAL=27 +val SCE_H_SGML_ENTITY=28 +val SCE_H_SGML_COMMENT=29 +val SCE_H_SGML_1ST_PARAM_COMMENT=30 +val SCE_H_SGML_BLOCK_DEFAULT=31 # Embedded Javascript val SCE_HJ_START=40 val SCE_HJ_DEFAULT=41 @@ -1547,6 +1567,18 @@ val SCE_EIFFEL_CHARACTER=5 val SCE_EIFFEL_OPERATOR=6 val SCE_EIFFEL_IDENTIFIER=7 val SCE_EIFFEL_STRINGEOL=8 +# Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer) +val SCE_NNCRONTAB_DEFAULT=0 +val SCE_NNCRONTAB_COMMENT=1 +val SCE_NNCRONTAB_TASK=2 +val SCE_NNCRONTAB_SECTION=3 +val SCE_NNCRONTAB_KEYWORD=4 +val SCE_NNCRONTAB_MODIFIER=5 +val SCE_NNCRONTAB_ASTERISK=6 +val SCE_NNCRONTAB_NUMBER=7 +val SCE_NNCRONTAB_STRING=8 +val SCE_NNCRONTAB_ENVIRONMENT=9 +val SCE_NNCRONTAB_IDENTIFIER=10 # Events @@ -1574,171 +1606,3 @@ evt void DwellStart=2016(int position) evt void DwellEnd=2017(int position) cat Deprecated - -val SCFIND_DOWN=1 - -################################################ -# From WinDefs.h - -# ***** DEPRECATED from here to end of file ****** - -# Will a paste succeed? -fun bool EM_CanPaste=1074(,) - -# Are there any undoable actions in the undo history. -fun bool EM_CanUndo=198(,) - -# Find the position and line from a point within the window. -fun int EM_CharFromPos=215(,point pt) - -# Delete the undo history. -fun void EM_EmptyUndoBuffer=205(,) - -# Retrieve the selection range. -fun void EM_ExGetSel=1076(,charrangeresult cr) - -# Retrieve the line number of a position in the document. -get int EM_ExLineFromChar=1078(,position pos) - -# Select a range of text. -fun void EM_ExSetSel=1079(,charrange cr) - -# Find some text in the document. -fun position EM_FindText=1080(int flags, findtext ft) - -# Find some text in the document. Returns range of found text in ft argument. -fun position EM_FindTextEx=1103(int flags, findtextex ft) - -# On Windows will draw the document into a display context such as a printer. -fun void EM_FormatRange=1081(bool draw, formatrange fr) - -# Retrieve the line at the top of the display. -get int EM_GetFirstVisibleLine=206(,) - -# Retrieve the contents of a line. -# Returns the length of the line. -fun int EM_GetLine=196(int line, countedstring text) - -# Returns the number of lines in the document. There is always at least one. -fun int EM_GetLineCount=186(,) - -# Returns the size in pixels of left and right margins packed into one integer. -# The left margin is in the low half and the right margin in the high half. -fun int EM_GetMargins=212(,) - -# Is the document different from when it was last saved? -get bool EM_GetModify=184(,) - -# Get the area used to display the document. -fun void EM_GetRect=178(,rectangle r) - -# Return the selection packed into one integer with the start of the selection -# in the low half and the end in the high half. -fun int EM_GetSel=176(,) - -# Retrieve the selected text. -# Return the length of the text. -fun int EM_GetSelText=1086(,stringresult text) - -# Retrieve a range of text. -# Return the length of the text. -fun int EM_GetTextRange=1099(, textrange tr) - -# Draw the selection in normal style or with selection highlighted. -fun void EM_HideSelection=1087(bool normal,) - -# Retrieve the line of a position. -fun int EM_LineFromChar=201(position pos,) - -# Retrieve the position at the start of a line. -fun position EM_LineIndex=187(int line,) - -# Retrieve the number of characters on a line not including end of line characters. -fun int EM_LineLength=193(int line,) - -# Scroll horizontally and vertically. -fun void EM_LineScroll=182(int columns, int lines) - -# Retrieve the point in the window where a position is displayed. -fun void EM_PosFromChar=214(pointresult pt, position pos) - -# Replace the selected text with the argument text. -fun void EM_ReplaceSel=194(, string text) - -# Ensure the caret is visible. -fun void EM_ScrollCaret=183(,) - -# Returns SEL_EMPTY if selection contains no characters, otherwise SEL_TEXT. -fun void EM_SelectionType=1090(,) - -# Set the width of the left and right margins -fun void EM_SetMargins=211(int flags, int values) - -# Set to read only or read write. -set void EM_SetReadOnly=207(bool readOnly,) - -# Select the range of text from start to end. -fun void EM_SetSel=177(position start, position end) - -# Undo one action in the undo history. -fun void EM_Undo=199(,) - -# Null operation. -fun void WM_Null=0(,) - -# Clear the selection. -fun void WM_Clear=771(,) - -fun void WM_Command=273(,) - -# Copy the selection to the clipboard. -fun void WM_Copy=769(,) - -# Cut the selection to the clipboard. -fun void WM_Cut=768(,) - -# Retrieve all the text in the document. -# Returns number of characters retrieved. -fun int WM_GetText=13(int length, stringresult text) - -# Retrieve the number of characters in the document. -fun int WM_GetTextLength=14(,) - -# Notification back to container -fun void WM_Notify=78(int id, int stuff) - -# Paste the contents of the clipboard into the document replacing the selection. -fun void WM_Paste=770(,) - -# Replace the contents of the document with the argument text. -fun void WM_SetText=12(, string text) - -# Undo one action in the undo history. -fun void WM_Undo=772(,) - -# Notification codes -val EN_CHANGE=768 -val EN_KILLFOCUS=512 -val EN_SETFOCUS=256 - -# Flags for setting margins. -val EC_LEFTMARGIN=1 -val EC_RIGHTMARGIN=2 -val EC_USEFONTINFO=0xffff - -# Selection type. -val SEL_EMPTY=0 -val SEL_TEXT=1 - -# Find replace mask constants -val FR_MATCHCASE=0x4 -val FR_WHOLEWORD=0x2 -val FR_DOWN=0x1 - -# Key modifier flag. -val SHIFT_PRESSED=1 -val LEFT_CTRL_PRESSED=2 -val LEFT_ALT_PRESSED=4 - -#events -evt void EN_Change=768(void) diff --git a/contrib/src/stc/scintilla/include/ScintillaWidget.h b/contrib/src/stc/scintilla/include/ScintillaWidget.h index f6c2fc3542..6e22f58f8b 100644 --- a/contrib/src/stc/scintilla/include/ScintillaWidget.h +++ b/contrib/src/stc/scintilla/include/ScintillaWidget.h @@ -11,17 +11,6 @@ #if PLAT_GTK -#ifndef SCINTILLA_H -#ifdef _MSC_VER -#pragma message(__FILE__ "(1) : warning : Scintilla.h should be included before ScintillaWidget.h") -#pragma message("This will be required in the next version of Scintilla") -#else -#warning Scintilla.h should be included before ScintillaWidget.h -#warning This will be required in the next version of Scintilla -#endif -#include "Scintilla.h" -#endif - #ifdef __cplusplus extern "C" { #endif diff --git a/contrib/src/stc/scintilla/include/WinDefs.h b/contrib/src/stc/scintilla/include/WinDefs.h deleted file mode 100644 index b3421c0bcc..0000000000 --- a/contrib/src/stc/scintilla/include/WinDefs.h +++ /dev/null @@ -1,197 +0,0 @@ -// Scintilla source code edit control -/** @file WinDefs.h - ** The subset of definitions from Windows needed by Scintilla for GTK+. - **/ -// Copyright 1998-2001 by Neil Hodgson -// The License.txt file describes the conditions under which this software may be distributed. - -#ifndef WINDEFS_H -#define WINDEFS_H - -/* Running GTK version on win32 */ -#if PLAT_GTK_WIN32 -#include "Windows.h" -#include "Richedit.h" - -/* Name conflicts */ -#undef DrawText -#undef FindText -#else - -#define WORD short -#define WPARAM unsigned long -#define LPARAM long -#define LRESULT long -#define DWORD long - -#define UINT unsigned int -#define LPSTR char * -#define LONG long - -//#if 0 -/* RTF control */ -#define EM_CANPASTE (1074) -#define EM_CANUNDO (198) -#define EM_CHARFROMPOS (215) -#define EM_EMPTYUNDOBUFFER (205) -#define EM_EXGETSEL (1076) -#define EM_EXLINEFROMCHAR (1078) -#define EM_EXSETSEL (1079) -#define EM_FINDTEXT (1080) -#define EM_FINDTEXTEX (1103) -#define EM_FORMATRANGE (1081) -#define EM_GETFIRSTVISIBLELINE (206) -#define EM_GETLINE (196) -#define EM_GETLINECOUNT (186) -#define EM_GETMARGINS (212) -#define EM_GETMODIFY (184) -#define EM_GETRECT (178) -#define EM_GETSEL (176) -#define EM_GETSELTEXT (1086) -#define EM_GETTEXTRANGE (1099) -#define EM_HIDESELECTION (1087) -#define EM_LINEFROMCHAR (201) -#define EM_LINEINDEX (187) -#define EM_LINELENGTH (193) -#define EM_LINESCROLL (182) -#define EM_POSFROMCHAR (214) -#define EM_REPLACESEL (194) -#define EM_SCROLLCARET (183) -#define EM_SELECTIONTYPE (1090) -#define EM_SETMARGINS (211) -#define EM_SETREADONLY (207) -#define EM_SETSEL (177) -#define EM_UNDO (199) - -#define WM_NULL (0) -#define WM_CLEAR (771) -#define WM_COPY (769) -#define WM_CUT (768) -#define WM_GETTEXT (13) -#define WM_GETTEXTLENGTH (14) -#define WM_PASTE (770) -#define WM_SETTEXT (12) -#define WM_UNDO (772) - -#define EN_CHANGE (768) -#define EN_KILLFOCUS (512) -#define EN_SETFOCUS (256) - -#define EC_LEFTMARGIN 1 -#define EC_RIGHTMARGIN 2 -#define EC_USEFONTINFO 0xffff - -//#endif - -#if 0 -#if PLAT_GTK -#define VK_DOWN GDK_Down -#define VK_UP GDK_Up -#define VK_LEFT GDK_Left -#define VK_RIGHT GDK_Right -#define VK_HOME GDK_Home -#define VK_END GDK_End -#define VK_PRIOR GDK_Page_Up -#define VK_NEXT GDK_Page_Down -#define VK_DELETE GDK_Delete -#define VK_INSERT GDK_Insert -#define VK_ESCAPE GDK_Escape -#define VK_BACK GDK_BackSpace -#define VK_TAB GDK_Tab -#define VK_RETURN GDK_Return -#define VK_ADD GDK_KP_Add -#define VK_SUBTRACT GDK_KP_Subtract -#define VK_DIVIDE GDK_KP_Divide -#endif - -#if PLAT_WX -#define VK_DOWN WXK_DOWN -#define VK_UP WXK_UP -#define VK_LEFT WXK_LEFT -#define VK_RIGHT WXK_RIGHT -#define VK_HOME WXK_HOME -#define VK_END WXK_END -#define VK_PRIOR WXK_PRIOR -#define VK_NEXT WXK_NEXT -#define VK_DELETE WXK_DELETE -#define VK_INSERT WXK_INSERT -#define VK_ESCAPE WXK_ESCAPE -#define VK_BACK WXK_BACK -#define VK_TAB WXK_TAB -#define VK_RETURN WXK_RETURN -#define VK_ADD WXK_ADD -#define VK_SUBTRACT WXK_SUBTRACT -//TODO: -#define VK_DIVIDE WXK_DIVIDE -#endif - -#define SHIFT_PRESSED 1 -#define LEFT_CTRL_PRESSED 2 -#define LEFT_ALT_PRESSED 4 - -// Are these needed any more -#define LPSTR char * -#define LONG long -#define LPDWORD (long *) - -/* SELCHANGE structure */ -#define SEL_EMPTY (0) -#define SEL_TEXT (1) -#define SEL_OBJECT (2) -#define SEL_MULTICHAR (4) -#define SEL_MULTIOBJECT (8) - -struct RECT { - LONG left; - LONG top; - LONG right; - LONG bottom; -}; - -/* FINDREPLACE structure */ - -#define FR_MATCHCASE (0x4) -#define FR_WHOLEWORD (0x2) -#define FR_DOWN (0x1) - -#endif - -#if 0 -struct CHARRANGE { - LONG cpMin; - LONG cpMax; -}; - -struct TEXTRANGE { - CHARRANGE chrg; - LPSTR lpstrText; -}; - -struct FINDTEXTEX { - CHARRANGE chrg; - LPSTR lpstrText; - CHARRANGE chrgText; -}; - -struct NMHDR { - WindowID hwndFrom; - UINT idFrom; - UINT code; -}; - -struct FORMATRANGE { - SurfaceID hdc; - SurfaceID hdcTarget; - RECT rc; - RECT rcPage; - CHARRANGE chrg; -}; -#endif - -//#define MAKELONG(a, b) ((a) | ((b) << 16)) -//#define LOWORD(x) (x & 0xffff) -//#define HIWORD(x) (x >> 16) - -#endif /* !_MSC_VER */ - -#endif diff --git a/contrib/src/stc/scintilla/src/Document.cxx b/contrib/src/stc/scintilla/src/Document.cxx index 10403242b9..abbb87d5dc 100644 --- a/contrib/src/stc/scintilla/src/Document.cxx +++ b/contrib/src/stc/scintilla/src/Document.cxx @@ -357,8 +357,10 @@ void Document::ModifiedAt(int pos) { // Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number void Document::DeleteChars(int pos, int len) { + if (len == 0) + return; if ((pos + len) > Length()) - return ; + return; if (cb.IsReadOnly() && enteredReadOnlyCount == 0) { enteredReadOnlyCount++; NotifyModifyAttempt(); diff --git a/contrib/src/stc/scintilla/src/Editor.cxx b/contrib/src/stc/scintilla/src/Editor.cxx index 5b72ac579d..2171924f0f 100644 --- a/contrib/src/stc/scintilla/src/Editor.cxx +++ b/contrib/src/stc/scintilla/src/Editor.cxx @@ -14,10 +14,6 @@ #include "Scintilla.h" -#if PLAT_WX || PLAT_GTK -#include "WinDefs.h" -#endif - #include "ContractionState.h" #include "SVector.h" #include "CellBuffer.h" @@ -58,7 +54,6 @@ Editor::Editor() { dwelling = false; ptMouseLast.x = 0; ptMouseLast.y = 0; - firstExpose = true; inDragDrop = false; dropWentOutside = false; posDrag = invalidPosition; @@ -69,9 +64,6 @@ Editor::Editor() { lineAnchor = 0; originalAnchorPos = 0; - dragChars = 0; - lenDrag = 0; - dragIsRectangle = false; selType = selStream; xStartSelect = 0; xEndSelect = 0; @@ -85,9 +77,6 @@ Editor::Editor() { searchAnchor = 0; - ucWheelScrollLines = 0; - cWheelDelta = 0; //wheel delta from roll - xOffset = 0; xCaretMargin = 50; horizontalScrollBarVisible = true; @@ -114,15 +103,11 @@ Editor::Editor() { modEventMask = SC_MODEVENTMASKALL; - displayPopupMenu = true; - pdoc = new Document(); pdoc ->AddRef(); pdoc->AddWatcher(this, 0); -#ifdef MACRO_SUPPORT - recordingMacro = 0; -#endif + recordingMacro = false; foldFlags = 0; } @@ -131,10 +116,6 @@ Editor::~Editor() { pdoc->Release(); pdoc = 0; DropGraphics(); - - delete []dragChars; - dragChars = 0; - lenDrag = 0; } void Editor::Finalise() { @@ -874,7 +855,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { if (marks) { for (int markBit = 0; (markBit < 32) && marks; markBit++) { if (marks & 1) { - vs.markers[markBit].Draw(surface, rcMarker); + vs.markers[markBit].Draw(surface, rcMarker, vs.styles[STYLE_LINENUMBER].font); } marks >>= 1; } @@ -1917,14 +1898,12 @@ void Editor::NotifyChar(int ch) { scn.nmhdr.code = SCN_CHARADDED; scn.ch = ch; NotifyParent(scn); -#ifdef MACRO_SUPPORT if (recordingMacro) { char txt[2]; txt[0] = static_cast(ch); txt[1] = '\0'; NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast(txt)); } -#endif } void Editor::NotifySavePoint(bool isSavePoint) { @@ -2150,7 +2129,6 @@ void Editor::NotifyDeleted(Document *, void *) { /* Do nothing */ } -#ifdef MACRO_SUPPORT void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam) { // Enumerates all macroable messages @@ -2159,10 +2137,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long case SCI_COPY: case SCI_PASTE: case SCI_CLEAR: - case WM_CUT: - case WM_COPY: - case WM_PASTE: - case WM_CLEAR: case SCI_REPLACESEL: case SCI_ADDTEXT: case SCI_INSERTTEXT: @@ -2236,7 +2210,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long scn.lParam = lParam; NotifyParent(scn); } -#endif // Force scroll and keep position relative to top of window void Editor::PageMove(int direction, bool extend) { @@ -2674,7 +2647,6 @@ void Editor::Indent(bool forwards) { * @return The position of the found text, -1 if not found. */ long Editor::FindText( - unsigned int iMessage, ///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT. unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD, ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP. long lParam) { ///< @c TextToFind structure: The text to search for in the given range. @@ -2688,10 +2660,8 @@ long Editor::FindText( wParam & SCFIND_REGEXP, &lengthFound); if (pos != -1) { - if (iMessage != EM_FINDTEXT) { - ft->chrgText.cpMin = pos; - ft->chrgText.cpMax = pos + lengthFound; - } + ft->chrgText.cpMin = pos; + ft->chrgText.cpMax = pos + lengthFound; } return pos; } @@ -2800,33 +2770,23 @@ char *Editor::CopyRange(int start, int end) { return text; } -int Editor::SelectionRangeLength() { +void Editor::CopySelectionRange(SelectionText *ss) { + char *text = 0; + int size = 0; if (selType == selRectangle) { int lineStart = pdoc->LineFromPosition(SelectionStart()); int lineEnd = pdoc->LineFromPosition(SelectionEnd()); - int totalSize = 0; - for (int line = lineStart; line <= lineEnd; line++) { - totalSize += SelectionEnd(line) - SelectionStart(line) + 1; + int line; + for (line = lineStart; line <= lineEnd; line++) { + size += SelectionEnd(line) - SelectionStart(line) + 1; if (pdoc->eolMode == SC_EOL_CRLF) - totalSize++; + size++; } - return totalSize; - } else { - return SelectionEnd() - SelectionStart(); - } -} - -char *Editor::CopySelectionRange() { - if (selType == selRectangle) { - char *text = 0; - int lineStart = pdoc->LineFromPosition(SelectionStart()); - int lineEnd = pdoc->LineFromPosition(SelectionEnd()); - int totalSize = SelectionRangeLength(); - if (totalSize > 0) { - text = new char[totalSize + 1]; + if (size > 0) { + text = new char[size + 1]; if (text) { int j = 0; - for (int line = lineStart; line <= lineEnd; line++) { + for (line = lineStart; line <= lineEnd; line++) { for (int i = SelectionStart(line);i < SelectionEnd(line);i++) { text[j++] = pdoc->CharAt(i); } @@ -2835,24 +2795,14 @@ char *Editor::CopySelectionRange() { if (pdoc->eolMode != SC_EOL_CR) text[j++] = '\n'; } - text[totalSize] = '\0'; + text[size] = '\0'; } } - return text; } else { - return CopyRange(SelectionStart(), SelectionEnd()); - } -} - -void Editor::CopySelectionIntoDrag() { - delete []dragChars; - dragChars = 0; - lenDrag = SelectionRangeLength(); - dragChars = CopySelectionRange(); - dragIsRectangle = selType == selRectangle; - if (!dragChars) { - lenDrag = 0; + size = SelectionEnd() - SelectionStart(); + text = CopyRange(SelectionStart(), SelectionEnd()); } + ss->Set(text, size, selType == selRectangle); } void Editor::SetDragPosition(int newPos) { @@ -2882,8 +2832,6 @@ void Editor::StartDrag() { //DisplayCursor(Window::cursorArrow); } - - void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) { //Platform::DebugPrintf("DropAt %d\n", inDragDrop); if (inDragDrop) @@ -3115,7 +3063,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b if (inDragDrop) { SetMouseCapture(false); SetDragPosition(newPos); - CopySelectionIntoDrag(); + CopySelectionRange(&drag); StartDrag(); } else { xStartSelect = pt.x - vs.fixedColumnWidth + xOffset; @@ -3220,25 +3168,23 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) { int selStart = SelectionStart(); int selEnd = SelectionEnd(); if (selStart < selEnd) { - if (dragChars && lenDrag) { + if (drag.len) { if (ctrl) { - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else if (newPos < selStart) { - pdoc->DeleteChars(selStart, lenDrag); - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->DeleteChars(selStart, drag.len); + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else if (newPos > selEnd) { - pdoc->DeleteChars(selStart, lenDrag); - newPos -= lenDrag; - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->DeleteChars(selStart, drag.len); + newPos -= drag.len; + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else { SetEmptySelection(newPos); } - delete []dragChars; - dragChars = 0; - lenDrag = 0; + drag.Set(0, 0); } selectionType = selChar; } @@ -3545,14 +3491,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { //Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam); // Optional macro recording hook -#ifdef MACRO_SUPPORT if (recordingMacro) NotifyMacroRecord(iMessage, wParam, lParam); -#endif switch (iMessage) { - case WM_GETTEXT: case SCI_GETTEXT: { if (lParam == 0) @@ -3565,7 +3508,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return iChar; } - case WM_SETTEXT: case SCI_SETTEXT: { if (lParam == 0) @@ -3576,130 +3518,45 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return TRUE; } - case WM_GETTEXTLENGTH: case SCI_GETTEXTLENGTH: return pdoc->Length(); - case WM_CUT: case SCI_CUT: Cut(); SetLastXChosen(); break; - case WM_COPY: case SCI_COPY: Copy(); break; - case WM_PASTE: case SCI_PASTE: Paste(); SetLastXChosen(); EnsureCaretVisible(); break; - case WM_CLEAR: case SCI_CLEAR: Clear(); SetLastXChosen(); break; - case WM_UNDO: case SCI_UNDO: Undo(); SetLastXChosen(); break; - // Edit control messages - - // Not supported (no-ops): - // EM_GETWORDBREAKPROC - // EM_GETWORDBREAKPROCEX - // EM_SETWORDBREAKPROC - // EM_SETWORDBREAKPROCEX - // EM_GETWORDWRAPMODE - // EM_SETWORDWRAPMODE - // EM_LIMITTEXT - // EM_EXLIMITTEXT - // EM_SETRECT - // EM_SETRECTNP - // EM_FMTLINES - // EM_GETHANDLE - // EM_SETHANDLE - // EM_GETPASSWORDCHAR - // EM_SETPASSWORDCHAR - // EM_SETTABSTOPS - // EM_FINDWORDBREAK - // EM_GETCHARFORMAT - // EM_SETCHARFORMAT - // EM_GETOLEINTERFACE - // EM_SETOLEINTERFACE - // EM_SETOLECALLBACK - // EM_GETPARAFORMAT - // EM_SETPARAFORMAT - // EM_PASTESPECIAL - // EM_REQUESTRESIZE - // EM_GETBKGNDCOLOR - // EM_SETBKGNDCOLOR - // EM_STREAMIN - // EM_STREAMOUT - // EM_GETIMECOLOR - // EM_SETIMECOLOR - // EM_GETIMEOPTIONS - // EM_SETIMEOPTIONS - // EM_GETOPTIONS - // EM_SETOPTIONS - // EM_GETPUNCTUATION - // EM_SETPUNCTUATION - // EM_GETTHUMB - // EM_SETTARGETDEVICE - - // Not supported but should be: - // EM_GETEVENTMASK - // EM_SETEVENTMASK - // For printing: - // EM_DISPLAYBAND - - case EM_CANUNDO: case SCI_CANUNDO: return pdoc->CanUndo() ? TRUE : FALSE; - case EM_UNDO: - Undo(); - SetLastXChosen(); - break; - - case EM_EMPTYUNDOBUFFER: case SCI_EMPTYUNDOBUFFER: pdoc->DeleteUndoHistory(); return 0; - case EM_GETFIRSTVISIBLELINE: case SCI_GETFIRSTVISIBLELINE: return topLine; - case EM_GETLINE: { - if (lParam == 0) { - return 0; - } - char *ptr = reinterpret_cast(lParam); - short *pBufSize = reinterpret_cast(lParam); - short bufSize = *pBufSize; - ptr[0] = '\0'; // If no characters copied, have to put a NUL into buffer - if (static_cast(wParam) > pdoc->LinesTotal()) { - return 0; - } - int lineStart = pdoc->LineStart(wParam); - int lineEnd = pdoc->LineStart(wParam + 1); - // The first word of the buffer is the size, in TCHARs, of the buffer - int iPlace = 0; - for (int iChar = lineStart; iChar < lineEnd && iPlace < bufSize; iChar++) { - ptr[iPlace++] = pdoc->CharAt(iChar); - } - return iPlace; - } - - case SCI_GETLINE: { // Simpler than EM_GETLINE, but with risk of overwriting the end of the buffer + case SCI_GETLINE: { // Risk of overwriting the end of the buffer if (lParam == 0) { return 0; } @@ -3713,42 +3570,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return iPlace; } - case EM_GETLINECOUNT: case SCI_GETLINECOUNT: if (pdoc->LinesTotal() == 0) return 1; else return pdoc->LinesTotal(); - case EM_GETMODIFY: case SCI_GETMODIFY: return !pdoc->IsSavePoint(); - case EM_GETRECT: - if (lParam == 0) - return 0; - *(reinterpret_cast(lParam)) = GetClientRectangle(); - break; - - case EM_GETSEL: - if (wParam) - *reinterpret_cast(wParam) = SelectionStart(); - if (lParam) - *reinterpret_cast(lParam) = SelectionEnd(); - return Platform::LongFromTwoShorts( - static_cast(SelectionStart()), - static_cast(SelectionEnd())); - - case EM_EXGETSEL: { - if (lParam == 0) - return 0; - CharacterRange *pCR = reinterpret_cast(lParam); - pCR->cpMin = SelectionStart(); - pCR->cpMax = SelectionEnd(); - } - break; - - case EM_SETSEL: case SCI_SETSEL: { int nStart = static_cast(wParam); int nEnd = static_cast(lParam); @@ -3762,55 +3592,28 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { } break; - case EM_EXSETSEL: { - if (lParam == 0) - return 0; - CharacterRange *pCR = reinterpret_cast(lParam); - selType = selStream; - if (pCR->cpMax == -1) { - SetSelection(pCR->cpMin, pdoc->Length()); - } else { - SetSelection(pCR->cpMin, pCR->cpMax); - } - EnsureCaretVisible(); - return pdoc->LineFromPosition(SelectionStart()); - } - - case EM_GETSELTEXT: case SCI_GETSELTEXT: { if (lParam == 0) return 0; + SelectionText selectedText; + CopySelectionRange(&selectedText); char *ptr = reinterpret_cast(lParam); - int selSize = SelectionRangeLength(); - char *text = CopySelectionRange(); int iChar = 0; - if (text) { - for (; iChar < selSize; iChar++) - ptr[iChar] = text[iChar]; + if (selectedText.len) { + for (; iChar < selectedText.len; iChar++) + ptr[iChar] = selectedText.s[iChar]; ptr[iChar] = '\0'; - delete []text; } else { ptr[0] = '\0'; } return iChar; } - case EM_LINEFROMCHAR: - if (static_cast(wParam) < 0) - wParam = SelectionStart(); - return pdoc->LineFromPosition(wParam); - - case EM_EXLINEFROMCHAR: - if (static_cast(lParam) < 0) - lParam = SelectionStart(); // Not specified, but probably OK - return pdoc->LineFromPosition(lParam); - case SCI_LINEFROMPOSITION: if (static_cast(wParam) < 0) return 0; return pdoc->LineFromPosition(wParam); - case EM_LINEINDEX: case SCI_POSITIONFROMLINE: if (static_cast(wParam) < 0) wParam = pdoc->LineFromPosition(SelectionStart()); @@ -3822,28 +3625,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { // return -1; return pdoc->LineStart(wParam); - case EM_LINELENGTH: { - if (static_cast(wParam) < 0) // Who use this anyway? - return 0; // Should be... Too complex to describe here, see MS specs! - if (static_cast(wParam) > pdoc->Length()) // Useful test, anyway... - return 0; - int line = pdoc->LineFromPosition(wParam); - int charsOnLine = 0; - for (int pos = pdoc->LineStart(line); pos < pdoc->LineStart(line + 1); pos++) { - if ((pdoc->CharAt(pos) != '\r') && (pdoc->CharAt(pos) != '\n')) - charsOnLine++; - } - return charsOnLine; - } - - // Replacement of the old Scintilla interpretation of EM_LINELENGTH + // Replacement of the old Scintilla interpretation of EM_LINELENGTH case SCI_LINELENGTH: if ((static_cast(wParam) < 0) || (static_cast(wParam) > pdoc->LineFromPosition(pdoc->Length()))) return 0; return pdoc->LineStart(wParam + 1) - pdoc->LineStart(wParam); - case EM_REPLACESEL: case SCI_REPLACESEL: { if (lParam == 0) return 0; @@ -3890,18 +3678,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETSEARCHFLAGS: return searchFlags; - case EM_LINESCROLL: case SCI_LINESCROLL: ScrollTo(topLine + lParam); HorizontalScrollTo(xOffset + wParam * vs.spaceWidth); return TRUE; - case EM_SCROLLCARET: case SCI_SCROLLCARET: EnsureCaretVisible(); break; - case EM_SETREADONLY: case SCI_SETREADONLY: pdoc->SetReadOnly(wParam); return TRUE; @@ -3909,33 +3694,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETREADONLY: return pdoc->IsReadOnly(); - case EM_CANPASTE: case SCI_CANPASTE: return CanPaste(); - case EM_CHARFROMPOS: { - if (lParam == 0) - return 0; - Point *ppt = reinterpret_cast(lParam); - int pos = PositionFromLocation(*ppt); - int line = pdoc->LineFromPosition(pos); - return Platform::LongFromTwoShorts( - static_cast(pos), static_cast < short > (line)); - } - - case EM_POSFROMCHAR: { - // The MS specs for this have changed 3 times: using the RichEdit 3 version - if (wParam == 0) - return 0; - Point *ppt = reinterpret_cast(wParam); - if (lParam < 0) { - *ppt = Point(0, 0); - } else { - *ppt = LocationFromPosition(lParam); - } - return 0; - } - case SCI_POINTXFROMPOSITION: if (lParam < 0) { return 0; @@ -3952,14 +3713,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return pt.y; } - case EM_FINDTEXT: - return FindText(iMessage, wParam, lParam); - - case EM_FINDTEXTEX: case SCI_FINDTEXT: - return FindText(iMessage, wParam, lParam); + return FindText(wParam, lParam); - case EM_GETTEXTRANGE: case SCI_GETTEXTRANGE: { if (lParam == 0) return 0; @@ -3974,53 +3730,20 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return len; // Not including NUL } - - - case EM_SELECTIONTYPE: -#ifdef SEL_EMPTY - if (currentPos == anchor) - return SEL_EMPTY; - else - return SEL_TEXT; -#else - return 0; -#endif - - case EM_HIDESELECTION: + case SCI_HIDESELECTION: hideSelection = wParam; Redraw(); break; - case EM_FORMATRANGE: case SCI_FORMATRANGE: return FormatRange(wParam, reinterpret_cast(lParam)); - case EM_GETMARGINS: - return Platform::LongFromTwoShorts(static_cast(vs.leftMarginWidth), - static_cast(vs.rightMarginWidth)); - case SCI_GETMARGINLEFT: return vs.leftMarginWidth; case SCI_GETMARGINRIGHT: return vs.rightMarginWidth; - case EM_SETMARGINS: -#ifdef EC_LEFTMARGIN - if (wParam & EC_LEFTMARGIN) { - vs.leftMarginWidth = Platform::LowShortFromLong(lParam); - } - if (wParam & EC_RIGHTMARGIN) { - vs.rightMarginWidth = Platform::HighShortFromLong(lParam); - } - if (wParam == EC_USEFONTINFO) { - vs.leftMarginWidth = vs.aveCharWidth / 2; - vs.rightMarginWidth = vs.aveCharWidth / 2; - } - InvalidateStyleRedraw(); -#endif - break; - case SCI_SETMARGINLEFT: vs.leftMarginWidth = lParam; InvalidateStyleRedraw(); @@ -4667,10 +4390,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_LINESONSCREEN: return LinesOnScreen(); - case SCI_USEPOPUP: - displayPopupMenu = wParam; - break; - case SCI_SETSELFORE: vs.selforeset = wParam; vs.selforeground.desired = Colour(lParam); @@ -4711,7 +4430,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_CLEARCMDKEY: kmap.AssignCmdKey(Platform::LowShortFromLong(wParam), - Platform::HighShortFromLong(wParam), WM_NULL); + Platform::HighShortFromLong(wParam), SCI_NULL); break; case SCI_CLEARALLCMDKEYS: @@ -4915,15 +4634,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETCURSOR: return cursorMode; -#ifdef MACRO_SUPPORT case SCI_STARTRECORD: - recordingMacro = 1; + recordingMacro = true; return 0; case SCI_STOPRECORD: - recordingMacro = 0; + recordingMacro = false; return 0; -#endif case SCI_MOVECARETINSIDEVIEW: MoveCaretInsideView(); diff --git a/contrib/src/stc/scintilla/src/Editor.h b/contrib/src/stc/scintilla/src/Editor.h index d42f5ad14a..a51fd86f91 100644 --- a/contrib/src/stc/scintilla/src/Editor.h +++ b/contrib/src/stc/scintilla/src/Editor.h @@ -50,6 +50,26 @@ public: int positions[maxLineLength+1]; }; +class SelectionText { +public: + char *s; + int len; + bool rectangular; + SelectionText() : s(0), len(0), rectangular(false) {} + ~SelectionText() { + Set(0, 0); + } + void Set(char *s_, int len_, bool rectangular_=false) { + delete []s; + s = s_; + if (s) + len = len_; + else + len = 0; + rectangular = rectangular_; + } +}; + /** */ class Editor : public DocWatcher { @@ -68,6 +88,7 @@ protected: // ScintillaBase subclass needs access to much of Editor bool stylesValid; ViewStyle vs; Palette palette; + int printMagnification; int printColourMode; int cursorMode; @@ -91,9 +112,6 @@ protected: // ScintillaBase subclass needs access to much of Editor Surface pixmapSelPattern; Surface pixmapIndentGuide; Surface pixmapIndentGuideHighlight; - // Intellimouse support - currently only implemented for Windows - unsigned int ucWheelScrollLines; - int cWheelDelta; ///< Wheel delta from roll KeyMap kmap; @@ -109,7 +127,6 @@ protected: // ScintillaBase subclass needs access to much of Editor bool dwelling; enum { selChar, selWord, selLine } selectionType; Point ptMouseLast; - bool firstExpose; bool inDragDrop; bool dropWentOutside; int posDrag; @@ -138,9 +155,7 @@ protected: // ScintillaBase subclass needs access to much of Editor int modEventMask; - char *dragChars; - int lenDrag; - bool dragIsRectangle; + SelectionText drag; enum { selStream, selRectangle, selRectangleFixed } selType; int xStartSelect; int xEndSelect; @@ -154,11 +169,7 @@ protected: // ScintillaBase subclass needs access to much of Editor int searchAnchor; - int displayPopupMenu; - -#ifdef MACRO_SUPPORT - int recordingMacro; -#endif + bool recordingMacro; int foldFlags; ContractionState cs; @@ -270,11 +281,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void NotifyModified(Document *document, DocModification mh, void *userData); void NotifyDeleted(Document *document, void *userData); void NotifyStyleNeeded(Document *doc, void *userData, int endPos); - - -#ifdef MACRO_SUPPORT void NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam); -#endif void PageMove(int direction, bool extend=false); void ChangeCaseOfSelection(bool makeUpperCase); @@ -289,16 +296,14 @@ protected: // ScintillaBase subclass needs access to much of Editor void Indent(bool forwards); - long FindText(unsigned int iMessage, unsigned long wParam, long lParam); + long FindText(unsigned long wParam, long lParam); void SearchAnchor(); long SearchText(unsigned int iMessage, unsigned long wParam, long lParam); long SearchInTarget(const char *text, int length); void GoToLine(int lineNo); char *CopyRange(int start, int end); - int SelectionRangeLength(); - char *CopySelectionRange(); - void CopySelectionIntoDrag(); + void CopySelectionRange(SelectionText *ss); void SetDragPosition(int newPos); void DisplayCursor(Window::Cursor c); virtual void StartDrag(); diff --git a/contrib/src/stc/scintilla/src/KeyWords.cxx b/contrib/src/stc/scintilla/src/KeyWords.cxx index 0728580fdf..756037a9a4 100644 --- a/contrib/src/stc/scintilla/src/KeyWords.cxx +++ b/contrib/src/stc/scintilla/src/KeyWords.cxx @@ -108,22 +108,26 @@ LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null"); int wxForceScintillaLexers(void) { extern LexerModule lmAda; extern LexerModule lmAVE; + extern LexerModule lmBatch; extern LexerModule lmConf; - extern LexerModule lmDiff; - extern LexerModule lmLatex; - extern LexerModule lmPascal; extern LexerModule lmCPP; - extern LexerModule lmHTML; - extern LexerModule lmXML; - extern LexerModule lmProps; + extern LexerModule lmDiff; + extern LexerModule lmEiffel; + extern LexerModule lmEiffelkw; extern LexerModule lmErrorList; + extern LexerModule lmHTML; + extern LexerModule lmLatex; + extern LexerModule lmLISP; + extern LexerModule lmLua; extern LexerModule lmMake; - extern LexerModule lmBatch; + extern LexerModule lmPascal; extern LexerModule lmPerl; + extern LexerModule lmProps; extern LexerModule lmPython; + extern LexerModule lmRuby; extern LexerModule lmSQL; extern LexerModule lmVB; - extern LexerModule lmRuby; + extern LexerModule lmXML; if ( &lmAda @@ -143,7 +147,12 @@ int wxForceScintillaLexers(void) { && &lmPython && &lmSQL && &lmVB - && &lmRuby + && &lmRuby + && &lmEiffel + && &lmEiffelkw + && &lmLISP + && &lmLua + && &lmNull ) { return 1; diff --git a/contrib/src/stc/scintilla/src/LexCPP.cxx b/contrib/src/stc/scintilla/src/LexCPP.cxx index 19aa329baf..b0471b8e52 100644 --- a/contrib/src/stc/scintilla/src/LexCPP.cxx +++ b/contrib/src/stc/scintilla/src/LexCPP.cxx @@ -15,317 +15,255 @@ #include "PropSet.h" #include "Accessor.h" +#include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" -static bool IsOKBeforeRE(int ch) { +static bool IsOKBeforeRE(const int ch) { return (ch == '(') || (ch == '=') || (ch == ','); } -static void getRange(unsigned int start, - unsigned int end, - Accessor &styler, - char *s, - unsigned int len) { - unsigned int i = 0; - while ((i < end - start + 1) && (i < len-1)) { - s[i] = styler[start + i]; - i++; - } - s[i] = '\0'; -} - -inline bool IsASpace(int ch) { - return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); -} - -inline bool IsAWordChar(int ch) { +inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } -inline bool IsAWordStart(int ch) { +inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } -inline bool IsADigit(int ch) { - return (ch >= '0') && (ch <= '9'); +inline bool IsADoxygenChar(const int ch) { + return (islower(ch) || ch == '$' || ch == '@' || + ch == '\\' || ch == '&' || ch == '<' || + ch == '>' || ch == '#' || ch == '{' || + ch == '}' || ch == '[' || ch == ']'); } -// All languages handled so far can treat all characters >= 0x80 as one class -// which just continues the current token or starts an identifier if in default. -// DBCS treated specially as the second character can be < 0x80 and hence -// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 -class ColouriseContext { - Accessor &styler; - int lengthDoc; - int currentPos; - ColouriseContext& operator=(const ColouriseContext&) { - return *this; - } -public: - bool atEOL; - int state; - int chPrev; - int ch; - int chNext; +inline bool IsStateComment(const int state) { + return ((state == SCE_C_COMMENT) || + (state == SCE_C_COMMENTLINE) || + (state == SCE_C_COMMENTDOC) || + (state == SCE_C_COMMENTDOCKEYWORD) || + (state == SCE_C_COMMENTDOCKEYWORDERROR)); +} - ColouriseContext(unsigned int startPos, int length, - int initStyle, Accessor &styler_) : - styler(styler_), - lengthDoc(startPos + length), - currentPos(startPos), - atEOL(false), - state(initStyle), - chPrev(0), - ch(0), - chNext(0) { - styler.StartAt(startPos); - styler.StartSegment(startPos); - int pos = currentPos; - ch = static_cast(styler.SafeGetCharAt(pos)); - if (styler.IsLeadByte(static_cast(ch))) { - pos++; - ch = ch << 8; - ch |= static_cast(styler.SafeGetCharAt(pos)); - } - chNext = static_cast(styler.SafeGetCharAt(pos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(pos+2)); - } - atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - } - void Complete() { - styler.ColourTo(currentPos - 1, state); - } - bool More() { - return currentPos <= lengthDoc; - } - void Forward() { - // A lot of this is repeated from the constructor - TODO: merge code - chPrev = ch; - currentPos++; - if (ch >= 0x100) - currentPos++; - ch = chNext; - chNext = static_cast(styler.SafeGetCharAt(currentPos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(currentPos + 2)); - } - // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) - // Avoid triggering two times on Dos/Win - // End of line - atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - } - void ChangeState(int state_) { - state = state_; - } - void SetState(int state_) { - styler.ColourTo(currentPos - 1, state); - state = state_; - } - void ForwardSetState(int state_) { - Forward(); - styler.ColourTo(currentPos - 1, state); - state = state_; - } - void GetCurrent(char *s, int len) { - getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len); - } - int LengthCurrent() { - return currentPos - styler.GetStartSegment(); - } - bool Match(char ch0) { - return ch == ch0; - } - bool Match(char ch0, char ch1) { - return (ch == ch0) && (chNext == ch1); - } - bool Match(const char *s) { - if (ch != *s) - return false; - s++; - if (chNext != *s) - return false; - s++; - for (int n=2; *s; n++) { - if (*s != styler.SafeGetCharAt(currentPos+n)) - return false; - s++; - } - return true; - } -}; +inline bool IsStateString(const int state) { + return ((state == SCE_C_STRING) || (state == SCE_C_VERBATIM)); +} static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor"); - if (initStyle == SCE_C_STRINGEOL) // Does not leak onto next line + // Do not leak onto next line + if (initStyle == SCE_C_STRINGEOL) initStyle = SCE_C_DEFAULT; int chPrevNonWhite = ' '; int visibleChars = 0; + int noDocChars = 0; bool lastWordWasUUID = false; - ColouriseContext cc(startPos, length, initStyle, styler); - - for (; cc.More(); cc.Forward()) { + StyleContext sc(startPos, length, initStyle, styler); - if (cc.state == SCE_C_STRINGEOL) { - if (cc.atEOL) { - cc.SetState(SCE_C_DEFAULT); + for (; sc.More(); sc.Forward()) { + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.Match("\\\n")) { + sc.Forward(); + sc.Forward(); + continue; } - } else if (cc.state == SCE_C_OPERATOR) { - cc.SetState(SCE_C_DEFAULT); - } else if (cc.state == SCE_C_NUMBER) { - if (!IsAWordChar(cc.ch)) { - cc.SetState(SCE_C_DEFAULT); + if (sc.Match("\\\r\n")) { + sc.Forward(); + sc.Forward(); + sc.Forward(); + continue; } - } else if (cc.state == SCE_C_IDENTIFIER) { - if (!IsAWordChar(cc.ch) || (cc.ch == '.')) { + } + + // Determine if the current state should terminate. + if (sc.state == SCE_C_OPERATOR) { + sc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); + } + } else if (sc.state == SCE_C_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { char s[100]; - cc.GetCurrent(s, sizeof(s)); + sc.GetCurrent(s, sizeof(s)); if (keywords.InList(s)) { lastWordWasUUID = strcmp(s, "uuid") == 0; - cc.ChangeState(SCE_C_WORD); + sc.ChangeState(SCE_C_WORD); } else if (keywords2.InList(s)) { - cc.ChangeState(SCE_C_WORD2); + sc.ChangeState(SCE_C_WORD2); } - cc.SetState(SCE_C_DEFAULT); + sc.SetState(SCE_C_DEFAULT); } - } if (cc.state == SCE_C_PREPROCESSOR) { + } else if (sc.state == SCE_C_PREPROCESSOR) { if (stylingWithinPreprocessor) { - if (IsASpace(cc.ch)) { - cc.SetState(SCE_C_DEFAULT); + if (IsASpace(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); } } else { - if (cc.atEOL && (cc.chPrev != '\\')) { - cc.SetState(SCE_C_DEFAULT); + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); } } - } else if (cc.state == SCE_C_COMMENT) { - if (cc.Match('*', '/')) { - cc.Forward(); - cc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_COMMENT) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } + } else if (sc.state == SCE_C_COMMENTDOC) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if ((sc.ch == '@' || sc.ch == '\\') && (noDocChars == 0)) { + sc.SetState(SCE_C_COMMENTDOCKEYWORD); + } else if (sc.atLineEnd) { + noDocChars = 0; + } else if (!isspace(sc.ch) && (sc.ch != '*')) { + noDocChars++; } - } else if (cc.state == SCE_C_COMMENTDOC) { - if (cc.Match('*', '/')) { - cc.Forward(); - cc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_COMMENTLINE || sc.state == SCE_C_COMMENTLINEDOC) { + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); + visibleChars = 0; } - } else if (cc.state == SCE_C_COMMENTLINE || cc.state == SCE_C_COMMENTLINEDOC) { - if (cc.ch == '\r' || cc.ch == '\n') { - cc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_COMMENTDOCKEYWORD) { + if (sc.Match('*', '/')) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (!IsADoxygenChar(sc.ch)) { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + if (!isspace(sc.ch) || !keywords3.InList(s+1)) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + } + sc.SetState(SCE_C_COMMENTDOC); } - } else if (cc.state == SCE_C_STRING) { - if (cc.ch == '\\') { - if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') { - cc.Forward(); + } else if (sc.state == SCE_C_STRING) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); } - } else if (cc.ch == '\"') { - cc.ForwardSetState(SCE_C_DEFAULT); - } else if ((cc.atEOL) && (cc.chPrev != '\\')) { - cc.ChangeState(SCE_C_STRINGEOL); + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + sc.ForwardSetState(SCE_C_DEFAULT); + visibleChars = 0; } - } else if (cc.state == SCE_C_CHARACTER) { - if ((cc.ch == '\r' || cc.ch == '\n') && (cc.chPrev != '\\')) { - cc.ChangeState(SCE_C_STRINGEOL); - } else if (cc.ch == '\\') { - if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') { - cc.Forward(); + } else if (sc.state == SCE_C_CHARACTER) { + if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + sc.ForwardSetState(SCE_C_DEFAULT); + visibleChars = 0; + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); } - } else if (cc.ch == '\'') { - cc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_C_DEFAULT); } - } else if (cc.state == SCE_C_REGEX) { - if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == '/') { - cc.ForwardSetState(SCE_C_DEFAULT); - } else if (cc.ch == '\\') { + } else if (sc.state == SCE_C_REGEX) { + if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == '/') { + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.ch == '\\') { // Gobble up the quoted character - if (cc.chNext == '\\' || cc.chNext == '/') { - cc.Forward(); + if (sc.chNext == '\\' || sc.chNext == '/') { + sc.Forward(); } } - } else if (cc.state == SCE_C_VERBATIM) { - if (cc.ch == '\"') { - if (cc.chNext == '\"') { - cc.Forward(); + } else if (sc.state == SCE_C_VERBATIM) { + if (sc.ch == '\"') { + if (sc.chNext == '\"') { + sc.Forward(); } else { - cc.ForwardSetState(SCE_C_DEFAULT); + sc.ForwardSetState(SCE_C_DEFAULT); } } - } else if (cc.state == SCE_C_UUID) { - if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == ')') { - cc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_UUID) { + if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') { + sc.SetState(SCE_C_DEFAULT); } } - if (cc.state == SCE_C_DEFAULT) { - if (cc.Match('@', '\"')) { - cc.SetState(SCE_C_VERBATIM); - cc.Forward(); - } else if (IsADigit(cc.ch) || (cc.ch == '.' && IsADigit(cc.chNext))) { + // Determine if a new state should be entered. + if (sc.state == SCE_C_DEFAULT) { + if (sc.Match('@', '\"')) { + sc.SetState(SCE_C_VERBATIM); + sc.Forward(); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { if (lastWordWasUUID) { - cc.SetState(SCE_C_UUID); + sc.SetState(SCE_C_UUID); lastWordWasUUID = false; } else { - cc.SetState(SCE_C_NUMBER); + sc.SetState(SCE_C_NUMBER); } - } else if (IsAWordStart(cc.ch) || (cc.ch == '@')) { + } else if (IsAWordStart(sc.ch) || (sc.ch == '@')) { if (lastWordWasUUID) { - cc.SetState(SCE_C_UUID); + sc.SetState(SCE_C_UUID); lastWordWasUUID = false; } else { - cc.SetState(SCE_C_IDENTIFIER); + sc.SetState(SCE_C_IDENTIFIER); } - } else if (cc.Match('/', '*')) { - if (cc.Match("/**") || cc.Match("/*!")) // Support of Qt/Doxygen doc. style - cc.SetState(SCE_C_COMMENTDOC); - else - cc.SetState(SCE_C_COMMENT); - cc.Forward(); // Eat the * so it isn't used for the end of the comment - } else if (cc.Match('/', '/')) { - if (cc.Match("///") || cc.Match("//!")) // Support of Qt/Doxygen doc. style - cc.SetState(SCE_C_COMMENTLINEDOC); + } else if (sc.Match('/', '*')) { + if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style + noDocChars = 0; + sc.SetState(SCE_C_COMMENTDOC); + } else { + sc.SetState(SCE_C_COMMENT); + } + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + if (sc.Match("///") || sc.Match("//!")) // Support of Qt/Doxygen doc. style + sc.SetState(SCE_C_COMMENTLINEDOC); else - cc.SetState(SCE_C_COMMENTLINE); - } else if (cc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) { - cc.SetState(SCE_C_REGEX); - } else if (cc.ch == '\"') { - cc.SetState(SCE_C_STRING); - } else if (cc.ch == '\'') { - cc.SetState(SCE_C_CHARACTER); - } else if (cc.ch == '#' && visibleChars == 0) { + sc.SetState(SCE_C_COMMENTLINE); + } else if (sc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) { + sc.SetState(SCE_C_REGEX); + } else if (sc.ch == '\"') { + sc.SetState(SCE_C_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_C_CHARACTER); + } else if (sc.ch == '#' && visibleChars == 0) { // Preprocessor commands are alone on their line - cc.SetState(SCE_C_PREPROCESSOR); + sc.SetState(SCE_C_PREPROCESSOR); // Skip whitespace between # and preprocessor word do { - cc.Forward(); - } while (IsASpace(cc.ch) && cc.More()); - } else if (isoperator(static_cast(cc.ch))) { - cc.SetState(SCE_C_OPERATOR); + sc.Forward(); + } while ((sc.ch == ' ') && (sc.ch == '\t') && sc.More()); + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); + } + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_C_OPERATOR); } } - if (cc.atEOL) { + + if (sc.atLineEnd) { // Reset states to begining of colourise so no surprises // if different sets of lines lexed. chPrevNonWhite = ' '; visibleChars = 0; lastWordWasUUID = false; } - if (!IsASpace(cc.ch)) { - chPrevNonWhite = cc.ch; + if (!IsASpace(sc.ch)) { + chPrevNonWhite = sc.ch; visibleChars++; } } - cc.Complete(); + sc.Complete(); } static void FoldCppDoc(unsigned int startPos, int length, int initStyle, WordList *[], diff --git a/contrib/src/stc/scintilla/src/LexCrontab.cxx b/contrib/src/stc/scintilla/src/LexCrontab.cxx new file mode 100644 index 0000000000..94a172cfca --- /dev/null +++ b/contrib/src/stc/scintilla/src/LexCrontab.cxx @@ -0,0 +1,204 @@ +// Scintilla source code edit control +/** @file LexCrontab.cxx + ** Lexer to use with extended crontab files used by a powerful + ** Windows scheduler/event monitor/automation manager nnCron. + ** (http://nemtsev.virtualave.net/) + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList +*keywordLists[], Accessor &styler) +{ + int state = SCE_NNCRONTAB_DEFAULT; + char chNext = styler[startPos]; + int lengthDoc = startPos + length; + // create a buffer large enough to take the largest chunk... + char *buffer = new char[length]; + int bufferCount = 0; + // used when highliting environment variables inside quoted string: + bool insideString = false; + + // this assumes that we have 3 keyword list in conf.properties + WordList §ion = *keywordLists[0]; + WordList &keyword = *keywordLists[1]; + WordList &modifier = *keywordLists[2]; + + // go through all provided text segment + // using the hand-written state machine shown below + styler.StartAt(startPos); + styler.StartSegment(startPos); + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i++; + continue; + } + switch(state) { + case SCE_NNCRONTAB_DEFAULT: + if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { + // whitespace is simply ignored here... + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + break; + } else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') { + // signals the start of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + else if( ch == '\\' && styler.SafeGetCharAt(i+1) == ' ') { + // signals the start of an extended comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == '#' ) { + // signals the start of a plain comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') { + // signals the end of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } else if( ch == '"') { + state = SCE_NNCRONTAB_STRING; + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + } else if( ch == '%') { + // signals environment variables + state = SCE_NNCRONTAB_ENVIRONMENT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + } else if( ch == '*' ) { + // signals an asterisk + // no state jump necessary for this simple case... + styler.ColourTo(i,SCE_NNCRONTAB_ASTERISK); + } else if( isalpha(ch) || ch == '<' ) { + // signals the start of an identifier + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_IDENTIFIER; + } else if( isdigit(ch) ) { + // signals the start of a number + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_NUMBER; + } else { + // style it the default style.. + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + } + break; + + case SCE_NNCRONTAB_COMMENT: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } + break; + + case SCE_NNCRONTAB_TASK: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + break; + + case SCE_NNCRONTAB_STRING: + if( ch == '%' ) { + state = SCE_NNCRONTAB_ENVIRONMENT; + insideString = true; + styler.ColourTo(i-1,SCE_NNCRONTAB_STRING); + break; + } + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || + (ch == '\n') || (ch == '\r') ) { + state = SCE_NNCRONTAB_DEFAULT; + } + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + break; + + case SCE_NNCRONTAB_ENVIRONMENT: + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( ch == '%' && insideString ) { + state = SCE_NNCRONTAB_STRING; + insideString = false; + break; + } + if( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\') + || (ch == '\n') || (ch == '\r') ) { + state = SCE_NNCRONTAB_DEFAULT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + break; + } + styler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT); + break; + + case SCE_NNCRONTAB_IDENTIFIER: + // stay in CONF_IDENTIFIER state until we find a non-alphanumeric + if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || + (ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + + // check if the buffer contains a keyword, + // and highlight it if it is a keyword... + if(section.InList(buffer)) { + styler.ColourTo(i,SCE_NNCRONTAB_SECTION ); + } else if(keyword.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD ); + } // else if(strchr(buffer,'/') || strchr(buffer,'.')) { + // styler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION); + // } + else if(modifier.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER ); + } else { + styler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT); + } + // push back the faulty character + chNext = styler[i--]; + } + break; + + case SCE_NNCRONTAB_NUMBER: + // stay in CONF_NUMBER state until we find a non-numeric + if( isdigit(ch) /* || ch == '.' */ ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + // Colourize here... (normal number) + styler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER); + // push back a character + chNext = styler[i--]; + } + break; + } + } +} + +LexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, "nncrontab"); diff --git a/contrib/src/stc/scintilla/src/LexEiffel.cxx b/contrib/src/stc/scintilla/src/LexEiffel.cxx index 1296fb2450..6470943208 100644 --- a/contrib/src/stc/scintilla/src/LexEiffel.cxx +++ b/contrib/src/stc/scintilla/src/LexEiffel.cxx @@ -16,6 +16,7 @@ #include "PropSet.h" #include "Accessor.h" +#include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" @@ -31,23 +32,6 @@ inline bool isEiffelOperator(unsigned int ch) { ch == '!' || ch == '@' || ch == '?'; } -static void getRangeLowered(unsigned int start, - unsigned int end, - Accessor &styler, - char *s, - unsigned int len) { - unsigned int i = 0; - while ((i < end - start + 1) && (i < len-1)) { - s[i] = static_cast(tolower(styler[start + i])); - i++; - } - s[i] = '\0'; -} - -inline bool IsASpace(unsigned int ch) { - return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); -} - inline bool IsAWordChar(unsigned int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } @@ -56,81 +40,6 @@ inline bool IsAWordStart(unsigned int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } -inline bool IsADigit(unsigned int ch) { - return (ch >= '0') && (ch <= '9'); -} - -// All languages handled so far can treat all characters >= 0x80 as one class -// which just continues the current token or starts an identifier if in default. -// DBCS treated specially as the second character can be < 0x80 and hence -// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 -class xColouriseContext { - Accessor &styler; - int lengthDoc; - int currentPos; - xColouriseContext& operator=(const xColouriseContext&) { - return *this; - } -public: - int state; - unsigned int chPrev; - unsigned int ch; - unsigned int chNext; - - xColouriseContext(unsigned int startPos, int length, - int initStyle, Accessor &styler_) : - styler(styler_), - lengthDoc(startPos + length), - currentPos(startPos), - state(initStyle), - chPrev(0), - ch(0), - chNext(0) { - styler.StartAt(startPos); - styler.StartSegment(startPos); - int pos = currentPos; - ch = static_cast(styler.SafeGetCharAt(pos)); - if (styler.IsLeadByte(static_cast(ch))) { - pos++; - ch = ch << 8; - ch |= static_cast(styler.SafeGetCharAt(pos)); - } - chNext = static_cast(styler.SafeGetCharAt(pos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(pos+2)); - } - } - void Complete() { - styler.ColourTo(currentPos - 1, state); - } - bool More() { - return currentPos <= lengthDoc; - } - void Forward() { - chPrev = ch; - currentPos++; - if (ch >= 0x100) - currentPos++; - ch = chNext; - chNext = static_cast(styler.SafeGetCharAt(currentPos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(currentPos + 2)); - } - } - void ChangeState(int state_) { - state = state_; - } - void SetState(int state_) { - styler.ColourTo(currentPos - 1, state); - state = state_; - } - void GetCurrentLowered(char *s, int len) { - getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len); - } -}; - static void ColouriseEiffelDoc(unsigned int startPos, int length, int initStyle, @@ -139,68 +48,68 @@ static void ColouriseEiffelDoc(unsigned int startPos, WordList &keywords = *keywordlists[0]; - xColouriseContext lc(startPos, length, initStyle, styler); + StyleContext sc(startPos, length, initStyle, styler); - for (; lc.More(); lc.Forward()) { + for (; sc.More(); sc.Forward()) { - if (lc.state == SCE_EIFFEL_STRINGEOL) { - if (lc.ch != '\r' && lc.ch != '\n') { - lc.SetState(SCE_EIFFEL_DEFAULT); + if (sc.state == SCE_EIFFEL_STRINGEOL) { + if (sc.ch != '\r' && sc.ch != '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_OPERATOR) { - lc.SetState(SCE_EIFFEL_DEFAULT); - } else if (lc.state == SCE_EIFFEL_WORD) { - if (!IsAWordChar(lc.ch)) { + } else if (sc.state == SCE_EIFFEL_OPERATOR) { + sc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_WORD) { + if (!IsAWordChar(sc.ch)) { char s[100]; - lc.GetCurrentLowered(s, sizeof(s)); + sc.GetCurrentLowered(s, sizeof(s)); if (!keywords.InList(s)) { - lc.ChangeState(SCE_EIFFEL_IDENTIFIER); + sc.ChangeState(SCE_EIFFEL_IDENTIFIER); } - lc.SetState(SCE_EIFFEL_DEFAULT); + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_NUMBER) { - if (!IsAWordChar(lc.ch)) { - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_COMMENTLINE) { - if (lc.ch == '\r' || lc.ch == '\n') { - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_COMMENTLINE) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_STRING) { - if (lc.ch == '%') { - lc.Forward(); - } else if (lc.ch == '\"') { - lc.Forward(); - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_STRING) { + if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\"') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_CHARACTER) { - if (lc.ch == '\r' || lc.ch == '\n') { - lc.SetState(SCE_EIFFEL_STRINGEOL); - } else if (lc.ch == '%') { - lc.Forward(); - } else if (lc.ch == '\'') { - lc.Forward(); - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_CHARACTER) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_STRINGEOL); + } else if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\'') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); } } - if (lc.state == SCE_EIFFEL_DEFAULT) { - if (lc.ch == '-' && lc.chNext == '-') { - lc.SetState(SCE_EIFFEL_COMMENTLINE); - } else if (lc.ch == '\"') { - lc.SetState(SCE_EIFFEL_STRING); - } else if (lc.ch == '\'') { - lc.SetState(SCE_EIFFEL_CHARACTER); - } else if (IsADigit(lc.ch) || (lc.ch == '.')) { - lc.SetState(SCE_EIFFEL_NUMBER); - } else if (IsAWordStart(lc.ch)) { - lc.SetState(SCE_EIFFEL_WORD); - } else if (isEiffelOperator(lc.ch)) { - lc.SetState(SCE_EIFFEL_OPERATOR); + if (sc.state == SCE_EIFFEL_DEFAULT) { + if (sc.ch == '-' && sc.chNext == '-') { + sc.SetState(SCE_EIFFEL_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_EIFFEL_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_EIFFEL_CHARACTER); + } else if (IsADigit(sc.ch) || (sc.ch == '.')) { + sc.SetState(SCE_EIFFEL_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_EIFFEL_WORD); + } else if (isEiffelOperator(sc.ch)) { + sc.SetState(SCE_EIFFEL_OPERATOR); } } } - lc.Complete(); + sc.Complete(); } static bool IsEiffelComment(Accessor &styler, int pos, int len) { diff --git a/contrib/src/stc/scintilla/src/LexHTML.cxx b/contrib/src/stc/scintilla/src/LexHTML.cxx index c28a432795..3a03096f8a 100644 --- a/contrib/src/stc/scintilla/src/LexHTML.cxx +++ b/contrib/src/stc/scintilla/src/LexHTML.cxx @@ -1,7 +1,7 @@ // Scintilla source code edit control /** @file LexHTML.cxx ** Lexer for HTML. - **/ + **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. @@ -23,16 +23,16 @@ #define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START) #define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START) -enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML }; +enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML, eScriptSGML, eScriptSGMLblock }; enum { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc }; static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, int prevValue) { char s[30 + 1]; - s[0] = '\0'; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; //Platform::DebugPrintf("Scripting indicator [%s]\n", s); if (strstr(s, "src")) // External script return eScriptNone; @@ -55,11 +55,11 @@ static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigne static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) { int iResult = 0; char s[30 + 1]; - s[0] = '\0'; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; if (0 == strncmp(s, "php", 3)) { iResult = 3; } @@ -68,22 +68,21 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u } static int ScriptOfState(int state) { - int scriptLanguage; - if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) { - scriptLanguage = eScriptPython; + return eScriptPython; } else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) { - scriptLanguage = eScriptVBS; + return eScriptVBS; } else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) { - scriptLanguage = eScriptJS; + return eScriptJS; } else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) { - scriptLanguage = eScriptPHP; + return eScriptPHP; + } else if ((state >= SCE_H_SGML_DEFAULT) && (state <= SCE_H_SGML_BLOCK_DEFAULT)) { + return eScriptSGML; + } else if (state == SCE_H_SGML_BLOCK_DEFAULT) { + return eScriptSGMLblock; } else { - // scriptLanguage = defaultScript; - scriptLanguage = eScriptNone; + return eScriptNone; } - - return scriptLanguage; } static int statePrintForState(int state, int inScriptType) { @@ -174,11 +173,11 @@ static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &k chAttr = SCE_H_NUMBER; } else { char s[30 + 1]; - s[0] = '\0'; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) chAttr = SCE_H_ATTRIBUTE; } @@ -195,18 +194,14 @@ static int classifyTagHTML(unsigned int start, unsigned int end, unsigned int i = 0; for (unsigned int cPos = start; cPos <= end && i < 30; cPos++) { char ch = styler[cPos]; - if (ch != '<') + if ((ch != '<') && (ch != '/')) s[i++] = static_cast(tolower(ch)); } s[i] = '\0'; bool isScript = false; char chAttr = SCE_H_TAGUNKNOWN; - if (s[0] == '!' && s[1] == '-' && s[2] == '-') { //Comment - chAttr = SCE_H_COMMENT; - } else if (strcmp(s, "![cdata[") == 0) { // In lower case because already converted - chAttr = SCE_H_CDATA; - } else if (s[0] == '!') { - chAttr = SCE_H_SGML; + if (s[0] == '!') { + chAttr = SCE_H_SGML_DEFAULT; } else if (s[0] == '/') { // Closing tag if (keywords.InList(s + 1)) chAttr = SCE_H_TAG; @@ -231,10 +226,11 @@ static void classifyWordHTJS(unsigned int start, unsigned int end, chAttr = SCE_HJ_NUMBER; else { char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) chAttr = SCE_HJ_KEYWORD; } @@ -248,10 +244,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw chAttr = SCE_HB_NUMBER; else { char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) { chAttr = SCE_HB_WORD; if (strcmp(s, "rem") == 0) @@ -268,10 +265,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, int inScriptType) { bool wordIsNumber = isdigit(styler[start]); char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; - s[i + 1] = '\0'; } + s[i] = '\0'; char chAttr = SCE_HP_IDENTIFIER; if (0 == strcmp(prevWord, "class")) chAttr = SCE_HP_CLASSNAME; @@ -294,16 +292,37 @@ static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &ke chAttr = SCE_HPHP_NUMBER; else { char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) chAttr = SCE_HPHP_WORD; } styler.ColourTo(end, chAttr); } +static bool isWordHSGML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + return keywords.InList(s); +} + +static bool isWordCdata(unsigned int start, unsigned int end, Accessor &styler) { + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + return (0 == strcmp(s, "[CDATA[")); +} + // Return the first state to reach when entering a scripting language static int StateForScript(int scriptLanguage) { int Result; @@ -320,6 +339,9 @@ static int StateForScript(int scriptLanguage) { case eScriptXML: Result = SCE_H_TAGUNKNOWN; break; + case eScriptSGML: + Result = SCE_H_SGML_DEFAULT; + break; default : Result = SCE_HJ_START; break; @@ -331,6 +353,10 @@ inline bool ishtmlwordchar(char ch) { return isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#'; } +inline bool issgmlwordchar(char ch) { + return isalnum(ch) || ch == '.' || ch == '_' || ch == ':' || ch == '!' || ch == '#' || ch == '['; +} + static bool InTagState(int state) { return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN || state == SCE_H_SCRIPT || @@ -339,6 +365,10 @@ static bool InTagState(int state) { state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING; } +static bool IsCommentState(const int state) { + return state == SCE_H_COMMENT || state == SCE_H_SGML_COMMENT; +} + static bool isLineEnd(char ch) { return ch == '\r' || ch == '\n'; } @@ -348,23 +378,23 @@ static bool isOKBeforeRE(char ch) { } static bool isPHPStringState(int state) { - return - (state == SCE_HPHP_HSTRING) || - (state == SCE_HPHP_SIMPLESTRING) || - (state == SCE_HPHP_HSTRING_VARIABLE); + return + (state == SCE_HPHP_HSTRING) || + (state == SCE_HPHP_SIMPLESTRING) || + (state == SCE_HPHP_HSTRING_VARIABLE); } static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { - WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; // SGML (DTD) keywords // Lexer for HTML requires more lexical states (7 bits worth) than most lexers - styler.StartAt(startPos, 127); + styler.StartAt(startPos, STYLE_MAX); char prevWord[200]; prevWord[0] = '\0'; int StateToPrint = initStyle; @@ -374,49 +404,51 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (InTagState(state)) { while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) { startPos--; - length++; + length++; } state = SCE_H_DEFAULT; } - styler.StartAt(startPos, 127); + styler.StartAt(startPos, STYLE_MAX); - int lineState = eScriptVBS; int lineCurrent = styler.GetLine(startPos); - if (lineCurrent > 0) + int lineState; + if (lineCurrent > 0) { lineState = styler.GetLineState(lineCurrent); - int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type - bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag - bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag - int defaultScript = (lineState >> 4) & 0x0F; // 4 bits of script name - int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits of state + } else { + // Default client and ASP scripting language is JavaScript + lineState = eScriptJS << 8; + lineState |= styler.GetPropertyInt("asp.default.language", eScriptJS) << 4; + } + int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type + bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag + bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag + int aspScript = (lineState >> 4) & 0x0F; // 4 bits of script name + int clientScript = (lineState >> 8) & 0x0F; // 4 bits of script name + int beforePreProc = (lineState >> 12) & 0xFF; // 8 bits of state int scriptLanguage = ScriptOfState(state); - bool fold = styler.GetPropertyInt("fold"); - bool foldHTML = styler.GetPropertyInt("fold.html",0); - bool foldCompact = styler.GetPropertyInt("fold.compact",1); - - fold = foldHTML && fold; + const bool foldHTML = styler.GetPropertyInt("fold.html", 0); + const bool fold = foldHTML && styler.GetPropertyInt("fold"); + const bool foldCompact = styler.GetPropertyInt("fold.compact", 1); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; - int visibleChars; - - visibleChars = 0; + int visibleChars = 0; char chPrev = ' '; char ch = ' '; char chPrevNonWhite = ' '; styler.StartSegment(startPos); - int lengthDoc = startPos + length; + const int lengthDoc = startPos + length; for (int i = startPos; i < lengthDoc; i++) { - char chPrev2 = chPrev; + const char chPrev2 = chPrev; chPrev = ch; if (ch != ' ' && ch != '\t') chPrevNonWhite = ch; ch = styler[i]; char chNext = styler.SafeGetCharAt(i + 1); - char chNext2 = styler.SafeGetCharAt(i + 2); + const char chNext2 = styler.SafeGetCharAt(i + 2); // Handle DBCS codepages if (styler.IsLeadByte(ch)) { @@ -451,18 +483,21 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) { // check if the number of tabs is lower than the level int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8; - for (int j = 0;Findlevel > 0;j++) { + for (int j = 0; Findlevel > 0; j++) { char chTmp = styler.SafeGetCharAt(i + j + 1); if (chTmp == '\t') { Findlevel -= 8; - } else if (chTmp == ' ') { + } else if (chTmp == ' ') { Findlevel--; - } else break; + } else { + break; + } } if (Findlevel > 0) { levelCurrent -= Findlevel / 8; - if (Findlevel % 8) levelCurrent--; + if (Findlevel % 8) + levelCurrent--; } } } @@ -487,11 +522,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } lineCurrent++; styler.SetLineState(lineCurrent, - ((inScriptType & 0x03) << 0) | - ((tagOpened & 0x01) << 2) | - ((tagClosing & 0x01) << 3) | - ((defaultScript & 0x0F) << 4) | - ((beforePreProc & 0xFF) << 8)); + ((inScriptType & 0x03) << 0) | + ((tagOpened & 0x01) << 2) | + ((tagClosing & 0x01) << 3) | + ((aspScript & 0x0F) << 4) | + ((clientScript & 0x0F) << 8) | + ((beforePreProc & 0xFF) << 12)); } // generic end of script processing @@ -503,9 +539,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_H_SINGLESTRING: case SCE_HJ_COMMENT: case SCE_HJ_COMMENTDOC: - // SCE_HJ_COMMENTLINE removed as this is a common thing done to hide - // the end of script marker from some JS interpreters. - //case SCE_HJ_COMMENTLINE: + // SCE_HJ_COMMENTLINE removed as this is a common thing done to hide + // the end of script marker from some JS interpreters. + //case SCE_HJ_COMMENTLINE: case SCE_HJ_DOUBLESTRING: case SCE_HJ_SINGLESTRING: case SCE_HB_STRING: @@ -514,29 +550,31 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_HP_TRIPLEDOUBLE: break; default : - // maybe we should check here if it's a tag and if it's SCRIPT + // closing tag of the script (it's a closing HTML tag anyway) styler.ColourTo(i - 1, StateToPrint); state = SCE_H_TAGUNKNOWN; inScriptType = eHtml; scriptLanguage = eScriptNone; + clientScript = eScriptJS; i += 2; - // unfold closing script - levelCurrent--; + visibleChars += 2; + tagClosing = true; continue; } } ///////////////////////////////////// // handle the start of PHP pre-processor = Non-HTML - else if ((state != SCE_H_ASPAT) && - !isPHPStringState(state) && - (state != SCE_HPHP_COMMENT) && - (ch == '<') && - (chNext == '?')) { + else if ((state != SCE_H_ASPAT) && + !isPHPStringState(state) && + (state != SCE_HPHP_COMMENT) && + (ch == '<') && + (chNext == '?')) { styler.ColourTo(i - 1, StateToPrint); beforePreProc = state; scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP); i++; + visibleChars++; i += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 2, i + 10); if (scriptLanguage == eScriptXML) styler.ColourTo(i, SCE_H_XMLSTART); @@ -567,6 +605,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (chNext2 == '@') { i += 2; // place as if it was the second next char treated + visibleChars += 2; state = SCE_H_ASPAT; } else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) { styler.ColourTo(i + 3, SCE_H_ASP); @@ -576,11 +615,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } else { if (chNext2 == '=') { i += 2; // place as if it was the second next char treated + visibleChars += 2; } else { i++; // place as if it was the next char treated + visibleChars++; } - state = StateForScript(defaultScript); + state = StateForScript(aspScript); } scriptLanguage = eScriptVBS; styler.ColourTo(i, SCE_H_ASP); @@ -591,17 +632,42 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty continue; } + ///////////////////////////////////// + // handle the start of SGML language (DTD) + else if (((scriptLanguage == eScriptNone) || (scriptLanguage == eScriptXML)) && + (chPrev == '<') && + (ch == '!') && + (StateToPrint != SCE_H_CDATA) && (!IsCommentState(StateToPrint))) { + beforePreProc = state; + styler.ColourTo(i - 2, StateToPrint); + if ((chNext == '-') && (chNext2 == '-')) { + state = SCE_H_COMMENT; // wait for a pending command + } + else if (isWordCdata(i + 1, i + 7, styler)) { + state = SCE_H_CDATA; + } else { + styler.ColourTo(i, SCE_H_SGML_DEFAULT); // ')) { + else if (( + ((inScriptType == eNonHtmlPreProc) + || (inScriptType == eNonHtmlScriptPreProc)) && ( + ((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) || + ((scriptLanguage != eScriptNone) && !isStringState(state) && + (ch == '%')) + ) && (chNext == '>')) || + ((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) { if (state == SCE_H_ASPAT) { - defaultScript = segIsScriptingIndicator(styler, - styler.GetStartSegment(), i - 1, defaultScript); + aspScript = segIsScriptingIndicator(styler, + styler.GetStartSegment(), i - 1, aspScript); } // Bounce out of any ASP mode switch (state) { @@ -624,11 +690,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty styler.ColourTo(i - 1, StateToPrint); break; } - i++; + if (scriptLanguage != eScriptSGML) { + i++; + visibleChars++; + } if (ch == '%') styler.ColourTo(i, SCE_H_ASP); else if (scriptLanguage == eScriptXML) styler.ColourTo(i, SCE_H_XMLEND); + else if (scriptLanguage == eScriptSGML) + styler.ColourTo(i, SCE_H_SGML_DEFAULT); else styler.ColourTo(i, SCE_H_QUESTION); state = beforePreProc; @@ -648,47 +719,156 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (ch == '<') { // in HTML, fold on tag open and unfold on tag close tagOpened = true; - if (chNext == '/') { - tagClosing = true; - } else { - tagClosing = false; - } - + tagClosing = (chNext == '/'); styler.ColourTo(i - 1, StateToPrint); - if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-') { - // should be better - i += 3; - levelCurrent++; - state = SCE_H_COMMENT; - } else + if (chNext != '!') state = SCE_H_TAGUNKNOWN; } else if (ch == '&') { styler.ColourTo(i - 1, SCE_H_DEFAULT); state = SCE_H_ENTITY; } break; - case SCE_H_COMMENT: - if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) { - // unfold HTML comment - levelCurrent--; + case SCE_H_SGML_DEFAULT: + if (scriptLanguage == eScriptSGMLblock) + StateToPrint = SCE_H_SGML_BLOCK_DEFAULT; + + if (ch == '\"') { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_DOUBLESTRING; + } else if (ch == '\'') { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_SIMPLESTRING; + } else if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_COMMENT; + } else if (isalpha(ch) && (chPrev == '%')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_ENTITY; + } else if (ch == '#') { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_SPECIAL; + } else if (ch == '[') { + styler.ColourTo(i - 1, StateToPrint); + scriptLanguage = eScriptSGMLblock; + } else if (ch == ']') { + if (scriptLanguage == eScriptSGMLblock) { + styler.ColourTo(i, StateToPrint); + scriptLanguage = eScriptSGML; + } else { + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i, SCE_H_SGML_ERROR); + } + } else if (scriptLanguage == eScriptSGMLblock) { + if ((ch == '!') && (chPrev == '<')) { + styler.ColourTo(i - 2, StateToPrint); + styler.ColourTo(i, SCE_H_SGML_DEFAULT); + state = SCE_H_SGML_COMMAND; + } else if (ch == '>') { + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i, SCE_H_SGML_DEFAULT); + } + } + break; + case SCE_H_SGML_COMMAND: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_COMMENT; + } else if (!issgmlwordchar(ch)) { + if (isWordHSGML(styler.GetStartSegment(), i - 1, keywords6, styler)) { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_1ST_PARAM; + } else { + state = SCE_H_SGML_ERROR; + } + } + break; + case SCE_H_SGML_1ST_PARAM: + // wait for the beginning of the word + if ((ch == '-') && (chPrev == '-')) { + if (scriptLanguage == eScriptSGMLblock) { + styler.ColourTo(i - 2, SCE_H_SGML_BLOCK_DEFAULT); + } else { + styler.ColourTo(i - 2, SCE_H_SGML_DEFAULT); + } + state = SCE_H_SGML_1ST_PARAM_COMMENT; + } else if (issgmlwordchar(ch)) { + if (scriptLanguage == eScriptSGMLblock) { + styler.ColourTo(i - 1, SCE_H_SGML_BLOCK_DEFAULT); + } else { + styler.ColourTo(i - 1, SCE_H_SGML_DEFAULT); + } + // find the length of the word + int size = 1; + while (ishtmlwordchar(styler.SafeGetCharAt(i + size))) + size++; + styler.ColourTo(i + size - 1, StateToPrint); + i += size - 1; + visibleChars += size - 1; + ch = styler.SafeGetCharAt(i); + state = SCE_H_SGML_DEFAULT; + continue; + } + break; + case SCE_H_SGML_ERROR: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_COMMENT; + } + case SCE_H_SGML_DOUBLESTRING: + if (ch == '\"') { styler.ColourTo(i, StateToPrint); - state = SCE_H_DEFAULT; - tagOpened = false; + state = SCE_H_SGML_DEFAULT; + } + break; + case SCE_H_SGML_SIMPLESTRING: + if (ch == '\'') { + styler.ColourTo(i, StateToPrint); + state = SCE_H_SGML_DEFAULT; + } + break; + case SCE_H_SGML_COMMENT: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i, StateToPrint); + state = SCE_H_SGML_DEFAULT; } break; case SCE_H_CDATA: - if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) { + if ((chPrev2 == ']') && (chPrev == ']') && (ch == '>')) { styler.ColourTo(i, StateToPrint); state = SCE_H_DEFAULT; - tagOpened = false; + levelCurrent--; } break; - case SCE_H_SGML: - if (ch == '>') { - levelCurrent--; + case SCE_H_COMMENT: + if ((chPrev2 == '-') && (chPrev == '-') && (ch == '>')) { styler.ColourTo(i, StateToPrint); state = SCE_H_DEFAULT; - tagOpened = false; + levelCurrent--; + } + break; + case SCE_H_SGML_1ST_PARAM_COMMENT: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i, SCE_H_SGML_COMMENT); + state = SCE_H_SGML_1ST_PARAM; + } + break; + case SCE_H_SGML_SPECIAL: + if (!isupper(ch)) { + styler.ColourTo(i - 1, StateToPrint); + if (isalnum(ch)) { + state = SCE_H_SGML_ERROR; + } else { + state = SCE_H_SGML_DEFAULT; + } + } + break; + case SCE_H_SGML_ENTITY: + if (ch == ';') { + styler.ColourTo(i, StateToPrint); + state = SCE_H_SGML_DEFAULT; + } else if (!isalnum(ch) && ch != '-' && ch != '.') { + styler.ColourTo(i, SCE_H_SGML_ERROR); + state = SCE_H_SGML_DEFAULT; } break; case SCE_H_ENTITY: @@ -705,9 +885,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (!ishtmlwordchar(ch) && !((ch == '/') && (chPrev == '<')) && ch != '[') { int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler); if (eClass == SCE_H_SCRIPT) { - inScriptType = eNonHtmlScript; - scriptLanguage = defaultScript; - eClass = SCE_H_TAG; + if (!tagClosing) { + inScriptType = eNonHtmlScript; + scriptLanguage = clientScript; + eClass = SCE_H_TAG; + } else { + scriptLanguage = eScriptNone; + eClass = SCE_H_TAG; + } } if (ch == '>') { styler.ColourTo(i, eClass); @@ -717,28 +902,27 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_H_DEFAULT; } tagOpened = false; - if (tagClosing) + if (tagClosing) { levelCurrent--; - else + } else { levelCurrent++; + } tagClosing = false; - } else if (ch == '/' && chNext == '>') { + } else if (ch == '/' && chNext == '>') { if (eClass == SCE_H_TAGUNKNOWN) { - styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN); + styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN); } else { - styler.ColourTo(i - 1, StateToPrint); - styler.ColourTo(i + 1, SCE_H_TAGEND); + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i + 1, SCE_H_TAGEND); } - i++; - ch = chNext; - state = SCE_H_DEFAULT; + i++; + ch = chNext; + state = SCE_H_DEFAULT; tagOpened = false; } else { if (eClass != SCE_H_TAGUNKNOWN) { - if (eClass == SCE_H_CDATA) { - state = SCE_H_CDATA; - } else if (eClass == SCE_H_SGML) { - state = SCE_H_SGML; + if (eClass == SCE_H_SGML_DEFAULT) { + state = SCE_H_SGML_DEFAULT; } else { state = SCE_H_OTHER; } @@ -750,7 +934,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') { if (inScriptType == eNonHtmlScript) { int scriptLanguagePrev = scriptLanguage; - scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage); + clientScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage); + scriptLanguage = clientScript; if ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone)) inScriptType = eHtml; } @@ -1217,18 +1402,18 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_HPHP_NUMBER: if (!isdigit(ch)) { styler.ColourTo(i - 1, SCE_HPHP_NUMBER); - if (isoperator(ch)) - state =SCE_HPHP_OPERATOR; - else + if (isoperator(ch)) + state = SCE_HPHP_OPERATOR; + else state = SCE_HPHP_DEFAULT; } break; case SCE_HPHP_VARIABLE: if (!iswordstart(ch)) { styler.ColourTo(i - 1, SCE_HPHP_VARIABLE); - if (isoperator(ch)) - state =SCE_HPHP_OPERATOR; - else + if (isoperator(ch)) + state = SCE_HPHP_OPERATOR; + else state = SCE_HPHP_DEFAULT; } break; @@ -1249,7 +1434,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty // skip the next char i++; } else if (ch == '$') { - styler.ColourTo(i-1, StateToPrint); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HPHP_HSTRING_VARIABLE; } else if (ch == '\"') { styler.ColourTo(i, StateToPrint); @@ -1267,13 +1452,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty break; case SCE_HPHP_HSTRING_VARIABLE: if (!iswordstart(ch)) { - styler.ColourTo(i-1, StateToPrint); + styler.ColourTo(i - 1, StateToPrint); i--; // strange but it works state = SCE_HPHP_HSTRING; } break; case SCE_HPHP_OPERATOR: - case SCE_HPHP_DEFAULT: + case SCE_HPHP_DEFAULT: styler.ColourTo(i - 1, StateToPrint); if (isdigit(ch)) { state = SCE_HPHP_NUMBER; @@ -1304,6 +1489,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty // Some of the above terminated their lexeme but since the same character starts // the same class again, only reenter if non empty segment. + bool nonEmptySegment = i >= static_cast(styler.GetStartSegment()); if (state == SCE_HB_DEFAULT) { // One of the above succeeded if ((ch == '\"') && (nonEmptySegment)) { @@ -1335,7 +1521,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_HJ_COMMENTLINE; } else if ((ch == '\"') && (nonEmptySegment)) { state = SCE_HJ_DOUBLESTRING; - } else if ((ch == '\'') && (nonEmptySegment)) { + } else if ((ch == '\'') && (nonEmptySegment)) { state = SCE_HJ_SINGLESTRING; } else if (iswordstart(ch)) { state = SCE_HJ_WORD; @@ -1357,4 +1543,3 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc, "hypertext"); LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc, "xml"); - diff --git a/contrib/src/stc/scintilla/src/LexPython.cxx b/contrib/src/stc/scintilla/src/LexPython.cxx index 6669694d1d..221859035e 100644 --- a/contrib/src/stc/scintilla/src/LexPython.cxx +++ b/contrib/src/stc/scintilla/src/LexPython.cxx @@ -15,70 +15,18 @@ #include "PropSet.h" #include "Accessor.h" +#include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" -/* Returns true if the "as" word that begins at start follows an import statement */ -static bool IsImportAs(unsigned int start, Accessor &styler) { - unsigned int i; - unsigned int j; - char s[10]; - - /* Find any import before start but after any statement terminator or quote */ - i = start; - while (i > 0) { - char ch = styler[i - 1]; - - if (ch == '\n' || ch == '\r' || ch == ';' || ch == '\'' || ch == '"' || ch == '`') - break; - if (ch == 't' && i > 5) { - for (j = 0; j < 6; j++) - s[j] = styler[(i - 6) + j]; - s[j] = '\0'; - if (strcmp(s, "import") == 0) - return true; - } - i--; - } - - return false; -} - -static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { - char s[100]; - bool wordIsNumber = isdigit(styler[start]); - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { - s[i] = styler[start + i]; - s[i + 1] = '\0'; - } - char chAttr = SCE_P_IDENTIFIER; - if (0 == strcmp(prevWord, "class")) - chAttr = SCE_P_CLASSNAME; - else if (0 == strcmp(prevWord, "def")) - chAttr = SCE_P_DEFNAME; - else if (wordIsNumber) - chAttr = SCE_P_NUMBER; - else if (keywords.InList(s)) - chAttr = SCE_P_WORD; - else if (strcmp(s, "as") == 0 && IsImportAs(start, styler)) - chAttr = SCE_P_WORD; - // make sure that dot-qualifiers inside the word are lexed correct - else for (unsigned int i = 0; i < end - start + 1; i++) { - if (styler[start + i] == '.') { - styler.ColourTo(start + i - 1, chAttr); - styler.ColourTo(start + i, SCE_P_OPERATOR); - } - } - styler.ColourTo(end, chAttr); - strcpy(prevWord, s); -} +enum kwType { kwOther, kwClass, kwDef, kwImport }; static bool IsPyComment(Accessor &styler, int pos, int len) { return len>0 && styler[pos]=='#'; } -static bool IsPyStringStart(char ch, char chNext, char chNext2) { +static bool IsPyStringStart(int ch, int chNext, int chNext2) { if (ch == '\'' || ch == '"') return true; if (ch == 'u' || ch == 'U') { @@ -93,10 +41,6 @@ static bool IsPyStringStart(char ch, char chNext, char chNext2) { return false; } -static bool IsPyWordStart(char ch, char chNext, char chNext2) { - return (iswordchar(ch) && !IsPyStringStart(ch, chNext, chNext2)); -} - /* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */ static int GetPyStringState(Accessor &styler, int i, int *nextIndex) { char ch = styler.SafeGetCharAt(i); @@ -139,10 +83,18 @@ static int GetPyStringState(Accessor &styler, int i, int *nextIndex) { } } +inline bool IsAWordChar(int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); +} + +inline bool IsAWordStart(int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { - int lengthDoc = startPos + length; + int endPos = startPos + length; // Backtrack to previous line in case need to fix its tab whinging int lineCurrent = styler.GetLine(startPos); @@ -156,32 +108,27 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, } } - // Python uses a different mask because bad indentation is marked by oring with 32 - styler.StartAt(startPos, 127); - WordList &keywords = *keywordlists[0]; - int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level"); - char prevWord[200]; - prevWord[0] = '\0'; - if (length == 0) - return ; + const int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level"); - int state = initStyle & 31; + initStyle = initStyle & 31; + if (initStyle == SCE_P_STRINGEOL) { + initStyle = SCE_P_DEFAULT; + } - int nextIndex = 0; - char chPrev = ' '; - char chPrev2 = ' '; - char chNext = styler[startPos]; - styler.StartSegment(startPos); - bool atStartLine = true; + kwType kwLast = kwOther; int spaceFlags = 0; styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment); - for (int i = startPos; i < lengthDoc; i++) { + + // Python uses a different mask because bad indentation is marked by oring with 32 + StyleContext sc(startPos, endPos-startPos, initStyle, styler, 0x7f); + + for (; sc.More(); sc.Forward()) { - if (atStartLine) { - char chBad = static_cast(64); - char chGood = static_cast(0); + if (sc.atLineStart) { + const char chBad = static_cast(64); + const char chGood = static_cast(0); char chFlags = chGood; if (whingeLevel == 1) { chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood; @@ -192,132 +139,117 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, } else if (whingeLevel == 4) { chFlags = (spaceFlags & wsTab) ? chBad : chGood; } - styler.SetFlags(chFlags, static_cast(state)); - atStartLine = false; + styler.SetFlags(chFlags, static_cast(sc.state)); } - char ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - char chNext2 = styler.SafeGetCharAt(i + 2); - - if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) { - if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) { + if (sc.atLineEnd) { + if ((sc.state == SCE_P_DEFAULT) || + (sc.state == SCE_P_TRIPLE) || + (sc.state == SCE_P_TRIPLEDOUBLE)) { // Perform colourisation of white space and triple quoted strings at end of each line to allow // tab marking to work inside white space and triple quoted strings - styler.ColourTo(i, state); + sc.ForwardSetState(sc.state); } lineCurrent++; styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment); - atStartLine = true; - } - - if (styler.IsLeadByte(ch)) { - chNext = styler.SafeGetCharAt(i + 2); - chPrev = ' '; - chPrev2 = ' '; - i += 1; - continue; + if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) { + sc.ChangeState(SCE_P_STRINGEOL); + sc.ForwardSetState(SCE_P_DEFAULT); + } } - if (state == SCE_P_STRINGEOL) { - if (ch != '\r' && ch != '\n') { - styler.ColourTo(i - 1, state); - state = SCE_P_DEFAULT; + // Check for a state end + if (sc.state == SCE_P_OPERATOR) { + kwLast = kwOther; + sc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_P_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_P_DEFAULT); } - } - if (state == SCE_P_DEFAULT) { - if (IsPyWordStart(ch, chNext, chNext2)) { - styler.ColourTo(i - 1, state); - state = SCE_P_WORD; - } else if (ch == '#') { - styler.ColourTo(i - 1, state); - state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE; - } else if (IsPyStringStart(ch, chNext, chNext2)) { - styler.ColourTo(i - 1, state); - state = GetPyStringState(styler, i, &nextIndex); - if (nextIndex != i + 1) { - i = nextIndex - 1; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); + } else if (sc.state == SCE_P_WORD) { + if ((sc.ch == '.') || (!IsAWordChar(sc.ch))) { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + int style = SCE_P_IDENTIFIER; + if ((kwLast == kwImport) && (strcmp(s, "as") == 0)) { + style = SCE_P_WORD; + } else if (keywords.InList(s)) { + style = SCE_P_WORD; + } else if (kwLast == kwClass) { + style = SCE_P_CLASSNAME; + } else if (kwLast == kwDef) { + style = SCE_P_DEFNAME; } - } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_P_OPERATOR); - } - } else if (state == SCE_P_WORD) { - if (!iswordchar(ch)) { - ClassifyWordPy(styler.GetStartSegment(), i - 1, keywords, styler, prevWord); - state = SCE_P_DEFAULT; - if (ch == '#') { - state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE; - } else if (IsPyStringStart(ch, chNext, chNext2)) { - styler.ColourTo(i - 1, state); - state = GetPyStringState(styler, i, &nextIndex); - if (nextIndex != i + 1) { - i = nextIndex - 1; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_P_OPERATOR); + sc.ChangeState(style); + sc.SetState(SCE_P_DEFAULT); + if (style == SCE_P_WORD) { + if (0 == strcmp(s, "class")) + kwLast = kwClass; + else if (0 == strcmp(s, "def")) + kwLast = kwDef; + else if (0 == strcmp(s, "import")) + kwLast = kwImport; + else + kwLast = kwOther; + } else if (style == SCE_P_CLASSNAME) { + kwLast = kwOther; + } else if (style == SCE_P_DEFNAME) { + kwLast = kwOther; } } - } else { - if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) { - if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); - state = SCE_P_DEFAULT; - } - } else if (state == SCE_P_STRING) { - if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourTo(i - 1, state); - state = SCE_P_STRINGEOL; - } else if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (ch == '\"') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } - } else if (state == SCE_P_CHARACTER) { - if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourTo(i - 1, state); - state = SCE_P_STRINGEOL; - } else if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (ch == '\'') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } - } else if (state == SCE_P_TRIPLE) { - if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; + } else if ((sc.state == SCE_P_COMMENTLINE) || (sc.state == SCE_P_COMMENTBLOCK)) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_P_DEFAULT); + } + } else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) { + if (sc.ch == '\\') { + if ((sc.chNext == '\r') && (sc.GetRelative(2) == '\n')) { + sc.Forward(); } - } else if (state == SCE_P_TRIPLEDOUBLE) { - if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; + sc.Forward(); + } else if ((sc.state == SCE_P_STRING) && (sc.ch == '\"')) { + sc.ForwardSetState(SCE_P_DEFAULT); + } else if ((sc.state == SCE_P_CHARACTER) && (sc.ch == '\'')) { + sc.ForwardSetState(SCE_P_DEFAULT); + } + } else if (sc.state == SCE_P_TRIPLE) { + if (sc.ch == '\\') { + sc.Forward(); + } else if (sc.Match("\'\'\'")) { + sc.Forward(); + sc.Forward(); + sc.ForwardSetState(SCE_P_DEFAULT); + } + } else if (sc.state == SCE_P_TRIPLEDOUBLE) { + if (sc.ch == '\\') { + sc.Forward(); + } else if (sc.Match("\"\"\"")) { + sc.Forward(); + sc.Forward(); + sc.ForwardSetState(SCE_P_DEFAULT); + } + } + + // Check for a new state starting character + if (sc.state == SCE_P_DEFAULT) { + if (isascii(sc.ch) && isoperator(static_cast(sc.ch)) || sc.ch == '`') { + sc.SetState(SCE_P_OPERATOR); + } else if (sc.ch == '#') { + sc.SetState(sc.chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_P_NUMBER); + } else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) { + int nextIndex = 0; + sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex)); + while (nextIndex > (sc.currentPos+1)) { + sc.Forward(); } + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_P_WORD); } } - chPrev2 = chPrev; - chPrev = ch; - } - if (state == SCE_P_WORD) { - ClassifyWordPy(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord); - } else { - styler.ColourTo(lengthDoc, state); } + sc.Complete(); } static bool IsCommentLine(int line, Accessor &styler) { @@ -338,14 +270,15 @@ static bool IsQuoteLine(int line, Accessor &styler) { return ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE)); } + static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/, WordList *[], Accessor &styler) { - int maxPos = startPos + length; - int maxLines = styler.GetLine(maxPos-1); - - bool foldComment = styler.GetPropertyInt("fold.comment.python"); - bool foldQuotes = styler.GetPropertyInt("fold.quotes.python"); - + const int maxPos = startPos + length; + const int maxLines = styler.GetLine(maxPos-1); // Requested last line + const int docLines = styler.GetLine(styler.Length() - 1); // Available last line + const bool foldComment = styler.GetPropertyInt("fold.comment.python"); + const bool foldQuotes = styler.GetPropertyInt("fold.quotes.python"); + // Backtrack to previous non-blank line so we can determine indent level // for any white space lines (needed esp. within triple quoted strings) // and so we can fix any preceding fold level (which is why we go back @@ -363,8 +296,8 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse } int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; + // Set up initial loop state startPos = styler.LineStart(lineCurrent); - // Set up initial state int prev_state = SCE_P_DEFAULT & 31; if (lineCurrent >= 1) prev_state = styler.StyleAt(startPos-1) & 31; @@ -374,21 +307,27 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler); // Process all characters to end of requested range or end of any triple quote - // or comment that hangs over the end of the range - while ((lineCurrent <= maxLines) || prevQuote || prevComment) { + // or comment that hangs over the end of the range. Cap processing in all cases + // to end of document (in case of unclosed quote or comment at end). + while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevQuote || prevComment)) { // Gather info int lev = indentCurrent; int lineNext = lineCurrent + 1; - int style = styler.StyleAt(styler.LineStart(lineNext)) & 31; - int indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); - int quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE)); - int quote_start = (quote && !prevQuote); - int quote_continue = (quote && prevQuote); - int comment = foldComment && IsCommentLine(lineCurrent, styler); - int comment_start = (comment && !prevComment && + int indentNext = indentCurrent; + int quote = false; + if (lineNext <= docLines) { + // Information about next line is only available if not at end of document + indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); + int style = styler.StyleAt(styler.LineStart(lineNext)) & 31; + quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE)); + } + const int quote_start = (quote && !prevQuote); + const int quote_continue = (quote && prevQuote); + const int comment = foldComment && IsCommentLine(lineCurrent, styler); + const int comment_start = (comment && !prevComment && (lineNext <= docLines) && IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE)); - int comment_continue = (comment && prevComment); + const int comment_continue = (comment && prevComment); if ((!quote || !prevQuote) && !comment) indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; if (quote) @@ -411,22 +350,35 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse } // Skip past any blank lines for next indent level info; we skip also comments - // starting in column 0 which effectively folds them into surrounding code - // rather than screwing up folding. Then set indent level on the lines - // we skipped to be same as maximum of current and next indent. This approach - // does a reasonable job of collapsing white space into surrounding code - // without getting confused by white space at the start of an indented level. + // starting in column 0 which effectively folds them into surrounding code rather + // than screwing up folding. + const int saveIndentNext = indentNext; while (!quote && - ((indentNext & SC_FOLDLEVELWHITEFLAG) || styler[styler.LineStart(lineNext)] == '#') && - (lineNext < maxLines)) { - int level = Platform::Maximum(indentCurrent, indentNext); - if (indentNext & SC_FOLDLEVELWHITEFLAG) - level = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel; - styler.SetLevel(lineNext, level); + (lineNext < docLines) && + ((indentNext & SC_FOLDLEVELWHITEFLAG) || + (lineNext <= docLines && styler[styler.LineStart(lineNext)] == '#'))) { + lineNext++; indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); } + // Next compute max indent level of current line and next non-blank line. + // This is the level to which we set all the intervening blank or comment lines. + const int skip_level = Platform::Maximum(indentCurrentLevel, + indentNext & SC_FOLDLEVELNUMBERMASK); + + // Now set all the indent levels on the lines we skipped + int skipLine = lineCurrent + 1; + int skipIndentNext = saveIndentNext; + while (skipLine < lineNext) { + int skipLineLevel = skip_level; + if (skipIndentNext & SC_FOLDLEVELWHITEFLAG) + skipLineLevel = SC_FOLDLEVELWHITEFLAG | skipLineLevel; + styler.SetLevel(skipLine, skipLineLevel); + skipLine++; + skipIndentNext = styler.IndentAmount(skipLine, &spaceFlags, NULL); + } + // Set fold header on non-quote/non-comment line if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) { if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) @@ -443,8 +395,9 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse lineCurrent = lineNext; } - // Make sure last line indent level is set too - styler.SetLevel(lineCurrent, indentCurrent); + // NOTE: Cannot set level of last line here because indentCurrent doesn't have + // header flag set; the loop above is crafted to take care of this case! + //styler.SetLevel(lineCurrent, indentCurrent); } LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, "python", FoldPyDoc); diff --git a/contrib/src/stc/scintilla/src/LineMarker.cxx b/contrib/src/stc/scintilla/src/LineMarker.cxx index dc1468d832..a7c5b124fc 100644 --- a/contrib/src/stc/scintilla/src/LineMarker.cxx +++ b/contrib/src/stc/scintilla/src/LineMarker.cxx @@ -40,7 +40,7 @@ static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, C surface->FillRectangle(rcH, fore); } -void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) { +void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter) { // Restrict most shapes a bit PRectangle rc = rcWhole; rc.top++; @@ -230,6 +230,15 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) { surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, centreY - blobSize); + } else if (markType >= SC_MARK_CHARACTER) { + char character[1]; + character[0] = static_cast(markType - SC_MARK_CHARACTER); + int width = surface->WidthText(fontForCharacter, character, 1); + rc.left += (rc.Width() - width) / 2; + rc.right = rc.left + width; + surface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2, + character, 1, fore.allocated, back.allocated); + } else { // SC_MARK_SHORTARROW Point pts[] = { Point(centreX, centreY + dimOn2), diff --git a/contrib/src/stc/scintilla/src/LineMarker.h b/contrib/src/stc/scintilla/src/LineMarker.h index ee0f36c256..b9dd15d062 100644 --- a/contrib/src/stc/scintilla/src/LineMarker.h +++ b/contrib/src/stc/scintilla/src/LineMarker.h @@ -20,7 +20,7 @@ public: fore = Colour(0,0,0); back = Colour(0xff,0xff,0xff); } - void Draw(Surface *surface, PRectangle &rc); + void Draw(Surface *surface, PRectangle &rc, Font &fontForCharacter); }; #endif diff --git a/contrib/src/stc/scintilla/src/RESearch.cxx b/contrib/src/stc/scintilla/src/RESearch.cxx index 07534db1ef..ac5b73d026 100644 --- a/contrib/src/stc/scintilla/src/RESearch.cxx +++ b/contrib/src/stc/scintilla/src/RESearch.cxx @@ -30,9 +30,8 @@ * Modification history: * * $Log$ - * Revision 1.1 2001/09/01 03:05:24 RD - * Upgraded to version 1.39 of Scintilla, and upated wxStyledTextCtrl - * accordingly. + * Revision 1.2 2001/10/18 01:24:58 RD + * Updated to version 1.40 of Scintilla * * Revision 1.6 2001/04/29 13:32:10 nyamatongwe * Addition of new target methods - versions of ReplaceTarget that take counted diff --git a/contrib/src/stc/scintilla/src/ScintillaBase.cxx b/contrib/src/stc/scintilla/src/ScintillaBase.cxx index 707f59b9f4..75a8ffffa4 100644 --- a/contrib/src/stc/scintilla/src/ScintillaBase.cxx +++ b/contrib/src/stc/scintilla/src/ScintillaBase.cxx @@ -35,6 +35,7 @@ #include "ScintillaBase.h" ScintillaBase::ScintillaBase() { + displayPopupMenu = true; listType = 0; #ifdef SCI_LEXER lexLanguage = SCLEX_CONTAINER; @@ -514,6 +515,10 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara InvalidateStyleRedraw(); break; + case SCI_USEPOPUP: + displayPopupMenu = wParam; + break; + #ifdef SCI_LEXER case SCI_SETLEXER: SetLexer(wParam); diff --git a/contrib/src/stc/scintilla/src/ScintillaBase.h b/contrib/src/stc/scintilla/src/ScintillaBase.h index d5b1e8ba0c..ca4695355f 100644 --- a/contrib/src/stc/scintilla/src/ScintillaBase.h +++ b/contrib/src/stc/scintilla/src/ScintillaBase.h @@ -30,6 +30,7 @@ protected: idcmdSelectAll=16 }; + bool displayPopupMenu; Menu popup; AutoComplete ac; @@ -42,7 +43,7 @@ protected: int lexLanguage; LexerModule *lexCurrent; PropSet props; - enum {numWordLists=5}; + enum {numWordLists=6}; WordList *keyWordLists[numWordLists+1]; void SetLexer(uptr_t wParam); void SetLexerLanguage(const char *languageName); diff --git a/contrib/src/stc/scintilla/src/StyleContext.cxx b/contrib/src/stc/scintilla/src/StyleContext.cxx new file mode 100644 index 0000000000..bdae28196f --- /dev/null +++ b/contrib/src/stc/scintilla/src/StyleContext.cxx @@ -0,0 +1,51 @@ +// Scintilla source code edit control +/** @file StyleContext.cxx + ** Lexer infrastructure. + **/ +// Copyright 1998-2001 by Neil Hodgson +// This file is in the public domain. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" + +static void getRange(unsigned int start, + unsigned int end, + Accessor &styler, + char *s, + unsigned int len) { + unsigned int i = 0; + while ((i < end - start + 1) && (i < len-1)) { + s[i] = styler[start + i]; + i++; + } + s[i] = '\0'; +} + +void StyleContext::GetCurrent(char *s, int len) { + getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len); +} + +static void getRangeLowered(unsigned int start, + unsigned int end, + Accessor &styler, + char *s, + unsigned int len) { + unsigned int i = 0; + while ((i < end - start + 1) && (i < len-1)) { + s[i] = static_cast(tolower(styler[start + i])); + i++; + } + s[i] = '\0'; +} + +void StyleContext::GetCurrentLowered(char *s, int len) { + getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len); +} diff --git a/contrib/src/stc/scintilla/src/StyleContext.h b/contrib/src/stc/scintilla/src/StyleContext.h new file mode 100644 index 0000000000..5bc6371fd3 --- /dev/null +++ b/contrib/src/stc/scintilla/src/StyleContext.h @@ -0,0 +1,127 @@ +// Scintilla source code edit control +/** @file StyleContext.cxx + ** Lexer infrastructure. + **/ +// Copyright 1998-2001 by Neil Hodgson +// This file is in the public domain. + +// All languages handled so far can treat all characters >= 0x80 as one class +// which just continues the current token or starts an identifier if in default. +// DBCS treated specially as the second character can be < 0x80 and hence +// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 +class StyleContext { + Accessor &styler; + int endPos; + StyleContext& operator=(const StyleContext&) { + return *this; + } +public: + int currentPos; + bool atLineStart; + bool atLineEnd; + int state; + int chPrev; + int ch; + int chNext; + + StyleContext(unsigned int startPos, int length, + int initStyle, Accessor &styler_, char chMask=31) : + styler(styler_), + endPos(startPos + length), + currentPos(startPos), + atLineStart(true), + atLineEnd(false), + state(initStyle), + chPrev(0), + ch(0), + chNext(0) { + styler.StartAt(startPos, chMask); + styler.StartSegment(startPos); + int pos = currentPos; + ch = static_cast(styler.SafeGetCharAt(pos)); + if (styler.IsLeadByte(static_cast(ch))) { + pos++; + ch = ch << 8; + ch |= static_cast(styler.SafeGetCharAt(pos)); + } + chNext = static_cast(styler.SafeGetCharAt(pos+1)); + if (styler.IsLeadByte(static_cast(chNext))) { + chNext = chNext << 8; + chNext |= static_cast(styler.SafeGetCharAt(pos+2)); + } + atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos); + } + void Complete() { + styler.ColourTo(currentPos - 1, state); + } + bool More() { + return currentPos <= endPos; + } + void Forward() { + atLineStart = atLineEnd; + // A lot of this is repeated from the constructor - TODO: merge code + chPrev = ch; + currentPos++; + if (ch >= 0x100) + currentPos++; + ch = chNext; + chNext = static_cast(styler.SafeGetCharAt(currentPos+1)); + if (styler.IsLeadByte(static_cast(chNext))) { + chNext = chNext << 8; + chNext |= static_cast(styler.SafeGetCharAt(currentPos + 2)); + } + // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) + // Avoid triggering two times on Dos/Win + // End of line + atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos); + } + void ChangeState(int state_) { + state = state_; + } + void SetState(int state_) { + styler.ColourTo(currentPos - 1, state); + state = state_; + } + void ForwardSetState(int state_) { + Forward(); + styler.ColourTo(currentPos - 1, state); + state = state_; + } + int LengthCurrent() { + return currentPos - styler.GetStartSegment(); + } + int GetRelative(int n) { + return styler.SafeGetCharAt(currentPos+n); + } + bool Match(char ch0) { + return ch == ch0; + } + bool Match(char ch0, char ch1) { + return (ch == ch0) && (chNext == ch1); + } + bool Match(const char *s) { + if (ch != *s) + return false; + s++; + if (chNext != *s) + return false; + s++; + for (int n=2; *s; n++) { + if (*s != styler.SafeGetCharAt(currentPos+n)) + return false; + s++; + } + return true; + } + // Non-inline + void GetCurrent(char *s, int len); + void GetCurrentLowered(char *s, int len); +}; + +inline bool IsASpace(unsigned int ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +inline bool IsADigit(unsigned int ch) { + return (ch >= '0') && (ch <= '9'); +} diff --git a/contrib/src/stc/stc.cpp b/contrib/src/stc/stc.cpp index bd6184cf6a..99645adb29 100644 --- a/contrib/src/stc/stc.cpp +++ b/contrib/src/stc/stc.cpp @@ -32,6 +32,7 @@ int wxForceScintillaLexers(void) extern LexerModule lmAVE; extern LexerModule lmConf; extern LexerModule lmCPP; + extern LexerModule lmNncrontab; extern LexerModule lmEiffel; extern LexerModule lmHTML; extern LexerModule lmLISP; @@ -48,6 +49,7 @@ int wxForceScintillaLexers(void) && &lmAVE && &lmConf && &lmCPP + && &lmNncrontab && &lmEiffel && &lmHTML && &lmLISP @@ -1202,6 +1204,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // Replace the target text with the argument text. +// Text is counted so it can contain nulls. // Returns the length of the replacement text. int wxStyledTextCtrl::ReplaceTarget(const wxString& text) { @@ -1210,6 +1213,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // Replace the target text with the argument text after \d processing. +// Text is counted so it can contain nulls. // Looks for \d where d is between 1 and 9 and replaces these with the strings // matched in the last search operation which were surrounded by \( and \). // Returns the length of the replacement text including any change @@ -1221,7 +1225,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // Search for a counted string in the target and set the target to the found -// range. +// range. Text is counted so it can contain nulls. // Returns length of range or -1 for failure in which case target is not moved. int wxStyledTextCtrl::SearchInTarget(const wxString& text) { diff --git a/contrib/src/stc/stc.cpp.in b/contrib/src/stc/stc.cpp.in index 979bca8794..3a415e1f85 100644 --- a/contrib/src/stc/stc.cpp.in +++ b/contrib/src/stc/stc.cpp.in @@ -32,6 +32,7 @@ int wxForceScintillaLexers(void) extern LexerModule lmAVE; extern LexerModule lmConf; extern LexerModule lmCPP; + extern LexerModule lmNncrontab; extern LexerModule lmEiffel; extern LexerModule lmHTML; extern LexerModule lmLISP; @@ -48,6 +49,7 @@ int wxForceScintillaLexers(void) && &lmAVE && &lmConf && &lmCPP + && &lmNncrontab && &lmEiffel && &lmHTML && &lmLISP diff --git a/include/wx/stc/stc.h b/include/wx/stc/stc.h index 46dcb91225..99553d810b 100644 --- a/include/wx/stc/stc.h +++ b/include/wx/stc/stc.h @@ -72,6 +72,7 @@ #define wxSTC_MARK_CIRCLEPLUSCONNECTED 19 #define wxSTC_MARK_CIRCLEMINUS 20 #define wxSTC_MARK_CIRCLEMINUSCONNECTED 21 +#define wxSTC_MARK_CHARACTER 10000 // Markers used for outlining column #define wxSTC_MARKNUM_FOLDEREND 25 @@ -83,12 +84,16 @@ #define wxSTC_MARKNUM_FOLDEROPEN 31 #define wxSTC_MARGIN_SYMBOL 0 #define wxSTC_MARGIN_NUMBER 1 + +// Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles. +// Styles 38 and 39 are for future use. #define wxSTC_STYLE_DEFAULT 32 #define wxSTC_STYLE_LINENUMBER 33 #define wxSTC_STYLE_BRACELIGHT 34 #define wxSTC_STYLE_BRACEBAD 35 #define wxSTC_STYLE_CONTROLCHAR 36 #define wxSTC_STYLE_INDENTGUIDE 37 +#define wxSTC_STYLE_LASTPREDEFINED 39 #define wxSTC_STYLE_MAX 127 // Character set identifiers are used in StyleSetCharacterSet. @@ -295,6 +300,7 @@ #define wxSTC_LEX_EIFFEL 23 #define wxSTC_LEX_EIFFELKW 24 #define wxSTC_LEX_TCL 25 +#define wxSTC_LEX_NNCRONTAB 26 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a // value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -334,6 +340,8 @@ #define wxSTC_C_REGEX 14 #define wxSTC_C_COMMENTLINEDOC 15 #define wxSTC_C_WORD2 16 +#define wxSTC_C_COMMENTDOCKEYWORD 17 +#define wxSTC_C_COMMENTDOCKEYWORDERROR 18 // Lexical states for SCLEX_HTML, SCLEX_XML #define wxSTC_H_DEFAULT 0 @@ -365,7 +373,17 @@ #define wxSTC_H_XCCOMMENT 20 // SGML -#define wxSTC_H_SGML 21 +#define wxSTC_H_SGML_DEFAULT 21 +#define wxSTC_H_SGML_COMMAND 22 +#define wxSTC_H_SGML_1ST_PARAM 23 +#define wxSTC_H_SGML_DOUBLESTRING 24 +#define wxSTC_H_SGML_SIMPLESTRING 25 +#define wxSTC_H_SGML_ERROR 26 +#define wxSTC_H_SGML_SPECIAL 27 +#define wxSTC_H_SGML_ENTITY 28 +#define wxSTC_H_SGML_COMMENT 29 +#define wxSTC_H_SGML_1ST_PARAM_COMMENT 30 +#define wxSTC_H_SGML_BLOCK_DEFAULT 31 // Embedded Javascript #define wxSTC_HJ_START 40 @@ -604,6 +622,19 @@ #define wxSTC_EIFFEL_IDENTIFIER 7 #define wxSTC_EIFFEL_STRINGEOL 8 +// Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer) +#define wxSTC_NNCRONTAB_DEFAULT 0 +#define wxSTC_NNCRONTAB_COMMENT 1 +#define wxSTC_NNCRONTAB_TASK 2 +#define wxSTC_NNCRONTAB_SECTION 3 +#define wxSTC_NNCRONTAB_KEYWORD 4 +#define wxSTC_NNCRONTAB_MODIFIER 5 +#define wxSTC_NNCRONTAB_ASTERISK 6 +#define wxSTC_NNCRONTAB_NUMBER 7 +#define wxSTC_NNCRONTAB_STRING 8 +#define wxSTC_NNCRONTAB_ENVIRONMENT 9 +#define wxSTC_NNCRONTAB_IDENTIFIER 10 + // END of generated section //---------------------------------------------------------------------- // Others @@ -1223,10 +1254,12 @@ public: int GetTargetEnd(); // Replace the target text with the argument text. + // Text is counted so it can contain nulls. // Returns the length of the replacement text. int ReplaceTarget(const wxString& text); // Replace the target text with the argument text after \d processing. + // Text is counted so it can contain nulls. // Looks for \d where d is between 1 and 9 and replaces these with the strings // matched in the last search operation which were surrounded by \( and \). // Returns the length of the replacement text including any change @@ -1234,7 +1267,7 @@ public: int ReplaceTargetRE(const wxString& text); // Search for a counted string in the target and set the target to the found - // range. + // range. Text is counted so it can contain nulls. // Returns length of range or -1 for failure in which case target is not moved. int SearchInTarget(const wxString& text); diff --git a/src/stc/Makefile.in b/src/stc/Makefile.in index 3deb9ba6ba..d6fdd6bc60 100644 --- a/src/stc/Makefile.in +++ b/src/stc/Makefile.in @@ -37,6 +37,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \ LexAda.o \ LexCPP.o \ LexConf.o \ + LexCrontab.o \ LexEiffel.o \ LexHTML.o \ LexLisp.o \ @@ -53,6 +54,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \ RESearch.o \ ScintillaBase.o \ Style.o \ + StyleContext.o \ UniConversion.o \ ViewStyle.o \ WindowAccessor.o \ diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 0e73907414..35a85e67ae 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -531,24 +531,20 @@ ListBox::~ListBox() { void ListBox::Create(Window &parent, int ctrlID) { id = new wxSTCListBox(parent.id, ctrlID); -// id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize, -// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER); } void ListBox::SetVisibleRows(int rows) { desiredVisibleRows = rows; - printf("SetVisibleRows: %d\n", rows); } PRectangle ListBox::GetDesiredRect() { wxSize sz = ((wxListBox*)id)->GetBestSize(); - printf("GetDesiredRect: %d, %d\n", sz.x, sz.y); PRectangle rc; rc.top = 0; rc.left = 0; if (sz.x > 400) sz.x = 400; - if (sz.y > 150) + if (sz.y > 150) // TODO: Use desiredVisibleRows?? sz.y = 150; rc.right = sz.x; rc.bottom = sz.y; @@ -592,13 +588,7 @@ int ListBox::GetSelection() { } int ListBox::Find(const char *prefix) { - if (prefix) { - for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) { - wxString text = ((wxListBox*)id)->GetString(x); - if (text.StartsWith(prefix)) - return x; - } - } + // No longer used return -1; } diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp index 103ce92796..d5f2648dd1 100644 --- a/src/stc/ScintillaWX.cpp +++ b/src/stc/ScintillaWX.cpp @@ -122,9 +122,10 @@ void ScintillaWX::Finalise() { void ScintillaWX::StartDrag() { wxDropSource source(wMain.GetID()); - wxTextDataObject data(dragChars); + wxTextDataObject data(wxString(drag.s, drag.len)); wxDragResult result; + dropWentOutside = true; source.SetData(data); result = source.DoDragDrop(TRUE); if (result == wxDragMove && dropWentOutside) @@ -217,9 +218,10 @@ void ScintillaWX::NotifyParent(SCNotification scn) { void ScintillaWX::Copy() { if (currentPos != anchor) { - char* text = CopySelectionRange(); + SelectionText st; + CopySelectionRange(&st); wxTheClipboard->Open(); - wxTheClipboard->SetData(new wxTextDataObject(text)); + wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len))); wxTheClipboard->Close(); } } @@ -494,14 +496,15 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { wxDragResult ScintillaWX::DoDragEnter(wxCoord x, wxCoord y, wxDragResult def) { - return def; + dragResult = def; + return dragResult; } wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { SetDragPosition(PositionFromLocation(Point(x, y))); dragResult = def; - return def; + return dragResult; } diff --git a/src/stc/makefile.b32 b/src/stc/makefile.b32 index 492b4e26df..7a74f314af 100644 --- a/src/stc/makefile.b32 +++ b/src/stc/makefile.b32 @@ -22,36 +22,45 @@ STCEXTRACPPFLAGS=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S) LIBTARGET=$(WXDIR)\contrib\lib\stc.lib OBJECTS = \ - AutoComplete.obj \ - CallTip.obj \ - CellBuffer.obj \ - ContractionState.obj \ - Document.obj \ - DocumentAccessor.obj \ - Editor.obj \ - Indicator.obj \ - KeyMap.obj \ - KeyWords.obj \ - LexCPP.obj \ - LexHTML.obj \ - LexLua.obj \ - LexOthers.obj \ - LexPerl.obj \ - LexPython.obj \ - LexSQL.obj \ - LexVB.obj \ - LineMarker.obj \ - PosRegExp.obj \ - PropSet.obj \ - ScintillaBase.obj \ - Style.obj \ - UniConversion.obj \ - ViewStyle.obj \ - WindowAccessor.obj \ - \ - PlatWX.obj \ - ScintillaWX.obj \ - stc.obj \ + AutoComplete.obj \ + CallTip.obj \ + CellBuffer.obj \ + ContractionState.obj \ + Document.obj \ + DocumentAccessor.obj \ + Editor.obj \ + Indicator.obj \ + KeyMap.obj \ + KeyWords.obj \ + LexAVE.obj \ + LexAda.obj \ + LexCPP.obj \ + LexConf.obj \ + LexCrontab.obj \ + LexEiffel.obj \ + LexHTML.obj \ + LexLisp.obj \ + LexLua.obj \ + LexOthers.obj \ + LexPascal.obj \ + LexPerl.obj \ + LexPython.obj \ + LexRuby.obj \ + LexSQL.obj \ + LexVB.obj \ + LineMarker.obj \ + PropSet.obj \ + RESearch.obj \ + ScintillaBase.obj \ + Style.obj \ + StyleContext.obj \ + UniConversion.obj \ + ViewStyle.obj \ + WindowAccessor.obj \ + \ + PlatWX.obj \ + ScintillaWX.obj \ + stc.obj \ !include $(WXDIR)\src\makelib.b32 diff --git a/src/stc/makefile.g95 b/src/stc/makefile.g95 index ea3cbd9c0c..cf708ed801 100644 --- a/src/stc/makefile.g95 +++ b/src/stc/makefile.g95 @@ -10,32 +10,42 @@ S=$(SCINTILLA)/src EXTRAINC=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S) -I. -I$(WXDIR)/contrib/include OBJECTS = \ - $(S)/AutoComplete.$(OBJSUFF) \ - $(S)/CallTip.$(OBJSUFF) \ - $(S)/CellBuffer.$(OBJSUFF) \ - $(S)/ContractionState.$(OBJSUFF)\ - $(S)/Document.$(OBJSUFF) \ - $(S)/Editor.$(OBJSUFF) \ - $(S)/Indicator.$(OBJSUFF) \ - $(S)/KeyMap.$(OBJSUFF) \ - $(S)/KeyWords.$(OBJSUFF) \ - $(S)/LineMarker.$(OBJSUFF) \ - $(S)/PropSet.$(OBJSUFF) \ - $(S)/ScintillaBase.$(OBJSUFF) \ - $(S)/Style.$(OBJSUFF) \ - $(S)/ViewStyle.$(OBJSUFF) \ - $(S)/LexCPP.$(OBJSUFF) \ - $(S)/LexHTML.$(OBJSUFF) \ - $(S)/LexLua.$(OBJSUFF) \ - $(S)/LexOthers.$(OBJSUFF) \ - $(S)/LexPerl.$(OBJSUFF) \ - $(S)/LexPython.$(OBJSUFF) \ - $(S)/LexSQL.$(OBJSUFF) \ - $(S)/LexVB.$(OBJSUFF) \ - $(S)/DocumentAccessor.$(OBJSUFF)\ + $(S)/AutoComplete.$(OBJSUFF) \ + $(S)/CallTip.$(OBJSUFF) \ + $(S)/CellBuffer.$(OBJSUFF) \ + $(S)/ContractionState.$(OBJSUFF) \ + $(S)/Document.$(OBJSUFF) \ + $(S)/DocumentAccessor.$(OBJSUFF) \ + $(S)/Editor.$(OBJSUFF) \ + $(S)/Indicator.$(OBJSUFF) \ + $(S)/KeyMap.$(OBJSUFF) \ + $(S)/KeyWords.$(OBJSUFF) \ + $(S)/LexAVE.$(OBJSUFF) \ + $(S)/LexAda.$(OBJSUFF) \ + $(S)/LexCPP.$(OBJSUFF) \ + $(S)/LexConf.$(OBJSUFF) \ + $(S)/LexCrontab.$(OBJSUFF) \ + $(S)/LexEiffel.$(OBJSUFF) \ + $(S)/LexHTML.$(OBJSUFF) \ + $(S)/LexLisp.$(OBJSUFF) \ + $(S)/LexLua.$(OBJSUFF) \ + $(S)/LexOthers.$(OBJSUFF) \ + $(S)/LexPascal.$(OBJSUFF) \ + $(S)/LexPerl.$(OBJSUFF) \ + $(S)/LexPython.$(OBJSUFF) \ + $(S)/LexRuby.$(OBJSUFF) \ + $(S)/LexSQL.$(OBJSUFF) \ + $(S)/LexVB.$(OBJSUFF) \ + $(S)/LineMarker.$(OBJSUFF) \ + $(S)/PropSet.$(OBJSUFF) \ + $(S)/RESearch.$(OBJSUFF) \ + $(S)/ScintillaBase.$(OBJSUFF) \ + $(S)/Style.$(OBJSUFF) \ + $(S)/StyleContext.$(OBJSUFF) \ $(S)/UniConversion.$(OBJSUFF) \ + $(S)/ViewStyle.$(OBJSUFF) \ $(S)/WindowAccessor.$(OBJSUFF) \ - $(S)/PosRegExp.$(OBJSUFF) \ + \ PlatWX.$(OBJSUFF) \ ScintillaWX.$(OBJSUFF) \ stc.$(OBJSUFF) diff --git a/src/stc/makefile.vc b/src/stc/makefile.vc index fa0f4a7e77..9c6d478b87 100644 --- a/src/stc/makefile.vc +++ b/src/stc/makefile.vc @@ -15,40 +15,41 @@ NOPCH=1 !include $(WXDIR)\src\makevc.env OBJECTS = \ - $(D)\AutoComplete.obj \ - $(D)\CallTip.obj \ - $(D)\CellBuffer.obj \ - $(D)\ContractionState.obj\ - $(D)\Document.obj \ - $(D)\DocumentAccessor.obj\ - $(D)\Editor.obj \ - $(D)\Indicator.obj \ - $(D)\KeyMap.obj \ - $(D)\KeyWords.obj \ - $(D)\LineMarker.obj \ - $(D)\PropSet.obj \ - $(D)\RESearch.obj \ - $(D)\ScintillaBase.obj \ - $(D)\Style.obj \ - $(D)\UniConversion.obj \ - $(D)\ViewStyle.obj \ - $(D)\WindowAccessor.obj \ - \ - $(D)\LexAda.obj \ - $(D)\LexAVE.obj \ - $(D)\LexConf.obj \ - $(D)\LexCPP.obj \ - $(D)\LexEiffel.obj \ - $(D)\LexHTML.obj \ - $(D)\LexLisp.obj \ - $(D)\LexLua.obj \ - $(D)\LexOthers.obj \ - $(D)\LexPascal.obj \ - $(D)\LexPerl.obj \ - $(D)\LexPython.obj \ - $(D)\LexRuby.obj \ - $(D)\LexSQL.obj \ - $(D)\LexVB.obj \ + $(D)\AutoComplete.obj \ + $(D)\CallTip.obj \ + $(D)\CellBuffer.obj \ + $(D)\ContractionState.obj \ + $(D)\Document.obj \ + $(D)\DocumentAccessor.obj \ + $(D)\Editor.obj \ + $(D)\Indicator.obj \ + $(D)\KeyMap.obj \ + $(D)\KeyWords.obj \ + $(D)\LexAVE.obj \ + $(D)\LexAda.obj \ + $(D)\LexCPP.obj \ + $(D)\LexConf.obj \ + $(D)\LexCrontab.obj \ + $(D)\LexEiffel.obj \ + $(D)\LexHTML.obj \ + $(D)\LexLisp.obj \ + $(D)\LexLua.obj \ + $(D)\LexOthers.obj \ + $(D)\LexPascal.obj \ + $(D)\LexPerl.obj \ + $(D)\LexPython.obj \ + $(D)\LexRuby.obj \ + $(D)\LexSQL.obj \ + $(D)\LexVB.obj \ + $(D)\LineMarker.obj \ + $(D)\PropSet.obj \ + $(D)\RESearch.obj \ + $(D)\ScintillaBase.obj \ + $(D)\Style.obj \ + $(D)\StyleContext.obj \ + $(D)\UniConversion.obj \ + $(D)\ViewStyle.obj \ + $(D)\WindowAccessor.obj \ \ $(D)\PlatWX.obj \ $(D)\ScintillaWX.obj \ diff --git a/src/stc/scintilla/README.txt b/src/stc/scintilla/README.txt index 598da70f58..98c4018245 100644 --- a/src/stc/scintilla/README.txt +++ b/src/stc/scintilla/README.txt @@ -3,5 +3,5 @@ scintilla/include directories from the Scintilla/SCiTE source distribution. All other code needed to implement Scintilla on top of wxWindows is located in the directory above this one. -The current version of the Scintilla code is 1.39 +The current version of the Scintilla code is 1.40 diff --git a/src/stc/scintilla/include/SciLexer.h b/src/stc/scintilla/include/SciLexer.h index 591bd06aa1..680cb15138 100644 --- a/src/stc/scintilla/include/SciLexer.h +++ b/src/stc/scintilla/include/SciLexer.h @@ -40,6 +40,7 @@ #define SCLEX_EIFFEL 23 #define SCLEX_EIFFELKW 24 #define SCLEX_TCL 25 +#define SCLEX_NNCRONTAB 26 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -72,6 +73,8 @@ #define SCE_C_REGEX 14 #define SCE_C_COMMENTLINEDOC 15 #define SCE_C_WORD2 16 +#define SCE_C_COMMENTDOCKEYWORD 17 +#define SCE_C_COMMENTDOCKEYWORDERROR 18 #define SCE_H_DEFAULT 0 #define SCE_H_TAG 1 #define SCE_H_TAGUNKNOWN 2 @@ -93,7 +96,17 @@ #define SCE_H_QUESTION 18 #define SCE_H_VALUE 19 #define SCE_H_XCCOMMENT 20 -#define SCE_H_SGML 21 +#define SCE_H_SGML_DEFAULT 21 +#define SCE_H_SGML_COMMAND 22 +#define SCE_H_SGML_1ST_PARAM 23 +#define SCE_H_SGML_DOUBLESTRING 24 +#define SCE_H_SGML_SIMPLESTRING 25 +#define SCE_H_SGML_ERROR 26 +#define SCE_H_SGML_SPECIAL 27 +#define SCE_H_SGML_ENTITY 28 +#define SCE_H_SGML_COMMENT 29 +#define SCE_H_SGML_1ST_PARAM_COMMENT 30 +#define SCE_H_SGML_BLOCK_DEFAULT 31 #define SCE_HJ_START 40 #define SCE_HJ_DEFAULT 41 #define SCE_HJ_COMMENT 42 @@ -295,6 +308,17 @@ #define SCE_EIFFEL_OPERATOR 6 #define SCE_EIFFEL_IDENTIFIER 7 #define SCE_EIFFEL_STRINGEOL 8 +#define SCE_NNCRONTAB_DEFAULT 0 +#define SCE_NNCRONTAB_COMMENT 1 +#define SCE_NNCRONTAB_TASK 2 +#define SCE_NNCRONTAB_SECTION 3 +#define SCE_NNCRONTAB_KEYWORD 4 +#define SCE_NNCRONTAB_MODIFIER 5 +#define SCE_NNCRONTAB_ASTERISK 6 +#define SCE_NNCRONTAB_NUMBER 7 +#define SCE_NNCRONTAB_STRING 8 +#define SCE_NNCRONTAB_ENVIRONMENT 9 +#define SCE_NNCRONTAB_IDENTIFIER 10 //--Autogenerated -- end of section automatically generated from Scintilla.iface #endif diff --git a/src/stc/scintilla/include/Scintilla.h b/src/stc/scintilla/include/Scintilla.h index 0185d3e5be..abe1581a49 100644 --- a/src/stc/scintilla/include/Scintilla.h +++ b/src/stc/scintilla/include/Scintilla.h @@ -11,9 +11,6 @@ #ifndef SCINTILLA_H #define SCINTILLA_H -// Compile-time configuration options -#define MACRO_SUPPORT 1 // Comment out to remove macro hooks - #if PLAT_WIN #ifdef STATIC_BUILD void Scintilla_RegisterClasses(HINSTANCE hInstance); @@ -102,6 +99,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SC_MARK_CIRCLEPLUSCONNECTED 19 #define SC_MARK_CIRCLEMINUS 20 #define SC_MARK_CIRCLEMINUSCONNECTED 21 +#define SC_MARK_CHARACTER 10000 #define SC_MARKNUM_FOLDEREND 25 #define SC_MARKNUM_FOLDEROPENMID 26 #define SC_MARKNUM_FOLDERMIDTAIL 27 @@ -134,6 +132,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define STYLE_BRACEBAD 35 #define STYLE_CONTROLCHAR 36 #define STYLE_INDENTGUIDE 37 +#define STYLE_LASTPREDEFINED 39 #define STYLE_MAX 127 #define SC_CHARSET_ANSI 0 #define SC_CHARSET_DEFAULT 1 @@ -507,12 +506,6 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCN_DWELLEND 2017 //--Autogenerated -- end of section automatically generated from Scintilla.iface -// Optional module for macro recording -#ifdef MACRO_SUPPORT -typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam, - long lParam, void *userData); -#endif - // These structures are defined to be exactly the same shape as the Win32 // CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs. // So older code that treats Scintilla as a RichEdit will work. @@ -566,11 +559,9 @@ struct SCNotification { const char *text; // SCN_MODIFIED int length; // SCN_MODIFIED int linesAdded; // SCN_MODIFIED -#ifdef MACRO_SUPPORT int message; // SCN_MACRORECORD uptr_t wParam; // SCN_MACRORECORD - sptr_t lParam; // SCN_MACRORECORD -#endif + sptr_t lParam; // SCN_MACRORECORD int line; // SCN_MODIFIED int foldLevelNow; // SCN_MODIFIED int foldLevelPrev; // SCN_MODIFIED diff --git a/src/stc/scintilla/include/Scintilla.iface b/src/stc/scintilla/include/Scintilla.iface index 90360076fa..7724efdb00 100644 --- a/src/stc/scintilla/include/Scintilla.iface +++ b/src/stc/scintilla/include/Scintilla.iface @@ -229,6 +229,8 @@ val SC_MARK_CIRCLEPLUSCONNECTED=19 val SC_MARK_CIRCLEMINUS=20 val SC_MARK_CIRCLEMINUSCONNECTED=21 +val SC_MARK_CHARACTER=10000 + # Markers used for outlining column val SC_MARKNUM_FOLDEREND=25 val SC_MARKNUM_FOLDEROPENMID=26 @@ -292,12 +294,15 @@ set void SetMarginSensitiveN=2246(int margin, bool sensitive) # Retrieve the mouse click sensitivity of a margin. get bool GetMarginSensitiveN=2247(int margin,) +# Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles. +# Styles 38 and 39 are for future use. val STYLE_DEFAULT=32 val STYLE_LINENUMBER=33 val STYLE_BRACELIGHT=34 val STYLE_BRACEBAD=35 val STYLE_CONTROLCHAR=36 val STYLE_INDENTGUIDE=37 +val STYLE_LASTPREDEFINED=39 val STYLE_MAX=127 # Character set identifiers are used in StyleSetCharacterSet. @@ -759,10 +764,12 @@ set void SetTargetEnd=2192(position pos,) get position GetTargetEnd=2193(,) # Replace the target text with the argument text. +# Text is counted so it can contain nulls. # Returns the length of the replacement text. fun int ReplaceTarget=2194(int length, string text) # Replace the target text with the argument text after \d processing. +# Text is counted so it can contain nulls. # Looks for \d where d is between 1 and 9 and replaces these with the strings # matched in the last search operation which were surrounded by \( and \). # Returns the length of the replacement text including any change @@ -770,7 +777,7 @@ fun int ReplaceTarget=2194(int length, string text) fun int ReplaceTargetRE=2195(int length, string text) # Search for a counted string in the target and set the target to the found -# range. +# range. Text is counted so it can contain nulls. # Returns length of range or -1 for failure in which case target is not moved. fun int SearchInTarget=2197(int length, string text) @@ -1265,6 +1272,7 @@ val SCLEX_RUBY=22 val SCLEX_EIFFEL=23 val SCLEX_EIFFELKW=24 val SCLEX_TCL=25 +val SCLEX_NNCRONTAB=26 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a # value assigned in sequence from SCLEX_AUTOMATIC+1. val SCLEX_AUTOMATIC=1000 @@ -1301,6 +1309,8 @@ val SCE_C_VERBATIM=13 val SCE_C_REGEX=14 val SCE_C_COMMENTLINEDOC=15 val SCE_C_WORD2=16 +val SCE_C_COMMENTDOCKEYWORD=17 +val SCE_C_COMMENTDOCKEYWORDERROR=18 # Lexical states for SCLEX_HTML, SCLEX_XML val SCE_H_DEFAULT=0 val SCE_H_TAG=1 @@ -1327,7 +1337,17 @@ val SCE_H_VALUE=19 # X-Code val SCE_H_XCCOMMENT=20 # SGML -val SCE_H_SGML=21 +val SCE_H_SGML_DEFAULT=21 +val SCE_H_SGML_COMMAND=22 +val SCE_H_SGML_1ST_PARAM=23 +val SCE_H_SGML_DOUBLESTRING=24 +val SCE_H_SGML_SIMPLESTRING=25 +val SCE_H_SGML_ERROR=26 +val SCE_H_SGML_SPECIAL=27 +val SCE_H_SGML_ENTITY=28 +val SCE_H_SGML_COMMENT=29 +val SCE_H_SGML_1ST_PARAM_COMMENT=30 +val SCE_H_SGML_BLOCK_DEFAULT=31 # Embedded Javascript val SCE_HJ_START=40 val SCE_HJ_DEFAULT=41 @@ -1547,6 +1567,18 @@ val SCE_EIFFEL_CHARACTER=5 val SCE_EIFFEL_OPERATOR=6 val SCE_EIFFEL_IDENTIFIER=7 val SCE_EIFFEL_STRINGEOL=8 +# Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer) +val SCE_NNCRONTAB_DEFAULT=0 +val SCE_NNCRONTAB_COMMENT=1 +val SCE_NNCRONTAB_TASK=2 +val SCE_NNCRONTAB_SECTION=3 +val SCE_NNCRONTAB_KEYWORD=4 +val SCE_NNCRONTAB_MODIFIER=5 +val SCE_NNCRONTAB_ASTERISK=6 +val SCE_NNCRONTAB_NUMBER=7 +val SCE_NNCRONTAB_STRING=8 +val SCE_NNCRONTAB_ENVIRONMENT=9 +val SCE_NNCRONTAB_IDENTIFIER=10 # Events @@ -1574,171 +1606,3 @@ evt void DwellStart=2016(int position) evt void DwellEnd=2017(int position) cat Deprecated - -val SCFIND_DOWN=1 - -################################################ -# From WinDefs.h - -# ***** DEPRECATED from here to end of file ****** - -# Will a paste succeed? -fun bool EM_CanPaste=1074(,) - -# Are there any undoable actions in the undo history. -fun bool EM_CanUndo=198(,) - -# Find the position and line from a point within the window. -fun int EM_CharFromPos=215(,point pt) - -# Delete the undo history. -fun void EM_EmptyUndoBuffer=205(,) - -# Retrieve the selection range. -fun void EM_ExGetSel=1076(,charrangeresult cr) - -# Retrieve the line number of a position in the document. -get int EM_ExLineFromChar=1078(,position pos) - -# Select a range of text. -fun void EM_ExSetSel=1079(,charrange cr) - -# Find some text in the document. -fun position EM_FindText=1080(int flags, findtext ft) - -# Find some text in the document. Returns range of found text in ft argument. -fun position EM_FindTextEx=1103(int flags, findtextex ft) - -# On Windows will draw the document into a display context such as a printer. -fun void EM_FormatRange=1081(bool draw, formatrange fr) - -# Retrieve the line at the top of the display. -get int EM_GetFirstVisibleLine=206(,) - -# Retrieve the contents of a line. -# Returns the length of the line. -fun int EM_GetLine=196(int line, countedstring text) - -# Returns the number of lines in the document. There is always at least one. -fun int EM_GetLineCount=186(,) - -# Returns the size in pixels of left and right margins packed into one integer. -# The left margin is in the low half and the right margin in the high half. -fun int EM_GetMargins=212(,) - -# Is the document different from when it was last saved? -get bool EM_GetModify=184(,) - -# Get the area used to display the document. -fun void EM_GetRect=178(,rectangle r) - -# Return the selection packed into one integer with the start of the selection -# in the low half and the end in the high half. -fun int EM_GetSel=176(,) - -# Retrieve the selected text. -# Return the length of the text. -fun int EM_GetSelText=1086(,stringresult text) - -# Retrieve a range of text. -# Return the length of the text. -fun int EM_GetTextRange=1099(, textrange tr) - -# Draw the selection in normal style or with selection highlighted. -fun void EM_HideSelection=1087(bool normal,) - -# Retrieve the line of a position. -fun int EM_LineFromChar=201(position pos,) - -# Retrieve the position at the start of a line. -fun position EM_LineIndex=187(int line,) - -# Retrieve the number of characters on a line not including end of line characters. -fun int EM_LineLength=193(int line,) - -# Scroll horizontally and vertically. -fun void EM_LineScroll=182(int columns, int lines) - -# Retrieve the point in the window where a position is displayed. -fun void EM_PosFromChar=214(pointresult pt, position pos) - -# Replace the selected text with the argument text. -fun void EM_ReplaceSel=194(, string text) - -# Ensure the caret is visible. -fun void EM_ScrollCaret=183(,) - -# Returns SEL_EMPTY if selection contains no characters, otherwise SEL_TEXT. -fun void EM_SelectionType=1090(,) - -# Set the width of the left and right margins -fun void EM_SetMargins=211(int flags, int values) - -# Set to read only or read write. -set void EM_SetReadOnly=207(bool readOnly,) - -# Select the range of text from start to end. -fun void EM_SetSel=177(position start, position end) - -# Undo one action in the undo history. -fun void EM_Undo=199(,) - -# Null operation. -fun void WM_Null=0(,) - -# Clear the selection. -fun void WM_Clear=771(,) - -fun void WM_Command=273(,) - -# Copy the selection to the clipboard. -fun void WM_Copy=769(,) - -# Cut the selection to the clipboard. -fun void WM_Cut=768(,) - -# Retrieve all the text in the document. -# Returns number of characters retrieved. -fun int WM_GetText=13(int length, stringresult text) - -# Retrieve the number of characters in the document. -fun int WM_GetTextLength=14(,) - -# Notification back to container -fun void WM_Notify=78(int id, int stuff) - -# Paste the contents of the clipboard into the document replacing the selection. -fun void WM_Paste=770(,) - -# Replace the contents of the document with the argument text. -fun void WM_SetText=12(, string text) - -# Undo one action in the undo history. -fun void WM_Undo=772(,) - -# Notification codes -val EN_CHANGE=768 -val EN_KILLFOCUS=512 -val EN_SETFOCUS=256 - -# Flags for setting margins. -val EC_LEFTMARGIN=1 -val EC_RIGHTMARGIN=2 -val EC_USEFONTINFO=0xffff - -# Selection type. -val SEL_EMPTY=0 -val SEL_TEXT=1 - -# Find replace mask constants -val FR_MATCHCASE=0x4 -val FR_WHOLEWORD=0x2 -val FR_DOWN=0x1 - -# Key modifier flag. -val SHIFT_PRESSED=1 -val LEFT_CTRL_PRESSED=2 -val LEFT_ALT_PRESSED=4 - -#events -evt void EN_Change=768(void) diff --git a/src/stc/scintilla/include/ScintillaWidget.h b/src/stc/scintilla/include/ScintillaWidget.h index f6c2fc3542..6e22f58f8b 100644 --- a/src/stc/scintilla/include/ScintillaWidget.h +++ b/src/stc/scintilla/include/ScintillaWidget.h @@ -11,17 +11,6 @@ #if PLAT_GTK -#ifndef SCINTILLA_H -#ifdef _MSC_VER -#pragma message(__FILE__ "(1) : warning : Scintilla.h should be included before ScintillaWidget.h") -#pragma message("This will be required in the next version of Scintilla") -#else -#warning Scintilla.h should be included before ScintillaWidget.h -#warning This will be required in the next version of Scintilla -#endif -#include "Scintilla.h" -#endif - #ifdef __cplusplus extern "C" { #endif diff --git a/src/stc/scintilla/include/WinDefs.h b/src/stc/scintilla/include/WinDefs.h deleted file mode 100644 index b3421c0bcc..0000000000 --- a/src/stc/scintilla/include/WinDefs.h +++ /dev/null @@ -1,197 +0,0 @@ -// Scintilla source code edit control -/** @file WinDefs.h - ** The subset of definitions from Windows needed by Scintilla for GTK+. - **/ -// Copyright 1998-2001 by Neil Hodgson -// The License.txt file describes the conditions under which this software may be distributed. - -#ifndef WINDEFS_H -#define WINDEFS_H - -/* Running GTK version on win32 */ -#if PLAT_GTK_WIN32 -#include "Windows.h" -#include "Richedit.h" - -/* Name conflicts */ -#undef DrawText -#undef FindText -#else - -#define WORD short -#define WPARAM unsigned long -#define LPARAM long -#define LRESULT long -#define DWORD long - -#define UINT unsigned int -#define LPSTR char * -#define LONG long - -//#if 0 -/* RTF control */ -#define EM_CANPASTE (1074) -#define EM_CANUNDO (198) -#define EM_CHARFROMPOS (215) -#define EM_EMPTYUNDOBUFFER (205) -#define EM_EXGETSEL (1076) -#define EM_EXLINEFROMCHAR (1078) -#define EM_EXSETSEL (1079) -#define EM_FINDTEXT (1080) -#define EM_FINDTEXTEX (1103) -#define EM_FORMATRANGE (1081) -#define EM_GETFIRSTVISIBLELINE (206) -#define EM_GETLINE (196) -#define EM_GETLINECOUNT (186) -#define EM_GETMARGINS (212) -#define EM_GETMODIFY (184) -#define EM_GETRECT (178) -#define EM_GETSEL (176) -#define EM_GETSELTEXT (1086) -#define EM_GETTEXTRANGE (1099) -#define EM_HIDESELECTION (1087) -#define EM_LINEFROMCHAR (201) -#define EM_LINEINDEX (187) -#define EM_LINELENGTH (193) -#define EM_LINESCROLL (182) -#define EM_POSFROMCHAR (214) -#define EM_REPLACESEL (194) -#define EM_SCROLLCARET (183) -#define EM_SELECTIONTYPE (1090) -#define EM_SETMARGINS (211) -#define EM_SETREADONLY (207) -#define EM_SETSEL (177) -#define EM_UNDO (199) - -#define WM_NULL (0) -#define WM_CLEAR (771) -#define WM_COPY (769) -#define WM_CUT (768) -#define WM_GETTEXT (13) -#define WM_GETTEXTLENGTH (14) -#define WM_PASTE (770) -#define WM_SETTEXT (12) -#define WM_UNDO (772) - -#define EN_CHANGE (768) -#define EN_KILLFOCUS (512) -#define EN_SETFOCUS (256) - -#define EC_LEFTMARGIN 1 -#define EC_RIGHTMARGIN 2 -#define EC_USEFONTINFO 0xffff - -//#endif - -#if 0 -#if PLAT_GTK -#define VK_DOWN GDK_Down -#define VK_UP GDK_Up -#define VK_LEFT GDK_Left -#define VK_RIGHT GDK_Right -#define VK_HOME GDK_Home -#define VK_END GDK_End -#define VK_PRIOR GDK_Page_Up -#define VK_NEXT GDK_Page_Down -#define VK_DELETE GDK_Delete -#define VK_INSERT GDK_Insert -#define VK_ESCAPE GDK_Escape -#define VK_BACK GDK_BackSpace -#define VK_TAB GDK_Tab -#define VK_RETURN GDK_Return -#define VK_ADD GDK_KP_Add -#define VK_SUBTRACT GDK_KP_Subtract -#define VK_DIVIDE GDK_KP_Divide -#endif - -#if PLAT_WX -#define VK_DOWN WXK_DOWN -#define VK_UP WXK_UP -#define VK_LEFT WXK_LEFT -#define VK_RIGHT WXK_RIGHT -#define VK_HOME WXK_HOME -#define VK_END WXK_END -#define VK_PRIOR WXK_PRIOR -#define VK_NEXT WXK_NEXT -#define VK_DELETE WXK_DELETE -#define VK_INSERT WXK_INSERT -#define VK_ESCAPE WXK_ESCAPE -#define VK_BACK WXK_BACK -#define VK_TAB WXK_TAB -#define VK_RETURN WXK_RETURN -#define VK_ADD WXK_ADD -#define VK_SUBTRACT WXK_SUBTRACT -//TODO: -#define VK_DIVIDE WXK_DIVIDE -#endif - -#define SHIFT_PRESSED 1 -#define LEFT_CTRL_PRESSED 2 -#define LEFT_ALT_PRESSED 4 - -// Are these needed any more -#define LPSTR char * -#define LONG long -#define LPDWORD (long *) - -/* SELCHANGE structure */ -#define SEL_EMPTY (0) -#define SEL_TEXT (1) -#define SEL_OBJECT (2) -#define SEL_MULTICHAR (4) -#define SEL_MULTIOBJECT (8) - -struct RECT { - LONG left; - LONG top; - LONG right; - LONG bottom; -}; - -/* FINDREPLACE structure */ - -#define FR_MATCHCASE (0x4) -#define FR_WHOLEWORD (0x2) -#define FR_DOWN (0x1) - -#endif - -#if 0 -struct CHARRANGE { - LONG cpMin; - LONG cpMax; -}; - -struct TEXTRANGE { - CHARRANGE chrg; - LPSTR lpstrText; -}; - -struct FINDTEXTEX { - CHARRANGE chrg; - LPSTR lpstrText; - CHARRANGE chrgText; -}; - -struct NMHDR { - WindowID hwndFrom; - UINT idFrom; - UINT code; -}; - -struct FORMATRANGE { - SurfaceID hdc; - SurfaceID hdcTarget; - RECT rc; - RECT rcPage; - CHARRANGE chrg; -}; -#endif - -//#define MAKELONG(a, b) ((a) | ((b) << 16)) -//#define LOWORD(x) (x & 0xffff) -//#define HIWORD(x) (x >> 16) - -#endif /* !_MSC_VER */ - -#endif diff --git a/src/stc/scintilla/src/Document.cxx b/src/stc/scintilla/src/Document.cxx index 10403242b9..abbb87d5dc 100644 --- a/src/stc/scintilla/src/Document.cxx +++ b/src/stc/scintilla/src/Document.cxx @@ -357,8 +357,10 @@ void Document::ModifiedAt(int pos) { // Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number void Document::DeleteChars(int pos, int len) { + if (len == 0) + return; if ((pos + len) > Length()) - return ; + return; if (cb.IsReadOnly() && enteredReadOnlyCount == 0) { enteredReadOnlyCount++; NotifyModifyAttempt(); diff --git a/src/stc/scintilla/src/Editor.cxx b/src/stc/scintilla/src/Editor.cxx index 5b72ac579d..2171924f0f 100644 --- a/src/stc/scintilla/src/Editor.cxx +++ b/src/stc/scintilla/src/Editor.cxx @@ -14,10 +14,6 @@ #include "Scintilla.h" -#if PLAT_WX || PLAT_GTK -#include "WinDefs.h" -#endif - #include "ContractionState.h" #include "SVector.h" #include "CellBuffer.h" @@ -58,7 +54,6 @@ Editor::Editor() { dwelling = false; ptMouseLast.x = 0; ptMouseLast.y = 0; - firstExpose = true; inDragDrop = false; dropWentOutside = false; posDrag = invalidPosition; @@ -69,9 +64,6 @@ Editor::Editor() { lineAnchor = 0; originalAnchorPos = 0; - dragChars = 0; - lenDrag = 0; - dragIsRectangle = false; selType = selStream; xStartSelect = 0; xEndSelect = 0; @@ -85,9 +77,6 @@ Editor::Editor() { searchAnchor = 0; - ucWheelScrollLines = 0; - cWheelDelta = 0; //wheel delta from roll - xOffset = 0; xCaretMargin = 50; horizontalScrollBarVisible = true; @@ -114,15 +103,11 @@ Editor::Editor() { modEventMask = SC_MODEVENTMASKALL; - displayPopupMenu = true; - pdoc = new Document(); pdoc ->AddRef(); pdoc->AddWatcher(this, 0); -#ifdef MACRO_SUPPORT - recordingMacro = 0; -#endif + recordingMacro = false; foldFlags = 0; } @@ -131,10 +116,6 @@ Editor::~Editor() { pdoc->Release(); pdoc = 0; DropGraphics(); - - delete []dragChars; - dragChars = 0; - lenDrag = 0; } void Editor::Finalise() { @@ -874,7 +855,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { if (marks) { for (int markBit = 0; (markBit < 32) && marks; markBit++) { if (marks & 1) { - vs.markers[markBit].Draw(surface, rcMarker); + vs.markers[markBit].Draw(surface, rcMarker, vs.styles[STYLE_LINENUMBER].font); } marks >>= 1; } @@ -1917,14 +1898,12 @@ void Editor::NotifyChar(int ch) { scn.nmhdr.code = SCN_CHARADDED; scn.ch = ch; NotifyParent(scn); -#ifdef MACRO_SUPPORT if (recordingMacro) { char txt[2]; txt[0] = static_cast(ch); txt[1] = '\0'; NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast(txt)); } -#endif } void Editor::NotifySavePoint(bool isSavePoint) { @@ -2150,7 +2129,6 @@ void Editor::NotifyDeleted(Document *, void *) { /* Do nothing */ } -#ifdef MACRO_SUPPORT void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam) { // Enumerates all macroable messages @@ -2159,10 +2137,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long case SCI_COPY: case SCI_PASTE: case SCI_CLEAR: - case WM_CUT: - case WM_COPY: - case WM_PASTE: - case WM_CLEAR: case SCI_REPLACESEL: case SCI_ADDTEXT: case SCI_INSERTTEXT: @@ -2236,7 +2210,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long scn.lParam = lParam; NotifyParent(scn); } -#endif // Force scroll and keep position relative to top of window void Editor::PageMove(int direction, bool extend) { @@ -2674,7 +2647,6 @@ void Editor::Indent(bool forwards) { * @return The position of the found text, -1 if not found. */ long Editor::FindText( - unsigned int iMessage, ///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT. unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD, ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP. long lParam) { ///< @c TextToFind structure: The text to search for in the given range. @@ -2688,10 +2660,8 @@ long Editor::FindText( wParam & SCFIND_REGEXP, &lengthFound); if (pos != -1) { - if (iMessage != EM_FINDTEXT) { - ft->chrgText.cpMin = pos; - ft->chrgText.cpMax = pos + lengthFound; - } + ft->chrgText.cpMin = pos; + ft->chrgText.cpMax = pos + lengthFound; } return pos; } @@ -2800,33 +2770,23 @@ char *Editor::CopyRange(int start, int end) { return text; } -int Editor::SelectionRangeLength() { +void Editor::CopySelectionRange(SelectionText *ss) { + char *text = 0; + int size = 0; if (selType == selRectangle) { int lineStart = pdoc->LineFromPosition(SelectionStart()); int lineEnd = pdoc->LineFromPosition(SelectionEnd()); - int totalSize = 0; - for (int line = lineStart; line <= lineEnd; line++) { - totalSize += SelectionEnd(line) - SelectionStart(line) + 1; + int line; + for (line = lineStart; line <= lineEnd; line++) { + size += SelectionEnd(line) - SelectionStart(line) + 1; if (pdoc->eolMode == SC_EOL_CRLF) - totalSize++; + size++; } - return totalSize; - } else { - return SelectionEnd() - SelectionStart(); - } -} - -char *Editor::CopySelectionRange() { - if (selType == selRectangle) { - char *text = 0; - int lineStart = pdoc->LineFromPosition(SelectionStart()); - int lineEnd = pdoc->LineFromPosition(SelectionEnd()); - int totalSize = SelectionRangeLength(); - if (totalSize > 0) { - text = new char[totalSize + 1]; + if (size > 0) { + text = new char[size + 1]; if (text) { int j = 0; - for (int line = lineStart; line <= lineEnd; line++) { + for (line = lineStart; line <= lineEnd; line++) { for (int i = SelectionStart(line);i < SelectionEnd(line);i++) { text[j++] = pdoc->CharAt(i); } @@ -2835,24 +2795,14 @@ char *Editor::CopySelectionRange() { if (pdoc->eolMode != SC_EOL_CR) text[j++] = '\n'; } - text[totalSize] = '\0'; + text[size] = '\0'; } } - return text; } else { - return CopyRange(SelectionStart(), SelectionEnd()); - } -} - -void Editor::CopySelectionIntoDrag() { - delete []dragChars; - dragChars = 0; - lenDrag = SelectionRangeLength(); - dragChars = CopySelectionRange(); - dragIsRectangle = selType == selRectangle; - if (!dragChars) { - lenDrag = 0; + size = SelectionEnd() - SelectionStart(); + text = CopyRange(SelectionStart(), SelectionEnd()); } + ss->Set(text, size, selType == selRectangle); } void Editor::SetDragPosition(int newPos) { @@ -2882,8 +2832,6 @@ void Editor::StartDrag() { //DisplayCursor(Window::cursorArrow); } - - void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) { //Platform::DebugPrintf("DropAt %d\n", inDragDrop); if (inDragDrop) @@ -3115,7 +3063,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b if (inDragDrop) { SetMouseCapture(false); SetDragPosition(newPos); - CopySelectionIntoDrag(); + CopySelectionRange(&drag); StartDrag(); } else { xStartSelect = pt.x - vs.fixedColumnWidth + xOffset; @@ -3220,25 +3168,23 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) { int selStart = SelectionStart(); int selEnd = SelectionEnd(); if (selStart < selEnd) { - if (dragChars && lenDrag) { + if (drag.len) { if (ctrl) { - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else if (newPos < selStart) { - pdoc->DeleteChars(selStart, lenDrag); - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->DeleteChars(selStart, drag.len); + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else if (newPos > selEnd) { - pdoc->DeleteChars(selStart, lenDrag); - newPos -= lenDrag; - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->DeleteChars(selStart, drag.len); + newPos -= drag.len; + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else { SetEmptySelection(newPos); } - delete []dragChars; - dragChars = 0; - lenDrag = 0; + drag.Set(0, 0); } selectionType = selChar; } @@ -3545,14 +3491,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { //Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam); // Optional macro recording hook -#ifdef MACRO_SUPPORT if (recordingMacro) NotifyMacroRecord(iMessage, wParam, lParam); -#endif switch (iMessage) { - case WM_GETTEXT: case SCI_GETTEXT: { if (lParam == 0) @@ -3565,7 +3508,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return iChar; } - case WM_SETTEXT: case SCI_SETTEXT: { if (lParam == 0) @@ -3576,130 +3518,45 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return TRUE; } - case WM_GETTEXTLENGTH: case SCI_GETTEXTLENGTH: return pdoc->Length(); - case WM_CUT: case SCI_CUT: Cut(); SetLastXChosen(); break; - case WM_COPY: case SCI_COPY: Copy(); break; - case WM_PASTE: case SCI_PASTE: Paste(); SetLastXChosen(); EnsureCaretVisible(); break; - case WM_CLEAR: case SCI_CLEAR: Clear(); SetLastXChosen(); break; - case WM_UNDO: case SCI_UNDO: Undo(); SetLastXChosen(); break; - // Edit control messages - - // Not supported (no-ops): - // EM_GETWORDBREAKPROC - // EM_GETWORDBREAKPROCEX - // EM_SETWORDBREAKPROC - // EM_SETWORDBREAKPROCEX - // EM_GETWORDWRAPMODE - // EM_SETWORDWRAPMODE - // EM_LIMITTEXT - // EM_EXLIMITTEXT - // EM_SETRECT - // EM_SETRECTNP - // EM_FMTLINES - // EM_GETHANDLE - // EM_SETHANDLE - // EM_GETPASSWORDCHAR - // EM_SETPASSWORDCHAR - // EM_SETTABSTOPS - // EM_FINDWORDBREAK - // EM_GETCHARFORMAT - // EM_SETCHARFORMAT - // EM_GETOLEINTERFACE - // EM_SETOLEINTERFACE - // EM_SETOLECALLBACK - // EM_GETPARAFORMAT - // EM_SETPARAFORMAT - // EM_PASTESPECIAL - // EM_REQUESTRESIZE - // EM_GETBKGNDCOLOR - // EM_SETBKGNDCOLOR - // EM_STREAMIN - // EM_STREAMOUT - // EM_GETIMECOLOR - // EM_SETIMECOLOR - // EM_GETIMEOPTIONS - // EM_SETIMEOPTIONS - // EM_GETOPTIONS - // EM_SETOPTIONS - // EM_GETPUNCTUATION - // EM_SETPUNCTUATION - // EM_GETTHUMB - // EM_SETTARGETDEVICE - - // Not supported but should be: - // EM_GETEVENTMASK - // EM_SETEVENTMASK - // For printing: - // EM_DISPLAYBAND - - case EM_CANUNDO: case SCI_CANUNDO: return pdoc->CanUndo() ? TRUE : FALSE; - case EM_UNDO: - Undo(); - SetLastXChosen(); - break; - - case EM_EMPTYUNDOBUFFER: case SCI_EMPTYUNDOBUFFER: pdoc->DeleteUndoHistory(); return 0; - case EM_GETFIRSTVISIBLELINE: case SCI_GETFIRSTVISIBLELINE: return topLine; - case EM_GETLINE: { - if (lParam == 0) { - return 0; - } - char *ptr = reinterpret_cast(lParam); - short *pBufSize = reinterpret_cast(lParam); - short bufSize = *pBufSize; - ptr[0] = '\0'; // If no characters copied, have to put a NUL into buffer - if (static_cast(wParam) > pdoc->LinesTotal()) { - return 0; - } - int lineStart = pdoc->LineStart(wParam); - int lineEnd = pdoc->LineStart(wParam + 1); - // The first word of the buffer is the size, in TCHARs, of the buffer - int iPlace = 0; - for (int iChar = lineStart; iChar < lineEnd && iPlace < bufSize; iChar++) { - ptr[iPlace++] = pdoc->CharAt(iChar); - } - return iPlace; - } - - case SCI_GETLINE: { // Simpler than EM_GETLINE, but with risk of overwriting the end of the buffer + case SCI_GETLINE: { // Risk of overwriting the end of the buffer if (lParam == 0) { return 0; } @@ -3713,42 +3570,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return iPlace; } - case EM_GETLINECOUNT: case SCI_GETLINECOUNT: if (pdoc->LinesTotal() == 0) return 1; else return pdoc->LinesTotal(); - case EM_GETMODIFY: case SCI_GETMODIFY: return !pdoc->IsSavePoint(); - case EM_GETRECT: - if (lParam == 0) - return 0; - *(reinterpret_cast(lParam)) = GetClientRectangle(); - break; - - case EM_GETSEL: - if (wParam) - *reinterpret_cast(wParam) = SelectionStart(); - if (lParam) - *reinterpret_cast(lParam) = SelectionEnd(); - return Platform::LongFromTwoShorts( - static_cast(SelectionStart()), - static_cast(SelectionEnd())); - - case EM_EXGETSEL: { - if (lParam == 0) - return 0; - CharacterRange *pCR = reinterpret_cast(lParam); - pCR->cpMin = SelectionStart(); - pCR->cpMax = SelectionEnd(); - } - break; - - case EM_SETSEL: case SCI_SETSEL: { int nStart = static_cast(wParam); int nEnd = static_cast(lParam); @@ -3762,55 +3592,28 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { } break; - case EM_EXSETSEL: { - if (lParam == 0) - return 0; - CharacterRange *pCR = reinterpret_cast(lParam); - selType = selStream; - if (pCR->cpMax == -1) { - SetSelection(pCR->cpMin, pdoc->Length()); - } else { - SetSelection(pCR->cpMin, pCR->cpMax); - } - EnsureCaretVisible(); - return pdoc->LineFromPosition(SelectionStart()); - } - - case EM_GETSELTEXT: case SCI_GETSELTEXT: { if (lParam == 0) return 0; + SelectionText selectedText; + CopySelectionRange(&selectedText); char *ptr = reinterpret_cast(lParam); - int selSize = SelectionRangeLength(); - char *text = CopySelectionRange(); int iChar = 0; - if (text) { - for (; iChar < selSize; iChar++) - ptr[iChar] = text[iChar]; + if (selectedText.len) { + for (; iChar < selectedText.len; iChar++) + ptr[iChar] = selectedText.s[iChar]; ptr[iChar] = '\0'; - delete []text; } else { ptr[0] = '\0'; } return iChar; } - case EM_LINEFROMCHAR: - if (static_cast(wParam) < 0) - wParam = SelectionStart(); - return pdoc->LineFromPosition(wParam); - - case EM_EXLINEFROMCHAR: - if (static_cast(lParam) < 0) - lParam = SelectionStart(); // Not specified, but probably OK - return pdoc->LineFromPosition(lParam); - case SCI_LINEFROMPOSITION: if (static_cast(wParam) < 0) return 0; return pdoc->LineFromPosition(wParam); - case EM_LINEINDEX: case SCI_POSITIONFROMLINE: if (static_cast(wParam) < 0) wParam = pdoc->LineFromPosition(SelectionStart()); @@ -3822,28 +3625,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { // return -1; return pdoc->LineStart(wParam); - case EM_LINELENGTH: { - if (static_cast(wParam) < 0) // Who use this anyway? - return 0; // Should be... Too complex to describe here, see MS specs! - if (static_cast(wParam) > pdoc->Length()) // Useful test, anyway... - return 0; - int line = pdoc->LineFromPosition(wParam); - int charsOnLine = 0; - for (int pos = pdoc->LineStart(line); pos < pdoc->LineStart(line + 1); pos++) { - if ((pdoc->CharAt(pos) != '\r') && (pdoc->CharAt(pos) != '\n')) - charsOnLine++; - } - return charsOnLine; - } - - // Replacement of the old Scintilla interpretation of EM_LINELENGTH + // Replacement of the old Scintilla interpretation of EM_LINELENGTH case SCI_LINELENGTH: if ((static_cast(wParam) < 0) || (static_cast(wParam) > pdoc->LineFromPosition(pdoc->Length()))) return 0; return pdoc->LineStart(wParam + 1) - pdoc->LineStart(wParam); - case EM_REPLACESEL: case SCI_REPLACESEL: { if (lParam == 0) return 0; @@ -3890,18 +3678,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETSEARCHFLAGS: return searchFlags; - case EM_LINESCROLL: case SCI_LINESCROLL: ScrollTo(topLine + lParam); HorizontalScrollTo(xOffset + wParam * vs.spaceWidth); return TRUE; - case EM_SCROLLCARET: case SCI_SCROLLCARET: EnsureCaretVisible(); break; - case EM_SETREADONLY: case SCI_SETREADONLY: pdoc->SetReadOnly(wParam); return TRUE; @@ -3909,33 +3694,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETREADONLY: return pdoc->IsReadOnly(); - case EM_CANPASTE: case SCI_CANPASTE: return CanPaste(); - case EM_CHARFROMPOS: { - if (lParam == 0) - return 0; - Point *ppt = reinterpret_cast(lParam); - int pos = PositionFromLocation(*ppt); - int line = pdoc->LineFromPosition(pos); - return Platform::LongFromTwoShorts( - static_cast(pos), static_cast < short > (line)); - } - - case EM_POSFROMCHAR: { - // The MS specs for this have changed 3 times: using the RichEdit 3 version - if (wParam == 0) - return 0; - Point *ppt = reinterpret_cast(wParam); - if (lParam < 0) { - *ppt = Point(0, 0); - } else { - *ppt = LocationFromPosition(lParam); - } - return 0; - } - case SCI_POINTXFROMPOSITION: if (lParam < 0) { return 0; @@ -3952,14 +3713,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return pt.y; } - case EM_FINDTEXT: - return FindText(iMessage, wParam, lParam); - - case EM_FINDTEXTEX: case SCI_FINDTEXT: - return FindText(iMessage, wParam, lParam); + return FindText(wParam, lParam); - case EM_GETTEXTRANGE: case SCI_GETTEXTRANGE: { if (lParam == 0) return 0; @@ -3974,53 +3730,20 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return len; // Not including NUL } - - - case EM_SELECTIONTYPE: -#ifdef SEL_EMPTY - if (currentPos == anchor) - return SEL_EMPTY; - else - return SEL_TEXT; -#else - return 0; -#endif - - case EM_HIDESELECTION: + case SCI_HIDESELECTION: hideSelection = wParam; Redraw(); break; - case EM_FORMATRANGE: case SCI_FORMATRANGE: return FormatRange(wParam, reinterpret_cast(lParam)); - case EM_GETMARGINS: - return Platform::LongFromTwoShorts(static_cast(vs.leftMarginWidth), - static_cast(vs.rightMarginWidth)); - case SCI_GETMARGINLEFT: return vs.leftMarginWidth; case SCI_GETMARGINRIGHT: return vs.rightMarginWidth; - case EM_SETMARGINS: -#ifdef EC_LEFTMARGIN - if (wParam & EC_LEFTMARGIN) { - vs.leftMarginWidth = Platform::LowShortFromLong(lParam); - } - if (wParam & EC_RIGHTMARGIN) { - vs.rightMarginWidth = Platform::HighShortFromLong(lParam); - } - if (wParam == EC_USEFONTINFO) { - vs.leftMarginWidth = vs.aveCharWidth / 2; - vs.rightMarginWidth = vs.aveCharWidth / 2; - } - InvalidateStyleRedraw(); -#endif - break; - case SCI_SETMARGINLEFT: vs.leftMarginWidth = lParam; InvalidateStyleRedraw(); @@ -4667,10 +4390,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_LINESONSCREEN: return LinesOnScreen(); - case SCI_USEPOPUP: - displayPopupMenu = wParam; - break; - case SCI_SETSELFORE: vs.selforeset = wParam; vs.selforeground.desired = Colour(lParam); @@ -4711,7 +4430,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_CLEARCMDKEY: kmap.AssignCmdKey(Platform::LowShortFromLong(wParam), - Platform::HighShortFromLong(wParam), WM_NULL); + Platform::HighShortFromLong(wParam), SCI_NULL); break; case SCI_CLEARALLCMDKEYS: @@ -4915,15 +4634,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETCURSOR: return cursorMode; -#ifdef MACRO_SUPPORT case SCI_STARTRECORD: - recordingMacro = 1; + recordingMacro = true; return 0; case SCI_STOPRECORD: - recordingMacro = 0; + recordingMacro = false; return 0; -#endif case SCI_MOVECARETINSIDEVIEW: MoveCaretInsideView(); diff --git a/src/stc/scintilla/src/Editor.h b/src/stc/scintilla/src/Editor.h index d42f5ad14a..a51fd86f91 100644 --- a/src/stc/scintilla/src/Editor.h +++ b/src/stc/scintilla/src/Editor.h @@ -50,6 +50,26 @@ public: int positions[maxLineLength+1]; }; +class SelectionText { +public: + char *s; + int len; + bool rectangular; + SelectionText() : s(0), len(0), rectangular(false) {} + ~SelectionText() { + Set(0, 0); + } + void Set(char *s_, int len_, bool rectangular_=false) { + delete []s; + s = s_; + if (s) + len = len_; + else + len = 0; + rectangular = rectangular_; + } +}; + /** */ class Editor : public DocWatcher { @@ -68,6 +88,7 @@ protected: // ScintillaBase subclass needs access to much of Editor bool stylesValid; ViewStyle vs; Palette palette; + int printMagnification; int printColourMode; int cursorMode; @@ -91,9 +112,6 @@ protected: // ScintillaBase subclass needs access to much of Editor Surface pixmapSelPattern; Surface pixmapIndentGuide; Surface pixmapIndentGuideHighlight; - // Intellimouse support - currently only implemented for Windows - unsigned int ucWheelScrollLines; - int cWheelDelta; ///< Wheel delta from roll KeyMap kmap; @@ -109,7 +127,6 @@ protected: // ScintillaBase subclass needs access to much of Editor bool dwelling; enum { selChar, selWord, selLine } selectionType; Point ptMouseLast; - bool firstExpose; bool inDragDrop; bool dropWentOutside; int posDrag; @@ -138,9 +155,7 @@ protected: // ScintillaBase subclass needs access to much of Editor int modEventMask; - char *dragChars; - int lenDrag; - bool dragIsRectangle; + SelectionText drag; enum { selStream, selRectangle, selRectangleFixed } selType; int xStartSelect; int xEndSelect; @@ -154,11 +169,7 @@ protected: // ScintillaBase subclass needs access to much of Editor int searchAnchor; - int displayPopupMenu; - -#ifdef MACRO_SUPPORT - int recordingMacro; -#endif + bool recordingMacro; int foldFlags; ContractionState cs; @@ -270,11 +281,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void NotifyModified(Document *document, DocModification mh, void *userData); void NotifyDeleted(Document *document, void *userData); void NotifyStyleNeeded(Document *doc, void *userData, int endPos); - - -#ifdef MACRO_SUPPORT void NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam); -#endif void PageMove(int direction, bool extend=false); void ChangeCaseOfSelection(bool makeUpperCase); @@ -289,16 +296,14 @@ protected: // ScintillaBase subclass needs access to much of Editor void Indent(bool forwards); - long FindText(unsigned int iMessage, unsigned long wParam, long lParam); + long FindText(unsigned long wParam, long lParam); void SearchAnchor(); long SearchText(unsigned int iMessage, unsigned long wParam, long lParam); long SearchInTarget(const char *text, int length); void GoToLine(int lineNo); char *CopyRange(int start, int end); - int SelectionRangeLength(); - char *CopySelectionRange(); - void CopySelectionIntoDrag(); + void CopySelectionRange(SelectionText *ss); void SetDragPosition(int newPos); void DisplayCursor(Window::Cursor c); virtual void StartDrag(); diff --git a/src/stc/scintilla/src/KeyWords.cxx b/src/stc/scintilla/src/KeyWords.cxx index 0728580fdf..756037a9a4 100644 --- a/src/stc/scintilla/src/KeyWords.cxx +++ b/src/stc/scintilla/src/KeyWords.cxx @@ -108,22 +108,26 @@ LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null"); int wxForceScintillaLexers(void) { extern LexerModule lmAda; extern LexerModule lmAVE; + extern LexerModule lmBatch; extern LexerModule lmConf; - extern LexerModule lmDiff; - extern LexerModule lmLatex; - extern LexerModule lmPascal; extern LexerModule lmCPP; - extern LexerModule lmHTML; - extern LexerModule lmXML; - extern LexerModule lmProps; + extern LexerModule lmDiff; + extern LexerModule lmEiffel; + extern LexerModule lmEiffelkw; extern LexerModule lmErrorList; + extern LexerModule lmHTML; + extern LexerModule lmLatex; + extern LexerModule lmLISP; + extern LexerModule lmLua; extern LexerModule lmMake; - extern LexerModule lmBatch; + extern LexerModule lmPascal; extern LexerModule lmPerl; + extern LexerModule lmProps; extern LexerModule lmPython; + extern LexerModule lmRuby; extern LexerModule lmSQL; extern LexerModule lmVB; - extern LexerModule lmRuby; + extern LexerModule lmXML; if ( &lmAda @@ -143,7 +147,12 @@ int wxForceScintillaLexers(void) { && &lmPython && &lmSQL && &lmVB - && &lmRuby + && &lmRuby + && &lmEiffel + && &lmEiffelkw + && &lmLISP + && &lmLua + && &lmNull ) { return 1; diff --git a/src/stc/scintilla/src/LexCPP.cxx b/src/stc/scintilla/src/LexCPP.cxx index 19aa329baf..b0471b8e52 100644 --- a/src/stc/scintilla/src/LexCPP.cxx +++ b/src/stc/scintilla/src/LexCPP.cxx @@ -15,317 +15,255 @@ #include "PropSet.h" #include "Accessor.h" +#include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" -static bool IsOKBeforeRE(int ch) { +static bool IsOKBeforeRE(const int ch) { return (ch == '(') || (ch == '=') || (ch == ','); } -static void getRange(unsigned int start, - unsigned int end, - Accessor &styler, - char *s, - unsigned int len) { - unsigned int i = 0; - while ((i < end - start + 1) && (i < len-1)) { - s[i] = styler[start + i]; - i++; - } - s[i] = '\0'; -} - -inline bool IsASpace(int ch) { - return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); -} - -inline bool IsAWordChar(int ch) { +inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } -inline bool IsAWordStart(int ch) { +inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } -inline bool IsADigit(int ch) { - return (ch >= '0') && (ch <= '9'); +inline bool IsADoxygenChar(const int ch) { + return (islower(ch) || ch == '$' || ch == '@' || + ch == '\\' || ch == '&' || ch == '<' || + ch == '>' || ch == '#' || ch == '{' || + ch == '}' || ch == '[' || ch == ']'); } -// All languages handled so far can treat all characters >= 0x80 as one class -// which just continues the current token or starts an identifier if in default. -// DBCS treated specially as the second character can be < 0x80 and hence -// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 -class ColouriseContext { - Accessor &styler; - int lengthDoc; - int currentPos; - ColouriseContext& operator=(const ColouriseContext&) { - return *this; - } -public: - bool atEOL; - int state; - int chPrev; - int ch; - int chNext; +inline bool IsStateComment(const int state) { + return ((state == SCE_C_COMMENT) || + (state == SCE_C_COMMENTLINE) || + (state == SCE_C_COMMENTDOC) || + (state == SCE_C_COMMENTDOCKEYWORD) || + (state == SCE_C_COMMENTDOCKEYWORDERROR)); +} - ColouriseContext(unsigned int startPos, int length, - int initStyle, Accessor &styler_) : - styler(styler_), - lengthDoc(startPos + length), - currentPos(startPos), - atEOL(false), - state(initStyle), - chPrev(0), - ch(0), - chNext(0) { - styler.StartAt(startPos); - styler.StartSegment(startPos); - int pos = currentPos; - ch = static_cast(styler.SafeGetCharAt(pos)); - if (styler.IsLeadByte(static_cast(ch))) { - pos++; - ch = ch << 8; - ch |= static_cast(styler.SafeGetCharAt(pos)); - } - chNext = static_cast(styler.SafeGetCharAt(pos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(pos+2)); - } - atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - } - void Complete() { - styler.ColourTo(currentPos - 1, state); - } - bool More() { - return currentPos <= lengthDoc; - } - void Forward() { - // A lot of this is repeated from the constructor - TODO: merge code - chPrev = ch; - currentPos++; - if (ch >= 0x100) - currentPos++; - ch = chNext; - chNext = static_cast(styler.SafeGetCharAt(currentPos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(currentPos + 2)); - } - // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) - // Avoid triggering two times on Dos/Win - // End of line - atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - } - void ChangeState(int state_) { - state = state_; - } - void SetState(int state_) { - styler.ColourTo(currentPos - 1, state); - state = state_; - } - void ForwardSetState(int state_) { - Forward(); - styler.ColourTo(currentPos - 1, state); - state = state_; - } - void GetCurrent(char *s, int len) { - getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len); - } - int LengthCurrent() { - return currentPos - styler.GetStartSegment(); - } - bool Match(char ch0) { - return ch == ch0; - } - bool Match(char ch0, char ch1) { - return (ch == ch0) && (chNext == ch1); - } - bool Match(const char *s) { - if (ch != *s) - return false; - s++; - if (chNext != *s) - return false; - s++; - for (int n=2; *s; n++) { - if (*s != styler.SafeGetCharAt(currentPos+n)) - return false; - s++; - } - return true; - } -}; +inline bool IsStateString(const int state) { + return ((state == SCE_C_STRING) || (state == SCE_C_VERBATIM)); +} static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor"); - if (initStyle == SCE_C_STRINGEOL) // Does not leak onto next line + // Do not leak onto next line + if (initStyle == SCE_C_STRINGEOL) initStyle = SCE_C_DEFAULT; int chPrevNonWhite = ' '; int visibleChars = 0; + int noDocChars = 0; bool lastWordWasUUID = false; - ColouriseContext cc(startPos, length, initStyle, styler); - - for (; cc.More(); cc.Forward()) { + StyleContext sc(startPos, length, initStyle, styler); - if (cc.state == SCE_C_STRINGEOL) { - if (cc.atEOL) { - cc.SetState(SCE_C_DEFAULT); + for (; sc.More(); sc.Forward()) { + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.Match("\\\n")) { + sc.Forward(); + sc.Forward(); + continue; } - } else if (cc.state == SCE_C_OPERATOR) { - cc.SetState(SCE_C_DEFAULT); - } else if (cc.state == SCE_C_NUMBER) { - if (!IsAWordChar(cc.ch)) { - cc.SetState(SCE_C_DEFAULT); + if (sc.Match("\\\r\n")) { + sc.Forward(); + sc.Forward(); + sc.Forward(); + continue; } - } else if (cc.state == SCE_C_IDENTIFIER) { - if (!IsAWordChar(cc.ch) || (cc.ch == '.')) { + } + + // Determine if the current state should terminate. + if (sc.state == SCE_C_OPERATOR) { + sc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); + } + } else if (sc.state == SCE_C_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { char s[100]; - cc.GetCurrent(s, sizeof(s)); + sc.GetCurrent(s, sizeof(s)); if (keywords.InList(s)) { lastWordWasUUID = strcmp(s, "uuid") == 0; - cc.ChangeState(SCE_C_WORD); + sc.ChangeState(SCE_C_WORD); } else if (keywords2.InList(s)) { - cc.ChangeState(SCE_C_WORD2); + sc.ChangeState(SCE_C_WORD2); } - cc.SetState(SCE_C_DEFAULT); + sc.SetState(SCE_C_DEFAULT); } - } if (cc.state == SCE_C_PREPROCESSOR) { + } else if (sc.state == SCE_C_PREPROCESSOR) { if (stylingWithinPreprocessor) { - if (IsASpace(cc.ch)) { - cc.SetState(SCE_C_DEFAULT); + if (IsASpace(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); } } else { - if (cc.atEOL && (cc.chPrev != '\\')) { - cc.SetState(SCE_C_DEFAULT); + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); } } - } else if (cc.state == SCE_C_COMMENT) { - if (cc.Match('*', '/')) { - cc.Forward(); - cc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_COMMENT) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } + } else if (sc.state == SCE_C_COMMENTDOC) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if ((sc.ch == '@' || sc.ch == '\\') && (noDocChars == 0)) { + sc.SetState(SCE_C_COMMENTDOCKEYWORD); + } else if (sc.atLineEnd) { + noDocChars = 0; + } else if (!isspace(sc.ch) && (sc.ch != '*')) { + noDocChars++; } - } else if (cc.state == SCE_C_COMMENTDOC) { - if (cc.Match('*', '/')) { - cc.Forward(); - cc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_COMMENTLINE || sc.state == SCE_C_COMMENTLINEDOC) { + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); + visibleChars = 0; } - } else if (cc.state == SCE_C_COMMENTLINE || cc.state == SCE_C_COMMENTLINEDOC) { - if (cc.ch == '\r' || cc.ch == '\n') { - cc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_COMMENTDOCKEYWORD) { + if (sc.Match('*', '/')) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (!IsADoxygenChar(sc.ch)) { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + if (!isspace(sc.ch) || !keywords3.InList(s+1)) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + } + sc.SetState(SCE_C_COMMENTDOC); } - } else if (cc.state == SCE_C_STRING) { - if (cc.ch == '\\') { - if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') { - cc.Forward(); + } else if (sc.state == SCE_C_STRING) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); } - } else if (cc.ch == '\"') { - cc.ForwardSetState(SCE_C_DEFAULT); - } else if ((cc.atEOL) && (cc.chPrev != '\\')) { - cc.ChangeState(SCE_C_STRINGEOL); + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + sc.ForwardSetState(SCE_C_DEFAULT); + visibleChars = 0; } - } else if (cc.state == SCE_C_CHARACTER) { - if ((cc.ch == '\r' || cc.ch == '\n') && (cc.chPrev != '\\')) { - cc.ChangeState(SCE_C_STRINGEOL); - } else if (cc.ch == '\\') { - if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') { - cc.Forward(); + } else if (sc.state == SCE_C_CHARACTER) { + if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + sc.ForwardSetState(SCE_C_DEFAULT); + visibleChars = 0; + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); } - } else if (cc.ch == '\'') { - cc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_C_DEFAULT); } - } else if (cc.state == SCE_C_REGEX) { - if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == '/') { - cc.ForwardSetState(SCE_C_DEFAULT); - } else if (cc.ch == '\\') { + } else if (sc.state == SCE_C_REGEX) { + if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == '/') { + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.ch == '\\') { // Gobble up the quoted character - if (cc.chNext == '\\' || cc.chNext == '/') { - cc.Forward(); + if (sc.chNext == '\\' || sc.chNext == '/') { + sc.Forward(); } } - } else if (cc.state == SCE_C_VERBATIM) { - if (cc.ch == '\"') { - if (cc.chNext == '\"') { - cc.Forward(); + } else if (sc.state == SCE_C_VERBATIM) { + if (sc.ch == '\"') { + if (sc.chNext == '\"') { + sc.Forward(); } else { - cc.ForwardSetState(SCE_C_DEFAULT); + sc.ForwardSetState(SCE_C_DEFAULT); } } - } else if (cc.state == SCE_C_UUID) { - if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == ')') { - cc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_C_UUID) { + if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') { + sc.SetState(SCE_C_DEFAULT); } } - if (cc.state == SCE_C_DEFAULT) { - if (cc.Match('@', '\"')) { - cc.SetState(SCE_C_VERBATIM); - cc.Forward(); - } else if (IsADigit(cc.ch) || (cc.ch == '.' && IsADigit(cc.chNext))) { + // Determine if a new state should be entered. + if (sc.state == SCE_C_DEFAULT) { + if (sc.Match('@', '\"')) { + sc.SetState(SCE_C_VERBATIM); + sc.Forward(); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { if (lastWordWasUUID) { - cc.SetState(SCE_C_UUID); + sc.SetState(SCE_C_UUID); lastWordWasUUID = false; } else { - cc.SetState(SCE_C_NUMBER); + sc.SetState(SCE_C_NUMBER); } - } else if (IsAWordStart(cc.ch) || (cc.ch == '@')) { + } else if (IsAWordStart(sc.ch) || (sc.ch == '@')) { if (lastWordWasUUID) { - cc.SetState(SCE_C_UUID); + sc.SetState(SCE_C_UUID); lastWordWasUUID = false; } else { - cc.SetState(SCE_C_IDENTIFIER); + sc.SetState(SCE_C_IDENTIFIER); } - } else if (cc.Match('/', '*')) { - if (cc.Match("/**") || cc.Match("/*!")) // Support of Qt/Doxygen doc. style - cc.SetState(SCE_C_COMMENTDOC); - else - cc.SetState(SCE_C_COMMENT); - cc.Forward(); // Eat the * so it isn't used for the end of the comment - } else if (cc.Match('/', '/')) { - if (cc.Match("///") || cc.Match("//!")) // Support of Qt/Doxygen doc. style - cc.SetState(SCE_C_COMMENTLINEDOC); + } else if (sc.Match('/', '*')) { + if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style + noDocChars = 0; + sc.SetState(SCE_C_COMMENTDOC); + } else { + sc.SetState(SCE_C_COMMENT); + } + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + if (sc.Match("///") || sc.Match("//!")) // Support of Qt/Doxygen doc. style + sc.SetState(SCE_C_COMMENTLINEDOC); else - cc.SetState(SCE_C_COMMENTLINE); - } else if (cc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) { - cc.SetState(SCE_C_REGEX); - } else if (cc.ch == '\"') { - cc.SetState(SCE_C_STRING); - } else if (cc.ch == '\'') { - cc.SetState(SCE_C_CHARACTER); - } else if (cc.ch == '#' && visibleChars == 0) { + sc.SetState(SCE_C_COMMENTLINE); + } else if (sc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) { + sc.SetState(SCE_C_REGEX); + } else if (sc.ch == '\"') { + sc.SetState(SCE_C_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_C_CHARACTER); + } else if (sc.ch == '#' && visibleChars == 0) { // Preprocessor commands are alone on their line - cc.SetState(SCE_C_PREPROCESSOR); + sc.SetState(SCE_C_PREPROCESSOR); // Skip whitespace between # and preprocessor word do { - cc.Forward(); - } while (IsASpace(cc.ch) && cc.More()); - } else if (isoperator(static_cast(cc.ch))) { - cc.SetState(SCE_C_OPERATOR); + sc.Forward(); + } while ((sc.ch == ' ') && (sc.ch == '\t') && sc.More()); + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); + } + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_C_OPERATOR); } } - if (cc.atEOL) { + + if (sc.atLineEnd) { // Reset states to begining of colourise so no surprises // if different sets of lines lexed. chPrevNonWhite = ' '; visibleChars = 0; lastWordWasUUID = false; } - if (!IsASpace(cc.ch)) { - chPrevNonWhite = cc.ch; + if (!IsASpace(sc.ch)) { + chPrevNonWhite = sc.ch; visibleChars++; } } - cc.Complete(); + sc.Complete(); } static void FoldCppDoc(unsigned int startPos, int length, int initStyle, WordList *[], diff --git a/src/stc/scintilla/src/LexCrontab.cxx b/src/stc/scintilla/src/LexCrontab.cxx new file mode 100644 index 0000000000..94a172cfca --- /dev/null +++ b/src/stc/scintilla/src/LexCrontab.cxx @@ -0,0 +1,204 @@ +// Scintilla source code edit control +/** @file LexCrontab.cxx + ** Lexer to use with extended crontab files used by a powerful + ** Windows scheduler/event monitor/automation manager nnCron. + ** (http://nemtsev.virtualave.net/) + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList +*keywordLists[], Accessor &styler) +{ + int state = SCE_NNCRONTAB_DEFAULT; + char chNext = styler[startPos]; + int lengthDoc = startPos + length; + // create a buffer large enough to take the largest chunk... + char *buffer = new char[length]; + int bufferCount = 0; + // used when highliting environment variables inside quoted string: + bool insideString = false; + + // this assumes that we have 3 keyword list in conf.properties + WordList §ion = *keywordLists[0]; + WordList &keyword = *keywordLists[1]; + WordList &modifier = *keywordLists[2]; + + // go through all provided text segment + // using the hand-written state machine shown below + styler.StartAt(startPos); + styler.StartSegment(startPos); + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i++; + continue; + } + switch(state) { + case SCE_NNCRONTAB_DEFAULT: + if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { + // whitespace is simply ignored here... + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + break; + } else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') { + // signals the start of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + else if( ch == '\\' && styler.SafeGetCharAt(i+1) == ' ') { + // signals the start of an extended comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == '#' ) { + // signals the start of a plain comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') { + // signals the end of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } else if( ch == '"') { + state = SCE_NNCRONTAB_STRING; + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + } else if( ch == '%') { + // signals environment variables + state = SCE_NNCRONTAB_ENVIRONMENT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + } else if( ch == '*' ) { + // signals an asterisk + // no state jump necessary for this simple case... + styler.ColourTo(i,SCE_NNCRONTAB_ASTERISK); + } else if( isalpha(ch) || ch == '<' ) { + // signals the start of an identifier + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_IDENTIFIER; + } else if( isdigit(ch) ) { + // signals the start of a number + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_NUMBER; + } else { + // style it the default style.. + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + } + break; + + case SCE_NNCRONTAB_COMMENT: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } + break; + + case SCE_NNCRONTAB_TASK: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + break; + + case SCE_NNCRONTAB_STRING: + if( ch == '%' ) { + state = SCE_NNCRONTAB_ENVIRONMENT; + insideString = true; + styler.ColourTo(i-1,SCE_NNCRONTAB_STRING); + break; + } + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || + (ch == '\n') || (ch == '\r') ) { + state = SCE_NNCRONTAB_DEFAULT; + } + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + break; + + case SCE_NNCRONTAB_ENVIRONMENT: + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( ch == '%' && insideString ) { + state = SCE_NNCRONTAB_STRING; + insideString = false; + break; + } + if( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\') + || (ch == '\n') || (ch == '\r') ) { + state = SCE_NNCRONTAB_DEFAULT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + break; + } + styler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT); + break; + + case SCE_NNCRONTAB_IDENTIFIER: + // stay in CONF_IDENTIFIER state until we find a non-alphanumeric + if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || + (ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + + // check if the buffer contains a keyword, + // and highlight it if it is a keyword... + if(section.InList(buffer)) { + styler.ColourTo(i,SCE_NNCRONTAB_SECTION ); + } else if(keyword.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD ); + } // else if(strchr(buffer,'/') || strchr(buffer,'.')) { + // styler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION); + // } + else if(modifier.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER ); + } else { + styler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT); + } + // push back the faulty character + chNext = styler[i--]; + } + break; + + case SCE_NNCRONTAB_NUMBER: + // stay in CONF_NUMBER state until we find a non-numeric + if( isdigit(ch) /* || ch == '.' */ ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + // Colourize here... (normal number) + styler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER); + // push back a character + chNext = styler[i--]; + } + break; + } + } +} + +LexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, "nncrontab"); diff --git a/src/stc/scintilla/src/LexEiffel.cxx b/src/stc/scintilla/src/LexEiffel.cxx index 1296fb2450..6470943208 100644 --- a/src/stc/scintilla/src/LexEiffel.cxx +++ b/src/stc/scintilla/src/LexEiffel.cxx @@ -16,6 +16,7 @@ #include "PropSet.h" #include "Accessor.h" +#include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" @@ -31,23 +32,6 @@ inline bool isEiffelOperator(unsigned int ch) { ch == '!' || ch == '@' || ch == '?'; } -static void getRangeLowered(unsigned int start, - unsigned int end, - Accessor &styler, - char *s, - unsigned int len) { - unsigned int i = 0; - while ((i < end - start + 1) && (i < len-1)) { - s[i] = static_cast(tolower(styler[start + i])); - i++; - } - s[i] = '\0'; -} - -inline bool IsASpace(unsigned int ch) { - return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); -} - inline bool IsAWordChar(unsigned int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } @@ -56,81 +40,6 @@ inline bool IsAWordStart(unsigned int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } -inline bool IsADigit(unsigned int ch) { - return (ch >= '0') && (ch <= '9'); -} - -// All languages handled so far can treat all characters >= 0x80 as one class -// which just continues the current token or starts an identifier if in default. -// DBCS treated specially as the second character can be < 0x80 and hence -// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 -class xColouriseContext { - Accessor &styler; - int lengthDoc; - int currentPos; - xColouriseContext& operator=(const xColouriseContext&) { - return *this; - } -public: - int state; - unsigned int chPrev; - unsigned int ch; - unsigned int chNext; - - xColouriseContext(unsigned int startPos, int length, - int initStyle, Accessor &styler_) : - styler(styler_), - lengthDoc(startPos + length), - currentPos(startPos), - state(initStyle), - chPrev(0), - ch(0), - chNext(0) { - styler.StartAt(startPos); - styler.StartSegment(startPos); - int pos = currentPos; - ch = static_cast(styler.SafeGetCharAt(pos)); - if (styler.IsLeadByte(static_cast(ch))) { - pos++; - ch = ch << 8; - ch |= static_cast(styler.SafeGetCharAt(pos)); - } - chNext = static_cast(styler.SafeGetCharAt(pos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(pos+2)); - } - } - void Complete() { - styler.ColourTo(currentPos - 1, state); - } - bool More() { - return currentPos <= lengthDoc; - } - void Forward() { - chPrev = ch; - currentPos++; - if (ch >= 0x100) - currentPos++; - ch = chNext; - chNext = static_cast(styler.SafeGetCharAt(currentPos+1)); - if (styler.IsLeadByte(static_cast(chNext))) { - chNext = chNext << 8; - chNext |= static_cast(styler.SafeGetCharAt(currentPos + 2)); - } - } - void ChangeState(int state_) { - state = state_; - } - void SetState(int state_) { - styler.ColourTo(currentPos - 1, state); - state = state_; - } - void GetCurrentLowered(char *s, int len) { - getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len); - } -}; - static void ColouriseEiffelDoc(unsigned int startPos, int length, int initStyle, @@ -139,68 +48,68 @@ static void ColouriseEiffelDoc(unsigned int startPos, WordList &keywords = *keywordlists[0]; - xColouriseContext lc(startPos, length, initStyle, styler); + StyleContext sc(startPos, length, initStyle, styler); - for (; lc.More(); lc.Forward()) { + for (; sc.More(); sc.Forward()) { - if (lc.state == SCE_EIFFEL_STRINGEOL) { - if (lc.ch != '\r' && lc.ch != '\n') { - lc.SetState(SCE_EIFFEL_DEFAULT); + if (sc.state == SCE_EIFFEL_STRINGEOL) { + if (sc.ch != '\r' && sc.ch != '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_OPERATOR) { - lc.SetState(SCE_EIFFEL_DEFAULT); - } else if (lc.state == SCE_EIFFEL_WORD) { - if (!IsAWordChar(lc.ch)) { + } else if (sc.state == SCE_EIFFEL_OPERATOR) { + sc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_WORD) { + if (!IsAWordChar(sc.ch)) { char s[100]; - lc.GetCurrentLowered(s, sizeof(s)); + sc.GetCurrentLowered(s, sizeof(s)); if (!keywords.InList(s)) { - lc.ChangeState(SCE_EIFFEL_IDENTIFIER); + sc.ChangeState(SCE_EIFFEL_IDENTIFIER); } - lc.SetState(SCE_EIFFEL_DEFAULT); + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_NUMBER) { - if (!IsAWordChar(lc.ch)) { - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_COMMENTLINE) { - if (lc.ch == '\r' || lc.ch == '\n') { - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_COMMENTLINE) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_STRING) { - if (lc.ch == '%') { - lc.Forward(); - } else if (lc.ch == '\"') { - lc.Forward(); - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_STRING) { + if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\"') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); } - } else if (lc.state == SCE_EIFFEL_CHARACTER) { - if (lc.ch == '\r' || lc.ch == '\n') { - lc.SetState(SCE_EIFFEL_STRINGEOL); - } else if (lc.ch == '%') { - lc.Forward(); - } else if (lc.ch == '\'') { - lc.Forward(); - lc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_CHARACTER) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_STRINGEOL); + } else if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\'') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); } } - if (lc.state == SCE_EIFFEL_DEFAULT) { - if (lc.ch == '-' && lc.chNext == '-') { - lc.SetState(SCE_EIFFEL_COMMENTLINE); - } else if (lc.ch == '\"') { - lc.SetState(SCE_EIFFEL_STRING); - } else if (lc.ch == '\'') { - lc.SetState(SCE_EIFFEL_CHARACTER); - } else if (IsADigit(lc.ch) || (lc.ch == '.')) { - lc.SetState(SCE_EIFFEL_NUMBER); - } else if (IsAWordStart(lc.ch)) { - lc.SetState(SCE_EIFFEL_WORD); - } else if (isEiffelOperator(lc.ch)) { - lc.SetState(SCE_EIFFEL_OPERATOR); + if (sc.state == SCE_EIFFEL_DEFAULT) { + if (sc.ch == '-' && sc.chNext == '-') { + sc.SetState(SCE_EIFFEL_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_EIFFEL_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_EIFFEL_CHARACTER); + } else if (IsADigit(sc.ch) || (sc.ch == '.')) { + sc.SetState(SCE_EIFFEL_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_EIFFEL_WORD); + } else if (isEiffelOperator(sc.ch)) { + sc.SetState(SCE_EIFFEL_OPERATOR); } } } - lc.Complete(); + sc.Complete(); } static bool IsEiffelComment(Accessor &styler, int pos, int len) { diff --git a/src/stc/scintilla/src/LexHTML.cxx b/src/stc/scintilla/src/LexHTML.cxx index c28a432795..3a03096f8a 100644 --- a/src/stc/scintilla/src/LexHTML.cxx +++ b/src/stc/scintilla/src/LexHTML.cxx @@ -1,7 +1,7 @@ // Scintilla source code edit control /** @file LexHTML.cxx ** Lexer for HTML. - **/ + **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. @@ -23,16 +23,16 @@ #define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START) #define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START) -enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML }; +enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML, eScriptSGML, eScriptSGMLblock }; enum { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc }; static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, int prevValue) { char s[30 + 1]; - s[0] = '\0'; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; //Platform::DebugPrintf("Scripting indicator [%s]\n", s); if (strstr(s, "src")) // External script return eScriptNone; @@ -55,11 +55,11 @@ static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigne static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) { int iResult = 0; char s[30 + 1]; - s[0] = '\0'; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; if (0 == strncmp(s, "php", 3)) { iResult = 3; } @@ -68,22 +68,21 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u } static int ScriptOfState(int state) { - int scriptLanguage; - if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) { - scriptLanguage = eScriptPython; + return eScriptPython; } else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) { - scriptLanguage = eScriptVBS; + return eScriptVBS; } else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) { - scriptLanguage = eScriptJS; + return eScriptJS; } else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) { - scriptLanguage = eScriptPHP; + return eScriptPHP; + } else if ((state >= SCE_H_SGML_DEFAULT) && (state <= SCE_H_SGML_BLOCK_DEFAULT)) { + return eScriptSGML; + } else if (state == SCE_H_SGML_BLOCK_DEFAULT) { + return eScriptSGMLblock; } else { - // scriptLanguage = defaultScript; - scriptLanguage = eScriptNone; + return eScriptNone; } - - return scriptLanguage; } static int statePrintForState(int state, int inScriptType) { @@ -174,11 +173,11 @@ static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &k chAttr = SCE_H_NUMBER; } else { char s[30 + 1]; - s[0] = '\0'; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) chAttr = SCE_H_ATTRIBUTE; } @@ -195,18 +194,14 @@ static int classifyTagHTML(unsigned int start, unsigned int end, unsigned int i = 0; for (unsigned int cPos = start; cPos <= end && i < 30; cPos++) { char ch = styler[cPos]; - if (ch != '<') + if ((ch != '<') && (ch != '/')) s[i++] = static_cast(tolower(ch)); } s[i] = '\0'; bool isScript = false; char chAttr = SCE_H_TAGUNKNOWN; - if (s[0] == '!' && s[1] == '-' && s[2] == '-') { //Comment - chAttr = SCE_H_COMMENT; - } else if (strcmp(s, "![cdata[") == 0) { // In lower case because already converted - chAttr = SCE_H_CDATA; - } else if (s[0] == '!') { - chAttr = SCE_H_SGML; + if (s[0] == '!') { + chAttr = SCE_H_SGML_DEFAULT; } else if (s[0] == '/') { // Closing tag if (keywords.InList(s + 1)) chAttr = SCE_H_TAG; @@ -231,10 +226,11 @@ static void classifyWordHTJS(unsigned int start, unsigned int end, chAttr = SCE_HJ_NUMBER; else { char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) chAttr = SCE_HJ_KEYWORD; } @@ -248,10 +244,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw chAttr = SCE_HB_NUMBER; else { char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = static_cast(tolower(styler[start + i])); - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) { chAttr = SCE_HB_WORD; if (strcmp(s, "rem") == 0) @@ -268,10 +265,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, int inScriptType) { bool wordIsNumber = isdigit(styler[start]); char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; - s[i + 1] = '\0'; } + s[i] = '\0'; char chAttr = SCE_HP_IDENTIFIER; if (0 == strcmp(prevWord, "class")) chAttr = SCE_HP_CLASSNAME; @@ -294,16 +292,37 @@ static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &ke chAttr = SCE_HPHP_NUMBER; else { char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; - s[i + 1] = '\0'; } + s[i] = '\0'; if (keywords.InList(s)) chAttr = SCE_HPHP_WORD; } styler.ColourTo(end, chAttr); } +static bool isWordHSGML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + return keywords.InList(s); +} + +static bool isWordCdata(unsigned int start, unsigned int end, Accessor &styler) { + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + return (0 == strcmp(s, "[CDATA[")); +} + // Return the first state to reach when entering a scripting language static int StateForScript(int scriptLanguage) { int Result; @@ -320,6 +339,9 @@ static int StateForScript(int scriptLanguage) { case eScriptXML: Result = SCE_H_TAGUNKNOWN; break; + case eScriptSGML: + Result = SCE_H_SGML_DEFAULT; + break; default : Result = SCE_HJ_START; break; @@ -331,6 +353,10 @@ inline bool ishtmlwordchar(char ch) { return isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#'; } +inline bool issgmlwordchar(char ch) { + return isalnum(ch) || ch == '.' || ch == '_' || ch == ':' || ch == '!' || ch == '#' || ch == '['; +} + static bool InTagState(int state) { return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN || state == SCE_H_SCRIPT || @@ -339,6 +365,10 @@ static bool InTagState(int state) { state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING; } +static bool IsCommentState(const int state) { + return state == SCE_H_COMMENT || state == SCE_H_SGML_COMMENT; +} + static bool isLineEnd(char ch) { return ch == '\r' || ch == '\n'; } @@ -348,23 +378,23 @@ static bool isOKBeforeRE(char ch) { } static bool isPHPStringState(int state) { - return - (state == SCE_HPHP_HSTRING) || - (state == SCE_HPHP_SIMPLESTRING) || - (state == SCE_HPHP_HSTRING_VARIABLE); + return + (state == SCE_HPHP_HSTRING) || + (state == SCE_HPHP_SIMPLESTRING) || + (state == SCE_HPHP_HSTRING_VARIABLE); } static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { - WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; // SGML (DTD) keywords // Lexer for HTML requires more lexical states (7 bits worth) than most lexers - styler.StartAt(startPos, 127); + styler.StartAt(startPos, STYLE_MAX); char prevWord[200]; prevWord[0] = '\0'; int StateToPrint = initStyle; @@ -374,49 +404,51 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (InTagState(state)) { while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) { startPos--; - length++; + length++; } state = SCE_H_DEFAULT; } - styler.StartAt(startPos, 127); + styler.StartAt(startPos, STYLE_MAX); - int lineState = eScriptVBS; int lineCurrent = styler.GetLine(startPos); - if (lineCurrent > 0) + int lineState; + if (lineCurrent > 0) { lineState = styler.GetLineState(lineCurrent); - int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type - bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag - bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag - int defaultScript = (lineState >> 4) & 0x0F; // 4 bits of script name - int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits of state + } else { + // Default client and ASP scripting language is JavaScript + lineState = eScriptJS << 8; + lineState |= styler.GetPropertyInt("asp.default.language", eScriptJS) << 4; + } + int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type + bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag + bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag + int aspScript = (lineState >> 4) & 0x0F; // 4 bits of script name + int clientScript = (lineState >> 8) & 0x0F; // 4 bits of script name + int beforePreProc = (lineState >> 12) & 0xFF; // 8 bits of state int scriptLanguage = ScriptOfState(state); - bool fold = styler.GetPropertyInt("fold"); - bool foldHTML = styler.GetPropertyInt("fold.html",0); - bool foldCompact = styler.GetPropertyInt("fold.compact",1); - - fold = foldHTML && fold; + const bool foldHTML = styler.GetPropertyInt("fold.html", 0); + const bool fold = foldHTML && styler.GetPropertyInt("fold"); + const bool foldCompact = styler.GetPropertyInt("fold.compact", 1); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; - int visibleChars; - - visibleChars = 0; + int visibleChars = 0; char chPrev = ' '; char ch = ' '; char chPrevNonWhite = ' '; styler.StartSegment(startPos); - int lengthDoc = startPos + length; + const int lengthDoc = startPos + length; for (int i = startPos; i < lengthDoc; i++) { - char chPrev2 = chPrev; + const char chPrev2 = chPrev; chPrev = ch; if (ch != ' ' && ch != '\t') chPrevNonWhite = ch; ch = styler[i]; char chNext = styler.SafeGetCharAt(i + 1); - char chNext2 = styler.SafeGetCharAt(i + 2); + const char chNext2 = styler.SafeGetCharAt(i + 2); // Handle DBCS codepages if (styler.IsLeadByte(ch)) { @@ -451,18 +483,21 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) { // check if the number of tabs is lower than the level int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8; - for (int j = 0;Findlevel > 0;j++) { + for (int j = 0; Findlevel > 0; j++) { char chTmp = styler.SafeGetCharAt(i + j + 1); if (chTmp == '\t') { Findlevel -= 8; - } else if (chTmp == ' ') { + } else if (chTmp == ' ') { Findlevel--; - } else break; + } else { + break; + } } if (Findlevel > 0) { levelCurrent -= Findlevel / 8; - if (Findlevel % 8) levelCurrent--; + if (Findlevel % 8) + levelCurrent--; } } } @@ -487,11 +522,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } lineCurrent++; styler.SetLineState(lineCurrent, - ((inScriptType & 0x03) << 0) | - ((tagOpened & 0x01) << 2) | - ((tagClosing & 0x01) << 3) | - ((defaultScript & 0x0F) << 4) | - ((beforePreProc & 0xFF) << 8)); + ((inScriptType & 0x03) << 0) | + ((tagOpened & 0x01) << 2) | + ((tagClosing & 0x01) << 3) | + ((aspScript & 0x0F) << 4) | + ((clientScript & 0x0F) << 8) | + ((beforePreProc & 0xFF) << 12)); } // generic end of script processing @@ -503,9 +539,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_H_SINGLESTRING: case SCE_HJ_COMMENT: case SCE_HJ_COMMENTDOC: - // SCE_HJ_COMMENTLINE removed as this is a common thing done to hide - // the end of script marker from some JS interpreters. - //case SCE_HJ_COMMENTLINE: + // SCE_HJ_COMMENTLINE removed as this is a common thing done to hide + // the end of script marker from some JS interpreters. + //case SCE_HJ_COMMENTLINE: case SCE_HJ_DOUBLESTRING: case SCE_HJ_SINGLESTRING: case SCE_HB_STRING: @@ -514,29 +550,31 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_HP_TRIPLEDOUBLE: break; default : - // maybe we should check here if it's a tag and if it's SCRIPT + // closing tag of the script (it's a closing HTML tag anyway) styler.ColourTo(i - 1, StateToPrint); state = SCE_H_TAGUNKNOWN; inScriptType = eHtml; scriptLanguage = eScriptNone; + clientScript = eScriptJS; i += 2; - // unfold closing script - levelCurrent--; + visibleChars += 2; + tagClosing = true; continue; } } ///////////////////////////////////// // handle the start of PHP pre-processor = Non-HTML - else if ((state != SCE_H_ASPAT) && - !isPHPStringState(state) && - (state != SCE_HPHP_COMMENT) && - (ch == '<') && - (chNext == '?')) { + else if ((state != SCE_H_ASPAT) && + !isPHPStringState(state) && + (state != SCE_HPHP_COMMENT) && + (ch == '<') && + (chNext == '?')) { styler.ColourTo(i - 1, StateToPrint); beforePreProc = state; scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP); i++; + visibleChars++; i += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 2, i + 10); if (scriptLanguage == eScriptXML) styler.ColourTo(i, SCE_H_XMLSTART); @@ -567,6 +605,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (chNext2 == '@') { i += 2; // place as if it was the second next char treated + visibleChars += 2; state = SCE_H_ASPAT; } else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) { styler.ColourTo(i + 3, SCE_H_ASP); @@ -576,11 +615,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } else { if (chNext2 == '=') { i += 2; // place as if it was the second next char treated + visibleChars += 2; } else { i++; // place as if it was the next char treated + visibleChars++; } - state = StateForScript(defaultScript); + state = StateForScript(aspScript); } scriptLanguage = eScriptVBS; styler.ColourTo(i, SCE_H_ASP); @@ -591,17 +632,42 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty continue; } + ///////////////////////////////////// + // handle the start of SGML language (DTD) + else if (((scriptLanguage == eScriptNone) || (scriptLanguage == eScriptXML)) && + (chPrev == '<') && + (ch == '!') && + (StateToPrint != SCE_H_CDATA) && (!IsCommentState(StateToPrint))) { + beforePreProc = state; + styler.ColourTo(i - 2, StateToPrint); + if ((chNext == '-') && (chNext2 == '-')) { + state = SCE_H_COMMENT; // wait for a pending command + } + else if (isWordCdata(i + 1, i + 7, styler)) { + state = SCE_H_CDATA; + } else { + styler.ColourTo(i, SCE_H_SGML_DEFAULT); // ')) { + else if (( + ((inScriptType == eNonHtmlPreProc) + || (inScriptType == eNonHtmlScriptPreProc)) && ( + ((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) || + ((scriptLanguage != eScriptNone) && !isStringState(state) && + (ch == '%')) + ) && (chNext == '>')) || + ((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) { if (state == SCE_H_ASPAT) { - defaultScript = segIsScriptingIndicator(styler, - styler.GetStartSegment(), i - 1, defaultScript); + aspScript = segIsScriptingIndicator(styler, + styler.GetStartSegment(), i - 1, aspScript); } // Bounce out of any ASP mode switch (state) { @@ -624,11 +690,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty styler.ColourTo(i - 1, StateToPrint); break; } - i++; + if (scriptLanguage != eScriptSGML) { + i++; + visibleChars++; + } if (ch == '%') styler.ColourTo(i, SCE_H_ASP); else if (scriptLanguage == eScriptXML) styler.ColourTo(i, SCE_H_XMLEND); + else if (scriptLanguage == eScriptSGML) + styler.ColourTo(i, SCE_H_SGML_DEFAULT); else styler.ColourTo(i, SCE_H_QUESTION); state = beforePreProc; @@ -648,47 +719,156 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (ch == '<') { // in HTML, fold on tag open and unfold on tag close tagOpened = true; - if (chNext == '/') { - tagClosing = true; - } else { - tagClosing = false; - } - + tagClosing = (chNext == '/'); styler.ColourTo(i - 1, StateToPrint); - if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-') { - // should be better - i += 3; - levelCurrent++; - state = SCE_H_COMMENT; - } else + if (chNext != '!') state = SCE_H_TAGUNKNOWN; } else if (ch == '&') { styler.ColourTo(i - 1, SCE_H_DEFAULT); state = SCE_H_ENTITY; } break; - case SCE_H_COMMENT: - if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) { - // unfold HTML comment - levelCurrent--; + case SCE_H_SGML_DEFAULT: + if (scriptLanguage == eScriptSGMLblock) + StateToPrint = SCE_H_SGML_BLOCK_DEFAULT; + + if (ch == '\"') { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_DOUBLESTRING; + } else if (ch == '\'') { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_SIMPLESTRING; + } else if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_COMMENT; + } else if (isalpha(ch) && (chPrev == '%')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_ENTITY; + } else if (ch == '#') { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_SPECIAL; + } else if (ch == '[') { + styler.ColourTo(i - 1, StateToPrint); + scriptLanguage = eScriptSGMLblock; + } else if (ch == ']') { + if (scriptLanguage == eScriptSGMLblock) { + styler.ColourTo(i, StateToPrint); + scriptLanguage = eScriptSGML; + } else { + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i, SCE_H_SGML_ERROR); + } + } else if (scriptLanguage == eScriptSGMLblock) { + if ((ch == '!') && (chPrev == '<')) { + styler.ColourTo(i - 2, StateToPrint); + styler.ColourTo(i, SCE_H_SGML_DEFAULT); + state = SCE_H_SGML_COMMAND; + } else if (ch == '>') { + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i, SCE_H_SGML_DEFAULT); + } + } + break; + case SCE_H_SGML_COMMAND: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_COMMENT; + } else if (!issgmlwordchar(ch)) { + if (isWordHSGML(styler.GetStartSegment(), i - 1, keywords6, styler)) { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_H_SGML_1ST_PARAM; + } else { + state = SCE_H_SGML_ERROR; + } + } + break; + case SCE_H_SGML_1ST_PARAM: + // wait for the beginning of the word + if ((ch == '-') && (chPrev == '-')) { + if (scriptLanguage == eScriptSGMLblock) { + styler.ColourTo(i - 2, SCE_H_SGML_BLOCK_DEFAULT); + } else { + styler.ColourTo(i - 2, SCE_H_SGML_DEFAULT); + } + state = SCE_H_SGML_1ST_PARAM_COMMENT; + } else if (issgmlwordchar(ch)) { + if (scriptLanguage == eScriptSGMLblock) { + styler.ColourTo(i - 1, SCE_H_SGML_BLOCK_DEFAULT); + } else { + styler.ColourTo(i - 1, SCE_H_SGML_DEFAULT); + } + // find the length of the word + int size = 1; + while (ishtmlwordchar(styler.SafeGetCharAt(i + size))) + size++; + styler.ColourTo(i + size - 1, StateToPrint); + i += size - 1; + visibleChars += size - 1; + ch = styler.SafeGetCharAt(i); + state = SCE_H_SGML_DEFAULT; + continue; + } + break; + case SCE_H_SGML_ERROR: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i - 2, StateToPrint); + state = SCE_H_SGML_COMMENT; + } + case SCE_H_SGML_DOUBLESTRING: + if (ch == '\"') { styler.ColourTo(i, StateToPrint); - state = SCE_H_DEFAULT; - tagOpened = false; + state = SCE_H_SGML_DEFAULT; + } + break; + case SCE_H_SGML_SIMPLESTRING: + if (ch == '\'') { + styler.ColourTo(i, StateToPrint); + state = SCE_H_SGML_DEFAULT; + } + break; + case SCE_H_SGML_COMMENT: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i, StateToPrint); + state = SCE_H_SGML_DEFAULT; } break; case SCE_H_CDATA: - if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) { + if ((chPrev2 == ']') && (chPrev == ']') && (ch == '>')) { styler.ColourTo(i, StateToPrint); state = SCE_H_DEFAULT; - tagOpened = false; + levelCurrent--; } break; - case SCE_H_SGML: - if (ch == '>') { - levelCurrent--; + case SCE_H_COMMENT: + if ((chPrev2 == '-') && (chPrev == '-') && (ch == '>')) { styler.ColourTo(i, StateToPrint); state = SCE_H_DEFAULT; - tagOpened = false; + levelCurrent--; + } + break; + case SCE_H_SGML_1ST_PARAM_COMMENT: + if ((ch == '-') && (chPrev == '-')) { + styler.ColourTo(i, SCE_H_SGML_COMMENT); + state = SCE_H_SGML_1ST_PARAM; + } + break; + case SCE_H_SGML_SPECIAL: + if (!isupper(ch)) { + styler.ColourTo(i - 1, StateToPrint); + if (isalnum(ch)) { + state = SCE_H_SGML_ERROR; + } else { + state = SCE_H_SGML_DEFAULT; + } + } + break; + case SCE_H_SGML_ENTITY: + if (ch == ';') { + styler.ColourTo(i, StateToPrint); + state = SCE_H_SGML_DEFAULT; + } else if (!isalnum(ch) && ch != '-' && ch != '.') { + styler.ColourTo(i, SCE_H_SGML_ERROR); + state = SCE_H_SGML_DEFAULT; } break; case SCE_H_ENTITY: @@ -705,9 +885,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (!ishtmlwordchar(ch) && !((ch == '/') && (chPrev == '<')) && ch != '[') { int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler); if (eClass == SCE_H_SCRIPT) { - inScriptType = eNonHtmlScript; - scriptLanguage = defaultScript; - eClass = SCE_H_TAG; + if (!tagClosing) { + inScriptType = eNonHtmlScript; + scriptLanguage = clientScript; + eClass = SCE_H_TAG; + } else { + scriptLanguage = eScriptNone; + eClass = SCE_H_TAG; + } } if (ch == '>') { styler.ColourTo(i, eClass); @@ -717,28 +902,27 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_H_DEFAULT; } tagOpened = false; - if (tagClosing) + if (tagClosing) { levelCurrent--; - else + } else { levelCurrent++; + } tagClosing = false; - } else if (ch == '/' && chNext == '>') { + } else if (ch == '/' && chNext == '>') { if (eClass == SCE_H_TAGUNKNOWN) { - styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN); + styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN); } else { - styler.ColourTo(i - 1, StateToPrint); - styler.ColourTo(i + 1, SCE_H_TAGEND); + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i + 1, SCE_H_TAGEND); } - i++; - ch = chNext; - state = SCE_H_DEFAULT; + i++; + ch = chNext; + state = SCE_H_DEFAULT; tagOpened = false; } else { if (eClass != SCE_H_TAGUNKNOWN) { - if (eClass == SCE_H_CDATA) { - state = SCE_H_CDATA; - } else if (eClass == SCE_H_SGML) { - state = SCE_H_SGML; + if (eClass == SCE_H_SGML_DEFAULT) { + state = SCE_H_SGML_DEFAULT; } else { state = SCE_H_OTHER; } @@ -750,7 +934,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') { if (inScriptType == eNonHtmlScript) { int scriptLanguagePrev = scriptLanguage; - scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage); + clientScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage); + scriptLanguage = clientScript; if ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone)) inScriptType = eHtml; } @@ -1217,18 +1402,18 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_HPHP_NUMBER: if (!isdigit(ch)) { styler.ColourTo(i - 1, SCE_HPHP_NUMBER); - if (isoperator(ch)) - state =SCE_HPHP_OPERATOR; - else + if (isoperator(ch)) + state = SCE_HPHP_OPERATOR; + else state = SCE_HPHP_DEFAULT; } break; case SCE_HPHP_VARIABLE: if (!iswordstart(ch)) { styler.ColourTo(i - 1, SCE_HPHP_VARIABLE); - if (isoperator(ch)) - state =SCE_HPHP_OPERATOR; - else + if (isoperator(ch)) + state = SCE_HPHP_OPERATOR; + else state = SCE_HPHP_DEFAULT; } break; @@ -1249,7 +1434,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty // skip the next char i++; } else if (ch == '$') { - styler.ColourTo(i-1, StateToPrint); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HPHP_HSTRING_VARIABLE; } else if (ch == '\"') { styler.ColourTo(i, StateToPrint); @@ -1267,13 +1452,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty break; case SCE_HPHP_HSTRING_VARIABLE: if (!iswordstart(ch)) { - styler.ColourTo(i-1, StateToPrint); + styler.ColourTo(i - 1, StateToPrint); i--; // strange but it works state = SCE_HPHP_HSTRING; } break; case SCE_HPHP_OPERATOR: - case SCE_HPHP_DEFAULT: + case SCE_HPHP_DEFAULT: styler.ColourTo(i - 1, StateToPrint); if (isdigit(ch)) { state = SCE_HPHP_NUMBER; @@ -1304,6 +1489,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty // Some of the above terminated their lexeme but since the same character starts // the same class again, only reenter if non empty segment. + bool nonEmptySegment = i >= static_cast(styler.GetStartSegment()); if (state == SCE_HB_DEFAULT) { // One of the above succeeded if ((ch == '\"') && (nonEmptySegment)) { @@ -1335,7 +1521,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_HJ_COMMENTLINE; } else if ((ch == '\"') && (nonEmptySegment)) { state = SCE_HJ_DOUBLESTRING; - } else if ((ch == '\'') && (nonEmptySegment)) { + } else if ((ch == '\'') && (nonEmptySegment)) { state = SCE_HJ_SINGLESTRING; } else if (iswordstart(ch)) { state = SCE_HJ_WORD; @@ -1357,4 +1543,3 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc, "hypertext"); LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc, "xml"); - diff --git a/src/stc/scintilla/src/LexPython.cxx b/src/stc/scintilla/src/LexPython.cxx index 6669694d1d..221859035e 100644 --- a/src/stc/scintilla/src/LexPython.cxx +++ b/src/stc/scintilla/src/LexPython.cxx @@ -15,70 +15,18 @@ #include "PropSet.h" #include "Accessor.h" +#include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" -/* Returns true if the "as" word that begins at start follows an import statement */ -static bool IsImportAs(unsigned int start, Accessor &styler) { - unsigned int i; - unsigned int j; - char s[10]; - - /* Find any import before start but after any statement terminator or quote */ - i = start; - while (i > 0) { - char ch = styler[i - 1]; - - if (ch == '\n' || ch == '\r' || ch == ';' || ch == '\'' || ch == '"' || ch == '`') - break; - if (ch == 't' && i > 5) { - for (j = 0; j < 6; j++) - s[j] = styler[(i - 6) + j]; - s[j] = '\0'; - if (strcmp(s, "import") == 0) - return true; - } - i--; - } - - return false; -} - -static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { - char s[100]; - bool wordIsNumber = isdigit(styler[start]); - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { - s[i] = styler[start + i]; - s[i + 1] = '\0'; - } - char chAttr = SCE_P_IDENTIFIER; - if (0 == strcmp(prevWord, "class")) - chAttr = SCE_P_CLASSNAME; - else if (0 == strcmp(prevWord, "def")) - chAttr = SCE_P_DEFNAME; - else if (wordIsNumber) - chAttr = SCE_P_NUMBER; - else if (keywords.InList(s)) - chAttr = SCE_P_WORD; - else if (strcmp(s, "as") == 0 && IsImportAs(start, styler)) - chAttr = SCE_P_WORD; - // make sure that dot-qualifiers inside the word are lexed correct - else for (unsigned int i = 0; i < end - start + 1; i++) { - if (styler[start + i] == '.') { - styler.ColourTo(start + i - 1, chAttr); - styler.ColourTo(start + i, SCE_P_OPERATOR); - } - } - styler.ColourTo(end, chAttr); - strcpy(prevWord, s); -} +enum kwType { kwOther, kwClass, kwDef, kwImport }; static bool IsPyComment(Accessor &styler, int pos, int len) { return len>0 && styler[pos]=='#'; } -static bool IsPyStringStart(char ch, char chNext, char chNext2) { +static bool IsPyStringStart(int ch, int chNext, int chNext2) { if (ch == '\'' || ch == '"') return true; if (ch == 'u' || ch == 'U') { @@ -93,10 +41,6 @@ static bool IsPyStringStart(char ch, char chNext, char chNext2) { return false; } -static bool IsPyWordStart(char ch, char chNext, char chNext2) { - return (iswordchar(ch) && !IsPyStringStart(ch, chNext, chNext2)); -} - /* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */ static int GetPyStringState(Accessor &styler, int i, int *nextIndex) { char ch = styler.SafeGetCharAt(i); @@ -139,10 +83,18 @@ static int GetPyStringState(Accessor &styler, int i, int *nextIndex) { } } +inline bool IsAWordChar(int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); +} + +inline bool IsAWordStart(int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { - int lengthDoc = startPos + length; + int endPos = startPos + length; // Backtrack to previous line in case need to fix its tab whinging int lineCurrent = styler.GetLine(startPos); @@ -156,32 +108,27 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, } } - // Python uses a different mask because bad indentation is marked by oring with 32 - styler.StartAt(startPos, 127); - WordList &keywords = *keywordlists[0]; - int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level"); - char prevWord[200]; - prevWord[0] = '\0'; - if (length == 0) - return ; + const int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level"); - int state = initStyle & 31; + initStyle = initStyle & 31; + if (initStyle == SCE_P_STRINGEOL) { + initStyle = SCE_P_DEFAULT; + } - int nextIndex = 0; - char chPrev = ' '; - char chPrev2 = ' '; - char chNext = styler[startPos]; - styler.StartSegment(startPos); - bool atStartLine = true; + kwType kwLast = kwOther; int spaceFlags = 0; styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment); - for (int i = startPos; i < lengthDoc; i++) { + + // Python uses a different mask because bad indentation is marked by oring with 32 + StyleContext sc(startPos, endPos-startPos, initStyle, styler, 0x7f); + + for (; sc.More(); sc.Forward()) { - if (atStartLine) { - char chBad = static_cast(64); - char chGood = static_cast(0); + if (sc.atLineStart) { + const char chBad = static_cast(64); + const char chGood = static_cast(0); char chFlags = chGood; if (whingeLevel == 1) { chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood; @@ -192,132 +139,117 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, } else if (whingeLevel == 4) { chFlags = (spaceFlags & wsTab) ? chBad : chGood; } - styler.SetFlags(chFlags, static_cast(state)); - atStartLine = false; + styler.SetFlags(chFlags, static_cast(sc.state)); } - char ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - char chNext2 = styler.SafeGetCharAt(i + 2); - - if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) { - if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) { + if (sc.atLineEnd) { + if ((sc.state == SCE_P_DEFAULT) || + (sc.state == SCE_P_TRIPLE) || + (sc.state == SCE_P_TRIPLEDOUBLE)) { // Perform colourisation of white space and triple quoted strings at end of each line to allow // tab marking to work inside white space and triple quoted strings - styler.ColourTo(i, state); + sc.ForwardSetState(sc.state); } lineCurrent++; styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment); - atStartLine = true; - } - - if (styler.IsLeadByte(ch)) { - chNext = styler.SafeGetCharAt(i + 2); - chPrev = ' '; - chPrev2 = ' '; - i += 1; - continue; + if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) { + sc.ChangeState(SCE_P_STRINGEOL); + sc.ForwardSetState(SCE_P_DEFAULT); + } } - if (state == SCE_P_STRINGEOL) { - if (ch != '\r' && ch != '\n') { - styler.ColourTo(i - 1, state); - state = SCE_P_DEFAULT; + // Check for a state end + if (sc.state == SCE_P_OPERATOR) { + kwLast = kwOther; + sc.SetState(SCE_C_DEFAULT); + } else if (sc.state == SCE_P_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_P_DEFAULT); } - } - if (state == SCE_P_DEFAULT) { - if (IsPyWordStart(ch, chNext, chNext2)) { - styler.ColourTo(i - 1, state); - state = SCE_P_WORD; - } else if (ch == '#') { - styler.ColourTo(i - 1, state); - state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE; - } else if (IsPyStringStart(ch, chNext, chNext2)) { - styler.ColourTo(i - 1, state); - state = GetPyStringState(styler, i, &nextIndex); - if (nextIndex != i + 1) { - i = nextIndex - 1; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); + } else if (sc.state == SCE_P_WORD) { + if ((sc.ch == '.') || (!IsAWordChar(sc.ch))) { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + int style = SCE_P_IDENTIFIER; + if ((kwLast == kwImport) && (strcmp(s, "as") == 0)) { + style = SCE_P_WORD; + } else if (keywords.InList(s)) { + style = SCE_P_WORD; + } else if (kwLast == kwClass) { + style = SCE_P_CLASSNAME; + } else if (kwLast == kwDef) { + style = SCE_P_DEFNAME; } - } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_P_OPERATOR); - } - } else if (state == SCE_P_WORD) { - if (!iswordchar(ch)) { - ClassifyWordPy(styler.GetStartSegment(), i - 1, keywords, styler, prevWord); - state = SCE_P_DEFAULT; - if (ch == '#') { - state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE; - } else if (IsPyStringStart(ch, chNext, chNext2)) { - styler.ColourTo(i - 1, state); - state = GetPyStringState(styler, i, &nextIndex); - if (nextIndex != i + 1) { - i = nextIndex - 1; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_P_OPERATOR); + sc.ChangeState(style); + sc.SetState(SCE_P_DEFAULT); + if (style == SCE_P_WORD) { + if (0 == strcmp(s, "class")) + kwLast = kwClass; + else if (0 == strcmp(s, "def")) + kwLast = kwDef; + else if (0 == strcmp(s, "import")) + kwLast = kwImport; + else + kwLast = kwOther; + } else if (style == SCE_P_CLASSNAME) { + kwLast = kwOther; + } else if (style == SCE_P_DEFNAME) { + kwLast = kwOther; } } - } else { - if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) { - if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); - state = SCE_P_DEFAULT; - } - } else if (state == SCE_P_STRING) { - if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourTo(i - 1, state); - state = SCE_P_STRINGEOL; - } else if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (ch == '\"') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } - } else if (state == SCE_P_CHARACTER) { - if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourTo(i - 1, state); - state = SCE_P_STRINGEOL; - } else if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (ch == '\'') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } - } else if (state == SCE_P_TRIPLE) { - if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; + } else if ((sc.state == SCE_P_COMMENTLINE) || (sc.state == SCE_P_COMMENTBLOCK)) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_P_DEFAULT); + } + } else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) { + if (sc.ch == '\\') { + if ((sc.chNext == '\r') && (sc.GetRelative(2) == '\n')) { + sc.Forward(); } - } else if (state == SCE_P_TRIPLEDOUBLE) { - if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; + sc.Forward(); + } else if ((sc.state == SCE_P_STRING) && (sc.ch == '\"')) { + sc.ForwardSetState(SCE_P_DEFAULT); + } else if ((sc.state == SCE_P_CHARACTER) && (sc.ch == '\'')) { + sc.ForwardSetState(SCE_P_DEFAULT); + } + } else if (sc.state == SCE_P_TRIPLE) { + if (sc.ch == '\\') { + sc.Forward(); + } else if (sc.Match("\'\'\'")) { + sc.Forward(); + sc.Forward(); + sc.ForwardSetState(SCE_P_DEFAULT); + } + } else if (sc.state == SCE_P_TRIPLEDOUBLE) { + if (sc.ch == '\\') { + sc.Forward(); + } else if (sc.Match("\"\"\"")) { + sc.Forward(); + sc.Forward(); + sc.ForwardSetState(SCE_P_DEFAULT); + } + } + + // Check for a new state starting character + if (sc.state == SCE_P_DEFAULT) { + if (isascii(sc.ch) && isoperator(static_cast(sc.ch)) || sc.ch == '`') { + sc.SetState(SCE_P_OPERATOR); + } else if (sc.ch == '#') { + sc.SetState(sc.chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_P_NUMBER); + } else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) { + int nextIndex = 0; + sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex)); + while (nextIndex > (sc.currentPos+1)) { + sc.Forward(); } + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_P_WORD); } } - chPrev2 = chPrev; - chPrev = ch; - } - if (state == SCE_P_WORD) { - ClassifyWordPy(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord); - } else { - styler.ColourTo(lengthDoc, state); } + sc.Complete(); } static bool IsCommentLine(int line, Accessor &styler) { @@ -338,14 +270,15 @@ static bool IsQuoteLine(int line, Accessor &styler) { return ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE)); } + static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/, WordList *[], Accessor &styler) { - int maxPos = startPos + length; - int maxLines = styler.GetLine(maxPos-1); - - bool foldComment = styler.GetPropertyInt("fold.comment.python"); - bool foldQuotes = styler.GetPropertyInt("fold.quotes.python"); - + const int maxPos = startPos + length; + const int maxLines = styler.GetLine(maxPos-1); // Requested last line + const int docLines = styler.GetLine(styler.Length() - 1); // Available last line + const bool foldComment = styler.GetPropertyInt("fold.comment.python"); + const bool foldQuotes = styler.GetPropertyInt("fold.quotes.python"); + // Backtrack to previous non-blank line so we can determine indent level // for any white space lines (needed esp. within triple quoted strings) // and so we can fix any preceding fold level (which is why we go back @@ -363,8 +296,8 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse } int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; + // Set up initial loop state startPos = styler.LineStart(lineCurrent); - // Set up initial state int prev_state = SCE_P_DEFAULT & 31; if (lineCurrent >= 1) prev_state = styler.StyleAt(startPos-1) & 31; @@ -374,21 +307,27 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler); // Process all characters to end of requested range or end of any triple quote - // or comment that hangs over the end of the range - while ((lineCurrent <= maxLines) || prevQuote || prevComment) { + // or comment that hangs over the end of the range. Cap processing in all cases + // to end of document (in case of unclosed quote or comment at end). + while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevQuote || prevComment)) { // Gather info int lev = indentCurrent; int lineNext = lineCurrent + 1; - int style = styler.StyleAt(styler.LineStart(lineNext)) & 31; - int indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); - int quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE)); - int quote_start = (quote && !prevQuote); - int quote_continue = (quote && prevQuote); - int comment = foldComment && IsCommentLine(lineCurrent, styler); - int comment_start = (comment && !prevComment && + int indentNext = indentCurrent; + int quote = false; + if (lineNext <= docLines) { + // Information about next line is only available if not at end of document + indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); + int style = styler.StyleAt(styler.LineStart(lineNext)) & 31; + quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE)); + } + const int quote_start = (quote && !prevQuote); + const int quote_continue = (quote && prevQuote); + const int comment = foldComment && IsCommentLine(lineCurrent, styler); + const int comment_start = (comment && !prevComment && (lineNext <= docLines) && IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE)); - int comment_continue = (comment && prevComment); + const int comment_continue = (comment && prevComment); if ((!quote || !prevQuote) && !comment) indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; if (quote) @@ -411,22 +350,35 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse } // Skip past any blank lines for next indent level info; we skip also comments - // starting in column 0 which effectively folds them into surrounding code - // rather than screwing up folding. Then set indent level on the lines - // we skipped to be same as maximum of current and next indent. This approach - // does a reasonable job of collapsing white space into surrounding code - // without getting confused by white space at the start of an indented level. + // starting in column 0 which effectively folds them into surrounding code rather + // than screwing up folding. + const int saveIndentNext = indentNext; while (!quote && - ((indentNext & SC_FOLDLEVELWHITEFLAG) || styler[styler.LineStart(lineNext)] == '#') && - (lineNext < maxLines)) { - int level = Platform::Maximum(indentCurrent, indentNext); - if (indentNext & SC_FOLDLEVELWHITEFLAG) - level = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel; - styler.SetLevel(lineNext, level); + (lineNext < docLines) && + ((indentNext & SC_FOLDLEVELWHITEFLAG) || + (lineNext <= docLines && styler[styler.LineStart(lineNext)] == '#'))) { + lineNext++; indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); } + // Next compute max indent level of current line and next non-blank line. + // This is the level to which we set all the intervening blank or comment lines. + const int skip_level = Platform::Maximum(indentCurrentLevel, + indentNext & SC_FOLDLEVELNUMBERMASK); + + // Now set all the indent levels on the lines we skipped + int skipLine = lineCurrent + 1; + int skipIndentNext = saveIndentNext; + while (skipLine < lineNext) { + int skipLineLevel = skip_level; + if (skipIndentNext & SC_FOLDLEVELWHITEFLAG) + skipLineLevel = SC_FOLDLEVELWHITEFLAG | skipLineLevel; + styler.SetLevel(skipLine, skipLineLevel); + skipLine++; + skipIndentNext = styler.IndentAmount(skipLine, &spaceFlags, NULL); + } + // Set fold header on non-quote/non-comment line if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) { if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) @@ -443,8 +395,9 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse lineCurrent = lineNext; } - // Make sure last line indent level is set too - styler.SetLevel(lineCurrent, indentCurrent); + // NOTE: Cannot set level of last line here because indentCurrent doesn't have + // header flag set; the loop above is crafted to take care of this case! + //styler.SetLevel(lineCurrent, indentCurrent); } LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, "python", FoldPyDoc); diff --git a/src/stc/scintilla/src/LineMarker.cxx b/src/stc/scintilla/src/LineMarker.cxx index dc1468d832..a7c5b124fc 100644 --- a/src/stc/scintilla/src/LineMarker.cxx +++ b/src/stc/scintilla/src/LineMarker.cxx @@ -40,7 +40,7 @@ static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, C surface->FillRectangle(rcH, fore); } -void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) { +void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter) { // Restrict most shapes a bit PRectangle rc = rcWhole; rc.top++; @@ -230,6 +230,15 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) { surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, centreY - blobSize); + } else if (markType >= SC_MARK_CHARACTER) { + char character[1]; + character[0] = static_cast(markType - SC_MARK_CHARACTER); + int width = surface->WidthText(fontForCharacter, character, 1); + rc.left += (rc.Width() - width) / 2; + rc.right = rc.left + width; + surface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2, + character, 1, fore.allocated, back.allocated); + } else { // SC_MARK_SHORTARROW Point pts[] = { Point(centreX, centreY + dimOn2), diff --git a/src/stc/scintilla/src/LineMarker.h b/src/stc/scintilla/src/LineMarker.h index ee0f36c256..b9dd15d062 100644 --- a/src/stc/scintilla/src/LineMarker.h +++ b/src/stc/scintilla/src/LineMarker.h @@ -20,7 +20,7 @@ public: fore = Colour(0,0,0); back = Colour(0xff,0xff,0xff); } - void Draw(Surface *surface, PRectangle &rc); + void Draw(Surface *surface, PRectangle &rc, Font &fontForCharacter); }; #endif diff --git a/src/stc/scintilla/src/RESearch.cxx b/src/stc/scintilla/src/RESearch.cxx index 07534db1ef..ac5b73d026 100644 --- a/src/stc/scintilla/src/RESearch.cxx +++ b/src/stc/scintilla/src/RESearch.cxx @@ -30,9 +30,8 @@ * Modification history: * * $Log$ - * Revision 1.1 2001/09/01 03:05:24 RD - * Upgraded to version 1.39 of Scintilla, and upated wxStyledTextCtrl - * accordingly. + * Revision 1.2 2001/10/18 01:24:58 RD + * Updated to version 1.40 of Scintilla * * Revision 1.6 2001/04/29 13:32:10 nyamatongwe * Addition of new target methods - versions of ReplaceTarget that take counted diff --git a/src/stc/scintilla/src/ScintillaBase.cxx b/src/stc/scintilla/src/ScintillaBase.cxx index 707f59b9f4..75a8ffffa4 100644 --- a/src/stc/scintilla/src/ScintillaBase.cxx +++ b/src/stc/scintilla/src/ScintillaBase.cxx @@ -35,6 +35,7 @@ #include "ScintillaBase.h" ScintillaBase::ScintillaBase() { + displayPopupMenu = true; listType = 0; #ifdef SCI_LEXER lexLanguage = SCLEX_CONTAINER; @@ -514,6 +515,10 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara InvalidateStyleRedraw(); break; + case SCI_USEPOPUP: + displayPopupMenu = wParam; + break; + #ifdef SCI_LEXER case SCI_SETLEXER: SetLexer(wParam); diff --git a/src/stc/scintilla/src/ScintillaBase.h b/src/stc/scintilla/src/ScintillaBase.h index d5b1e8ba0c..ca4695355f 100644 --- a/src/stc/scintilla/src/ScintillaBase.h +++ b/src/stc/scintilla/src/ScintillaBase.h @@ -30,6 +30,7 @@ protected: idcmdSelectAll=16 }; + bool displayPopupMenu; Menu popup; AutoComplete ac; @@ -42,7 +43,7 @@ protected: int lexLanguage; LexerModule *lexCurrent; PropSet props; - enum {numWordLists=5}; + enum {numWordLists=6}; WordList *keyWordLists[numWordLists+1]; void SetLexer(uptr_t wParam); void SetLexerLanguage(const char *languageName); diff --git a/src/stc/scintilla/src/StyleContext.cxx b/src/stc/scintilla/src/StyleContext.cxx new file mode 100644 index 0000000000..bdae28196f --- /dev/null +++ b/src/stc/scintilla/src/StyleContext.cxx @@ -0,0 +1,51 @@ +// Scintilla source code edit control +/** @file StyleContext.cxx + ** Lexer infrastructure. + **/ +// Copyright 1998-2001 by Neil Hodgson +// This file is in the public domain. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" + +static void getRange(unsigned int start, + unsigned int end, + Accessor &styler, + char *s, + unsigned int len) { + unsigned int i = 0; + while ((i < end - start + 1) && (i < len-1)) { + s[i] = styler[start + i]; + i++; + } + s[i] = '\0'; +} + +void StyleContext::GetCurrent(char *s, int len) { + getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len); +} + +static void getRangeLowered(unsigned int start, + unsigned int end, + Accessor &styler, + char *s, + unsigned int len) { + unsigned int i = 0; + while ((i < end - start + 1) && (i < len-1)) { + s[i] = static_cast(tolower(styler[start + i])); + i++; + } + s[i] = '\0'; +} + +void StyleContext::GetCurrentLowered(char *s, int len) { + getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len); +} diff --git a/src/stc/scintilla/src/StyleContext.h b/src/stc/scintilla/src/StyleContext.h new file mode 100644 index 0000000000..5bc6371fd3 --- /dev/null +++ b/src/stc/scintilla/src/StyleContext.h @@ -0,0 +1,127 @@ +// Scintilla source code edit control +/** @file StyleContext.cxx + ** Lexer infrastructure. + **/ +// Copyright 1998-2001 by Neil Hodgson +// This file is in the public domain. + +// All languages handled so far can treat all characters >= 0x80 as one class +// which just continues the current token or starts an identifier if in default. +// DBCS treated specially as the second character can be < 0x80 and hence +// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 +class StyleContext { + Accessor &styler; + int endPos; + StyleContext& operator=(const StyleContext&) { + return *this; + } +public: + int currentPos; + bool atLineStart; + bool atLineEnd; + int state; + int chPrev; + int ch; + int chNext; + + StyleContext(unsigned int startPos, int length, + int initStyle, Accessor &styler_, char chMask=31) : + styler(styler_), + endPos(startPos + length), + currentPos(startPos), + atLineStart(true), + atLineEnd(false), + state(initStyle), + chPrev(0), + ch(0), + chNext(0) { + styler.StartAt(startPos, chMask); + styler.StartSegment(startPos); + int pos = currentPos; + ch = static_cast(styler.SafeGetCharAt(pos)); + if (styler.IsLeadByte(static_cast(ch))) { + pos++; + ch = ch << 8; + ch |= static_cast(styler.SafeGetCharAt(pos)); + } + chNext = static_cast(styler.SafeGetCharAt(pos+1)); + if (styler.IsLeadByte(static_cast(chNext))) { + chNext = chNext << 8; + chNext |= static_cast(styler.SafeGetCharAt(pos+2)); + } + atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos); + } + void Complete() { + styler.ColourTo(currentPos - 1, state); + } + bool More() { + return currentPos <= endPos; + } + void Forward() { + atLineStart = atLineEnd; + // A lot of this is repeated from the constructor - TODO: merge code + chPrev = ch; + currentPos++; + if (ch >= 0x100) + currentPos++; + ch = chNext; + chNext = static_cast(styler.SafeGetCharAt(currentPos+1)); + if (styler.IsLeadByte(static_cast(chNext))) { + chNext = chNext << 8; + chNext |= static_cast(styler.SafeGetCharAt(currentPos + 2)); + } + // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) + // Avoid triggering two times on Dos/Win + // End of line + atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos); + } + void ChangeState(int state_) { + state = state_; + } + void SetState(int state_) { + styler.ColourTo(currentPos - 1, state); + state = state_; + } + void ForwardSetState(int state_) { + Forward(); + styler.ColourTo(currentPos - 1, state); + state = state_; + } + int LengthCurrent() { + return currentPos - styler.GetStartSegment(); + } + int GetRelative(int n) { + return styler.SafeGetCharAt(currentPos+n); + } + bool Match(char ch0) { + return ch == ch0; + } + bool Match(char ch0, char ch1) { + return (ch == ch0) && (chNext == ch1); + } + bool Match(const char *s) { + if (ch != *s) + return false; + s++; + if (chNext != *s) + return false; + s++; + for (int n=2; *s; n++) { + if (*s != styler.SafeGetCharAt(currentPos+n)) + return false; + s++; + } + return true; + } + // Non-inline + void GetCurrent(char *s, int len); + void GetCurrentLowered(char *s, int len); +}; + +inline bool IsASpace(unsigned int ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +inline bool IsADigit(unsigned int ch) { + return (ch >= '0') && (ch <= '9'); +} diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp index bd6184cf6a..99645adb29 100644 --- a/src/stc/stc.cpp +++ b/src/stc/stc.cpp @@ -32,6 +32,7 @@ int wxForceScintillaLexers(void) extern LexerModule lmAVE; extern LexerModule lmConf; extern LexerModule lmCPP; + extern LexerModule lmNncrontab; extern LexerModule lmEiffel; extern LexerModule lmHTML; extern LexerModule lmLISP; @@ -48,6 +49,7 @@ int wxForceScintillaLexers(void) && &lmAVE && &lmConf && &lmCPP + && &lmNncrontab && &lmEiffel && &lmHTML && &lmLISP @@ -1202,6 +1204,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // Replace the target text with the argument text. +// Text is counted so it can contain nulls. // Returns the length of the replacement text. int wxStyledTextCtrl::ReplaceTarget(const wxString& text) { @@ -1210,6 +1213,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // Replace the target text with the argument text after \d processing. +// Text is counted so it can contain nulls. // Looks for \d where d is between 1 and 9 and replaces these with the strings // matched in the last search operation which were surrounded by \( and \). // Returns the length of the replacement text including any change @@ -1221,7 +1225,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // Search for a counted string in the target and set the target to the found -// range. +// range. Text is counted so it can contain nulls. // Returns length of range or -1 for failure in which case target is not moved. int wxStyledTextCtrl::SearchInTarget(const wxString& text) { diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in index 979bca8794..3a415e1f85 100644 --- a/src/stc/stc.cpp.in +++ b/src/stc/stc.cpp.in @@ -32,6 +32,7 @@ int wxForceScintillaLexers(void) extern LexerModule lmAVE; extern LexerModule lmConf; extern LexerModule lmCPP; + extern LexerModule lmNncrontab; extern LexerModule lmEiffel; extern LexerModule lmHTML; extern LexerModule lmLISP; @@ -48,6 +49,7 @@ int wxForceScintillaLexers(void) && &lmAVE && &lmConf && &lmCPP + && &lmNncrontab && &lmEiffel && &lmHTML && &lmLISP -- 2.45.2