]> git.saurik.com Git - wxWidgets.git/commitdiff
Updated wxSTC's copy of Scintilla to version 1.61
authorRobin Dunn <robin@alldunn.com>
Mon, 27 Sep 2004 20:29:49 +0000 (20:29 +0000)
committerRobin Dunn <robin@alldunn.com>
Mon, 27 Sep 2004 20:29:49 +0000 (20:29 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29464 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

91 files changed:
contrib/build/stc/makefile.bcc
contrib/build/stc/makefile.gcc
contrib/build/stc/makefile.vc
contrib/build/stc/makefile.wat
contrib/build/stc/stc.bkl
contrib/build/stc/stc.dsp
contrib/include/wx/stc/stc.h
contrib/src/stc/Makefile.in
contrib/src/stc/scintilla/README.txt
contrib/src/stc/scintilla/include/Platform.h
contrib/src/stc/scintilla/include/PropSet.h
contrib/src/stc/scintilla/include/SString.h
contrib/src/stc/scintilla/include/SciLexer.h
contrib/src/stc/scintilla/include/Scintilla.h
contrib/src/stc/scintilla/include/Scintilla.iface
contrib/src/stc/scintilla/src/CallTip.cxx
contrib/src/stc/scintilla/src/CellBuffer.cxx
contrib/src/stc/scintilla/src/CellBuffer.h
contrib/src/stc/scintilla/src/Document.cxx
contrib/src/stc/scintilla/src/Document.h
contrib/src/stc/scintilla/src/Editor.cxx
contrib/src/stc/scintilla/src/Editor.h
contrib/src/stc/scintilla/src/KeyWords.cxx
contrib/src/stc/scintilla/src/LexAPDL.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexAU3.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexBash.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexGui4Cli.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexHTML.cxx
contrib/src/stc/scintilla/src/LexKix.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexMSSQL.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexNsis.cxx
contrib/src/stc/scintilla/src/LexOthers.cxx
contrib/src/stc/scintilla/src/LexPB.cxx
contrib/src/stc/scintilla/src/LexPerl.cxx
contrib/src/stc/scintilla/src/LexPython.cxx
contrib/src/stc/scintilla/src/LexSQL.cxx
contrib/src/stc/scintilla/src/LexSpecman.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexVerilog.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/PropSet.cxx
contrib/src/stc/scintilla/src/ScintillaBase.cxx
contrib/src/stc/scintilla/src/Style.cxx
contrib/src/stc/scintilla/src/Style.h
contrib/src/stc/scintilla/src/StyleContext.cxx
contrib/src/stc/scintilla/src/StyleContext.h
contrib/src/stc/scintilla/src/ViewStyle.cxx
contrib/src/stc/scintilla/src/ViewStyle.h
contrib/src/stc/scintilla/src/XPM.cxx
contrib/src/stc/stc.cpp
include/wx/stc/stc.h
src/stc/Makefile.in
src/stc/scintilla/README.txt
src/stc/scintilla/include/Platform.h
src/stc/scintilla/include/PropSet.h
src/stc/scintilla/include/SString.h
src/stc/scintilla/include/SciLexer.h
src/stc/scintilla/include/Scintilla.h
src/stc/scintilla/include/Scintilla.iface
src/stc/scintilla/src/CallTip.cxx
src/stc/scintilla/src/CellBuffer.cxx
src/stc/scintilla/src/CellBuffer.h
src/stc/scintilla/src/Document.cxx
src/stc/scintilla/src/Document.h
src/stc/scintilla/src/Editor.cxx
src/stc/scintilla/src/Editor.h
src/stc/scintilla/src/KeyWords.cxx
src/stc/scintilla/src/LexAPDL.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexAU3.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexBash.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexGui4Cli.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexHTML.cxx
src/stc/scintilla/src/LexKix.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexMSSQL.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexNsis.cxx
src/stc/scintilla/src/LexOthers.cxx
src/stc/scintilla/src/LexPB.cxx
src/stc/scintilla/src/LexPerl.cxx
src/stc/scintilla/src/LexPython.cxx
src/stc/scintilla/src/LexSQL.cxx
src/stc/scintilla/src/LexSpecman.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexVerilog.cxx [new file with mode: 0644]
src/stc/scintilla/src/PropSet.cxx
src/stc/scintilla/src/ScintillaBase.cxx
src/stc/scintilla/src/Style.cxx
src/stc/scintilla/src/Style.h
src/stc/scintilla/src/StyleContext.cxx
src/stc/scintilla/src/StyleContext.h
src/stc/scintilla/src/ViewStyle.cxx
src/stc/scintilla/src/ViewStyle.h
src/stc/scintilla/src/XPM.cxx
src/stc/stc.cpp
wxPython/contrib/stc/_stc_rename.i

index c52174bb588bcc30be31675d03ab914d803a020f..17cbee8d7cfe73292211f9bc7b9fe0f2203a9969 100644 (file)
@@ -85,6 +85,14 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexTeX.obj \
        $(OBJS)\stcdll_LexVB.obj \
        $(OBJS)\stcdll_LexYAML.obj \
        $(OBJS)\stcdll_LexTeX.obj \
        $(OBJS)\stcdll_LexVB.obj \
        $(OBJS)\stcdll_LexYAML.obj \
+       $(OBJS)\stcdll_LexAPDL.obj \
+       $(OBJS)\stcdll_LexAU3.obj \
+       $(OBJS)\stcdll_LexBash.obj \
+       $(OBJS)\stcdll_LexGui4Cli.obj \
+       $(OBJS)\stcdll_LexKix.obj \
+       $(OBJS)\stcdll_LexMSSQL.obj \
+       $(OBJS)\stcdll_LexSpecman.obj \
+       $(OBJS)\stcdll_LexVerilog.obj \
        $(OBJS)\stcdll_LineMarker.obj \
        $(OBJS)\stcdll_PropSet.obj \
        $(OBJS)\stcdll_RESearch.obj \
        $(OBJS)\stcdll_LineMarker.obj \
        $(OBJS)\stcdll_PropSet.obj \
        $(OBJS)\stcdll_RESearch.obj \
@@ -153,6 +161,14 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexTeX.obj \
        $(OBJS)\stclib_LexVB.obj \
        $(OBJS)\stclib_LexYAML.obj \
        $(OBJS)\stclib_LexTeX.obj \
        $(OBJS)\stclib_LexVB.obj \
        $(OBJS)\stclib_LexYAML.obj \
+       $(OBJS)\stclib_LexAPDL.obj \
+       $(OBJS)\stclib_LexAU3.obj \
+       $(OBJS)\stclib_LexBash.obj \
+       $(OBJS)\stclib_LexGui4Cli.obj \
+       $(OBJS)\stclib_LexKix.obj \
+       $(OBJS)\stclib_LexMSSQL.obj \
+       $(OBJS)\stclib_LexSpecman.obj \
+       $(OBJS)\stclib_LexVerilog.obj \
        $(OBJS)\stclib_LineMarker.obj \
        $(OBJS)\stclib_PropSet.obj \
        $(OBJS)\stclib_RESearch.obj \
        $(OBJS)\stclib_LineMarker.obj \
        $(OBJS)\stclib_PropSet.obj \
        $(OBJS)\stclib_RESearch.obj \
@@ -464,6 +480,30 @@ $(OBJS)\stcdll_LexVB.obj: ../../src/stc\scintilla\src\LexVB.cxx
 $(OBJS)\stcdll_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
 $(OBJS)\stcdll_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexAPDL.obj: ../../src/stc\scintilla\src\LexAPDL.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexAU3.obj: ../../src/stc\scintilla\src\LexAU3.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexBash.obj: ../../src/stc\scintilla\src\LexBash.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexGui4Cli.obj: ../../src/stc\scintilla\src\LexGui4Cli.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexMSSQL.obj: ../../src/stc\scintilla\src\LexMSSQL.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexVerilog.obj: ../../src/stc\scintilla\src\LexVerilog.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
 $(OBJS)\stcdll_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
@@ -647,6 +687,30 @@ $(OBJS)\stclib_LexVB.obj: ../../src/stc\scintilla\src\LexVB.cxx
 $(OBJS)\stclib_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
 $(OBJS)\stclib_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexAPDL.obj: ../../src/stc\scintilla\src\LexAPDL.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexAU3.obj: ../../src/stc\scintilla\src\LexAU3.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexBash.obj: ../../src/stc\scintilla\src\LexBash.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexGui4Cli.obj: ../../src/stc\scintilla\src\LexGui4Cli.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexMSSQL.obj: ../../src/stc\scintilla\src\LexMSSQL.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexVerilog.obj: ../../src/stc\scintilla\src\LexVerilog.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
 $(OBJS)\stclib_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
index f9bbca70510e631917e987a227aa91ecf1d5ec2b..9522098bc84d6b2b629a37d59f347c9d56689ace 100644 (file)
@@ -77,6 +77,14 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexTeX.o \
        $(OBJS)\stcdll_LexVB.o \
        $(OBJS)\stcdll_LexYAML.o \
        $(OBJS)\stcdll_LexTeX.o \
        $(OBJS)\stcdll_LexVB.o \
        $(OBJS)\stcdll_LexYAML.o \
+       $(OBJS)\stcdll_LexAPDL.o \
+       $(OBJS)\stcdll_LexAU3.o \
+       $(OBJS)\stcdll_LexBash.o \
+       $(OBJS)\stcdll_LexGui4Cli.o \
+       $(OBJS)\stcdll_LexKix.o \
+       $(OBJS)\stcdll_LexMSSQL.o \
+       $(OBJS)\stcdll_LexSpecman.o \
+       $(OBJS)\stcdll_LexVerilog.o \
        $(OBJS)\stcdll_LineMarker.o \
        $(OBJS)\stcdll_PropSet.o \
        $(OBJS)\stcdll_RESearch.o \
        $(OBJS)\stcdll_LineMarker.o \
        $(OBJS)\stcdll_PropSet.o \
        $(OBJS)\stcdll_RESearch.o \
@@ -145,6 +153,14 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexTeX.o \
        $(OBJS)\stclib_LexVB.o \
        $(OBJS)\stclib_LexYAML.o \
        $(OBJS)\stclib_LexTeX.o \
        $(OBJS)\stclib_LexVB.o \
        $(OBJS)\stclib_LexYAML.o \
+       $(OBJS)\stclib_LexAPDL.o \
+       $(OBJS)\stclib_LexAU3.o \
+       $(OBJS)\stclib_LexBash.o \
+       $(OBJS)\stclib_LexGui4Cli.o \
+       $(OBJS)\stclib_LexKix.o \
+       $(OBJS)\stclib_LexMSSQL.o \
+       $(OBJS)\stclib_LexSpecman.o \
+       $(OBJS)\stclib_LexVerilog.o \
        $(OBJS)\stclib_LineMarker.o \
        $(OBJS)\stclib_PropSet.o \
        $(OBJS)\stclib_RESearch.o \
        $(OBJS)\stclib_LineMarker.o \
        $(OBJS)\stclib_PropSet.o \
        $(OBJS)\stclib_RESearch.o \
@@ -457,6 +473,30 @@ $(OBJS)\stcdll_LexVB.o: ../../src/stc/scintilla/src/LexVB.cxx
 $(OBJS)\stcdll_LexYAML.o: ../../src/stc/scintilla/src/LexYAML.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 $(OBJS)\stcdll_LexYAML.o: ../../src/stc/scintilla/src/LexYAML.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+$(OBJS)\stcdll_LexAPDL.o: ../../src/stc/scintilla/src/LexAPDL.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexAU3.o: ../../src/stc/scintilla/src/LexAU3.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexBash.o: ../../src/stc/scintilla/src/LexBash.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexGui4Cli.o: ../../src/stc/scintilla/src/LexGui4Cli.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexKix.o: ../../src/stc/scintilla/src/LexKix.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexMSSQL.o: ../../src/stc/scintilla/src/LexMSSQL.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexSpecman.o: ../../src/stc/scintilla/src/LexSpecman.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexVerilog.o: ../../src/stc/scintilla/src/LexVerilog.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 $(OBJS)\stcdll_LineMarker.o: ../../src/stc/scintilla/src/LineMarker.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 $(OBJS)\stcdll_LineMarker.o: ../../src/stc/scintilla/src/LineMarker.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
@@ -640,6 +680,30 @@ $(OBJS)\stclib_LexVB.o: ../../src/stc/scintilla/src/LexVB.cxx
 $(OBJS)\stclib_LexYAML.o: ../../src/stc/scintilla/src/LexYAML.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 $(OBJS)\stclib_LexYAML.o: ../../src/stc/scintilla/src/LexYAML.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+$(OBJS)\stclib_LexAPDL.o: ../../src/stc/scintilla/src/LexAPDL.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexAU3.o: ../../src/stc/scintilla/src/LexAU3.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexBash.o: ../../src/stc/scintilla/src/LexBash.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexGui4Cli.o: ../../src/stc/scintilla/src/LexGui4Cli.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexKix.o: ../../src/stc/scintilla/src/LexKix.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexMSSQL.o: ../../src/stc/scintilla/src/LexMSSQL.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexSpecman.o: ../../src/stc/scintilla/src/LexSpecman.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexVerilog.o: ../../src/stc/scintilla/src/LexVerilog.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 $(OBJS)\stclib_LineMarker.o: ../../src/stc/scintilla/src/LineMarker.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 $(OBJS)\stclib_LineMarker.o: ../../src/stc/scintilla/src/LineMarker.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
index a77cd8d2e2b20af1e8c6dab6aa5565f318294734..5cc756c34d4fc86f5f606012ff8fa25502993299 100644 (file)
@@ -80,6 +80,14 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexTeX.obj \
        $(OBJS)\stcdll_LexVB.obj \
        $(OBJS)\stcdll_LexYAML.obj \
        $(OBJS)\stcdll_LexTeX.obj \
        $(OBJS)\stcdll_LexVB.obj \
        $(OBJS)\stcdll_LexYAML.obj \
+       $(OBJS)\stcdll_LexAPDL.obj \
+       $(OBJS)\stcdll_LexAU3.obj \
+       $(OBJS)\stcdll_LexBash.obj \
+       $(OBJS)\stcdll_LexGui4Cli.obj \
+       $(OBJS)\stcdll_LexKix.obj \
+       $(OBJS)\stcdll_LexMSSQL.obj \
+       $(OBJS)\stcdll_LexSpecman.obj \
+       $(OBJS)\stcdll_LexVerilog.obj \
        $(OBJS)\stcdll_LineMarker.obj \
        $(OBJS)\stcdll_PropSet.obj \
        $(OBJS)\stcdll_RESearch.obj \
        $(OBJS)\stcdll_LineMarker.obj \
        $(OBJS)\stcdll_PropSet.obj \
        $(OBJS)\stcdll_RESearch.obj \
@@ -151,6 +159,14 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexTeX.obj \
        $(OBJS)\stclib_LexVB.obj \
        $(OBJS)\stclib_LexYAML.obj \
        $(OBJS)\stclib_LexTeX.obj \
        $(OBJS)\stclib_LexVB.obj \
        $(OBJS)\stclib_LexYAML.obj \
+       $(OBJS)\stclib_LexAPDL.obj \
+       $(OBJS)\stclib_LexAU3.obj \
+       $(OBJS)\stclib_LexBash.obj \
+       $(OBJS)\stclib_LexGui4Cli.obj \
+       $(OBJS)\stclib_LexKix.obj \
+       $(OBJS)\stclib_LexMSSQL.obj \
+       $(OBJS)\stclib_LexSpecman.obj \
+       $(OBJS)\stclib_LexVerilog.obj \
        $(OBJS)\stclib_LineMarker.obj \
        $(OBJS)\stclib_PropSet.obj \
        $(OBJS)\stclib_RESearch.obj \
        $(OBJS)\stclib_LineMarker.obj \
        $(OBJS)\stclib_PropSet.obj \
        $(OBJS)\stclib_RESearch.obj \
@@ -542,6 +558,30 @@ $(OBJS)\stcdll_LexVB.obj: ../../src/stc\scintilla\src\LexVB.cxx
 $(OBJS)\stcdll_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
 $(OBJS)\stcdll_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexAPDL.obj: ../../src/stc\scintilla\src\LexAPDL.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexAU3.obj: ../../src/stc\scintilla\src\LexAU3.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexBash.obj: ../../src/stc\scintilla\src\LexBash.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexGui4Cli.obj: ../../src/stc\scintilla\src\LexGui4Cli.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexMSSQL.obj: ../../src/stc\scintilla\src\LexMSSQL.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexVerilog.obj: ../../src/stc\scintilla\src\LexVerilog.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
 $(OBJS)\stcdll_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
@@ -725,6 +765,30 @@ $(OBJS)\stclib_LexVB.obj: ../../src/stc\scintilla\src\LexVB.cxx
 $(OBJS)\stclib_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
 $(OBJS)\stclib_LexYAML.obj: ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexAPDL.obj: ../../src/stc\scintilla\src\LexAPDL.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexAU3.obj: ../../src/stc\scintilla\src\LexAU3.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexBash.obj: ../../src/stc\scintilla\src\LexBash.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexGui4Cli.obj: ../../src/stc\scintilla\src\LexGui4Cli.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexMSSQL.obj: ../../src/stc\scintilla\src\LexMSSQL.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexVerilog.obj: ../../src/stc\scintilla\src\LexVerilog.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
 $(OBJS)\stclib_LineMarker.obj: ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
index dc2f04a99409fa284a0732d4f95475537457f292..41ee34fd7967b98dda3d442c93af7d69fa511a13 100644 (file)
@@ -245,6 +245,14 @@ STCDLL_OBJECTS =  &
        $(OBJS)\stcdll_LexTeX.obj &
        $(OBJS)\stcdll_LexVB.obj &
        $(OBJS)\stcdll_LexYAML.obj &
        $(OBJS)\stcdll_LexTeX.obj &
        $(OBJS)\stcdll_LexVB.obj &
        $(OBJS)\stcdll_LexYAML.obj &
+       $(OBJS)\stcdll_LexAPDL.obj &
+       $(OBJS)\stcdll_LexAU3.obj &
+       $(OBJS)\stcdll_LexBash.obj &
+       $(OBJS)\stcdll_LexGui4Cli.obj &
+       $(OBJS)\stcdll_LexKix.obj &
+       $(OBJS)\stcdll_LexMSSQL.obj &
+       $(OBJS)\stcdll_LexSpecman.obj &
+       $(OBJS)\stcdll_LexVerilog.obj &
        $(OBJS)\stcdll_LineMarker.obj &
        $(OBJS)\stcdll_PropSet.obj &
        $(OBJS)\stcdll_RESearch.obj &
        $(OBJS)\stcdll_LineMarker.obj &
        $(OBJS)\stcdll_PropSet.obj &
        $(OBJS)\stcdll_RESearch.obj &
@@ -313,6 +321,14 @@ STCLIB_OBJECTS =  &
        $(OBJS)\stclib_LexTeX.obj &
        $(OBJS)\stclib_LexVB.obj &
        $(OBJS)\stclib_LexYAML.obj &
        $(OBJS)\stclib_LexTeX.obj &
        $(OBJS)\stclib_LexVB.obj &
        $(OBJS)\stclib_LexYAML.obj &
+       $(OBJS)\stclib_LexAPDL.obj &
+       $(OBJS)\stclib_LexAU3.obj &
+       $(OBJS)\stclib_LexBash.obj &
+       $(OBJS)\stclib_LexGui4Cli.obj &
+       $(OBJS)\stclib_LexKix.obj &
+       $(OBJS)\stclib_LexMSSQL.obj &
+       $(OBJS)\stclib_LexSpecman.obj &
+       $(OBJS)\stclib_LexVerilog.obj &
        $(OBJS)\stclib_LineMarker.obj &
        $(OBJS)\stclib_PropSet.obj &
        $(OBJS)\stclib_RESearch.obj &
        $(OBJS)\stclib_LineMarker.obj &
        $(OBJS)\stclib_PropSet.obj &
        $(OBJS)\stclib_RESearch.obj &
@@ -517,6 +533,30 @@ $(OBJS)\stcdll_LexVB.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexVB.cxx
 $(OBJS)\stcdll_LexYAML.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
 $(OBJS)\stcdll_LexYAML.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
+$(OBJS)\stcdll_LexAPDL.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexAPDL.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexAU3.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexAU3.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexBash.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexBash.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexGui4Cli.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexGui4Cli.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexKix.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexKix.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexMSSQL.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexMSSQL.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexSpecman.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexSpecman.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexVerilog.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexVerilog.cxx
+       $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
 $(OBJS)\stcdll_LineMarker.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
 $(OBJS)\stcdll_LineMarker.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
@@ -700,6 +740,30 @@ $(OBJS)\stclib_LexVB.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexVB.cxx
 $(OBJS)\stclib_LexYAML.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
 $(OBJS)\stclib_LexYAML.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexYAML.cxx
        $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
+$(OBJS)\stclib_LexAPDL.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexAPDL.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexAU3.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexAU3.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexBash.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexBash.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexGui4Cli.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexGui4Cli.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexKix.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexKix.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexMSSQL.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexMSSQL.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexSpecman.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexSpecman.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexVerilog.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexVerilog.cxx
+       $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
 $(OBJS)\stclib_LineMarker.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
 $(OBJS)\stclib_LineMarker.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LineMarker.cxx
        $(CXX) -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
index 7dd9548deec93c58a38b8fc9cf63f7d7de703a68..f5a17e935717ca14cbc7b98398359c9532b6795a 100644 (file)
         scintilla/src/LexTeX.cxx
         scintilla/src/LexVB.cxx
         scintilla/src/LexYAML.cxx
         scintilla/src/LexTeX.cxx
         scintilla/src/LexVB.cxx
         scintilla/src/LexYAML.cxx
+       
+        scintilla/src/LexAPDL.cxx
+        scintilla/src/LexAU3.cxx
+        scintilla/src/LexBash.cxx
+        scintilla/src/LexGui4Cli.cxx
+        scintilla/src/LexKix.cxx
+        scintilla/src/LexMSSQL.cxx
+        scintilla/src/LexSpecman.cxx
+        scintilla/src/LexVerilog.cxx
+
         scintilla/src/LineMarker.cxx
         scintilla/src/PropSet.cxx
         scintilla/src/RESearch.cxx
         scintilla/src/LineMarker.cxx
         scintilla/src/PropSet.cxx
         scintilla/src/RESearch.cxx
index 79e9f6358e53c109d33cc38b748910182b32abf9..2463f233e761a32aa3fcb54758e95a2c938b6e1d 100644 (file)
@@ -496,6 +496,14 @@ SOURCE=../../src/stc\scintilla\src\KeyWords.cxx
 # End Source File
 # Begin Source File
 
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexAPDL.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=../../src/stc\scintilla\src\LexAU3.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexAVE.cxx
 # End Source File
 # Begin Source File
 SOURCE=../../src/stc\scintilla\src\LexAVE.cxx
 # End Source File
 # Begin Source File
@@ -512,6 +520,10 @@ SOURCE=../../src/stc\scintilla\src\LexBaan.cxx
 # End Source File
 # Begin Source File
 
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexBash.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexBullant.cxx
 # End Source File
 # Begin Source File
 SOURCE=../../src/stc\scintilla\src\LexBullant.cxx
 # End Source File
 # Begin Source File
@@ -556,10 +568,18 @@ SOURCE=../../src/stc\scintilla\src\LexFortran.cxx
 # End Source File
 # Begin Source File
 
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexGui4Cli.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexHTML.cxx
 # End Source File
 # Begin Source File
 
 SOURCE=../../src/stc\scintilla\src\LexHTML.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexKix.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexLisp.cxx
 # End Source File
 # Begin Source File
 SOURCE=../../src/stc\scintilla\src\LexLisp.cxx
 # End Source File
 # Begin Source File
@@ -580,6 +600,10 @@ SOURCE=../../src/stc\scintilla\src\LexMPT.cxx
 # End Source File
 # Begin Source File
 
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexMSSQL.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexMatlab.cxx
 # End Source File
 # Begin Source File
 SOURCE=../../src/stc\scintilla\src\LexMatlab.cxx
 # End Source File
 # Begin Source File
@@ -632,6 +656,10 @@ SOURCE=../../src/stc\scintilla\src\LexScriptol.cxx
 # End Source File
 # Begin Source File
 
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexSpecman.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexTeX.cxx
 # End Source File
 # Begin Source File
 SOURCE=../../src/stc\scintilla\src\LexTeX.cxx
 # End Source File
 # Begin Source File
@@ -640,6 +668,10 @@ SOURCE=../../src/stc\scintilla\src\LexVB.cxx
 # End Source File
 # Begin Source File
 
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexVerilog.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexYAML.cxx
 # End Source File
 # Begin Source File
 SOURCE=../../src/stc\scintilla\src\LexYAML.cxx
 # End Source File
 # Begin Source File
index 32b6b7bf34fd5e8cb42c01d0252a83466fa56a56..39b826243015c13921ddcf51091ea7fe52dbd967 100644 (file)
 #define wxSTC_TIME_FOREVER 10000000
 #define wxSTC_WRAP_NONE 0
 #define wxSTC_WRAP_WORD 1
 #define wxSTC_TIME_FOREVER 10000000
 #define wxSTC_WRAP_NONE 0
 #define wxSTC_WRAP_WORD 1
+#define wxSTC_WRAPVISUALFLAG_NONE 0x0000
+#define wxSTC_WRAPVISUALFLAG_END 0x0001
+#define wxSTC_WRAPVISUALFLAG_START 0x0002
+#define wxSTC_WRAPVISUALFLAGLOC_DEFAULT 0x0000
+#define wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001
+#define wxSTC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002
 #define wxSTC_CACHE_NONE 0
 #define wxSTC_CACHE_CARET 1
 #define wxSTC_CACHE_PAGE 2
 #define wxSTC_CACHE_NONE 0
 #define wxSTC_CACHE_CARET 1
 #define wxSTC_CACHE_PAGE 2
 #define wxSTC_LEX_FORTH 52
 #define wxSTC_LEX_ERLANG 53
 #define wxSTC_LEX_OCTAVE 54
 #define wxSTC_LEX_FORTH 52
 #define wxSTC_LEX_ERLANG 53
 #define wxSTC_LEX_OCTAVE 54
+#define wxSTC_LEX_MSSQL 55
+#define wxSTC_LEX_VERILOG 56
+#define wxSTC_LEX_KIX 57
+#define wxSTC_LEX_GUI4CLI 58
+#define wxSTC_LEX_SPECMAN 59
+#define wxSTC_LEX_AU3 60
+#define wxSTC_LEX_APDL 61
+#define wxSTC_LEX_BASH 62
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 #define wxSTC_HP_OPERATOR 101
 #define wxSTC_HP_IDENTIFIER 102
 
 #define wxSTC_HP_OPERATOR 101
 #define wxSTC_HP_IDENTIFIER 102
 
+// PHP
+#define wxSTC_HPHP_COMPLEX_VARIABLE 104
+
 // ASP Python
 #define wxSTC_HPA_START 105
 #define wxSTC_HPA_DEFAULT 106
 // ASP Python
 #define wxSTC_HPA_START 105
 #define wxSTC_HPA_DEFAULT 106
 #define wxSTC_B_KEYWORD2 10
 #define wxSTC_B_KEYWORD3 11
 #define wxSTC_B_KEYWORD4 12
 #define wxSTC_B_KEYWORD2 10
 #define wxSTC_B_KEYWORD3 11
 #define wxSTC_B_KEYWORD4 12
+#define wxSTC_B_CONSTANT 13
+#define wxSTC_B_ASM 14
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 #define wxSTC_ERR_IFC 16
 #define wxSTC_ERR_IFORT 17
 #define wxSTC_ERR_ABSF 18
 #define wxSTC_ERR_IFC 16
 #define wxSTC_ERR_IFORT 17
 #define wxSTC_ERR_ABSF 18
+#define wxSTC_ERR_TIDY 19
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 #define wxSTC_NSIS_IFDEFINEDEF 11
 #define wxSTC_NSIS_MACRODEF 12
 #define wxSTC_NSIS_STRINGVAR 13
 #define wxSTC_NSIS_IFDEFINEDEF 11
 #define wxSTC_NSIS_MACRODEF 12
 #define wxSTC_NSIS_STRINGVAR 13
+#define wxSTC_NSIS_NUMBER 14
 
 // Lexical states for SCLEX_MMIXAL
 #define wxSTC_MMIXAL_LEADWS 0
 
 // Lexical states for SCLEX_MMIXAL
 #define wxSTC_MMIXAL_LEADWS 0
 #define wxSTC_ERLANG_NODE_NAME 13
 #define wxSTC_ERLANG_UNKNOWN 31
 
 #define wxSTC_ERLANG_NODE_NAME 13
 #define wxSTC_ERLANG_UNKNOWN 31
 
+// Lexical states for SCLEX_OCTAVE are identical to MatLab
+// Lexical states for SCLEX_MSSQL
+#define wxSTC_MSSQL_DEFAULT 0
+#define wxSTC_MSSQL_COMMENT 1
+#define wxSTC_MSSQL_LINE_COMMENT 2
+#define wxSTC_MSSQL_NUMBER 3
+#define wxSTC_MSSQL_STRING 4
+#define wxSTC_MSSQL_OPERATOR 5
+#define wxSTC_MSSQL_IDENTIFIER 6
+#define wxSTC_MSSQL_VARIABLE 7
+#define wxSTC_MSSQL_COLUMN_NAME 8
+#define wxSTC_MSSQL_STATEMENT 9
+#define wxSTC_MSSQL_DATATYPE 10
+#define wxSTC_MSSQL_SYSTABLE 11
+#define wxSTC_MSSQL_GLOBAL_VARIABLE 12
+#define wxSTC_MSSQL_FUNCTION 13
+#define wxSTC_MSSQL_STORED_PROCEDURE 14
+#define wxSTC_MSSQL_DEFAULT_PREF_DATATYPE 15
+#define wxSTC_MSSQL_COLUMN_NAME_2 16
+
+// Lexical states for SCLEX_VERILOG
+#define wxSTC_V_DEFAULT 0
+#define wxSTC_V_COMMENT 1
+#define wxSTC_V_COMMENTLINE 2
+#define wxSTC_V_COMMENTLINEBANG 3
+#define wxSTC_V_NUMBER 4
+#define wxSTC_V_WORD 5
+#define wxSTC_V_STRING 6
+#define wxSTC_V_WORD2 7
+#define wxSTC_V_WORD3 8
+#define wxSTC_V_PREPROCESSOR 9
+#define wxSTC_V_OPERATOR 10
+#define wxSTC_V_IDENTIFIER 11
+#define wxSTC_V_STRINGEOL 12
+#define wxSTC_V_USER 19
+
+// Lexical states for SCLEX_KIX
+#define wxSTC_KIX_DEFAULT 0
+#define wxSTC_KIX_COMMENT 1
+#define wxSTC_KIX_STRING1 2
+#define wxSTC_KIX_STRING2 3
+#define wxSTC_KIX_NUMBER 4
+#define wxSTC_KIX_VAR 5
+#define wxSTC_KIX_MACRO 6
+#define wxSTC_KIX_KEYWORD 7
+#define wxSTC_KIX_FUNCTIONS 8
+#define wxSTC_KIX_OPERATOR 9
+#define wxSTC_KIX_IDENTIFIER 31
+
+// Lexical states for SCLEX_GUI4CLI
+#define wxSTC_GC_DEFAULT 0
+#define wxSTC_GC_COMMENTLINE 1
+#define wxSTC_GC_COMMENTBLOCK 2
+#define wxSTC_GC_GLOBAL 3
+#define wxSTC_GC_EVENT 4
+#define wxSTC_GC_ATTRIBUTE 5
+#define wxSTC_GC_CONTROL 6
+#define wxSTC_GC_COMMAND 7
+#define wxSTC_GC_STRING 8
+#define wxSTC_GC_OPERATOR 9
+
+// Lexical states for SCLEX_SPECMAN
+#define wxSTC_SN_DEFAULT 0
+#define wxSTC_SN_CODE 1
+#define wxSTC_SN_COMMENTLINE 2
+#define wxSTC_SN_COMMENTLINEBANG 3
+#define wxSTC_SN_NUMBER 4
+#define wxSTC_SN_WORD 5
+#define wxSTC_SN_STRING 6
+#define wxSTC_SN_WORD2 7
+#define wxSTC_SN_WORD3 8
+#define wxSTC_SN_PREPROCESSOR 9
+#define wxSTC_SN_OPERATOR 10
+#define wxSTC_SN_IDENTIFIER 11
+#define wxSTC_SN_STRINGEOL 12
+#define wxSTC_SN_REGEXTAG 13
+#define wxSTC_SN_SIGNAL 14
+#define wxSTC_SN_USER 19
+
+// Lexical states for SCLEX_AU3
+#define wxSTC_AU3_DEFAULT 0
+#define wxSTC_AU3_COMMENT 1
+#define wxSTC_AU3_COMMENTBLOCK 2
+#define wxSTC_AU3_NUMBER 3
+#define wxSTC_AU3_FUNCTION 4
+#define wxSTC_AU3_KEYWORD 5
+#define wxSTC_AU3_MACRO 6
+#define wxSTC_AU3_STRING 7
+#define wxSTC_AU3_OPERATOR 8
+#define wxSTC_AU3_VARIABLE 9
+#define wxSTC_AU3_SENT 10
+#define wxSTC_AU3_PREPROCESSOR 11
+
+// Lexical states for SCLEX_APDL
+#define wxSTC_APDL_DEFAULT 0
+#define wxSTC_APDL_COMMENT 1
+#define wxSTC_APDL_COMMENTBLOCK 2
+#define wxSTC_APDL_NUMBER 3
+#define wxSTC_APDL_STRING 4
+#define wxSTC_APDL_WORD 5
+#define wxSTC_APDL_COMMAND 6
+#define wxSTC_APDL_PROCESSOR 7
+#define wxSTC_APDL_FUNCTION 8
+
+// Lexical states for SCLEX_BASH
+#define wxSTC_SH_DEFAULT 0
+#define wxSTC_SH_ERROR 1
+#define wxSTC_SH_COMMENTLINE 2
+#define wxSTC_SH_NUMBER 3
+#define wxSTC_SH_WORD 4
+#define wxSTC_SH_STRING 5
+#define wxSTC_SH_CHARACTER 6
+#define wxSTC_SH_OPERATOR 7
+#define wxSTC_SH_IDENTIFIER 8
+#define wxSTC_SH_SCALAR 9
+#define wxSTC_SH_PARAM 10
+#define wxSTC_SH_BACKTICKS 11
+#define wxSTC_SH_HERE_DELIM 12
+#define wxSTC_SH_HERE_Q 13
+
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
@@ -1339,7 +1480,7 @@ public:
 //       and regenerate
 
 
 //       and regenerate
 
 
-    // Add text to the document.
+    // Add text to the document at current position.
     void AddText(const wxString& text);
 
     // Add array of cells to document.
     void AddText(const wxString& text);
 
     // Add array of cells to document.
@@ -1354,7 +1495,7 @@ public:
     // Set all style bytes to 0, remove all folding information.
     void ClearDocumentStyle();
 
     // Set all style bytes to 0, remove all folding information.
     void ClearDocumentStyle();
 
-    // The number of characters in the document.
+    // Returns the number of characters in the document.
     int GetLength();
 
     // Returns the character byte at the position.
     int GetLength();
 
     // Returns the character byte at the position.
@@ -2071,6 +2212,24 @@ public:
     // Retrieve whether text is word wrapped.
     int GetWrapMode();
 
     // Retrieve whether text is word wrapped.
     int GetWrapMode();
 
+    // Set the display mode of visual flags for wrapped lines.
+    void SetWrapVisualFlags(int wrapVisualFlags);
+
+    // Retrive the display mode of visual flags for wrapped lines.
+    int GetWrapVisualFlags();
+
+    // Set the location of visual flags for wrapped lines.
+    void SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation);
+
+    // Retrive the location of visual flags for wrapped lines.
+    int GetWrapVisualFlagsLocation();
+
+    // Set the start indent for wrapped lines.
+    void SetWrapStartIndent(int indent);
+
+    // Retrive the start indent for wrapped lines.
+    int GetWrapStartIndent();
+
     // Sets the degree of caching of layout information.
     void SetLayoutCache(int mode);
 
     // Sets the degree of caching of layout information.
     void SetLayoutCache(int mode);
 
@@ -2575,6 +2734,9 @@ public:
     // Get currently selected item position in the auto-completion list
     int AutoCompGetCurrent();
 
     // Get currently selected item position in the auto-completion list
     int AutoCompGetCurrent();
 
+    // Enlarge the document to a particular size of text bytes.
+    void Allocate(int bytes);
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
index 44361f13d82146d67cc694f30f419bd3a9c8fdb7..c8368bb3d7acfd930c04f7de59804d63dee58d3e 100644 (file)
@@ -108,6 +108,14 @@ STCDLL_OBJECTS =  \
        stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexYAML.o \
        stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexYAML.o \
+       stcdll_LexAPDL.o \
+       stcdll_LexAU3.o \
+       stcdll_LexBash.o \
+       stcdll_LexGui4Cli.o \
+       stcdll_LexKix.o \
+       stcdll_LexMSSQL.o \
+       stcdll_LexSpecman.o \
+       stcdll_LexVerilog.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
@@ -174,6 +182,14 @@ STCLIB_OBJECTS =  \
        stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexYAML.o \
        stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexYAML.o \
+       stclib_LexAPDL.o \
+       stclib_LexAU3.o \
+       stclib_LexBash.o \
+       stclib_LexGui4Cli.o \
+       stclib_LexKix.o \
+       stclib_LexMSSQL.o \
+       stclib_LexSpecman.o \
+       stclib_LexVerilog.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
@@ -491,6 +507,30 @@ stcdll_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
 stcdll_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexAPDL.o: $(srcdir)/scintilla/src/LexAPDL.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexAU3.o: $(srcdir)/scintilla/src/LexAU3.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexBash.o: $(srcdir)/scintilla/src/LexBash.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexGui4Cli.o: $(srcdir)/scintilla/src/LexGui4Cli.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexMSSQL.o: $(srcdir)/scintilla/src/LexMSSQL.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexVerilog.o: $(srcdir)/scintilla/src/LexVerilog.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
@@ -674,6 +714,30 @@ stclib_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
 stclib_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexAPDL.o: $(srcdir)/scintilla/src/LexAPDL.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexAU3.o: $(srcdir)/scintilla/src/LexAU3.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexBash.o: $(srcdir)/scintilla/src/LexBash.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexGui4Cli.o: $(srcdir)/scintilla/src/LexGui4Cli.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexMSSQL.o: $(srcdir)/scintilla/src/LexMSSQL.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexVerilog.o: $(srcdir)/scintilla/src/LexVerilog.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
index f8ebdb02a6d196c246cd290fee67d6fb7a9fdc20..25dca357b17b24068edf3ed461726ca16dc43c80 100644 (file)
@@ -3,4 +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.
 
 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.58
+The current version of the Scintilla code is 1.61
+
index 1058242fb36c110776e1daf27ee46011f9ebdb26..e6385da71ddf818c245c11d665e81a64e35ffbb0 100644 (file)
@@ -284,7 +284,8 @@ public:
        Font();
        virtual ~Font();
 
        Font();
        virtual ~Font();
 
-       virtual void Create(const char *faceName, int characterSet, int size, bool bold, bool italic, bool extraFontFlag=false);
+       virtual void Create(const char *faceName, int characterSet, int size,
+               bool bold, bool italic, bool extraFontFlag=false);
        virtual void Release();
 
        FontID GetID() { return id; }
        virtual void Release();
 
        FontID GetID() { return id; }
index 62cd5da3a93620d26ea1d84515011dd8b0643270..0b4c2f58de2046a4a95d06e9769ff79cae2f187d 100644 (file)
@@ -56,6 +56,11 @@ public:
        char *ToString();       // Caller must delete[] the return value
        bool GetFirst(char **key, char **val);
        bool GetNext(char **key, char **val);
        char *ToString();       // Caller must delete[] the return value
        bool GetFirst(char **key, char **val);
        bool GetNext(char **key, char **val);
+
+private:
+       // copy-value semantics not implemented 
+       PropSet(const PropSet &copy);
+       void operator=(const PropSet &assign);
 };
 
 /**
 };
 
 /**
@@ -83,11 +88,18 @@ public:
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
                bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
                bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
-               bool ignoreCase=false, char otherSeparator='\0');
+               bool ignoreCase=false, char otherSeparator='\0', bool exactLen=false);
 };
 
 inline bool IsAlphabetic(unsigned int ch) {
        return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
 }
 
 };
 
 inline bool IsAlphabetic(unsigned int ch) {
        return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
 }
 
+
+#ifdef _MSC_VER
+// Visual C++ doesn't like the private copy idiom for disabling
+// the default copy constructor and operator=, but it's fine.
+#pragma warning(disable: 4511 4512)
+#endif
+
 #endif
 #endif
index 01602df7816fbc65d28c4fd4f7af1e4b6423fd09..5c2a93d33b7737cb1a28c3b3bbe8680f5bf35409 100644 (file)
@@ -2,7 +2,7 @@
 /** @file SString.h
  ** A simple string class.
  **/
 /** @file SString.h
  ** A simple string class.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SSTRING_H
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SSTRING_H
@@ -18,100 +18,148 @@ bool EqualCaseInsensitive(const char *a, const char *b);
 // An SString may contain embedded nul characters.
 
 /**
 // An SString may contain embedded nul characters.
 
 /**
- * @brief A simple string class.
- *
- * Hold the length of the string for quick operations,
- * can have a buffer bigger than the string to avoid too many memory allocations and copies.
- * May have embedded zeroes as a result of @a substitute, but relies too heavily on C string
- * functions to allow reliable manipulations of these strings, other than simple appends, etc.
- **/
-class SString {
+ * Base class from which the two other classes (SBuffer & SString)
+ * are derived.
+ */
+class SContainer {
 public:
        /** Type of string lengths (sizes) and positions (indexes). */
        typedef size_t lenpos_t;
        /** Out of bounds value indicating that the string argument should be measured. */
        enum { measure_length=0xffffffffU};
 
 public:
        /** Type of string lengths (sizes) and positions (indexes). */
        typedef size_t lenpos_t;
        /** Out of bounds value indicating that the string argument should be measured. */
        enum { measure_length=0xffffffffU};
 
-private:
+protected:
        char *s;                                ///< The C string
        lenpos_t sSize;                 ///< The size of the buffer, less 1: ie. the maximum size of the string
        char *s;                                ///< The C string
        lenpos_t sSize;                 ///< The size of the buffer, less 1: ie. the maximum size of the string
-       lenpos_t sLen;                  ///< The size of the string in s
-       lenpos_t sizeGrowth;    ///< Minimum growth size when appending strings
-       enum { sizeGrowthDefault = 64 };
-       bool grow(lenpos_t lenNew) {
-               while (sizeGrowth * 6 < lenNew) {
-                       sizeGrowth *= 2;
-               }
-               char *sNew = new char[lenNew + sizeGrowth + 1];
-               if (sNew) {
-                       if (s) {
-                               memcpy(sNew, s, sLen);
-                               delete []s;
-                       }
-                       s = sNew;
-                       s[sLen] = '\0';
-                       sSize = lenNew + sizeGrowth;
+
+       SContainer() : s(0), sSize(0) {}
+       ~SContainer() {
+               delete []s;     // Suppose it was allocated using StringAllocate
+               s = 0;
+               sSize = 0;
+       }
+       /** Size of buffer. */
+       lenpos_t size() const {
+               if (s) {
+                       return sSize;
+               } else {
+                       return 0;
                }
                }
-               return sNew != 0;
        }
        }
+public:
+       /**
+        * Allocate uninitialized memory big enough to fit a string of the given length.
+        * @return the pointer to the new string
+        */
+       static char *StringAllocate(lenpos_t len);
+       /**
+        * Duplicate a buffer/C string.
+        * Allocate memory of the given size, or big enough to fit the string if length isn't given;
+        * then copy the given string in the allocated memory.
+        * @return the pointer to the new string
+        */
+       static char *StringAllocate(
+               const char *s,                  ///< The string to duplicate
+               lenpos_t len=measure_length);   ///< The length of memory to allocate. Optional.
+};
 
 
-       SString &assign(const char *sOther, lenpos_t sSize_=measure_length) {
-               if (!sOther) {
-                       sSize_ = 0;
-               } else if (sSize_ == measure_length) {
-                       sSize_ = strlen(sOther);
-               }
-               if (sSize > 0 && sSize_ <= sSize) {     // Does not allocate new buffer if the current is big enough
-                       if (s && sSize_) {
-                               memcpy(s, sOther, sSize_);
-                       }
-                       s[sSize_] = '\0';
-                       sLen = sSize_;
+
+/**
+ * @brief A string buffer class.
+ *
+ * Main use is to ask an API the length of a string it can provide,
+ * then to allocate a buffer of the given size, and to provide this buffer
+ * to the API to put the string.
+ * This class is intended to be shortlived, to be transformed as SString
+ * as soon as it holds the string, so it has little members.
+ * Note: we assume the buffer is filled by the API. If the length can be shorter,
+ * we should set sLen to strlen(sb.ptr()) in related SString constructor and assignment.
+ */
+class SBuffer : protected SContainer {
+public:
+       SBuffer(lenpos_t len) {
+               s = StringAllocate(len);
+               if (s) {
+                       *s = '\0';
+               sSize = len;
                } else {
                } else {
+                       sSize = 0;
+               }
+       }
+private:
+       /// Copy constructor
+       // Here only to be on the safe size, user should avoid returning SBuffer values.
+       SBuffer(const SBuffer &source) : SContainer() {
+               s = StringAllocate(source.s, source.sSize);
+               sSize = (s) ? source.sSize : 0;
+       }
+       /// Default assignment operator
+       // Same here, shouldn't be used
+       SBuffer &operator=(const SBuffer &source) {
+               if (this != &source) {
                        delete []s;
                        delete []s;
-                       s = StringAllocate(sOther, sSize_);
-                       if (s) {
-                               sSize = sSize_; // Allow buffer bigger than real string, thus providing space to grow
-                               sLen = strlen(s);
-                       } else {
-                               sSize = sLen = 0;
-                       }
+                       s = StringAllocate(source.s, source.sSize);
+                       sSize = (s) ? source.sSize : 0;
                }
                return *this;
        }
                }
                return *this;
        }
-
 public:
 public:
-       SString() : s(0), sSize(0), sLen(0), sizeGrowth(sizeGrowthDefault) {
+       /** Provide direct read/write access to buffer. */
+       char *ptr() {
+           return s;
        }
        }
-       SString(const SString &source) : sizeGrowth(sizeGrowthDefault) {
-               s = StringAllocate(source.s);
-               sSize = sLen = (s) ? strlen(s) : 0;
+       /** Ownership of the buffer have been taken, so release it. */
+       void reset() {
+               s = 0;
+               sSize = 0;
+       }
+       /** Size of buffer. */
+       lenpos_t size() const {
+               return SContainer::size();
+       }
+};
+
+
+/**
+ * @brief A simple string class.
+ *
+ * Hold the length of the string for quick operations,
+ * can have a buffer bigger than the string to avoid too many memory allocations and copies.
+ * May have embedded zeroes as a result of @a substitute, but relies too heavily on C string
+ * functions to allow reliable manipulations of these strings, other than simple appends, etc.
+ */
+class SString : protected SContainer {
+       lenpos_t sLen;                  ///< The size of the string in s
+       lenpos_t sizeGrowth;    ///< Minimum growth size when appending strings
+       enum { sizeGrowthDefault = 64 };
+
+       bool grow(lenpos_t lenNew);
+       SString &assign(const char *sOther, lenpos_t sSize_=measure_length);
+
+public:
+       SString() : sLen(0), sizeGrowth(sizeGrowthDefault) {}
+       SString(const SString &source) : SContainer(), sizeGrowth(sizeGrowthDefault) {
+               s = StringAllocate(source.s, source.sLen);
+               sSize = sLen = (s) ? source.sLen : 0;
        }
        SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
                s = StringAllocate(s_);
                sSize = sLen = (s) ? strlen(s) : 0;
        }
        }
        SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
                s = StringAllocate(s_);
                sSize = sLen = (s) ? strlen(s) : 0;
        }
+       SString(SBuffer &buf) : sizeGrowth(sizeGrowthDefault) {
+               s = buf.ptr();
+               sSize = sLen = buf.size();
+               // Consumes the given buffer!
+               buf.reset();
+       }
        SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) {
                // note: expects the "last" argument to point one beyond the range end (a la STL iterators)
                s = StringAllocate(s_ + first, last - first);
        SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) {
                // note: expects the "last" argument to point one beyond the range end (a la STL iterators)
                s = StringAllocate(s_ + first, last - first);
-               sSize = sLen = (s) ? strlen(s) : 0;
-       }
-       SString(int i) : sizeGrowth(sizeGrowthDefault) {
-               char number[32];
-               sprintf(number, "%0d", i);
-               s = StringAllocate(number);
-               sSize = sLen = (s) ? strlen(s) : 0;
-       }
-       SString(double d, int precision) : sizeGrowth(sizeGrowthDefault) {
-               char number[32];
-               sprintf(number, "%.*f", precision, d);
-               s = StringAllocate(number);
-               sSize = sLen = (s) ? strlen(s) : 0;
+               sSize = sLen = (s) ? last - first : 0;
        }
        }
+       SString(int i);
+       SString(double d, int precision);
        ~SString() {
        ~SString() {
-               delete []s;
-               s = 0;
-               sSize = 0;
                sLen = 0;
        }
        void clear() {
                sLen = 0;
        }
        void clear() {
@@ -122,58 +170,41 @@ public:
        }
        /** Size of buffer. */
        lenpos_t size() const {
        }
        /** Size of buffer. */
        lenpos_t size() const {
-               if (s)
-                       return sSize;
-               else
-                       return 0;
+               return SContainer::size();
        }
        /** Size of string in buffer. */
        lenpos_t length() const {
                return sLen;
        }
        }
        /** Size of string in buffer. */
        lenpos_t length() const {
                return sLen;
        }
+       /** Read access to a character of the string. */
+       char operator[](lenpos_t i) const {
+               return (s && i < sSize) ? s[i] : '\0';
+       }
        SString &operator=(const char *source) {
                return assign(source);
        }
        SString &operator=(const SString &source) {
                if (this != &source) {
        SString &operator=(const char *source) {
                return assign(source);
        }
        SString &operator=(const SString &source) {
                if (this != &source) {
-                       assign(source.c_str());
+                       assign(source.s, source.sLen);
                }
                return *this;
        }
                }
                return *this;
        }
-       bool operator==(const SString &sOther) const {
-               if ((s == 0) && (sOther.s == 0))
-                       return true;
-               if ((s == 0) || (sOther.s == 0))
-                       return false;
-               return strcmp(s, sOther.s) == 0;
-       }
+       bool operator==(const SString &sOther) const;
        bool operator!=(const SString &sOther) const {
                return !operator==(sOther);
        }
        bool operator!=(const SString &sOther) const {
                return !operator==(sOther);
        }
-       bool operator==(const char *sOther) const {
-               if ((s == 0) && (sOther == 0))
-                       return true;
-               if ((s == 0) || (sOther == 0))
-                       return false;
-               return strcmp(s, sOther) == 0;
-       }
+       bool operator==(const char *sOther) const;
        bool operator!=(const char *sOther) const {
                return !operator==(sOther);
        }
        bool contains(char ch) {
        bool operator!=(const char *sOther) const {
                return !operator==(sOther);
        }
        bool contains(char ch) {
-               if (s && *s)
-                       return strchr(s, ch) != 0;
-               else
-                       return false;
+               return (s && *s) ? strchr(s, ch) != 0 : false;
        }
        void setsizegrowth(lenpos_t sizeGrowth_) {
                sizeGrowth = sizeGrowth_;
        }
        const char *c_str() const {
        }
        void setsizegrowth(lenpos_t sizeGrowth_) {
                sizeGrowth = sizeGrowth_;
        }
        const char *c_str() const {
-               if (s)
-                       return s;
-               else
-                       return "";
+               return s ? s : "";
        }
        /** Give ownership of buffer to caller which must use delete[] to free buffer. */
        char *detach() {
        }
        /** Give ownership of buffer to caller which must use delete[] to free buffer. */
        char *detach() {
@@ -183,57 +214,10 @@ public:
                sLen = 0;
                return sRet;
        }
                sLen = 0;
                return sRet;
        }
-       char operator[](lenpos_t i) const {
-               if (s && i < sSize)     // Or < sLen? Depends on the use, both are OK
-                       return s[i];
-               else
-                       return '\0';
-       }
-       SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const {
-               if (subPos >= sLen) {
-                       return SString();                                       // return a null string if start index is out of bounds
-               }
-               if ((subLen == measure_length) || (subPos + subLen > sLen)) {
-                       subLen = sLen - subPos;         // can't substr past end of source string
-               }
-               return SString(s, subPos, subPos + subLen);
-       }
-       SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length) {
-               if ((subLen == measure_length) || (subPos + subLen > sLen)) {
-                       subLen = sLen - subPos;         // don't apply past end of string
-               }
-               for (lenpos_t i = subPos; i < subPos + subLen; i++) {
-                       if (s[i] < 'A' || s[i] > 'Z')
-                               continue;
-                       else
-                               s[i] = static_cast<char>(s[i] - 'A' + 'a');
-               }
-               return *this;
-       }
-       SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0') {
-               if (!sOther) {
-                       return *this;
-               }
-               if (sLenOther == measure_length) {
-                       sLenOther = strlen(sOther);
-               }
-               int lenSep = 0;
-               if (sLen && sep) {      // Only add a separator if not empty
-                       lenSep = 1;
-               }
-               lenpos_t lenNew = sLen + sLenOther + lenSep;
-               // Conservative about growing the buffer: don't do it, unless really needed
-               if ((lenNew + 1 < sSize) || (grow(lenNew))) {
-                       if (lenSep) {
-                               s[sLen] = sep;
-                               sLen++;
-                       }
-                       memcpy(&s[sLen], sOther, sLenOther);
-                       sLen += sLenOther;
-                       s[sLen] = '\0';
-               }
-               return *this;
-       }
+       SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const;
+       SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length);
+       SString &uppercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length);
+       SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0');
        SString &operator+=(const char *sOther) {
                return append(sOther, static_cast<lenpos_t>(measure_length));
        }
        SString &operator+=(const char *sOther) {
                return append(sOther, static_cast<lenpos_t>(measure_length));
        }
@@ -246,121 +230,40 @@ public:
        SString &appendwithseparator(const char *sOther, char sep) {
                return append(sOther, strlen(sOther), sep);
        }
        SString &appendwithseparator(const char *sOther, char sep) {
                return append(sOther, strlen(sOther), sep);
        }
-       SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length) {
-               if (!sOther) {
-                       return *this;
-               }
-               if (sLenOther == measure_length) {
-                       sLenOther = strlen(sOther);
-               }
-               lenpos_t lenNew = sLen + sLenOther;
-               // Conservative about growing the buffer: don't do it, unless really needed
-               if ((lenNew + 1 < sSize) || grow(lenNew)) {
-                       lenpos_t moveChars = sLen - pos + 1;
-                       for (lenpos_t i = moveChars; i > 0; i--) {
-                               s[pos + sLenOther + i - 1] = s[pos + i - 1];
-                       }
-                       memcpy(s + pos, sOther, sLenOther);
-                       sLen = lenNew;
-               }
-               return *this;
-       }
-       /** Remove @a len characters from the @a pos position, included.
+       SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length);
+
+       /**
+        * Remove @a len characters from the @a pos position, included.
         * Characters at pos + len and beyond replace characters at pos.
         * If @a len is 0, or greater than the length of the string
         * starting at @a pos, the string is just truncated at @a pos.
         */
         * Characters at pos + len and beyond replace characters at pos.
         * If @a len is 0, or greater than the length of the string
         * starting at @a pos, the string is just truncated at @a pos.
         */
-       void remove(lenpos_t pos, lenpos_t len) {
-               if (len < 1 || pos + len >= sLen) {
-                       s[pos] = '\0';
-                       sLen = pos;
-               } else {
-                       for (lenpos_t i = pos; i < sLen - len + 1; i++) {
-                               s[i] = s[i+len];
-                       }
-                       sLen -= len;
-               }
-       }
+       void remove(lenpos_t pos, lenpos_t len);
+
        SString &change(lenpos_t pos, char ch) {
        SString &change(lenpos_t pos, char ch) {
-               if (pos >= sLen) {                                      // character changed must be in string bounds
-                       return *this;
+               if (pos < sLen) {                                       // character changed must be in string bounds
+                       *(s + pos) = ch;
                }
                }
-               *(s + pos) = ch;
                return *this;
        }
        /** Read an integral numeric value from the string. */
        int value() const {
                return *this;
        }
        /** Read an integral numeric value from the string. */
        int value() const {
-               if (s)
-                       return atoi(s);
-               else
-                       return 0;
-       }
-       int search(const char *sFind, lenpos_t start=0) const {
-               if (start < sLen) {
-                       const char *sFound = strstr(s + start, sFind);
-                       if (sFound) {
-                               return sFound - s;
-                       }
-               }
-               return -1;
+               return s ? atoi(s) : 0;
        }
        }
+       bool startswith(const char *prefix);
+       bool endswith(const char *suffix);
+       int search(const char *sFind, lenpos_t start=0) const;
        bool contains(const char *sFind) {
                return search(sFind) >= 0;
        }
        bool contains(const char *sFind) {
                return search(sFind) >= 0;
        }
-       int substitute(char chFind, char chReplace) {
-               int c = 0;
-               char *t = s;
-               while (t) {
-                       t = strchr(t, chFind);
-                       if (t) {
-                               *t = chReplace;
-                               t++;
-                               c++;
-                       }
-               }
-               return c;
-       }
-       int substitute(const char *sFind, const char *sReplace) {
-               int c = 0;
-               lenpos_t lenFind = strlen(sFind);
-               lenpos_t lenReplace = strlen(sReplace);
-               int posFound = search(sFind);
-               while (posFound >= 0) {
-                       remove(posFound, lenFind);
-                       insert(posFound, sReplace, lenReplace);
-                       posFound = search(sFind, posFound + lenReplace);
-                       c++;
-               }
-               return c;
-       }
+       int substitute(char chFind, char chReplace);
+       int substitute(const char *sFind, const char *sReplace);
        int remove(const char *sFind) {
                return substitute(sFind, "");
        }
        int remove(const char *sFind) {
                return substitute(sFind, "");
        }
-       /**
-        * Duplicate a C string.
-        * Allocate memory of the given size, or big enough to fit the string if length isn't given;
-        * then copy the given string in the allocated memory.
-        * @return the pointer to the new string
-        */
-       static char *StringAllocate(
-               const char *s,                  ///< The string to duplicate
-               lenpos_t len=measure_length)    ///< The length of memory to allocate. Optional.
-       {
-               if (s == 0) {
-                       return 0;
-               }
-               if (len == measure_length) {
-                       len = strlen(s);
-               }
-               char *sNew = new char[len + 1];
-               if (sNew) {
-                       memcpy(sNew, s, len);
-                       sNew[len] = '\0';
-               }
-               return sNew;
-       }
 };
 
 };
 
+
 /**
  * Duplicate a C string.
  * Allocate memory of the given size, or big enough to fit the string if length isn't given;
 /**
  * Duplicate a C string.
  * Allocate memory of the given size, or big enough to fit the string if length isn't given;
@@ -369,9 +272,9 @@ public:
  */
 inline char *StringDup(
        const char *s,                  ///< The string to duplicate
  */
 inline char *StringDup(
        const char *s,                  ///< The string to duplicate
-       SString::lenpos_t len=SString::measure_length)  ///< The length of memory to allocate. Optional.
+       SContainer::lenpos_t len=SContainer::measure_length)    ///< The length of memory to allocate. Optional.
 {
 {
-       return SString::StringAllocate(s, len);
+       return SContainer::StringAllocate(s, len);
 }
 
 #endif
 }
 
 #endif
index 44d5dcdcda215c47d92cf07d1729289f96001051..5c8307a59551bbbc805a5d6142a57ee9d6abf81f 100644 (file)
 #define SCLEX_FORTH 52
 #define SCLEX_ERLANG 53
 #define SCLEX_OCTAVE 54
 #define SCLEX_FORTH 52
 #define SCLEX_ERLANG 53
 #define SCLEX_OCTAVE 54
+#define SCLEX_MSSQL 55
+#define SCLEX_VERILOG 56
+#define SCLEX_KIX 57
+#define SCLEX_GUI4CLI 58
+#define SCLEX_SPECMAN 59
+#define SCLEX_AU3 60
+#define SCLEX_APDL 61
+#define SCLEX_BASH 62
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_HP_DEFNAME 100
 #define SCE_HP_OPERATOR 101
 #define SCE_HP_IDENTIFIER 102
 #define SCE_HP_DEFNAME 100
 #define SCE_HP_OPERATOR 101
 #define SCE_HP_IDENTIFIER 102
+#define SCE_HPHP_COMPLEX_VARIABLE 104
 #define SCE_HPA_START 105
 #define SCE_HPA_DEFAULT 106
 #define SCE_HPA_COMMENTLINE 107
 #define SCE_HPA_START 105
 #define SCE_HPA_DEFAULT 106
 #define SCE_HPA_COMMENTLINE 107
 #define SCE_B_KEYWORD2 10
 #define SCE_B_KEYWORD3 11
 #define SCE_B_KEYWORD4 12
 #define SCE_B_KEYWORD2 10
 #define SCE_B_KEYWORD3 11
 #define SCE_B_KEYWORD4 12
+#define SCE_B_CONSTANT 13
+#define SCE_B_ASM 14
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_ERR_IFC 16
 #define SCE_ERR_IFORT 17
 #define SCE_ERR_ABSF 18
 #define SCE_ERR_IFC 16
 #define SCE_ERR_IFORT 17
 #define SCE_ERR_ABSF 18
+#define SCE_ERR_TIDY 19
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
+#define SCE_NSIS_NUMBER 14
 #define SCE_MMIXAL_LEADWS 0
 #define SCE_MMIXAL_COMMENT 1
 #define SCE_MMIXAL_LABEL 2
 #define SCE_MMIXAL_LEADWS 0
 #define SCE_MMIXAL_COMMENT 1
 #define SCE_MMIXAL_LABEL 2
 #define SCE_ERLANG_SEPARATOR 12
 #define SCE_ERLANG_NODE_NAME 13
 #define SCE_ERLANG_UNKNOWN 31
 #define SCE_ERLANG_SEPARATOR 12
 #define SCE_ERLANG_NODE_NAME 13
 #define SCE_ERLANG_UNKNOWN 31
+#define SCE_MSSQL_DEFAULT 0
+#define SCE_MSSQL_COMMENT 1
+#define SCE_MSSQL_LINE_COMMENT 2
+#define SCE_MSSQL_NUMBER 3
+#define SCE_MSSQL_STRING 4
+#define SCE_MSSQL_OPERATOR 5
+#define SCE_MSSQL_IDENTIFIER 6
+#define SCE_MSSQL_VARIABLE 7
+#define SCE_MSSQL_COLUMN_NAME 8
+#define SCE_MSSQL_STATEMENT 9
+#define SCE_MSSQL_DATATYPE 10
+#define SCE_MSSQL_SYSTABLE 11
+#define SCE_MSSQL_GLOBAL_VARIABLE 12
+#define SCE_MSSQL_FUNCTION 13
+#define SCE_MSSQL_STORED_PROCEDURE 14
+#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15
+#define SCE_MSSQL_COLUMN_NAME_2 16
+#define SCE_V_DEFAULT 0
+#define SCE_V_COMMENT 1
+#define SCE_V_COMMENTLINE 2
+#define SCE_V_COMMENTLINEBANG 3
+#define SCE_V_NUMBER 4
+#define SCE_V_WORD 5
+#define SCE_V_STRING 6
+#define SCE_V_WORD2 7
+#define SCE_V_WORD3 8
+#define SCE_V_PREPROCESSOR 9
+#define SCE_V_OPERATOR 10
+#define SCE_V_IDENTIFIER 11
+#define SCE_V_STRINGEOL 12
+#define SCE_V_USER 19
+#define SCE_KIX_DEFAULT 0
+#define SCE_KIX_COMMENT 1
+#define SCE_KIX_STRING1 2
+#define SCE_KIX_STRING2 3
+#define SCE_KIX_NUMBER 4
+#define SCE_KIX_VAR 5
+#define SCE_KIX_MACRO 6
+#define SCE_KIX_KEYWORD 7
+#define SCE_KIX_FUNCTIONS 8
+#define SCE_KIX_OPERATOR 9
+#define SCE_KIX_IDENTIFIER 31
+#define SCE_GC_DEFAULT 0
+#define SCE_GC_COMMENTLINE 1
+#define SCE_GC_COMMENTBLOCK 2
+#define SCE_GC_GLOBAL 3
+#define SCE_GC_EVENT 4
+#define SCE_GC_ATTRIBUTE 5
+#define SCE_GC_CONTROL 6
+#define SCE_GC_COMMAND 7
+#define SCE_GC_STRING 8
+#define SCE_GC_OPERATOR 9
+#define SCE_SN_DEFAULT 0
+#define SCE_SN_CODE 1
+#define SCE_SN_COMMENTLINE 2
+#define SCE_SN_COMMENTLINEBANG 3
+#define SCE_SN_NUMBER 4
+#define SCE_SN_WORD 5
+#define SCE_SN_STRING 6
+#define SCE_SN_WORD2 7
+#define SCE_SN_WORD3 8
+#define SCE_SN_PREPROCESSOR 9
+#define SCE_SN_OPERATOR 10
+#define SCE_SN_IDENTIFIER 11
+#define SCE_SN_STRINGEOL 12
+#define SCE_SN_REGEXTAG 13
+#define SCE_SN_SIGNAL 14
+#define SCE_SN_USER 19
+#define SCE_AU3_DEFAULT 0
+#define SCE_AU3_COMMENT 1
+#define SCE_AU3_COMMENTBLOCK 2
+#define SCE_AU3_NUMBER 3
+#define SCE_AU3_FUNCTION 4
+#define SCE_AU3_KEYWORD 5
+#define SCE_AU3_MACRO 6
+#define SCE_AU3_STRING 7
+#define SCE_AU3_OPERATOR 8
+#define SCE_AU3_VARIABLE 9
+#define SCE_AU3_SENT 10
+#define SCE_AU3_PREPROCESSOR 11
+#define SCE_APDL_DEFAULT 0
+#define SCE_APDL_COMMENT 1
+#define SCE_APDL_COMMENTBLOCK 2
+#define SCE_APDL_NUMBER 3
+#define SCE_APDL_STRING 4
+#define SCE_APDL_WORD 5
+#define SCE_APDL_COMMAND 6
+#define SCE_APDL_PROCESSOR 7
+#define SCE_APDL_FUNCTION 8
+#define SCE_SH_DEFAULT 0
+#define SCE_SH_ERROR 1
+#define SCE_SH_COMMENTLINE 2
+#define SCE_SH_NUMBER 3
+#define SCE_SH_WORD 4
+#define SCE_SH_STRING 5
+#define SCE_SH_CHARACTER 6
+#define SCE_SH_OPERATOR 7
+#define SCE_SH_IDENTIFIER 8
+#define SCE_SH_SCALAR 9
+#define SCE_SH_PARAM 10
+#define SCE_SH_BACKTICKS 11
+#define SCE_SH_HERE_DELIM 12
+#define SCE_SH_HERE_Q 13
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
index 68c5427b616865fb82436926dd3d8d4c23f70950..1a4e4887228a2be9a0b17b771d3746e7e6cf7dd6 100644 (file)
@@ -388,6 +388,18 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SC_WRAP_WORD 1
 #define SCI_SETWRAPMODE 2268
 #define SCI_GETWRAPMODE 2269
 #define SC_WRAP_WORD 1
 #define SCI_SETWRAPMODE 2268
 #define SCI_GETWRAPMODE 2269
+#define SC_WRAPVISUALFLAG_NONE 0x0000
+#define SC_WRAPVISUALFLAG_END 0x0001
+#define SC_WRAPVISUALFLAG_START 0x0002
+#define SCI_SETWRAPVISUALFLAGS 2460
+#define SCI_GETWRAPVISUALFLAGS 2461
+#define SC_WRAPVISUALFLAGLOC_DEFAULT 0x0000
+#define SC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001
+#define SC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002
+#define SCI_SETWRAPVISUALFLAGSLOCATION 2462
+#define SCI_GETWRAPVISUALFLAGSLOCATION 2463
+#define SCI_SETWRAPSTARTINDENT 2464
+#define SCI_GETWRAPSTARTINDENT 2465
 #define SC_CACHE_NONE 0
 #define SC_CACHE_CARET 1
 #define SC_CACHE_PAGE 2
 #define SC_CACHE_NONE 0
 #define SC_CACHE_CARET 1
 #define SC_CACHE_PAGE 2
@@ -570,6 +582,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_SETWHITESPACECHARS 2443
 #define SCI_SETCHARSDEFAULT 2444
 #define SCI_AUTOCGETCURRENT 2445
 #define SCI_SETWHITESPACECHARS 2443
 #define SCI_SETCHARSDEFAULT 2444
 #define SCI_AUTOCGETCURRENT 2445
+#define SCI_ALLOCATE 2446
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
index 06ff4e5800b64c0bac1254e080230f24435b737b..fef371328ce7b64432bec109d8ee0f8724968cce 100644 (file)
@@ -53,7 +53,7 @@
 ##     position -> integer position in a document
 ##     colour -> colour integer containing red, green and blue bytes.
 ##     string -> pointer to const character
 ##     position -> integer position in a document
 ##     colour -> colour integer containing red, green and blue bytes.
 ##     string -> pointer to const character
-##     stringresult -> pointer to character
+##     stringresult -> pointer to character, NULL-> return size of result
 ##     cells -> pointer to array of cells, each cell containing a style byte and character byte
 ##     textrange -> range of a min and a max position with an output string
 ##     findtext -> searchrange, text -> foundposition
 ##     cells -> pointer to array of cells, each cell containing a style byte and character byte
 ##     textrange -> range of a min and a max position with an output string
 ##     findtext -> searchrange, text -> foundposition
 ## Client code should ignore definitions containing types it does not understand, except
 ## for possibly #defining the constants
 
 ## Client code should ignore definitions containing types it does not understand, except
 ## for possibly #defining the constants
 
+## Line numbers and positions start at 0.
 ## String arguments may contain NUL ('\0') characters where the calls provide a length
 ## argument and retrieve NUL characters. All retrieved strings except for those retrieved
 ## by GetLine also have a NUL appended but client code should calculate the size that
 ## will be returned rather than relying upon the NUL whenever possible. Allow for the
 ## String arguments may contain NUL ('\0') characters where the calls provide a length
 ## argument and retrieve NUL characters. All retrieved strings except for those retrieved
 ## by GetLine also have a NUL appended but client code should calculate the size that
 ## will be returned rather than relying upon the NUL whenever possible. Allow for the
-## extra NUL character when allocating buffers.
+## extra NUL character when allocating buffers. The size to allocate for a stringresult
+## can be determined by calling with a NULL (0) pointer.
 
 cat Basics
 
 
 cat Basics
 
@@ -87,7 +89,7 @@ val SCI_START=2000
 val SCI_OPTIONAL_START=3000
 val SCI_LEXER_START=4000
 
 val SCI_OPTIONAL_START=3000
 val SCI_LEXER_START=4000
 
-# Add text to the document.
+# Add text to the document at current position.
 fun void AddText=2001(int length, string text)
 
 # Add array of cells to document.
 fun void AddText=2001(int length, string text)
 
 # Add array of cells to document.
@@ -102,7 +104,7 @@ fun void ClearAll=2004(,)
 # Set all style bytes to 0, remove all folding information.
 fun void ClearDocumentStyle=2005(,)
 
 # Set all style bytes to 0, remove all folding information.
 fun void ClearDocumentStyle=2005(,)
 
-# The number of characters in the document.
+# Returns the number of characters in the document.
 get int GetLength=2006(,)
 
 # Returns the character byte at the position.
 get int GetLength=2006(,)
 
 # Returns the character byte at the position.
@@ -999,6 +1001,34 @@ set void SetWrapMode=2268(int mode,)
 # Retrieve whether text is word wrapped.
 get int GetWrapMode=2269(,)
 
 # Retrieve whether text is word wrapped.
 get int GetWrapMode=2269(,)
 
+enu WrapVisualFlag=SC_WRAPVISUALFLAG_
+val SC_WRAPVISUALFLAG_NONE=0x0000
+val SC_WRAPVISUALFLAG_END=0x0001
+val SC_WRAPVISUALFLAG_START=0x0002
+
+# Set the display mode of visual flags for wrapped lines.
+set void SetWrapVisualFlags=2460(int wrapVisualFlags,)
+
+# Retrive the display mode of visual flags for wrapped lines.
+get int GetWrapVisualFlags=2461(,)
+
+enu WrapVisualLocation=SC_WRAPVISUALFLAGLOC_
+val SC_WRAPVISUALFLAGLOC_DEFAULT=0x0000
+val SC_WRAPVISUALFLAGLOC_END_BY_TEXT=0x0001
+val SC_WRAPVISUALFLAGLOC_START_BY_TEXT=0x0002
+
+# Set the location of visual flags for wrapped lines.
+set void SetWrapVisualFlagsLocation=2462(int wrapVisualFlagsLocation,)
+
+# Retrive the location of visual flags for wrapped lines.
+get int GetWrapVisualFlagsLocation=2463(,)
+
+# Set the start indent for wrapped lines.
+set void SetWrapStartIndent=2464(int indent,)
+
+# Retrive the start indent for wrapped lines.
+get int GetWrapStartIndent=2465(,)
+
 enu LineCache=SC_CACHE_
 val SC_CACHE_NONE=0
 val SC_CACHE_CARET=1
 enu LineCache=SC_CACHE_
 val SC_CACHE_NONE=0
 val SC_CACHE_CARET=1
@@ -1550,6 +1580,9 @@ fun void SetCharsDefault=2444(,)
 # Get currently selected item position in the auto-completion list
 fun int AutoCGetCurrent=2445(,)
 
 # Get currently selected item position in the auto-completion list
 fun int AutoCGetCurrent=2445(,)
 
+# Enlarge the document to a particular size of text bytes.
+fun void Allocate=2446(int bytes,)
+
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
@@ -1692,6 +1725,14 @@ val SCLEX_POWERBASIC=51
 val SCLEX_FORTH=52
 val SCLEX_ERLANG=53
 val SCLEX_OCTAVE=54
 val SCLEX_FORTH=52
 val SCLEX_ERLANG=53
 val SCLEX_OCTAVE=54
+val SCLEX_MSSQL=55
+val SCLEX_VERILOG=56
+val SCLEX_KIX=57
+val SCLEX_GUI4CLI=58
+val SCLEX_SPECMAN=59
+val SCLEX_AU3=60
+val SCLEX_APDL=61
+val SCLEX_BASH=62
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
@@ -1840,6 +1881,8 @@ val SCE_HP_CLASSNAME=99
 val SCE_HP_DEFNAME=100
 val SCE_HP_OPERATOR=101
 val SCE_HP_IDENTIFIER=102
 val SCE_HP_DEFNAME=100
 val SCE_HP_OPERATOR=101
 val SCE_HP_IDENTIFIER=102
+# PHP
+val SCE_HPHP_COMPLEX_VARIABLE=104
 # ASP Python
 val SCE_HPA_START=105
 val SCE_HPA_DEFAULT=106
 # ASP Python
 val SCE_HPA_START=105
 val SCE_HPA_DEFAULT=106
@@ -1914,6 +1957,8 @@ val SCE_B_STRINGEOL=9
 val SCE_B_KEYWORD2=10
 val SCE_B_KEYWORD3=11
 val SCE_B_KEYWORD4=12
 val SCE_B_KEYWORD2=10
 val SCE_B_KEYWORD3=11
 val SCE_B_KEYWORD4=12
+val SCE_B_CONSTANT=13
+val SCE_B_ASM=14
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
@@ -1971,6 +2016,7 @@ val SCE_ERR_ELF=15
 val SCE_ERR_IFC=16
 val SCE_ERR_IFORT=17
 val SCE_ERR_ABSF=18
 val SCE_ERR_IFC=16
 val SCE_ERR_IFORT=17
 val SCE_ERR_ABSF=18
+val SCE_ERR_TIDY=19
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
@@ -2266,6 +2312,7 @@ val SCE_NSIS_SUBSECTIONDEF=10
 val SCE_NSIS_IFDEFINEDEF=11
 val SCE_NSIS_MACRODEF=12
 val SCE_NSIS_STRINGVAR=13
 val SCE_NSIS_IFDEFINEDEF=11
 val SCE_NSIS_MACRODEF=12
 val SCE_NSIS_STRINGVAR=13
+val SCE_NSIS_NUMBER=14
 # Lexical states for SCLEX_MMIXAL
 lex MMIXAL=SCLEX_MMIXAL SCE_MMIXAL_
 val SCE_MMIXAL_LEADWS=0
 # Lexical states for SCLEX_MMIXAL
 lex MMIXAL=SCLEX_MMIXAL SCE_MMIXAL_
 val SCE_MMIXAL_LEADWS=0
@@ -2358,7 +2405,124 @@ val SCE_ERLANG_NODE_NAME=13
 val SCE_ERLANG_UNKNOWN=31
 # Lexical states for SCLEX_OCTAVE are identical to MatLab
 lex Octave=SCLEX_OCTAVE SCE_MATLAB_
 val SCE_ERLANG_UNKNOWN=31
 # Lexical states for SCLEX_OCTAVE are identical to MatLab
 lex Octave=SCLEX_OCTAVE SCE_MATLAB_
-
+# Lexical states for SCLEX_MSSQL
+lex MSSQL=SCLEX_MSSQL SCE_MSSQL_
+val SCE_MSSQL_DEFAULT=0
+val SCE_MSSQL_COMMENT=1
+val SCE_MSSQL_LINE_COMMENT=2
+val SCE_MSSQL_NUMBER=3
+val SCE_MSSQL_STRING=4
+val SCE_MSSQL_OPERATOR=5
+val SCE_MSSQL_IDENTIFIER=6
+val SCE_MSSQL_VARIABLE=7
+val SCE_MSSQL_COLUMN_NAME=8
+val SCE_MSSQL_STATEMENT=9
+val SCE_MSSQL_DATATYPE=10
+val SCE_MSSQL_SYSTABLE=11
+val SCE_MSSQL_GLOBAL_VARIABLE=12
+val SCE_MSSQL_FUNCTION=13
+val SCE_MSSQL_STORED_PROCEDURE=14
+val SCE_MSSQL_DEFAULT_PREF_DATATYPE=15
+val SCE_MSSQL_COLUMN_NAME_2=16
+# Lexical states for SCLEX_VERILOG
+lex Verilog=SCLEX_VERILOG SCE_V_
+val SCE_V_DEFAULT=0
+val SCE_V_COMMENT=1
+val SCE_V_COMMENTLINE=2
+val SCE_V_COMMENTLINEBANG=3
+val SCE_V_NUMBER=4
+val SCE_V_WORD=5
+val SCE_V_STRING=6
+val SCE_V_WORD2=7
+val SCE_V_WORD3=8
+val SCE_V_PREPROCESSOR=9
+val SCE_V_OPERATOR=10
+val SCE_V_IDENTIFIER=11
+val SCE_V_STRINGEOL=12
+val SCE_V_USER=19
+# Lexical states for SCLEX_KIX
+lex Kix=SCLEX_KIX SCE_KIX_
+val SCE_KIX_DEFAULT=0
+val SCE_KIX_COMMENT=1
+val SCE_KIX_STRING1=2
+val SCE_KIX_STRING2=3
+val SCE_KIX_NUMBER=4
+val SCE_KIX_VAR=5
+val SCE_KIX_MACRO=6
+val SCE_KIX_KEYWORD=7
+val SCE_KIX_FUNCTIONS=8
+val SCE_KIX_OPERATOR=9
+val SCE_KIX_IDENTIFIER=31
+# Lexical states for SCLEX_GUI4CLI
+val SCE_GC_DEFAULT=0
+val SCE_GC_COMMENTLINE=1
+val SCE_GC_COMMENTBLOCK=2
+val SCE_GC_GLOBAL=3
+val SCE_GC_EVENT=4
+val SCE_GC_ATTRIBUTE=5
+val SCE_GC_CONTROL=6
+val SCE_GC_COMMAND=7
+val SCE_GC_STRING=8
+val SCE_GC_OPERATOR=9
+# Lexical states for SCLEX_SPECMAN
+lex Specman=SCLEX_SPECMAN SCE_SN_
+val SCE_SN_DEFAULT=0
+val SCE_SN_CODE=1
+val SCE_SN_COMMENTLINE=2
+val SCE_SN_COMMENTLINEBANG=3
+val SCE_SN_NUMBER=4
+val SCE_SN_WORD=5
+val SCE_SN_STRING=6
+val SCE_SN_WORD2=7
+val SCE_SN_WORD3=8
+val SCE_SN_PREPROCESSOR=9
+val SCE_SN_OPERATOR=10
+val SCE_SN_IDENTIFIER=11
+val SCE_SN_STRINGEOL=12
+val SCE_SN_REGEXTAG=13
+val SCE_SN_SIGNAL=14
+val SCE_SN_USER=19
+# Lexical states for SCLEX_AU3
+lex Au3=SCLEX_AU3 SCE_AU3_
+val SCE_AU3_DEFAULT=0
+val SCE_AU3_COMMENT=1
+val SCE_AU3_COMMENTBLOCK=2
+val SCE_AU3_NUMBER=3
+val SCE_AU3_FUNCTION=4
+val SCE_AU3_KEYWORD=5
+val SCE_AU3_MACRO=6
+val SCE_AU3_STRING=7
+val SCE_AU3_OPERATOR=8
+val SCE_AU3_VARIABLE=9
+val SCE_AU3_SENT=10
+val SCE_AU3_PREPROCESSOR=11
+# Lexical states for SCLEX_APDL
+lex APDL=SCLEX_APDL SCE_APDL_
+val SCE_APDL_DEFAULT=0
+val SCE_APDL_COMMENT=1
+val SCE_APDL_COMMENTBLOCK=2
+val SCE_APDL_NUMBER=3
+val SCE_APDL_STRING=4
+val SCE_APDL_WORD=5
+val SCE_APDL_COMMAND=6
+val SCE_APDL_PROCESSOR=7
+val SCE_APDL_FUNCTION=8
+# Lexical states for SCLEX_BASH
+lex Bash=SCLEX_BASH SCE_SH_
+val SCE_SH_DEFAULT=0
+val SCE_SH_ERROR=1
+val SCE_SH_COMMENTLINE=2
+val SCE_SH_NUMBER=3
+val SCE_SH_WORD=4
+val SCE_SH_STRING=5
+val SCE_SH_CHARACTER=6
+val SCE_SH_OPERATOR=7
+val SCE_SH_IDENTIFIER=8
+val SCE_SH_SCALAR=9
+val SCE_SH_PARAM=10
+val SCE_SH_BACKTICKS=11
+val SCE_SH_HERE_DELIM=12
+val SCE_SH_HERE_Q=13
 # Events
 
 evt void StyleNeeded=2000(int position)
 # Events
 
 evt void StyleNeeded=2000(int position)
index 2f299afffd4f30b90b7b4d3c376aaccbb90d906f..93e888d0e6b9f77f7a9d202d8130e806f074df20 100644 (file)
@@ -49,7 +49,7 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
 }
 
 static bool IsArrowCharacter(char ch) {
 }
 
 static bool IsArrowCharacter(char ch) {
-       return (ch >= 0) && (ch <= '\002');
+       return (ch == 0) || (ch == '\001') || (ch == '\002');
 }
 
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
 }
 
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
index 6dae67507527f33fa135e9042e3993ccfba24ff5..27e62ac61c1aedbd5ea11b4e4affbe8a7862e196 100644 (file)
@@ -627,21 +627,11 @@ void CellBuffer::RoomFor(int insertionLength) {
        //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
        if (gaplen <= insertionLength) {
                //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
        //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
        if (gaplen <= insertionLength) {
                //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
-               GapTo(length);
                if (growSize * 6 < size)
                        growSize *= 2;
                int newSize = size + insertionLength + growSize;
                if (growSize * 6 < size)
                        growSize *= 2;
                int newSize = size + insertionLength + growSize;
-               //Platform::DebugPrintf("moved gap %d\n", newSize);
-               char *newBody = new char[newSize];
-               memcpy(newBody, body, size);
-               delete []body;
-               body = newBody;
-               gaplen += newSize - size;
-               part2body = body + gaplen;
-               size = newSize;
-               //Platform::DebugPrintf("end need room %d %d - size=%d length=%d\n", gaplen, insertionLength,size,length);
+               Allocate(newSize);
        }
        }
-
 }
 
 // To make it easier to write code that uses ByteAt, a position outside the range of the buffer
 }
 
 // To make it easier to write code that uses ByteAt, a position outside the range of the buffer
@@ -791,6 +781,19 @@ int CellBuffer::Length() {
        return ByteLength() / 2;
 }
 
        return ByteLength() / 2;
 }
 
+void CellBuffer::Allocate(int newSize) {
+       if (newSize > length) {
+               GapTo(length);
+               char *newBody = new char[newSize];
+               memcpy(newBody, body, length);
+               delete []body;
+               body = newBody;
+               gaplen += newSize - size;
+               part2body = body + gaplen;
+               size = newSize;
+       }
+}
+
 int CellBuffer::Lines() {
        //Platform::DebugPrintf("Lines = %d\n", lv.lines);
        return lv.lines;
 int CellBuffer::Lines() {
        //Platform::DebugPrintf("Lines = %d\n", lv.lines);
        return lv.lines;
index 5cfcbfe1f01fcaac2f1601f029401227dc187f4c..bf4a102f2268ea418e1d6199ca260d6a0a3d382a 100644 (file)
@@ -2,7 +2,7 @@
 /** @file CellBuffer.h
  ** Manages the text of the document.
  **/
 /** @file CellBuffer.h
  ** Manages the text of the document.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CELLBUFFER_H
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CELLBUFFER_H
@@ -150,12 +150,14 @@ public:
  */
 class CellBuffer {
 private:
  */
 class CellBuffer {
 private:
-       char *body;
-       int size;
-       int length;
-       int part1len;
-       int gaplen;
-       char *part2body;
+       char *body;             ///< The cell buffer itself.
+       int size;               ///< Allocated size of the buffer.
+       int length;             ///< Total length of the data.
+       int part1len;   ///< Length of the first part.
+       int gaplen;             ///< Length of the gap between the two parts.
+       char *part2body;        ///< The second part of the cell buffer.
+                                               ///< Doesn't point after the gap but set so that
+                                               ///< part2body[position] is consistent with body[position].
        bool readOnly;
        int growSize;
 
        bool readOnly;
        int growSize;
 
@@ -184,6 +186,7 @@ public:
 
        int ByteLength();
        int Length();
 
        int ByteLength();
        int Length();
+       void Allocate(int newSize);
        int Lines();
        int LineStart(int line);
        int LineFromPosition(int pos) { return lv.LineFromPosition(pos); }
        int Lines();
        int LineStart(int line);
        int LineFromPosition(int pos) { return lv.LineFromPosition(pos); }
@@ -212,7 +215,7 @@ public:
        int GetMark(int line);
        void DeleteAllMarks(int markerNum);
        int LineFromHandle(int markerHandle);
        int GetMark(int line);
        void DeleteAllMarks(int markerNum);
        int LineFromHandle(int markerHandle);
+
        /// Actions without undo
        void BasicInsertString(int position, char *s, int insertLength);
        void BasicDeleteChars(int position, int deleteLength);
        /// Actions without undo
        void BasicInsertString(int position, char *s, int insertLength);
        void BasicDeleteChars(int position, int deleteLength);
index fb28144dd7d40021f9d97dd20e5b9bc53e009077..97abd6254600de6e2a835c2c1ab93344b116c565 100644 (file)
@@ -50,13 +50,14 @@ Document::Document() {
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
-       SetDefaultCharClasses();
+       SetDefaultCharClasses(true);
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
        enteredReadOnlyCount = 0;
        tabInChars = 8;
        indentInChars = 0;
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
        enteredReadOnlyCount = 0;
        tabInChars = 8;
        indentInChars = 0;
+       actualIndentInChars = 8;
        useTabs = true;
        tabIndents = true;
        backspaceUnindents = false;
        useTabs = true;
        tabIndents = true;
        backspaceUnindents = false;
@@ -206,7 +207,7 @@ int Document::GetLastChild(int lineParent, int level) {
 }
 
 int Document::GetFoldParent(int line) {
 }
 
 int Document::GetFoldParent(int line) {
-       int level = GetLevel(line);
+       int level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK;
        int lineLook = line - 1;
        while ((lineLook > 0) && (
                    (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||
        int lineLook = line - 1;
        while ((lineLook > 0) && (
                    (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||
@@ -379,6 +380,9 @@ bool Document::DeleteChars(int pos, int len) {
        return !cb.IsReadOnly();
 }
 
        return !cb.IsReadOnly();
 }
 
+/**
+ * Insert a styled string (char/style pairs) with a length.
+ */
 bool Document::InsertStyledString(int position, char *s, int insertLength) {
        if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
                enteredReadOnlyCount++;
 bool Document::InsertStyledString(int position, char *s, int insertLength) {
        if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
                enteredReadOnlyCount++;
@@ -498,6 +502,9 @@ int Document::Redo() {
        return newPos;
 }
 
        return newPos;
 }
 
+/**
+ * Insert a single character.
+ */
 bool Document::InsertChar(int pos, char ch) {
        char chs[2];
        chs[0] = ch;
 bool Document::InsertChar(int pos, char ch) {
        char chs[2];
        chs[0] = ch;
@@ -505,12 +512,16 @@ bool Document::InsertChar(int pos, char ch) {
        return InsertStyledString(pos*2, chs, 2);
 }
 
        return InsertStyledString(pos*2, chs, 2);
 }
 
-// Insert a null terminated string
+/**
+ * Insert a null terminated string.
+ */
 bool Document::InsertString(int position, const char *s) {
        return InsertString(position, s, strlen(s));
 }
 
 bool Document::InsertString(int position, const char *s) {
        return InsertString(position, s, strlen(s));
 }
 
-// Insert a string with a length
+/**
+ * Insert a string with a length.
+ */
 bool Document::InsertString(int position, const char *s, size_t insertLength) {
        bool changed = false;
        char *sWithStyle = new char[insertLength * 2];
 bool Document::InsertString(int position, const char *s, size_t insertLength) {
        bool changed = false;
        char *sWithStyle = new char[insertLength * 2];
@@ -1163,21 +1174,21 @@ void Document::ChangeCase(Range r, bool makeUpperCase) {
        }
 }
 
        }
 }
 
-void Document::SetDefaultCharClasses() {
+void Document::SetDefaultCharClasses(bool includeWordClass) {
        // Initialize all char classes to default values
        for (int ch = 0; ch < 256; ch++) {
                if (ch == '\r' || ch == '\n')
                        charClass[ch] = ccNewLine;
                else if (ch < 0x20 || ch == ' ')
                        charClass[ch] = ccSpace;
        // Initialize all char classes to default values
        for (int ch = 0; ch < 256; ch++) {
                if (ch == '\r' || ch == '\n')
                        charClass[ch] = ccNewLine;
                else if (ch < 0x20 || ch == ' ')
                        charClass[ch] = ccSpace;
-               else if (ch >= 0x80 || isalnum(ch) || ch == '_')
+               else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))
                        charClass[ch] = ccWord;
                else
                        charClass[ch] = ccPunctuation;
        }
 }
 
                        charClass[ch] = ccWord;
                else
                        charClass[ch] = ccPunctuation;
        }
 }
 
-void Document::SetCharClasses(unsigned char *chars, charClassification newCharClass) {
+void Document::SetCharClasses(const unsigned char *chars, charClassification newCharClass) {
        // Apply the newCharClass to the specifed chars
        if (chars) {
                while (*chars) {
        // Apply the newCharClass to the specifed chars
        if (chars) {
                while (*chars) {
@@ -1246,10 +1257,7 @@ bool Document::SetStyles(int length, char *styles) {
 
 bool Document::EnsureStyledTo(int pos) {
        if (pos > GetEndStyled()) {
 
 bool Document::EnsureStyledTo(int pos) {
        if (pos > GetEndStyled()) {
-               styleClock++;
-               if (styleClock > 0x100000) {
-                       styleClock = 0;
-               }
+               IncrementStyleClock();
                // Ask the watchers to style, and stop as soon as one responds.
                for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) {
                        watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos);
                // Ask the watchers to style, and stop as soon as one responds.
                for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) {
                        watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos);
@@ -1258,6 +1266,13 @@ bool Document::EnsureStyledTo(int pos) {
        return pos <= GetEndStyled();
 }
 
        return pos <= GetEndStyled();
 }
 
+void Document::IncrementStyleClock() {
+       styleClock++;
+       if (styleClock > 0x100000) {
+               styleClock = 0;
+       }
+}
+
 bool Document::AddWatcher(DocWatcher *watcher, void *userData) {
        for (int i = 0; i < lenWatchers; i++) {
                if ((watchers[i].watcher == watcher) &&
 bool Document::AddWatcher(DocWatcher *watcher, void *userData) {
        for (int i = 0; i < lenWatchers; i++) {
                if ((watchers[i].watcher == watcher) &&
index dc9e38e21dda01e46f84716511a6ef995ca1d874..54ecadb004535e261d6cabeaca8ca5d024ab6c0a 100644 (file)
@@ -87,7 +87,7 @@ public:
                        userData = 0;
                }
        };
                        userData = 0;
                }
        };
-       
+
        enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
 
 private:
        enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
 
 private:
@@ -116,6 +116,7 @@ public:
        int dbcsCodePage;
        int tabInChars;
        int indentInChars;
        int dbcsCodePage;
        int tabInChars;
        int indentInChars;
+       int actualIndentInChars;
        bool useTabs;
        bool tabIndents;
        bool backspaceUnindents;
        bool useTabs;
        bool tabIndents;
        bool backspaceUnindents;
@@ -193,6 +194,7 @@ public:
        int NextWordStart(int pos, int delta);
        int NextWordEnd(int pos, int delta);
        int Length() { return cb.Length(); }
        int NextWordStart(int pos, int delta);
        int NextWordEnd(int pos, int delta);
        int Length() { return cb.Length(); }
+       void Allocate(int newSize) { cb.Allocate(newSize*2); }
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
        long FindText(int iMessage, unsigned long wParam, long lParam);
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
        long FindText(int iMessage, unsigned long wParam, long lParam);
@@ -200,9 +202,9 @@ public:
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
-       
-       void SetDefaultCharClasses();
-       void SetCharClasses(unsigned char *chars, charClassification newCharClass);
+
+       void SetDefaultCharClasses(bool includeWordClass);
+       void SetCharClasses(const unsigned char *chars, charClassification newCharClass);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
@@ -210,6 +212,7 @@ public:
        int GetEndStyled() { return endStyled; }
        bool EnsureStyledTo(int pos);
        int GetStyleClock() { return styleClock; }
        int GetEndStyled() { return endStyled; }
        bool EnsureStyledTo(int pos);
        int GetStyleClock() { return styleClock; }
+       void IncrementStyleClock();
 
        int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
        int GetLineState(int line) { return cb.GetLineState(line); }
 
        int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
        int GetLineState(int line) { return cb.GetLineState(line); }
@@ -226,6 +229,7 @@ public:
        int ExtendStyleRange(int pos, int delta, bool singleLine = false);
        int ParaUp(int pos);
        int ParaDown(int pos);
        int ExtendStyleRange(int pos, int delta, bool singleLine = false);
        int ParaUp(int pos);
        int ParaDown(int pos);
+       int IndentSize() { return actualIndentInChars; }
 
 private:
        charClassification WordCharClass(unsigned char ch);
 
 private:
        charClassification WordCharClass(unsigned char ch);
@@ -237,8 +241,6 @@ private:
        void NotifyModifyAttempt();
        void NotifySavePoint(bool atSavePoint);
        void NotifyModified(DocModification mh);
        void NotifyModifyAttempt();
        void NotifySavePoint(bool atSavePoint);
        void NotifyModified(DocModification mh);
-
-       int IndentSize() { return indentInChars ? indentInChars : tabInChars; }
 };
 
 /**
 };
 
 /**
index f0f10e25a3f810eafffc9dff1629a7595980e2bd..1ab36610b0f8bd84dd1fc9d87ef2527398f16168 100644 (file)
@@ -2,7 +2,7 @@
 /** @file Editor.cxx
  ** Main code for the edit control.
  **/
 /** @file Editor.cxx
  ** Main code for the edit control.
  **/
-// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
@@ -71,7 +71,7 @@ void LineLayout::Resize(int maxLineLength_) {
        if (maxLineLength_ > maxLineLength) {
                Free();
                chars = new char[maxLineLength_ + 1];
        if (maxLineLength_ > maxLineLength) {
                Free();
                chars = new char[maxLineLength_ + 1];
-               styles = new char[maxLineLength_ + 1];
+               styles = new unsigned char[maxLineLength_ + 1];
                indicators = new char[maxLineLength_ + 1];
                // Extra position allocated as sometimes the Windows
                // GetTextExtentExPoint API writes an extra element.
                indicators = new char[maxLineLength_ + 1];
                // Extra position allocated as sometimes the Windows
                // GetTextExtentExPoint API writes an extra element.
@@ -240,10 +240,14 @@ LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChar
        allInvalidated = false;
        int pos = -1;
        LineLayout *ret = 0;
        allInvalidated = false;
        int pos = -1;
        LineLayout *ret = 0;
-       if (((level == llcCaret) || (level == llcPage)) && (lineNumber == lineCaret)) {
+       if (level == llcCaret) {
                pos = 0;
        } else if (level == llcPage) {
                pos = 0;
        } else if (level == llcPage) {
-               pos = lineNumber % length;
+               if (lineNumber == lineCaret) {
+                       pos = length;
+               } else {
+                       pos = lineNumber % length;
+               }
        } else if (level == llcDocument) {
                pos = lineNumber;
        }
        } else if (level == llcDocument) {
                pos = lineNumber;
        }
@@ -381,6 +385,10 @@ Editor::Editor() {
        docLineLastWrapped = -1;
        docLastLineToWrap = -1;
        backgroundWrapEnabled = true;
        docLineLastWrapped = -1;
        docLastLineToWrap = -1;
        backgroundWrapEnabled = true;
+       wrapVisualFlags = 0;
+       wrapVisualFlagsLocation = 0;
+       wrapVisualStartIndent = 0;
+       actualWrapVisualStartIndent = 0;
 
        hsStart = -1;
        hsEnd = -1;
 
        hsStart = -1;
        hsEnd = -1;
@@ -489,7 +497,7 @@ int Editor::MaxScrollPos() {
        }
 }
 
        }
 }
 
-static inline bool IsControlCharacter(char ch) {
+static inline bool IsControlCharacter(int ch) {
        // iscntrl returns true for lots of chars > 127 which are displayable
        return ch >= 0 && ch < ' ';
 }
        // iscntrl returns true for lots of chars > 127 which are displayable
        return ch >= 0 && ch < ' ';
 }
@@ -632,9 +640,15 @@ Point Editor::LocationFromPosition(int pos) {
                if (posInLine > ll->maxLineLength) {
                        pt.x = ll->positions[ll->maxLineLength] - ll->positions[ll->LineStart(ll->lines)];
                }
                if (posInLine > ll->maxLineLength) {
                        pt.x = ll->positions[ll->maxLineLength] - ll->positions[ll->LineStart(ll->lines)];
                }
+
                for (int subLine = 0; subLine < ll->lines; subLine++) {
                        if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) {
                                pt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)];
                for (int subLine = 0; subLine < ll->lines; subLine++) {
                        if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) {
                                pt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)];
+                               if (actualWrapVisualStartIndent != 0) {
+                                       int lineStart = ll->LineStart(subLine);
+                                       if (lineStart != 0)     // Wrapped
+                                               pt.x += actualWrapVisualStartIndent * vs.aveCharWidth;
+                               }
                        }
                        if (posInLine >= ll->LineStart(subLine)) {
                                pt.y += vs.lineHeight;
                        }
                        if (posInLine >= ll->LineStart(subLine)) {
                                pt.y += vs.lineHeight;
@@ -687,6 +701,11 @@ int Editor::PositionFromLocation(Point pt) {
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
+
+                       if (actualWrapVisualStartIndent != 0) {
+                               if (lineStart != 0)     // Wrapped
+                                       pt.x -= actualWrapVisualStartIndent * vs.aveCharWidth;
+                       }
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
@@ -731,6 +750,11 @@ int Editor::PositionFromLocationClose(Point pt) {
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
+
+                       if (actualWrapVisualStartIndent != 0) {
+                               if (lineStart != 0)     // Wrapped
+                                       pt.x -= actualWrapVisualStartIndent * vs.aveCharWidth;
+                       }
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
@@ -763,6 +787,11 @@ int Editor::PositionFromLineX(int lineDoc, int x) {
                int lineStart = ll->LineStart(subLine);
                int lineEnd = ll->LineStart(subLine + 1);
                int subLineStart = ll->positions[lineStart];
                int lineStart = ll->LineStart(subLine);
                int lineEnd = ll->LineStart(subLine + 1);
                int subLineStart = ll->positions[lineStart];
+
+               if (actualWrapVisualStartIndent != 0) {
+                       if (lineStart != 0)     // Wrapped
+                               x -= actualWrapVisualStartIndent * vs.aveCharWidth;
+               }
                for (int i = lineStart; i < lineEnd; i++) {
                        if (x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                IsEOLChar(ll->chars[i])) {
                for (int i = lineStart; i < lineEnd; i++) {
                        if (x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                IsEOLChar(ll->chars[i])) {
@@ -1390,6 +1419,8 @@ void Editor::InvalidateCaret() {
 }
 
 void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
 }
 
 void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
+       docLineStartWrapping = Platform::Minimum(docLineStartWrapping, pdoc->LinesTotal()-1);
+       docLineEndWrapping = Platform::Minimum(docLineEndWrapping, pdoc->LinesTotal()-1);
        bool noWrap = (docLastLineToWrap == docLineLastWrapped);
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
        bool noWrap = (docLastLineToWrap == docLineLastWrapped);
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
@@ -1407,7 +1438,9 @@ void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
        if (docLastLineToWrap >= pdoc->LinesTotal())
                docLastLineToWrap = pdoc->LinesTotal()-1;
        // Wrap lines during idle.
        if (docLastLineToWrap >= pdoc->LinesTotal())
                docLastLineToWrap = pdoc->LinesTotal()-1;
        // Wrap lines during idle.
-       if (backgroundWrapEnabled && docLastLineToWrap != docLineLastWrapped ) {
+       if ((wrapState != eWrapNone) &&
+               backgroundWrapEnabled &&
+               (docLastLineToWrap != docLineLastWrapped)) {
                SetIdle(true);
        }
 }
                SetIdle(true);
        }
 }
@@ -1488,6 +1521,7 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                                        firstLineToWrap++;
                                        if (!priorityWrap)
                                                docLineLastWrapped++;
                                        firstLineToWrap++;
                                        if (!priorityWrap)
                                                docLineLastWrapped++;
+                                       if (firstLineToWrap < pdoc->LinesTotal()) {
                                        AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
                                        AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
@@ -1496,6 +1530,7 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                                        }
                                        if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
                                        }
                                        if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
+                                               }
                                        }
                                }
                                // If wrapping is done, bring it to resting position
                                        }
                                }
                                // If wrapping is done, bring it to resting position
@@ -1982,6 +2017,9 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                        // Simple common case where line does not need wrapping.
                        ll->lines = 1;
                } else {
                        // Simple common case where line does not need wrapping.
                        ll->lines = 1;
                } else {
+                       if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) {
+                               width -= vstyle.aveCharWidth; // take into account the space for end wrap mark
+                       }
                        ll->lines = 0;
                        // Calculate line start positions based upon width.
                        // For now this is simplistic - wraps on byte rather than character and
                        ll->lines = 0;
                        // Calculate line start positions based upon width.
                        // For now this is simplistic - wraps on byte rather than character and
@@ -2008,6 +2046,8 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                                        ll->lines++;
                                        ll->SetLineStart(ll->lines, lastGoodBreak);
                                        startOffset = ll->positions[lastGoodBreak];
                                        ll->lines++;
                                        ll->SetLineStart(ll->lines, lastGoodBreak);
                                        startOffset = ll->positions[lastGoodBreak];
+                                       // take into account the space for start wrap mark and indent
+                                       startOffset -= actualWrapVisualStartIndent * vstyle.aveCharWidth;
                                        p = lastGoodBreak + 1;
                                        continue;
                                }
                                        p = lastGoodBreak + 1;
                                        continue;
                                }
@@ -2055,9 +2095,56 @@ void Editor::DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight,
                      highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide);
 }
 
                      highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide);
 }
 
+void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace,
+                            bool isEndMarker, ColourAllocated wrapColour) {
+       surface->PenColour(wrapColour);
+
+       enum { xa = 1 }; // gap before start
+       int w = rcPlace.right - rcPlace.left - xa - 1;
+
+       bool xStraight = isEndMarker;  // x-mirrored symbol for start marker
+       bool yStraight = true;
+       //bool yStraight= isEndMarker; // comment in for start marker y-mirrowed
+
+       int x0 = xStraight ? rcPlace.left : rcPlace.right - 1;
+       int y0 = yStraight ? rcPlace.top : rcPlace.bottom - 1;
+
+       int dy = (rcPlace.bottom - rcPlace.top) / 5;
+       int y = (rcPlace.bottom - rcPlace.top) / 2 + dy;
+
+       struct Relative {
+               Surface *surface;
+               int xBase;
+               int xDir;
+               int yBase;
+               int yDir;
+               void MoveTo(int xRelative, int yRelative) {
+                   surface->MoveTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
+               }
+               void LineTo(int xRelative, int yRelative) {
+                   surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
+               }
+       };
+       Relative rel = {surface, x0, xStraight?1:-1, y0, yStraight?1:-1};
+
+       // arrow head
+       rel.MoveTo(xa, y);
+       rel.LineTo(xa + 2*w / 3, y - dy);
+       rel.MoveTo(xa, y);
+       rel.LineTo(xa + 2*w / 3, y + dy);
+
+       // arrow body
+       rel.MoveTo(xa, y);
+       rel.LineTo(xa + w, y);
+       rel.LineTo(xa + w, y - 2 * dy);
+       rel.LineTo(xa - 1,   // on windows lineto is exclusive endpoint, perhaps GTK not...
+                       y - 2 * dy);
+}
+
 void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                      int line, int lineEnd, int xStart, int subLine, int subLineStart,
 void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                      int line, int lineEnd, int xStart, int subLine, int subLineStart,
-                     bool overrideBackground, ColourAllocated background) {
+                     bool overrideBackground, ColourAllocated background,
+                     bool drawWrapMarkEnd, ColourAllocated wrapColour) {
 
        int styleMask = pdoc->stylingBitsMask;
        PRectangle rcSegment = rcLine;
 
        int styleMask = pdoc->stylingBitsMask;
        PRectangle rcSegment = rcLine;
@@ -2069,6 +2156,7 @@ void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, Lin
        int posLineEnd = pdoc->LineStart(line + 1);
        bool eolInSelection = (subLine == (ll->lines - 1)) &&
                              (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd);
        int posLineEnd = pdoc->LineStart(line + 1);
        bool eolInSelection = (subLine == (ll->lines - 1)) &&
                              (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd);
+
        if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) {
                if (primarySelection)
                        surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
        if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) {
                if (primarySelection)
                        surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
@@ -2089,6 +2177,20 @@ void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, Lin
        } else {
                surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated);
        }
        } else {
                surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated);
        }
+
+       if (drawWrapMarkEnd) {
+               PRectangle rcPlace = rcSegment;
+
+               if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_END_BY_TEXT) {
+                       rcPlace.left = xEol + xStart;
+                       rcPlace.right = rcPlace.left + vsDraw.aveCharWidth;
+               } else {
+                       // draw left of the right text margin, to avoid clipping by the current clip rect
+                       rcPlace.right = rcLine.right - vs.rightMarginWidth;
+                       rcPlace.left = rcPlace.right - vsDraw.aveCharWidth;
+               }
+               DrawWrapMarker(surface, rcPlace, true, wrapColour);
+       }
 }
 
 void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
 }
 
 void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
@@ -2141,9 +2243,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                                        (!overrideBackground) && (vsDraw.whitespaceBackgroundSet);
 
        bool inIndentation = subLine == 0;      // Do not handle indentation except on first subline.
                                        (!overrideBackground) && (vsDraw.whitespaceBackgroundSet);
 
        bool inIndentation = subLine == 0;      // Do not handle indentation except on first subline.
-       int indentWidth = pdoc->indentInChars * vsDraw.spaceWidth;
-       if (indentWidth == 0)
-               indentWidth = pdoc->tabInChars * vsDraw.spaceWidth;
+       int indentWidth = pdoc->IndentSize() * vsDraw.spaceWidth;
 
        int posLineStart = pdoc->LineStart(line);
 
 
        int posLineStart = pdoc->LineStart(line);
 
@@ -2155,6 +2255,51 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                lineStart = ll->LineStart(subLine);
                lineEnd = ll->LineStart(subLine + 1);
        }
                lineStart = ll->LineStart(subLine);
                lineEnd = ll->LineStart(subLine + 1);
        }
+
+       bool drawWrapMarkEnd = false;
+
+       if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) {
+               if (subLine + 1 < ll->lines) {
+                       drawWrapMarkEnd = ll->LineStart(subLine + 1) != 0;
+               }
+       }
+
+       if (actualWrapVisualStartIndent != 0) {
+
+               bool continuedWrapLine = false;
+               if (subLine < ll->lines) {
+                       continuedWrapLine = ll->LineStart(subLine) != 0;
+               }
+
+               if (continuedWrapLine) {
+                       // draw continuation rect
+                       PRectangle rcPlace = rcSegment;
+
+                       rcPlace.left = ll->positions[startseg] + xStart - subLineStart;
+                       rcPlace.right = rcPlace.left + actualWrapVisualStartIndent * vsDraw.aveCharWidth;
+
+                       // default bgnd here..
+                       surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated);
+
+                       // main line style would be below but this would be inconsistent with end markers
+                       // also would possibly not be the style at wrap point
+                       //int styleMain = ll->styles[lineStart];
+                       //surface->FillRectangle(rcPlace, vsDraw.styles[styleMain].back.allocated);
+
+                       if (wrapVisualFlags & SC_WRAPVISUALFLAG_START) {
+
+                               if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_START_BY_TEXT)
+                                       rcPlace.left = rcPlace.right - vsDraw.aveCharWidth;
+                               else
+                                       rcPlace.right = rcPlace.left + vsDraw.aveCharWidth;
+
+                               DrawWrapMarker(surface, rcPlace, false, vsDraw.whitespaceForeground.allocated);
+                       }
+
+                       xStart += actualWrapVisualStartIndent * vsDraw.aveCharWidth;
+               }
+       }
+
        int i;
 
        // Background drawing loop
        int i;
 
        // Background drawing loop
@@ -2212,7 +2357,8 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 
        if (twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
 
        if (twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
-                       xStart, subLine, subLineStart, overrideBackground, background);
+                       xStart, subLine, subLineStart, overrideBackground, background,
+                       drawWrapMarkEnd, vsDraw.whitespaceForeground.allocated);
        }
 
        inIndentation = subLine == 0;   // Do not handle indentation except on first subline.
        }
 
        inIndentation = subLine == 0;   // Do not handle indentation except on first subline.
@@ -2402,10 +2548,10 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                }
        }
        // End of the drawing of the current line
                }
        }
        // End of the drawing of the current line
-
        if (!twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
        if (!twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
-                       xStart, subLine, subLineStart, overrideBackground, background);
+                       xStart, subLine, subLineStart, overrideBackground, background,
+                       drawWrapMarkEnd, vsDraw.whitespaceForeground.allocated);
        }
 
        if (vsDraw.edgeState == EDGE_LINE) {
        }
 
        if (vsDraw.edgeState == EDGE_LINE) {
@@ -2604,6 +2750,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                        // and determine the x position at which each character starts.
                        //ElapsedTime et;
                        if (lineDoc != lineDocPrevious) {
                        // and determine the x position at which each character starts.
                        //ElapsedTime et;
                        if (lineDoc != lineDocPrevious) {
+                               ll.Set(0);
                                ll.Set(RetrieveLineLayout(lineDoc));
                                LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                lineDocPrevious = lineDoc;
                                ll.Set(RetrieveLineLayout(lineDoc));
                                LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                lineDocPrevious = lineDoc;
@@ -2670,7 +2817,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                                        int FoldLevelCurr = (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelPrev = (pdoc->GetLevel(lineDoc - 1) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelFlags = (pdoc->GetLevel(lineDoc) & ~SC_FOLDLEVELNUMBERMASK) & ~(0xFFF0000);
                                        int FoldLevelCurr = (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelPrev = (pdoc->GetLevel(lineDoc - 1) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelFlags = (pdoc->GetLevel(lineDoc) & ~SC_FOLDLEVELNUMBERMASK) & ~(0xFFF0000);
-                                       int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+                                       int indentationStep = pdoc->IndentSize();
                                        // Draw line above fold
                                        if ((FoldLevelPrev < FoldLevelCurr)
                                                ||
                                        // Draw line above fold
                                        if ((FoldLevelPrev < FoldLevelCurr)
                                                ||
@@ -2708,6 +2855,12 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                                        if ((offset >= ll->LineStart(subLine)) &&
                                                ((offset < ll->LineStart(subLine + 1)) || offset == ll->numCharsInLine)) {
                                                int xposCaret = ll->positions[offset] - ll->positions[ll->LineStart(subLine)] + xStart;
                                        if ((offset >= ll->LineStart(subLine)) &&
                                                ((offset < ll->LineStart(subLine + 1)) || offset == ll->numCharsInLine)) {
                                                int xposCaret = ll->positions[offset] - ll->positions[ll->LineStart(subLine)] + xStart;
+
+                                               if (actualWrapVisualStartIndent != 0) {
+                                                       int lineStart = ll->LineStart(subLine);
+                                                       if (lineStart != 0)     // Wrapped
+                                                               xposCaret += actualWrapVisualStartIndent * vs.aveCharWidth;
+                                               }
                                                int widthOverstrikeCaret;
                                                if (posCaret == pdoc->Length()) {   // At end of document
                                                        widthOverstrikeCaret = vs.aveCharWidth;
                                                int widthOverstrikeCaret;
                                                if (posCaret == pdoc->Length()) {   // At end of document
                                                        widthOverstrikeCaret = vs.aveCharWidth;
@@ -3238,7 +3391,7 @@ void Editor::DelCharBack(bool allowLineStartDeletion) {
                                        pdoc->GetColumn(currentPos) > 0 && pdoc->backspaceUnindents) {
                                        pdoc->BeginUndoAction();
                                        int indentation = pdoc->GetLineIndentation(lineCurrentPos);
                                        pdoc->GetColumn(currentPos) > 0 && pdoc->backspaceUnindents) {
                                        pdoc->BeginUndoAction();
                                        int indentation = pdoc->GetLineIndentation(lineCurrentPos);
-                                       int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+                                       int indentationStep = pdoc->IndentSize();
                                        if (indentation % indentationStep == 0) {
                                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                        } else {
                                        if (indentation % indentationStep == 0) {
                                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                        } else {
@@ -3452,6 +3605,7 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
+               pdoc->IncrementStyleClock();
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
                                // Styling performed before this view
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
                                // Styling performed before this view
@@ -4280,8 +4434,8 @@ void Editor::Indent(bool forwards) {
                        if (pdoc->GetColumn(currentPos) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) &&
                                pdoc->tabIndents) {
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
                        if (pdoc->GetColumn(currentPos) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) &&
                                pdoc->tabIndents) {
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
-                               int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
-                               pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep);
+                               int indentationStep = pdoc->IndentSize();
+                               pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep - indentation % indentationStep);
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                        } else {
                                if (pdoc->useTabs) {
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                        } else {
                                if (pdoc->useTabs) {
@@ -4304,7 +4458,7 @@ void Editor::Indent(bool forwards) {
                                pdoc->tabIndents) {
                                pdoc->BeginUndoAction();
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
                                pdoc->tabIndents) {
                                pdoc->BeginUndoAction();
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
-                               int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+                               int indentationStep = pdoc->IndentSize();
                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                                pdoc->EndUndoAction();
                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                                pdoc->EndUndoAction();
@@ -4477,7 +4631,8 @@ char *Editor::CopyRange(int start, int end) {
 }
 
 void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) {
 }
 
 void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) {
-       ss->Set(CopyRange(start, end), end - start + 1, false);
+       ss->Set(CopyRange(start, end), end - start + 1,
+               pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
@@ -4519,7 +4674,8 @@ void Editor::CopySelectionRange(SelectionText *ss) {
                                text[size] = '\0';
                        }
                }
                                text[size] = '\0';
                        }
                }
-               ss->Set(text, size + 1, selType == selRectangle);
+               ss->Set(text, size + 1, pdoc->dbcsCodePage,
+                       vs.styles[STYLE_DEFAULT].characterSet, selType == selRectangle);
        }
 }
 
        }
 }
 
@@ -4527,13 +4683,15 @@ void Editor::CopyRangeToClipboard(int start, int end) {
        start = pdoc->ClampPositionIntoDocument(start);
        end = pdoc->ClampPositionIntoDocument(end);
        SelectionText selectedText;
        start = pdoc->ClampPositionIntoDocument(start);
        end = pdoc->ClampPositionIntoDocument(end);
        SelectionText selectedText;
-       selectedText.Set(CopyRange(start, end), end - start + 1);
+       selectedText.Set(CopyRange(start, end), end - start + 1,
+               pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
        CopyToClipboard(selectedText);
 }
 
 void Editor::CopyText(int length, const char *text) {
        SelectionText selectedText;
        CopyToClipboard(selectedText);
 }
 
 void Editor::CopyText(int length, const char *text) {
        SelectionText selectedText;
-       selectedText.Copy(text, length);
+       selectedText.Copy(text, length,
+               pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
        CopyToClipboard(selectedText);
 }
 
        CopyToClipboard(selectedText);
 }
 
@@ -4929,7 +5087,8 @@ void Editor::ButtonMove(Point pt) {
                }
                // While dragging to make rectangular selection, we don't want the current
                // position to jump to the end of smaller or empty lines.
                }
                // While dragging to make rectangular selection, we don't want the current
                // position to jump to the end of smaller or empty lines.
-               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
+               //xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
+               xEndSelect = XFromPosition(movePos);
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
@@ -5006,7 +5165,7 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
                                        } else {
                                                SetEmptySelection(newPos);
                                        }
                                        } else {
                                                SetEmptySelection(newPos);
                                        }
-                                       drag.Set(0, 0);
+                                       drag.Free();
                                }
                                selectionType = selChar;
                        }
                                }
                                selectionType = selChar;
                        }
@@ -5238,6 +5397,9 @@ void Editor::SetDocPointer(Document *document) {
        targetStart = 0;
        targetEnd = 0;
 
        targetStart = 0;
        targetEnd = 0;
 
+       braces[0] = invalidPosition;
+       braces[1] = invalidPosition;
+
        // Reset the contraction state to fully shown.
        cs.Clear();
        cs.InsertLines(0, pdoc->LinesTotal() - 1);
        // Reset the contraction state to fully shown.
        cs.Clear();
        cs.InsertLines(0, pdoc->LinesTotal() - 1);
@@ -5272,16 +5434,34 @@ void Editor::Expand(int &line, bool doExpand) {
 }
 
 void Editor::ToggleContraction(int line) {
 }
 
 void Editor::ToggleContraction(int line) {
-       if (pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) {
+       if (line >= 0) {
+               if ((pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) == 0) {
+                       line = pdoc->GetFoldParent(line);
+                       if (line < 0)
+                               return;
+               }
+
                if (cs.GetExpanded(line)) {
                        int lineMaxSubord = pdoc->GetLastChild(line);
                        cs.SetExpanded(line, 0);
                        if (lineMaxSubord > line) {
                                cs.SetVisible(line + 1, lineMaxSubord, false);
                if (cs.GetExpanded(line)) {
                        int lineMaxSubord = pdoc->GetLastChild(line);
                        cs.SetExpanded(line, 0);
                        if (lineMaxSubord > line) {
                                cs.SetVisible(line + 1, lineMaxSubord, false);
+
+                               int lineCurrent = pdoc->LineFromPosition(currentPos);
+                               if (lineCurrent > line && lineCurrent <= lineMaxSubord) {
+                                       // This does not re-expand the fold
+                                       EnsureCaretVisible();
+                               }
+
                                SetScrollBars();
                                Redraw();
                        }
                                SetScrollBars();
                                Redraw();
                        }
+
                } else {
                } else {
+                       if (!(cs.GetVisible(line))) {
+                               EnsureLineVisible(line, false);
+                               GoToLine(line);
+                       }
                        cs.SetExpanded(line, 1);
                        Expand(line, true);
                        SetScrollBars();
                        cs.SetExpanded(line, 1);
                        Expand(line, true);
                        SetScrollBars();
@@ -5383,7 +5563,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_GETTEXT: {
                        if (lParam == 0)
 
        case SCI_GETTEXT: {
                        if (lParam == 0)
-                               return 0;
+                               return pdoc->Length() + 1;
                        if (wParam == 0)
                                return 0;
                        char *ptr = CharPtrFromSPtr(lParam);
                        if (wParam == 0)
                                return 0;
                        char *ptr = CharPtrFromSPtr(lParam);
@@ -5397,9 +5577,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_SETTEXT: {
                        if (lParam == 0)
                                return 0;
        case SCI_SETTEXT: {
                        if (lParam == 0)
                                return 0;
+                       pdoc->BeginUndoAction();
                        pdoc->DeleteChars(0, pdoc->Length());
                        SetEmptySelection(0);
                        pdoc->InsertString(0, CharPtrFromSPtr(lParam));
                        pdoc->DeleteChars(0, pdoc->Length());
                        SetEmptySelection(0);
                        pdoc->InsertString(0, CharPtrFromSPtr(lParam));
+                       pdoc->EndUndoAction();
                        return 1;
                }
 
                        return 1;
                }
 
@@ -5451,11 +5633,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return topLine;
 
        case SCI_GETLINE: {     // Risk of overwriting the end of the buffer
                return topLine;
 
        case SCI_GETLINE: {     // Risk of overwriting the end of the buffer
-                       if (lParam == 0) {
-                               return 0;
-                       }
                        int lineStart = pdoc->LineStart(wParam);
                        int lineEnd = pdoc->LineStart(wParam + 1);
                        int lineStart = pdoc->LineStart(wParam);
                        int lineEnd = pdoc->LineStart(wParam + 1);
+                       if (lParam == 0) {
+                               return lineEnd - lineStart;
+                       }
                        char *ptr = CharPtrFromSPtr(lParam);
                        int iPlace = 0;
                        for (int iChar = lineStart; iChar < lineEnd; iChar++) {
                        char *ptr = CharPtrFromSPtr(lParam);
                        int iPlace = 0;
                        for (int iChar = lineStart; iChar < lineEnd; iChar++) {
@@ -5487,8 +5669,23 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_GETSELTEXT: {
                break;
 
        case SCI_GETSELTEXT: {
-                       if (lParam == 0)
-                               return 0;
+                       if (lParam == 0) {
+                               if (selType == selStream) {
+                                       return 1 + SelectionEnd() - SelectionStart();
+                               } else {
+                                       // TODO: why is selLines handled the slow way?
+                                       int size = 0;
+                                       int extraCharsPerLine = 0;
+                                       if (selType != selLines)
+                                               extraCharsPerLine = (pdoc->eolMode == SC_EOL_CRLF) ? 2 : 1;
+                                       SelectionLineIterator lineIterator(this);
+                                       while (lineIterator.Iterate()) {
+                                               size += lineIterator.endPos + extraCharsPerLine - lineIterator.startPos;
+                                       }
+
+                                       return 1 + size;
+                               }
+                       }
                        SelectionText selectedText;
                        CopySelectionRange(&selectedText);
                        char *ptr = CharPtrFromSPtr(lParam);
                        SelectionText selectedText;
                        CopySelectionRange(&selectedText);
                        char *ptr = CharPtrFromSPtr(lParam);
@@ -5745,7 +5942,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETWORDCHARS: {
                break;
 
        case SCI_SETWORDCHARS: {
-                       pdoc->SetDefaultCharClasses();
+                       pdoc->SetDefaultCharClasses(false);
                        if (lParam == 0)
                                return 0;
                        pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
                        if (lParam == 0)
                                return 0;
                        pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
@@ -5760,12 +5957,16 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETCHARSDEFAULT:
                break;
 
        case SCI_SETCHARSDEFAULT:
-               pdoc->SetDefaultCharClasses();
+               pdoc->SetDefaultCharClasses(true);
                break;
 
        case SCI_GETLENGTH:
                return pdoc->Length();
 
                break;
 
        case SCI_GETLENGTH:
                return pdoc->Length();
 
+       case SCI_ALLOCATE:
+               pdoc->Allocate(wParam);
+               break;
+
        case SCI_GETCHARAT:
                return pdoc->CharAt(wParam);
 
        case SCI_GETCHARAT:
                return pdoc->CharAt(wParam);
 
@@ -5885,12 +6086,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_GETCURLINE: {
                break;
 
        case SCI_GETCURLINE: {
-                       if (lParam == 0) {
-                               return 0;
-                       }
                        int lineCurrentPos = pdoc->LineFromPosition(currentPos);
                        int lineStart = pdoc->LineStart(lineCurrentPos);
                        unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1);
                        int lineCurrentPos = pdoc->LineFromPosition(currentPos);
                        int lineStart = pdoc->LineStart(lineCurrentPos);
                        unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1);
+                       if (lParam == 0) {
+                               return 1 + lineEnd - lineStart;
+                       }
                        char *ptr = CharPtrFromSPtr(lParam);
                        unsigned int iPlace = 0;
                        for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) {
                        char *ptr = CharPtrFromSPtr(lParam);
                        unsigned int iPlace = 0;
                        for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) {
@@ -5940,8 +6141,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETTABWIDTH:
                break;
 
        case SCI_SETTABWIDTH:
-               if (wParam > 0)
+               if (wParam > 0) {
                        pdoc->tabInChars = wParam;
                        pdoc->tabInChars = wParam;
+                       if (pdoc->indentInChars == 0)
+                               pdoc->actualIndentInChars = pdoc->tabInChars;
+               }
                InvalidateStyleRedraw();
                break;
 
                InvalidateStyleRedraw();
                break;
 
@@ -5950,6 +6154,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_SETINDENT:
                pdoc->indentInChars = wParam;
 
        case SCI_SETINDENT:
                pdoc->indentInChars = wParam;
+               if (pdoc->indentInChars != 0)
+                       pdoc->actualIndentInChars = pdoc->indentInChars;
+               else
+                       pdoc->actualIndentInChars = pdoc->tabInChars;
                InvalidateStyleRedraw();
                break;
 
                InvalidateStyleRedraw();
                break;
 
@@ -6012,6 +6220,38 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_GETWRAPMODE:
                return wrapState;
 
        case SCI_GETWRAPMODE:
                return wrapState;
 
+       case SCI_SETWRAPVISUALFLAGS:
+               wrapVisualFlags = wParam;
+               actualWrapVisualStartIndent = wrapVisualStartIndent;
+               if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0))
+                       actualWrapVisualStartIndent = 1; // must indent to show start visual
+               InvalidateStyleRedraw();
+               ReconfigureScrollBars();
+               break;
+
+       case SCI_GETWRAPVISUALFLAGS:
+               return wrapVisualFlags;
+
+       case SCI_SETWRAPVISUALFLAGSLOCATION:
+               wrapVisualFlagsLocation = wParam;
+               InvalidateStyleRedraw();
+               break;
+
+       case SCI_GETWRAPVISUALFLAGSLOCATION:
+               return wrapVisualFlagsLocation;
+
+       case SCI_SETWRAPSTARTINDENT:
+               wrapVisualStartIndent = wParam;
+               actualWrapVisualStartIndent = wrapVisualStartIndent;
+               if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0))
+                       actualWrapVisualStartIndent = 1; // must indent to show start visual
+               InvalidateStyleRedraw();
+               ReconfigureScrollBars();
+               break;
+
+       case SCI_GETWRAPSTARTINDENT:
+               return wrapVisualStartIndent;
+
        case SCI_SETLAYOUTCACHE:
                llc.SetLevel(wParam);
                break;
        case SCI_SETLAYOUTCACHE:
                llc.SetLevel(wParam);
                break;
index 08c56f7a4175205864c2936edf361c13f5c24e92..b9bda04ab4678c4ec19ed761a5bdfd4f688bc436 100644 (file)
@@ -63,7 +63,7 @@ public:
        bool containsCaret;
        int edgeColumn;
        char *chars;
        bool containsCaret;
        int edgeColumn;
        char *chars;
-       char *styles;
+       unsigned char *styles;
        char *indicators;
        int *positions;
        char bracePreviousStyles[2];
        char *indicators;
        int *positions;
        char bracePreviousStyles[2];
@@ -134,20 +134,27 @@ public:
        char *s;
        int len;
        bool rectangular;
        char *s;
        int len;
        bool rectangular;
-       SelectionText() : s(0), len(0), rectangular(false) {}
+       int codePage;
+       int characterSet;
+       SelectionText() : s(0), len(0), rectangular(false), codePage(0), characterSet(0) {}
        ~SelectionText() {
        ~SelectionText() {
-               Set(0, 0);
+               Free();
        }
        }
-       void Set(char *s_, int len_, bool rectangular_=false) {
+       void Free() {
+               Set(0, 0, 0, 0, false);
+       }
+       void Set(char *s_, int len_, int codePage_, int characterSet_, bool rectangular_) {
                delete []s;
                s = s_;
                if (s)
                        len = len_;
                else
                        len = 0;
                delete []s;
                s = s_;
                if (s)
                        len = len_;
                else
                        len = 0;
+               codePage = codePage_;
+               characterSet = characterSet_;
                rectangular = rectangular_;
        }
                rectangular = rectangular_;
        }
-       void Copy(const char *s_, int len_, bool rectangular_=false) {
+       void Copy(const char *s_, int len_, int codePage_, int characterSet_, bool rectangular_) {
                delete []s;
                s = new char[len_];
                if (s) {
                delete []s;
                s = new char[len_];
                if (s) {
@@ -158,8 +165,13 @@ public:
                } else {
                        len = 0;
                }
                } else {
                        len = 0;
                }
+               codePage = codePage_;
+               characterSet = characterSet_;
                rectangular = rectangular_;
        }
                rectangular = rectangular_;
        }
+       void Copy(const SelectionText &other) {
+               Copy(other.s, other.len, other.codePage, other.characterSet, other.rectangular);
+       }
 };
 
 /**
 };
 
 /**
@@ -293,6 +305,10 @@ protected: // ScintillaBase subclass needs access to much of Editor
        int wrapWidth;
        int docLineLastWrapped;
        int docLastLineToWrap;
        int wrapWidth;
        int docLineLastWrapped;
        int docLastLineToWrap;
+       int wrapVisualFlags;
+       int wrapVisualFlagsLocation;
+       int wrapVisualStartIndent;
+       int actualWrapVisualStartIndent;
 
        Document *pdoc;
 
 
        Document *pdoc;
 
@@ -365,9 +381,11 @@ protected: // ScintillaBase subclass needs access to much of Editor
                int width=LineLayout::wrapWidthInfinite);
        ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll);
        void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
                int width=LineLayout::wrapWidthInfinite);
        ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll);
        void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
+       void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourAllocated wrapColour);
        void DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                int line, int lineEnd, int xStart, int subLine, int subLineStart,
        void DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                int line, int lineEnd, int xStart, int subLine, int subLineStart,
-               bool overrideBackground, ColourAllocated background);
+               bool overrideBackground, ColourAllocated background,
+               bool drawWrapMark, ColourAllocated wrapColour);
        void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
                PRectangle rcLine, LineLayout *ll, int subLine=0);
        void RefreshPixMaps(Surface *surfaceWindow);
        void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
                PRectangle rcLine, LineLayout *ll, int subLine=0);
        void RefreshPixMaps(Surface *surfaceWindow);
index 206a333b0028f3dde430854d1db31d7d66f58f1d..def79f6ecdce17cfe32c1801e71064bbfb300a65 100644 (file)
@@ -130,9 +130,12 @@ int Scintilla_LinkLexers() {
 //++Autogenerated -- run src/LexGen.py to regenerate
 //**\(\tLINK_LEXER(\*);\n\)
        LINK_LEXER(lmAda);
 //++Autogenerated -- run src/LexGen.py to regenerate
 //**\(\tLINK_LEXER(\*);\n\)
        LINK_LEXER(lmAda);
+       LINK_LEXER(lmAPDL);
        LINK_LEXER(lmAsm);
        LINK_LEXER(lmAsm);
+       LINK_LEXER(lmAU3);
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
+       LINK_LEXER(lmBash);
        LINK_LEXER(lmBullant);
        LINK_LEXER(lmClw);
        LINK_LEXER(lmClwNoCase);
        LINK_LEXER(lmBullant);
        LINK_LEXER(lmClw);
        LINK_LEXER(lmClwNoCase);
@@ -149,10 +152,12 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmForth);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
        LINK_LEXER(lmForth);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
+       LINK_LEXER(lmGui4Cli);
        LINK_LEXER(lmHTML);
        LINK_LEXER(lmXML);
        LINK_LEXER(lmASP);
        LINK_LEXER(lmPHP);
        LINK_LEXER(lmHTML);
        LINK_LEXER(lmXML);
        LINK_LEXER(lmASP);
        LINK_LEXER(lmPHP);
+       LINK_LEXER(lmKix);
        LINK_LEXER(lmLISP);
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
        LINK_LEXER(lmLISP);
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
@@ -161,6 +166,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmMETAPOST);
        LINK_LEXER(lmMMIXAL);
        LINK_LEXER(lmLot);
        LINK_LEXER(lmMETAPOST);
        LINK_LEXER(lmMMIXAL);
        LINK_LEXER(lmLot);
+       LINK_LEXER(lmMSSQL);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
@@ -177,10 +183,12 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmPython);
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmPython);
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
+       LINK_LEXER(lmSpecman);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmTeX);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmTeX);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
+       LINK_LEXER(lmVerilog);
        LINK_LEXER(lmYAML);
 
 //--Autogenerated -- end of automatically generated section
        LINK_LEXER(lmYAML);
 
 //--Autogenerated -- end of automatically generated section
diff --git a/contrib/src/stc/scintilla/src/LexAPDL.cxx b/contrib/src/stc/scintilla/src/LexAPDL.cxx
new file mode 100644 (file)
index 0000000..b739e9a
--- /dev/null
@@ -0,0 +1,174 @@
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '/' || ch == '*');
+}
+
+inline bool IsABlank(unsigned int ch) {
+    return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
+}
+
+
+
+static void ColouriseAPDLDoc(unsigned int startPos, int length, int initStyle,
+                              WordList *keywordlists[], Accessor &styler)
+{
+
+    //~ FILE *fp;
+    //~ fp = fopen("myoutput.txt", "w");
+
+    WordList &commands = *keywordlists[0];
+    WordList &processors = *keywordlists[1];
+    WordList &functions = *keywordlists[2];
+
+
+    // backtrack to the beginning of the document, this may be slow for big documents.
+    initStyle = SCE_APDL_DEFAULT;
+    StyleContext sc(0, startPos+length, initStyle, styler);
+
+    // backtrack to the nearest keyword
+    //~ while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_APDL_WORD)) {
+            //~ startPos--;
+    //~ }
+    //~ startPos = styler.LineStart(styler.GetLine(startPos));
+    //~ initStyle = styler.StyleAt(startPos - 1);
+    //~ StyleContext sc(startPos, endPos-startPos, initStyle, styler);
+
+    bool firstInLine = true;
+    bool atEOL;
+
+    for (; sc.More(); sc.Forward()) {
+
+        atEOL = (sc.ch == '\r' && sc.chNext == '\n') || (sc.ch == '\n');
+
+        //~ if (sc.ch == '\r') {
+            //~ fprintf(fp,"CR\t%d\t%d", atEOL, firstInLine);
+        //~ } else if (sc.ch == '\n') {
+            //~ fprintf(fp,"LF\t%d\t%d", atEOL, firstInLine);
+        //~ } else {
+            //~ fprintf(fp,"%c\t%d\t%d", sc.ch, atEOL, firstInLine);
+        //~ }
+
+        // Determine if the current state should terminate.
+        if (sc.state == SCE_APDL_COMMENT) {
+            //~ fprintf(fp,"\tCOMMENT");
+            if (atEOL) {
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_COMMENTBLOCK) {
+            //~ fprintf(fp,"\tCOMMENTBLOCK");
+            if (atEOL) {
+                if (sc.ch == '\r') {
+                    sc.Forward();
+                }
+                sc.ForwardSetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_NUMBER) {
+            //~ fprintf(fp,"\tNUMBER");
+            if (isdigit(sc.ch)) {
+            } else if ((sc.ch == 'e' || sc.ch == 'E') && (isdigit(sc.chNext) || sc.chNext == '+' || sc.chNext == '-')) {
+            } else if (sc.ch == '.') {
+            } else if ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')) {
+            } else {
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_STRING) {
+            //~ fprintf(fp,"\tSTRING");
+            if (sc.ch == '\"') {
+                //~ sc.ForwardSetState(SCE_APDL_DEFAULT);
+                sc.Forward();
+                atEOL = (sc.ch == '\r' && sc.chNext == '\n') || (sc.ch == '\n');
+                if (atEOL) {
+                    firstInLine = true;
+                }
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_WORD) {
+            //~ fprintf(fp,"\tWORD");
+            if (!IsAWordChar(sc.ch) || sc.ch == '%') {
+                char s[100];
+                sc.GetCurrentLowered(s, sizeof(s));
+                if (commands.InList(s) && firstInLine) {
+                    if (IsABlank(sc.ch) || sc.ch == ',' || atEOL) {
+                        sc.ChangeState(SCE_APDL_COMMAND);
+                    }
+                    if (sc.ch != '\n') {
+                        firstInLine = false;
+                    }
+                } else if (processors.InList(s)) {
+                    if (IsABlank(sc.ch) || atEOL) {
+                        sc.ChangeState(SCE_APDL_PROCESSOR);
+                        while (sc.ch != '\n') {
+                            sc.Forward();
+                        }
+                        sc.Forward();
+                    }
+                } else if (functions.InList(s)) {
+                    sc.ChangeState(SCE_APDL_FUNCTION);
+                    if (sc.ch != '\n') {
+                        firstInLine = false;
+                    }
+                } else {
+                    if (sc.ch != '\n') {
+                        firstInLine = false;
+                    }
+                }
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        }
+
+        // Determine if a new state should be entered.
+        if (sc.state == SCE_APDL_DEFAULT) {
+            if (sc.ch == '!' && sc.chNext != '!') {
+                sc.SetState(SCE_APDL_COMMENT);
+            } else if (sc.ch == '!' && sc.chNext == '!') {
+                sc.SetState(SCE_APDL_COMMENTBLOCK);
+            } else if (IsADigit(sc.ch) && !IsAWordChar(sc.chPrev)) {
+                sc.SetState(SCE_APDL_NUMBER);
+            } else if (sc.ch == '.' && (isoperator(static_cast<char>(sc.chPrev)) ||
+               IsABlank(sc.chPrev) || sc.chPrev == '\n' || sc.chPrev == '\r')) {
+                sc.SetState(SCE_APDL_NUMBER);
+            } else if (sc.ch == '\"') {
+                sc.SetState(SCE_APDL_STRING);
+            } else if (IsAWordStart(sc.ch) && (!IsADigit(sc.chPrev))) {
+                sc.SetState(SCE_APDL_WORD);
+            }
+
+        }
+        //~ fprintf(fp,"\n");
+
+        if (atEOL) {
+            firstInLine = true;
+        }
+
+    }
+    sc.Complete();
+}
+
+static const char * const apdlWordListDesc[] = {
+    "Commands",
+    "Processors",
+    "Functions",
+    0
+};
+
+LexerModule lmAPDL(SCLEX_APDL, ColouriseAPDLDoc, "apdl", 0, apdlWordListDesc);
diff --git a/contrib/src/stc/scintilla/src/LexAU3.cxx b/contrib/src/stc/scintilla/src/LexAU3.cxx
new file mode 100644 (file)
index 0000000..8bc1f06
--- /dev/null
@@ -0,0 +1,369 @@
+// Scintilla source code edit control
+// @file LexAU3.cxx
+// Lexer for AutoIt3  http://www.hiddensoft.com/autoit3
+// by Jos van der Zande, jvdzande@yahoo.com 
+//
+// Changes:
+// March 28, 2004 - Added the standard Folding code
+// April 21, 2004 - Added Preprosessor Table + Syntax Highlighting
+//                  Fixed Number highlighting
+//                  Changed default isoperator to IsAOperator to have a better match to AutoIt3
+//                  Fixed "#comments_start" -> "#comments-start"  
+//                  Fixed "#comments_end" -> "#comments-end"  
+//                  Fixed Sendkeys in Strings when not terminated with }
+//                  Added support for Sendkey strings that have second parameter e.g. {UP 5} or {a down}
+// April 26, 2004   Fixed # pre-processor statement inside of comment block would invalidly change the color.
+//                  Added logic for #include <xyz.au3> to treat the <> as string
+//                  Added underscore to IsAOperator.
+// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+// Scintilla source code edit control
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static bool IsAU3Comment(Accessor &styler, int pos, int len) {
+       return len>0 && styler[pos]==';';
+}
+
+static inline bool IsTypeCharacter(const int ch)
+{
+    return ch == '$';
+}
+static inline bool IsAWordChar(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '-');
+}
+
+static inline bool IsAWordStart(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$');
+}
+
+static inline bool IsAOperator(char ch) {
+       if (isascii(ch) && isalnum(ch))
+               return false;
+       if (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||
+           ch == '&' || ch == '^' || ch == '=' || ch == '<' || ch == '>' ||
+           ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '_' )
+               return true;
+       return false;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// GetSendKey() filters the portion before and after a/multiple space(s)
+// and return the first portion to be looked-up in the table
+// also check if the second portion is valid... (up,down.on.off,toggle or a number)
+///////////////////////////////////////////////////////////////////////////////
+
+static int GetSendKey(const char *szLine, char *szKey)
+{
+       int             nFlag   = 0;
+       int             nKeyPos = 0;
+       int             nSpecPos= 0;
+       int             nSpecNum= 1;
+       int             nPos    = 0;
+       char    cTemp;
+       char    szSpecial[100];
+
+       // split the portion of the sendkey in the part before and after the spaces
+       while ( ( (cTemp = szLine[nPos]) != '\0'))
+       {
+               if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space
+               {
+                       nFlag = 1;
+                       // Add } to the end of the first bit for table lookup later.
+                       szKey[nKeyPos++] = '}';
+               }
+               else if (cTemp == ' ')
+               {
+                       // skip other spaces 
+               }
+               else if (nFlag == 0)
+               {
+                       // save first portion into var till space or } is hit
+                       szKey[nKeyPos++] = cTemp;
+               }
+               else if ((nFlag == 1) && (cTemp != '}'))
+               {
+                       // Save second portion into var...
+                       szSpecial[nSpecPos++] = cTemp;
+                       // check if Second portion is all numbers for repeat fuction
+                       if (isdigit(cTemp) == false) {nSpecNum = 0;} 
+               }
+               nPos++;                                                                 // skip to next char
+
+       } // End While
+
+
+       // Check if the second portion is either a number or one of these keywords
+       szKey[nKeyPos] = '\0';
+       szSpecial[nSpecPos] = '\0';
+       if (strcmp(szSpecial,"down")==0    || strcmp(szSpecial,"up")==0  ||
+               strcmp(szSpecial,"on")==0      || strcmp(szSpecial,"off")==0 || 
+               strcmp(szSpecial,"toggle")==0  || nSpecNum == 1 )
+       {
+               nFlag = 0;
+       }
+       else
+       {
+               nFlag = 1;
+       }
+       return nFlag;  // 1 is bad, 0 is good
+
+} // GetSendKey()
+
+static void ColouriseAU3Doc(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];
+    styler.StartAt(startPos);
+
+    StyleContext sc(startPos, length, initStyle, styler);
+       char si;     // string indicator "=1 '=2
+       si=0;
+       //$$$
+    for (; sc.More(); sc.Forward()) {
+               char s[100];
+               sc.GetCurrentLowered(s, sizeof(s));
+               switch (sc.state)
+        {
+            case SCE_AU3_COMMENTBLOCK:
+            {
+                               if (!IsAWordChar(sc.ch))
+                               {
+                                       if ((strcmp(s, "#ce")==0 || strcmp(s, "#comments-end")==0)) 
+                                       {sc.SetState(SCE_AU3_COMMENT);}  // set to comment line for the rest of the line
+                                       else
+                                       {sc.SetState(SCE_AU3_COMMENTBLOCK);}
+                               }
+                break;
+                       }
+            case SCE_AU3_COMMENT:
+            {
+                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_OPERATOR:
+            {
+                sc.SetState(SCE_AU3_DEFAULT);
+                break;
+            }
+            case SCE_AU3_KEYWORD:
+            {
+                if (!IsAWordChar(sc.ch))
+                {
+                    if (!IsTypeCharacter(sc.ch))
+                    {
+                                               if (strcmp(s, "#cs")==0 || strcmp(s, "#comments-start")==0 )
+                                               {
+                                                       sc.ChangeState(SCE_AU3_COMMENTBLOCK);
+                                                       sc.SetState(SCE_AU3_COMMENTBLOCK);
+                                               }
+                                               else if (keywords.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_KEYWORD);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                               else if (keywords2.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_FUNCTION);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                               else if (keywords3.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_MACRO);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                               else if (keywords5.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_PREPROCESSOR);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                                       if (strcmp(s, "#include")==0)
+                                                       {
+                                                               si = 3;   // use to determine string start for #inlude <>
+                                                       }
+                                               }
+                                               else if (!IsAWordChar(sc.ch)) {
+                                                       sc.ChangeState(SCE_AU3_DEFAULT);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                       }
+                               }       
+                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_NUMBER:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_VARIABLE:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_STRING:
+            {
+                               // check for " to end a double qouted string or
+                               // check for ' to end a single qouted string 
+                   if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>'))
+                               {
+                                       sc.ForwardSetState(SCE_AU3_DEFAULT);
+                               }
+                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+                               // find Sendkeys in a STRING
+                               if (sc.ch == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               break;
+            }
+            
+            case SCE_AU3_SENT:
+            {
+                               // Send key string ended 
+                               if (sc.chPrev == '}' && sc.ch != '}') 
+                               {
+                                       // set color to SENDKEY when valid sendkey .. else set back to regular string
+                                       char sk[100];
+                                       // split {111 222} and return {111} and check if 222 is valid.
+                                       // if return code = 1 then invalid 222 so must be string
+                                       if (GetSendKey(s,sk))   
+                                       {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                       }
+                                       // if single char between {?} then its ok as sendkey for a single character
+                                       else if (strlen(sk) == 3)  
+                                       {
+                                               sc.ChangeState(SCE_AU3_SENT);
+                                       }
+                                       // if sendkey {111} is in table then ok as sendkey
+                                       else if (keywords4.InList(sk)) 
+                                       {
+                                               sc.ChangeState(SCE_AU3_SENT);
+                                       }
+                                       else
+                                       {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                       }
+                                       sc.SetState(SCE_AU3_STRING);
+                               }
+                               // check if next portion is again a sendkey
+                               if (sc.atLineEnd) 
+                               {
+                                       sc.SetState(SCE_AU3_DEFAULT);
+                                       si = 0;  // reset string indicator
+                               }
+                               if (sc.ch == '{' && sc.chPrev != '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               // check to see if the string ended...
+                               // Sentkey string isn't complete but the string ended....
+                               if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\''))
+                               {
+                                       sc.ChangeState(SCE_AU3_STRING);
+                                       sc.ForwardSetState(SCE_AU3_DEFAULT);
+                               }
+                               break;
+            }
+        }  //switch (sc.state)
+
+        // Determine if a new state should be entered:
+
+               if (sc.state == SCE_AU3_DEFAULT)
+        {
+            if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);}
+            else if (sc.ch == '#') {sc.SetState(SCE_AU3_KEYWORD);}
+            else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);}
+            else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);}
+            else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);}  // string after #include 
+            else if (sc.ch == '\"') {
+                               sc.SetState(SCE_AU3_STRING);
+                               si = 1; }
+            else if (sc.ch == '\'') {
+                               sc.SetState(SCE_AU3_STRING);
+                               si = 2; }
+            else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_AU3_NUMBER);}
+            else if (IsAOperator(static_cast<char>(sc.ch))) {sc.SetState(SCE_AU3_OPERATOR);}
+            else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);}
+                       else if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+        }
+    }      //for (; sc.More(); sc.Forward())
+    sc.Complete();
+}
+
+//
+//
+static void FoldAU3Doc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
+{
+               int endPos = startPos + length;
+
+       // Backtrack to previous line in case need to fix its fold status
+       int lineCurrent = styler.GetLine(startPos);
+       if (startPos > 0) {
+               if (lineCurrent > 0) {
+                       lineCurrent--;
+                       startPos = styler.LineStart(lineCurrent);
+               }
+       }
+       int spaceFlags = 0;
+       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsAU3Comment);
+       char chNext = styler[startPos];
+       for (int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
+                       int lev = indentCurrent;
+                       int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsAU3Comment);
+                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
+                               // Only non whitespace lines can be headers
+                               if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
+                                       lev |= SC_FOLDLEVELHEADERFLAG;
+                               } else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
+                                       // Line after is blank so check the next - maybe should continue further?
+                                       int spaceFlags2 = 0;
+                                       int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsAU3Comment);
+                                       if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+                                               lev |= SC_FOLDLEVELHEADERFLAG;
+                                       }
+                               }
+                       }
+                       indentCurrent = indentNext;
+                       styler.SetLevel(lineCurrent, lev);
+                       lineCurrent++;
+               }
+       }
+
+}
+
+
+//
+
+static const char * const AU3WordLists[] = {
+    "#autoit keywords",
+    "#autoit functions",
+    "#autoit macros",
+    "#autoit Sent keys",
+    "#autoit Pre-processors",
+    0
+};
+LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", FoldAU3Doc , AU3WordLists);
diff --git a/contrib/src/stc/scintilla/src/LexBash.cxx b/contrib/src/stc/scintilla/src/LexBash.cxx
new file mode 100644 (file)
index 0000000..abd02c4
--- /dev/null
@@ -0,0 +1,645 @@
+// Scintilla source code edit control
+/** @file LexBash.cxx
+ ** Lexer for Bash.
+ **/
+// Copyright 2004 by Neil Hodgson <neilh@scintilla.org>
+// Adapted from LexPerl by Kein-Hong Man <mkh@pl.jaring.my> 2004
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#define BASH_BASE_ERROR                65
+#define BASH_BASE_DECIMAL      66
+#define BASH_BASE_HEX          67
+#define BASH_BASE_OCTAL                68
+#define BASH_BASE_OCTAL_ERROR  69
+
+#define HERE_DELIM_MAX 256
+
+static inline int translateBashDigit(char ch) {
+       if (ch >= '0' && ch <= '9') {
+               return ch - '0';
+       } else if (ch >= 'a' && ch <= 'z') {
+               return ch - 'a' + 10;
+       } else if (ch >= 'A' && ch <= 'Z') {
+               return ch - 'A' + 36;
+       } else if (ch == '@') {
+               return 62;
+       } else if (ch == '_') {
+               return 63;
+       }
+       return BASH_BASE_ERROR;
+}
+
+static inline bool isEOLChar(char ch) {
+       return (ch == '\r') || (ch == '\n');
+}
+
+static bool isSingleCharOp(char ch) {
+       char strCharSet[2];
+       strCharSet[0] = ch;
+       strCharSet[1] = '\0';
+       return (NULL != strstr("rwxoRWXOezsfdlpSbctugkTBMACahGLNn", strCharSet));
+}
+
+static inline bool isBashOperator(char ch) {
+       if (ch == '^' || ch == '&' || ch == '\\' || ch == '%' ||
+               ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
+               ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
+               ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
+               ch == '>' || ch == ',' || ch == '/' || ch == '<' ||
+               ch == '?' || ch == '!' || ch == '.' || ch == '~' ||
+               ch == '@')
+               return true;
+       return false;
+}
+
+static int classifyWordBash(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
+       char s[100];
+       for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
+               s[i] = styler[start + i];
+               s[i + 1] = '\0';
+       }
+       char chAttr = SCE_SH_IDENTIFIER;
+       if (keywords.InList(s))
+               chAttr = SCE_SH_WORD;
+       styler.ColourTo(end, chAttr);
+       return chAttr;
+}
+
+static inline int getBashNumberBase(unsigned int start, unsigned int end, Accessor &styler) {
+       int base = 0;
+       for (unsigned int i = 0; i < end - start + 1 && i < 10; i++) {
+               base = base * 10 + (styler[start + i] - '0');
+       }
+       if (base > 64 || (end - start) > 1) {
+               return BASH_BASE_ERROR;
+       }
+       return base;
+}
+
+static inline bool isEndVar(char ch) {
+       return !isalnum(ch) && ch != '$' && ch != '_';
+}
+
+static inline bool isNonQuote(char ch) {
+       return isalnum(ch) || ch == '_';
+}
+
+static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
+       if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
+               return false;
+       }
+       while (*val) {
+               if (*val != styler[pos++]) {
+                       return false;
+               }
+               val++;
+       }
+       return true;
+}
+
+static char opposite(char ch) {
+       if (ch == '(')
+               return ')';
+       if (ch == '[')
+               return ']';
+       if (ch == '{')
+               return '}';
+       if (ch == '<')
+               return '>';
+       return ch;
+}
+
+static void ColouriseBashDoc(unsigned int startPos, int length, int initStyle,
+                             WordList *keywordlists[], Accessor &styler) {
+
+       // Lexer for bash often has to backtrack to start of current style to determine
+       // which characters are being used as quotes, how deeply nested is the
+       // start position and what the termination string is for here documents
+
+       WordList &keywords = *keywordlists[0];
+
+       class HereDocCls {
+       public:
+               int State;              // 0: '<<' encountered
+               // 1: collect the delimiter
+               // 2: here doc text (lines after the delimiter)
+               char Quote;             // the char after '<<'
+               bool Quoted;            // true if Quote in ('\'','"','`')
+               bool Indent;            // indented delimiter (for <<-)
+               int DelimiterLength;    // strlen(Delimiter)
+               char *Delimiter;        // the Delimiter, 256: sizeof PL_tokenbuf
+               HereDocCls() {
+                       State = 0;
+                       DelimiterLength = 0;
+                       Delimiter = new char[HERE_DELIM_MAX];
+                       Delimiter[0] = '\0';
+               }
+               ~HereDocCls() {
+                       delete []Delimiter;
+               }
+       };
+       HereDocCls HereDoc;
+
+       class QuoteCls {
+               public:
+               int  Rep;
+               int  Count;
+               char Up;
+               char Down;
+               QuoteCls() {
+                       this->New(1);
+               }
+               void New(int r) {
+                       Rep   = r;
+                       Count = 0;
+                       Up    = '\0';
+                       Down  = '\0';
+               }
+               void Open(char u) {
+                       Count++;
+                       Up    = u;
+                       Down  = opposite(Up);
+               }
+       };
+       QuoteCls Quote;
+
+       int state = initStyle;
+       int numBase = 0;
+       unsigned int lengthDoc = startPos + length;
+
+       // If in a long distance lexical state, seek to the beginning to find quote characters
+       // Bash strings can be multi-line with embedded newlines, so backtrack.
+       // Bash numbers have additional state during lexing, so backtrack too.
+       if (state == SCE_SH_HERE_Q) {
+               while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_SH_HERE_DELIM)) {
+                       startPos--;
+               }
+               startPos = styler.LineStart(styler.GetLine(startPos));
+               state = styler.StyleAt(startPos - 1);
+       }
+       if (state == SCE_SH_STRING
+        || state == SCE_SH_BACKTICKS
+        || state == SCE_SH_CHARACTER
+        || state == SCE_SH_NUMBER
+        || state == SCE_SH_IDENTIFIER
+        || state == SCE_SH_COMMENTLINE
+       ) {
+               while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
+                       startPos--;
+               }
+               state = SCE_SH_DEFAULT;
+       }
+
+       styler.StartAt(startPos);
+       char chPrev = styler.SafeGetCharAt(startPos - 1);
+       if (startPos == 0)
+               chPrev = '\n';
+       char chNext = styler[startPos];
+       styler.StartSegment(startPos);
+
+       for (unsigned int i = startPos; i < lengthDoc; i++) {
+               char ch = chNext;
+               // if the current character is not consumed due to the completion of an
+               // earlier style, lexing can be restarted via a simple goto
+       restartLexer:
+               chNext = styler.SafeGetCharAt(i + 1);
+               char chNext2 = styler.SafeGetCharAt(i + 2);
+
+               if (styler.IsLeadByte(ch)) {
+                       chNext = styler.SafeGetCharAt(i + 2);
+                       chPrev = ' ';
+                       i += 1;
+                       continue;
+               }
+
+               if ((chPrev == '\r' && ch == '\n')) {   // skip on DOS/Windows
+                       styler.ColourTo(i, state);
+                       chPrev = ch;
+                       continue;
+               }
+
+               if (HereDoc.State == 1 && isEOLChar(ch)) {
+                       // Begin of here-doc (the line after the here-doc delimiter):
+                       // Lexically, the here-doc starts from the next line after the >>, but the
+                       // first line of here-doc seem to follow the style of the last EOL sequence
+                       HereDoc.State = 2;
+                       if (HereDoc.Quoted) {
+                               if (state == SCE_SH_HERE_DELIM) {
+                                       // Missing quote at end of string! We are stricter than bash.
+                                       // Colour here-doc anyway while marking this bit as an error.
+                                       state = SCE_SH_ERROR;
+                               }
+                               styler.ColourTo(i - 1, state);
+                               // HereDoc.Quote always == '\''
+                               state = SCE_SH_HERE_Q;
+                       } else {
+                               styler.ColourTo(i - 1, state);
+                               // always switch
+                               state = SCE_SH_HERE_Q;
+                       }
+               }
+
+               if (state == SCE_SH_DEFAULT) {
+                       if (ch == '\\') {       // escaped character
+                               i++;
+                               ch = chNext;
+                               chNext = chNext2;
+                               styler.ColourTo(i, SCE_SH_IDENTIFIER);
+                       } else if (isdigit(ch)) {
+                               state = SCE_SH_NUMBER;
+                               numBase = BASH_BASE_DECIMAL;
+                               if (ch == '0') {        // hex,octal
+                                       if (chNext == 'x' || chNext == 'X') {
+                                               numBase = BASH_BASE_HEX;
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       } else if (isdigit(chNext)) {
+                                               numBase = BASH_BASE_OCTAL;
+                                       }
+                               }
+                       } else if (iswordstart(ch)) {
+                               state = SCE_SH_WORD;
+                               if (!iswordchar(chNext) && chNext != '+' && chNext != '-') {
+                                       // We need that if length of word == 1!
+                                       // This test is copied from the SCE_SH_WORD handler.
+                                       classifyWordBash(styler.GetStartSegment(), i, keywords, styler);
+                                       state = SCE_SH_DEFAULT;
+                               }
+                       } else if (ch == '#') {
+                               state = SCE_SH_COMMENTLINE;
+                       } else if (ch == '\"') {
+                               state = SCE_SH_STRING;
+                               Quote.New(1);
+                               Quote.Open(ch);
+                       } else if (ch == '\'') {
+                               state = SCE_SH_CHARACTER;
+                               Quote.New(1);
+                               Quote.Open(ch);
+                       } else if (ch == '`') {
+                               state = SCE_SH_BACKTICKS;
+                               Quote.New(1);
+                               Quote.Open(ch);
+                       } else if (ch == '$') {
+                               if (chNext == '{') {
+                                       state = SCE_SH_PARAM;
+                                       goto startQuote;
+                               } else if (chNext == '\'') {
+                                       state = SCE_SH_CHARACTER;
+                                       goto startQuote;
+                               } else if (chNext == '"') {
+                                       state = SCE_SH_STRING;
+                                       goto startQuote;
+                               } else if (chNext == '(' && chNext2 == '(') {
+                                       styler.ColourTo(i, SCE_SH_OPERATOR);
+                                       state = SCE_SH_DEFAULT;
+                                       goto skipChar;
+                               } else if (chNext == '(' || chNext == '`') {
+                                       state = SCE_SH_BACKTICKS;
+                               startQuote:
+                                       Quote.New(1);
+                                       Quote.Open(chNext);
+                                       goto skipChar;
+                               } else {
+                                       state = SCE_SH_SCALAR;
+                               skipChar:
+                                       i++;
+                                       ch = chNext;
+                                       chNext = chNext2;
+                               }
+                       } else if (ch == '*') {
+                               if (chNext == '*') {    // exponentiation
+                                       i++;
+                                       ch = chNext;
+                                       chNext = chNext2;
+                               }
+                               styler.ColourTo(i, SCE_SH_OPERATOR);
+                       } else if (ch == '<' && chNext == '<') {
+                               state = SCE_SH_HERE_DELIM;
+                               HereDoc.State = 0;
+                               HereDoc.Indent = false;
+                       } else if (ch == '-'    // file test operators
+                                  && isSingleCharOp(chNext)
+                                  && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
+                               styler.ColourTo(i + 1, SCE_SH_WORD);
+                               state = SCE_SH_DEFAULT;
+                               i++;
+                               ch = chNext;
+                               chNext = chNext2;
+                       } else if (isBashOperator(ch)) {
+                               styler.ColourTo(i, SCE_SH_OPERATOR);
+                       } else {
+                               // keep colouring defaults to make restart easier
+                               styler.ColourTo(i, SCE_SH_DEFAULT);
+                       }
+               } else if (state == SCE_SH_NUMBER) {
+                       int digit = translateBashDigit(ch);
+                       if (numBase == BASH_BASE_DECIMAL) {
+                               if (ch == '#') {
+                                       numBase = getBashNumberBase(styler.GetStartSegment(), i - 1, styler);
+                                       if (numBase == BASH_BASE_ERROR) // take the rest as comment
+                                               goto numAtEnd;
+                               } else if (!isdigit(ch))
+                                       goto numAtEnd;
+                       } else if (numBase == BASH_BASE_HEX) {
+                               if ((digit < 16) || (digit >= 36 && digit <= 41)) {
+                                       // hex digit 0-9a-fA-F
+                               } else
+                                       goto numAtEnd;
+                       } else if (numBase == BASH_BASE_OCTAL ||
+                                  numBase == BASH_BASE_OCTAL_ERROR) {
+                               if (digit > 7) {
+                                       if (digit <= 9) {
+                                               numBase = BASH_BASE_OCTAL_ERROR;
+                                       } else
+                                               goto numAtEnd;
+                               }
+                       } else if (numBase == BASH_BASE_ERROR) {
+                               if (digit > 9)
+                                       goto numAtEnd;
+                       } else {        // DD#DDDD number style handling
+                               if (digit != BASH_BASE_ERROR) {
+                                       if (numBase <= 36) {
+                                               // case-insensitive if base<=36
+                                               if (digit >= 36) digit -= 26;
+                                       }
+                                       if (digit >= numBase) {
+                                               if (digit <= 9) {
+                                                       numBase = BASH_BASE_ERROR;
+                                               } else
+                                                       goto numAtEnd;
+                                       }
+                               } else {
+                       numAtEnd:
+                                       if (numBase == BASH_BASE_ERROR ||
+                                           numBase == BASH_BASE_OCTAL_ERROR)
+                                               state = SCE_SH_ERROR;
+                                       styler.ColourTo(i - 1, state);
+                                       state = SCE_SH_DEFAULT;
+                                       goto restartLexer;
+                               }
+                       }
+               } else if (state == SCE_SH_WORD) {
+                       if (!iswordchar(chNext) && chNext != '+' && chNext != '-') {
+                               // "." never used in Bash variable names
+                               // but used in file names
+                               classifyWordBash(styler.GetStartSegment(), i, keywords, styler);
+                               state = SCE_SH_DEFAULT;
+                               ch = ' ';
+                       }
+               } else if (state == SCE_SH_IDENTIFIER) {
+                       if (!iswordchar(chNext) && chNext != '+' && chNext != '-') {
+                               styler.ColourTo(i, SCE_SH_IDENTIFIER);
+                               state = SCE_SH_DEFAULT;
+                               ch = ' ';
+                       }
+               } else {
+                       if (state == SCE_SH_COMMENTLINE) {
+                               if (ch == '\\' && isEOLChar(chNext)) {
+                                       // comment continuation
+                                       if (chNext == '\r' && chNext2 == '\n') {
+                                               i += 2;
+                                               ch = styler.SafeGetCharAt(i);
+                                               chNext = styler.SafeGetCharAt(i + 1);
+                                       } else {
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       }
+                               } else if (isEOLChar(ch)) {
+                                       styler.ColourTo(i - 1, state);
+                                       state = SCE_SH_DEFAULT;
+                                       goto restartLexer;
+                               } else if (isEOLChar(chNext)) {
+                                       styler.ColourTo(i, state);
+                                       state = SCE_SH_DEFAULT;
+                               }
+                       } else if (state == SCE_SH_HERE_DELIM) {
+                               //
+                               // From Bash info:
+                               // ---------------
+                               // Specifier format is: <<[-]WORD
+                               // Optional '-' is for removal of leading tabs from here-doc.
+                               // Whitespace acceptable after <<[-] operator
+                               //
+                               if (HereDoc.State == 0) { // '<<' encountered
+                                       HereDoc.State = 1;
+                                       HereDoc.Quote = chNext;
+                                       HereDoc.Quoted = false;
+                                       HereDoc.DelimiterLength = 0;
+                                       HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+                                       if (chNext == '\'') {   // a quoted here-doc delimiter (' only)
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                               HereDoc.Quoted = true;
+                                       } else if (!HereDoc.Indent && chNext == '-') {  // <<- indent case
+                                               HereDoc.Indent = true;
+                                               HereDoc.State = 0;
+                                       } else if (isalpha(chNext) || chNext == '_' || chNext == '\\'
+                                               || chNext == '-' || chNext == '+') {
+                                               // an unquoted here-doc delimiter, no special handling
+                                       } else if (chNext == '<') {     // HERE string <<<
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                               styler.ColourTo(i, SCE_SH_HERE_DELIM);
+                                               state = SCE_SH_DEFAULT;
+                                               HereDoc.State = 0;
+                                       } else if (isspacechar(chNext)) {
+                                               // eat whitespace
+                                               HereDoc.State = 0;
+                                       } else if (isdigit(chNext) || chNext == '=' || chNext == '$') {
+                                               // left shift << or <<= operator cases
+                                               styler.ColourTo(i, SCE_SH_OPERATOR);
+                                               state = SCE_SH_DEFAULT;
+                                               HereDoc.State = 0;
+                                       } else {
+                                               // symbols terminates; deprecated zero-length delimiter
+                                       }
+                               } else if (HereDoc.State == 1) { // collect the delimiter
+                                       if (HereDoc.Quoted) { // a quoted here-doc delimiter
+                                               if (ch == HereDoc.Quote) { // closing quote => end of delimiter
+                                                       styler.ColourTo(i, state);
+                                                       state = SCE_SH_DEFAULT;
+                                               } else {
+                                                       if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote
+                                                               i++;
+                                                               ch = chNext;
+                                                               chNext = chNext2;
+                                                       }
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+                                               }
+                                       } else { // an unquoted here-doc delimiter
+                                               if (isalnum(ch) || ch == '_' || ch == '-' || ch == '+') {
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+                                               } else if (ch == '\\') {
+                                                       // skip escape prefix
+                                               } else {
+                                                       styler.ColourTo(i - 1, state);
+                                                       state = SCE_SH_DEFAULT;
+                                                       goto restartLexer;
+                                               }
+                                       }
+                                       if (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) {
+                                               styler.ColourTo(i - 1, state);
+                                               state = SCE_SH_ERROR;
+                                               goto restartLexer;
+                                       }
+                               }
+                       } else if (HereDoc.State == 2) {
+                               // state == SCE_SH_HERE_Q
+                               if (isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {
+                                       if (!HereDoc.Indent && isEOLChar(chPrev)) {
+                                       endHereDoc:
+                                               // standard HERE delimiter
+                                               i += HereDoc.DelimiterLength;
+                                               chPrev = styler.SafeGetCharAt(i - 1);
+                                               ch = styler.SafeGetCharAt(i);
+                                               if (isEOLChar(ch)) {
+                                                       styler.ColourTo(i - 1, state);
+                                                       state = SCE_SH_DEFAULT;
+                                                       HereDoc.State = 0;
+                                                       goto restartLexer;
+                                               }
+                                               chNext = styler.SafeGetCharAt(i + 1);
+                                       } else if (HereDoc.Indent) {
+                                               // indented HERE delimiter
+                                               unsigned int bk = (i > 0)? i - 1: 0;
+                                               while (i > 0) {
+                                                       ch = styler.SafeGetCharAt(bk--);
+                                                       if (isEOLChar(ch)) {
+                                                               goto endHereDoc;
+                                                       } else if (!isspacechar(ch)) {
+                                                               break;  // got leading non-whitespace
+                                                       }
+                                               }
+                                       }
+                               }
+                       } else if (state == SCE_SH_SCALAR) {    // variable names
+                               if (isEndVar(ch)) {
+                                       if ((state == SCE_SH_SCALAR)
+                                           && i == (styler.GetStartSegment() + 1)) {
+                                               // Special variable: $(, $_ etc.
+                                               styler.ColourTo(i, state);
+                                               state = SCE_SH_DEFAULT;
+                                       } else {
+                                               styler.ColourTo(i - 1, state);
+                                               state = SCE_SH_DEFAULT;
+                                               goto restartLexer;
+                                       }
+                               }
+                       } else if (state == SCE_SH_STRING
+                               || state == SCE_SH_CHARACTER
+                               || state == SCE_SH_BACKTICKS
+                               || state == SCE_SH_PARAM
+                               ) {
+                               if (!Quote.Down && !isspacechar(ch)) {
+                                       Quote.Open(ch);
+                               } else if (ch == '\\' && Quote.Up != '\\') {
+                                       i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               } else if (ch == Quote.Down) {
+                                       Quote.Count--;
+                                       if (Quote.Count == 0) {
+                                               Quote.Rep--;
+                                               if (Quote.Rep <= 0) {
+                                                       styler.ColourTo(i, state);
+                                                       state = SCE_SH_DEFAULT;
+                                                       ch = ' ';
+                                               }
+                                               if (Quote.Up == Quote.Down) {
+                                                       Quote.Count++;
+                                               }
+                                       }
+                               } else if (ch == Quote.Up) {
+                                       Quote.Count++;
+                               }
+                       }
+               }
+               if (state == SCE_SH_ERROR) {
+                       break;
+               }
+               chPrev = ch;
+       }
+       styler.ColourTo(lengthDoc - 1, state);
+}
+
+static void FoldBashDoc(unsigned int startPos, int length, int, WordList *[],
+                            Accessor &styler) {
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+       int levelCurrent = levelPrev;
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               int style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if (foldComment && (style == SCE_SH_COMMENTLINE)) {
+                       if ((ch == '/') && (chNext == '/')) {
+                               char chNext2 = styler.SafeGetCharAt(i + 2);
+                               if (chNext2 == '{') {
+                                       levelCurrent++;
+                               } else if (chNext2 == '}') {
+                                       levelCurrent--;
+                               }
+                       }
+               }
+               if (style == SCE_C_OPERATOR) {
+                       if (ch == '{') {
+                               levelCurrent++;
+                       } else if (ch == '}') {
+                               levelCurrent--;
+                       }
+               }
+               if (atEOL) {
+                       int lev = levelPrev;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if ((levelCurrent > levelPrev) && (visibleChars > 0))
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelPrev = levelCurrent;
+                       visibleChars = 0;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+       // Fill in the real level of the next line, keeping the current flags as they will be filled in later
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+}
+
+static const char * const bashWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+LexerModule lmBash(SCLEX_BASH, ColouriseBashDoc, "bash", FoldBashDoc, bashWordListDesc);
diff --git a/contrib/src/stc/scintilla/src/LexGui4Cli.cxx b/contrib/src/stc/scintilla/src/LexGui4Cli.cxx
new file mode 100644 (file)
index 0000000..2e3c02c
--- /dev/null
@@ -0,0 +1,309 @@
+// Scintilla source code edit control
+// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+/*
+This is the Lexer for Gui4Cli, included in SciLexer.dll
+- by d. Keletsekis, 2/10/2003
+
+To add to SciLexer.dll:
+1. Add the values below to INCLUDE\Scintilla.iface
+2. Run the include/HFacer.py script
+3. Run the src/lexGen.py script
+
+val SCE_GC_DEFAULT=0
+val SCE_GC_COMMENTLINE=1
+val SCE_GC_COMMENTBLOCK=2
+val SCE_GC_GLOBAL=3
+val SCE_GC_EVENT=4
+val SCE_GC_ATTRIBUTE=5
+val SCE_GC_CONTROL=6
+val SCE_GC_COMMAND=7
+val SCE_GC_STRING=8
+val SCE_GC_OPERATOR=9
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#define debug Platform::DebugPrintf
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
+}
+
+inline bool isGCOperator(int ch)
+{      if (isalnum(ch))
+               return false;
+       // '.' left out as it is used to make up numbers
+       if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
+                ch == '(' || ch == ')' || ch == '=' || ch == '%' ||
+                ch == '[' || ch == ']' || ch == '<' || ch == '>' ||
+                ch == ',' || ch == ';' || ch == ':')
+               return true;
+       return false;
+}
+
+#define isSpace(x)             ((x)==' ' || (x)=='\t')
+#define isNL(x)                        ((x)=='\n' || (x)=='\r')
+#define isSpaceOrNL(x)  (isSpace(x) || isNL(x))
+#define BUFFSIZE 500
+#define isFoldPoint(x)  ((styler.LevelAt(x) & SC_FOLDLEVELNUMBERMASK) == 1024)
+
+static void colorFirstWord(WordList *keywordlists[], Accessor &styler,
+                                                                       StyleContext *sc, char *buff, int length, int)
+{
+       int c = 0;
+       while (sc->More() && isSpaceOrNL(sc->ch))
+       {       sc->Forward();
+       }
+       styler.ColourTo(sc->currentPos - 1, sc->state);
+
+       if (!IsAWordChar(sc->ch)) // comment, marker, etc..
+               return;
+
+       while (sc->More() && !isSpaceOrNL(sc->ch) && (c < length-1) && !isGCOperator(sc->ch))
+       {       buff[c] = static_cast<char>(sc->ch);
+               ++c; sc->Forward();
+       }
+       buff[c] = '\0';
+       char *p = buff;
+       while (*p)      // capitalize..
+       {       if (islower(*p)) *p = static_cast<char>(toupper(*p));
+               ++p;
+       }
+
+       WordList &kGlobal               = *keywordlists[0];     // keyword lists set by the user
+       WordList &kEvent                = *keywordlists[1];
+       WordList &kAttribute    = *keywordlists[2];
+       WordList &kControl      = *keywordlists[3];
+       WordList &kCommand      = *keywordlists[4];
+
+       int state = 0;
+       // int level = styler.LevelAt(line) & SC_FOLDLEVELNUMBERMASK;
+       // debug ("line = %d, level = %d", line, level);
+
+       if           (kGlobal.InList(buff))             state = SCE_GC_GLOBAL;
+       else if (kAttribute.InList(buff))       state = SCE_GC_ATTRIBUTE;
+       else if (kControl.InList(buff))         state = SCE_GC_CONTROL;
+       else if (kCommand.InList(buff))         state = SCE_GC_COMMAND;
+       else if (kEvent.InList(buff))                   state = SCE_GC_EVENT;
+
+       if (state)
+       {       sc->ChangeState(state);
+               styler.ColourTo(sc->currentPos - 1, sc->state);
+               sc->ChangeState(SCE_GC_DEFAULT);
+       }
+       else
+       {       sc->ChangeState(SCE_GC_DEFAULT);
+               styler.ColourTo(sc->currentPos - 1, sc->state);
+       }
+}
+
+// Main colorizing function called by Scintilla
+static void
+ColouriseGui4CliDoc(unsigned int startPos, int length, int initStyle,
+                    WordList *keywordlists[], Accessor &styler)
+{
+       styler.StartAt(startPos);
+
+       int quotestart = 0, oldstate, currentline = styler.GetLine(startPos);
+       styler.StartSegment(startPos);
+       bool noforward;
+       char buff[BUFFSIZE+1];  // buffer for command name
+
+       StyleContext sc(startPos, length, initStyle, styler);
+       buff[0] = '\0'; // cbuff = 0;
+
+       if (sc.state != SCE_GC_COMMENTBLOCK) // colorize 1st word..
+               colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);
+
+       while (sc.More())
+       {       noforward = 0;
+
+               switch (sc.ch)
+               {
+                       case '/':
+                               if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_STRING)
+                                       break;
+                               if (sc.chNext == '/')   // line comment
+                               {       sc.SetState (SCE_GC_COMMENTLINE);
+                                       sc.Forward();
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               }
+                               else if (sc.chNext == '*')      // block comment
+                               {       sc.SetState(SCE_GC_COMMENTBLOCK);
+                                       sc.Forward();
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               }
+                               else
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               break;
+
+                       case '*':       // end of comment block, or operator..
+                               if (sc.state == SCE_GC_STRING)
+                                       break;
+                               if (sc.state == SCE_GC_COMMENTBLOCK && sc.chNext == '/')
+                               {       sc.Forward();
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                                       sc.ChangeState (SCE_GC_DEFAULT);
+                               }
+                               else
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               break;
+
+                       case '\'':      case '\"': // strings..
+                               if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_COMMENTLINE)
+                                       break;
+                               if (sc.state == SCE_GC_STRING)
+                               {       if (sc.ch == quotestart)        // match same quote char..
+                                       {       styler.ColourTo(sc.currentPos, sc.state);
+                                               sc.ChangeState(SCE_GC_DEFAULT);
+                                               quotestart = 0;
+                               }       }
+                               else
+                               {       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       sc.ChangeState(SCE_GC_STRING);
+                                       quotestart = sc.ch;
+                               }
+                               break;
+
+                       case ';':       // end of commandline character
+                               if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE &&
+                                        sc.state != SCE_GC_STRING)
+                               {
+                                       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);
+                                       sc.ChangeState(SCE_GC_DEFAULT);
+                                       sc.Forward();
+                                       colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);
+                                       noforward = 1; // don't move forward - already positioned at next char..
+                               }
+                               break;
+
+                       case '+': case '-': case '=':   case '!':       // operators..
+                       case '<': case '>': case '&': case '|': case '$':
+                               if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE &&
+                                        sc.state != SCE_GC_STRING)
+                               {
+                                       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);
+                                       sc.ChangeState(SCE_GC_DEFAULT);
+                               }
+                               break;
+
+                       case '\\':      // escape - same as operator, but also mark in strings..
+                               if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE)
+                               {
+                                       oldstate = sc.state;
+                                       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       sc.Forward(); // mark also the next char..
+                                       styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);
+                                       sc.ChangeState(oldstate);
+                               }
+                               break;
+
+                       case '\n': case '\r':
+                               ++currentline;
+                               if (sc.state == SCE_GC_COMMENTLINE)
+                               {       styler.ColourTo(sc.currentPos, sc.state);
+                                       sc.ChangeState (SCE_GC_DEFAULT);
+                               }
+                               else if (sc.state != SCE_GC_COMMENTBLOCK)
+                               {       colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);
+                                       noforward = 1; // don't move forward - already positioned at next char..
+                               }
+                               break;
+
+//                     case ' ': case '\t':
+//                     default :
+               }
+
+               if (!noforward) sc.Forward();
+
+       }
+       styler.ColourTo(sc.currentPos, sc.state);
+}
+
+// Main folding function called by Scintilla - (based on props (.ini) files function)
+static void FoldGui4Cli(unsigned int startPos, int length, int,
+                                                               WordList *[], Accessor &styler)
+{
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       bool headerPoint = false;
+
+       for (unsigned int i = startPos; i < endPos; i++)
+       {
+               char ch = chNext;
+               chNext = styler[i+1];
+
+               int style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+
+               if (style == SCE_GC_EVENT || style == SCE_GC_GLOBAL)
+               {       headerPoint = true; // fold at events and globals
+               }
+
+               if (atEOL)
+               {       int lev = SC_FOLDLEVELBASE+1;
+
+                       if (headerPoint)
+                               lev = SC_FOLDLEVELBASE;
+
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+
+                       if (headerPoint)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+
+                       if (lev != styler.LevelAt(lineCurrent)) // set level, if not already correct
+                       {       styler.SetLevel(lineCurrent, lev);
+                       }
+
+                       lineCurrent++;          // re-initialize our flags
+                       visibleChars = 0;
+                       headerPoint = false;
+               }
+
+               if (!(isspacechar(ch))) // || (style == SCE_GC_COMMENTLINE) || (style != SCE_GC_COMMENTBLOCK)))
+                       visibleChars++;
+       }
+
+       int lev = headerPoint ? SC_FOLDLEVELBASE : SC_FOLDLEVELBASE+1;
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, lev | flagsNext);
+}
+
+// I have no idea what these are for.. probably accessible by some message.
+static const char * const gui4cliWordListDesc[] = {
+       "Globals", "Events", "Attributes", "Control", "Commands",
+       0
+};
+
+// Declare language & pass our function pointers to Scintilla
+LexerModule lmGui4Cli(SCLEX_GUI4CLI, ColouriseGui4CliDoc, "gui4cli", FoldGui4Cli, gui4cliWordListDesc);
+
+#undef debug
+
index e442054b36275965101a3e0d0100ace166727639..d2cd30f60e2ee44335d3806f317b9cc63b51e755 100644 (file)
@@ -145,6 +145,8 @@ static inline bool isStringState(int state) {
        case SCE_HPA_STRING:
        case SCE_HPHP_HSTRING:
        case SCE_HPHP_SIMPLESTRING:
        case SCE_HPA_STRING:
        case SCE_HPHP_HSTRING:
        case SCE_HPHP_SIMPLESTRING:
+       case SCE_HPHP_HSTRING_VARIABLE:
+       case SCE_HPHP_COMPLEX_VARIABLE:
                bResult = true;
                break;
        default :
                bResult = true;
                break;
        default :
@@ -416,7 +418,21 @@ static bool isPHPStringState(int state) {
        return
            (state == SCE_HPHP_HSTRING) ||
            (state == SCE_HPHP_SIMPLESTRING) ||
        return
            (state == SCE_HPHP_HSTRING) ||
            (state == SCE_HPHP_SIMPLESTRING) ||
-           (state == SCE_HPHP_HSTRING_VARIABLE);
+           (state == SCE_HPHP_HSTRING_VARIABLE) ||
+           (state == SCE_HPHP_COMPLEX_VARIABLE);
+}
+
+static int FindPhpStringDelimiter(char *phpStringDelimiter, const int phpStringDelimiterSize, int i, const int lengthDoc, Accessor &styler) {
+       int j;
+       phpStringDelimiter[0] = '\n';
+       for (j = i; j < lengthDoc && styler[j] != '\n' && styler[j] != '\r'; j++) {
+               if (j - i < phpStringDelimiterSize - 2)
+                       phpStringDelimiter[j-i+1] = styler[j];
+               else
+                       i++;
+       }
+       phpStringDelimiter[j-i+1] = '\0';
+       return j;
 }
 
 static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
 }
 
 static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
@@ -432,6 +448,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
        styler.StartAt(startPos, STYLE_MAX);
        char prevWord[200];
        prevWord[0] = '\0';
        styler.StartAt(startPos, STYLE_MAX);
        char prevWord[200];
        prevWord[0] = '\0';
+       char phpStringDelimiter[200]; // PHP is not limited in length, we are
+       phpStringDelimiter[0] = '\0';
        int StateToPrint = initStyle;
        int state = stateForPrintState(StateToPrint);
 
        int StateToPrint = initStyle;
        int state = stateForPrintState(StateToPrint);
 
@@ -443,6 +461,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                }
                state = SCE_H_DEFAULT;
        }
                }
                state = SCE_H_DEFAULT;
        }
+       // String can be heredoc, must find a delimiter first
+       while (startPos > 0 && isPHPStringState(state) && state != SCE_HPHP_SIMPLESTRING) {
+               startPos--;
+               length++;
+               state = styler.StyleAt(startPos);
+       }
        styler.StartAt(startPos, STYLE_MAX);
 
        int lineCurrent = styler.GetLine(startPos);
        styler.StartAt(startPos, STYLE_MAX);
 
        int lineCurrent = styler.GetLine(startPos);
@@ -930,7 +954,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_H_DEFAULT;
                        }
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_H_DEFAULT;
                        }
-                       if (ch != '#' && !(isascii(ch) && isalnum(ch))) {       // Should check that '#' follows '&', but it is unlikely anyway...
+                       if (ch != '#' && !(isascii(ch) && isalnum(ch))  // Should check that '#' follows '&', but it is unlikely anyway...
+                               && ch != '.' && ch != '-' && ch != '_' && ch != ':') { // valid in XML
                                styler.ColourTo(i, SCE_H_TAGUNKNOWN);
                                state = SCE_H_DEFAULT;
                        }
                                styler.ColourTo(i, SCE_H_TAGUNKNOWN);
                                state = SCE_H_DEFAULT;
                        }
@@ -1454,6 +1479,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                        state = SCE_HPHP_COMMENTLINE;
                                } else if (ch == '\"') {
                                        state = SCE_HPHP_HSTRING;
                                        state = SCE_HPHP_COMMENTLINE;
                                } else if (ch == '\"') {
                                        state = SCE_HPHP_HSTRING;
+                                       strcpy(phpStringDelimiter, "\"");
+                               } else if (styler.Match(i, "<<<")) {
+                                       state = SCE_HPHP_HSTRING;
+                                       i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler);
                                } else if (ch == '\'') {
                                        state = SCE_HPHP_SIMPLESTRING;
                                } else if (ch == '$' && IsPhpWordStart(chNext)) {
                                } else if (ch == '\'') {
                                        state = SCE_HPHP_SIMPLESTRING;
                                } else if (ch == '$' && IsPhpWordStart(chNext)) {
@@ -1496,13 +1525,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                        }
                        break;
                case SCE_HPHP_HSTRING:
                        }
                        break;
                case SCE_HPHP_HSTRING:
-                       if (ch == '\\') {
+                       if (ch == '\\' && (phpStringDelimiter[0] == '\"' || chNext == '$' || chNext == '{')) {
                                // skip the next char
                                i++;
                                // skip the next char
                                i++;
+                       } else if (((ch == '{' && chNext == '$') || (ch == '$' && chNext == '{'))
+                               && IsPhpWordStart(chNext2)) {
+                               styler.ColourTo(i - 1, StateToPrint);
+                               state = SCE_HPHP_COMPLEX_VARIABLE;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
                                styler.ColourTo(i - 1, StateToPrint);
                                state = SCE_HPHP_HSTRING_VARIABLE;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
                                styler.ColourTo(i - 1, StateToPrint);
                                state = SCE_HPHP_HSTRING_VARIABLE;
-                       } else if (ch == '\"') {
+                       } else if (styler.Match(i, phpStringDelimiter)) {
+                               if (strlen(phpStringDelimiter) > 1)
+                                       i += strlen(phpStringDelimiter) - 1;
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_HPHP_DEFAULT;
                        }
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_HPHP_DEFAULT;
                        }
@@ -1523,6 +1558,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                state = SCE_HPHP_HSTRING;
                        }
                        break;
                                state = SCE_HPHP_HSTRING;
                        }
                        break;
+               case SCE_HPHP_COMPLEX_VARIABLE:
+                       if (ch == '}') {
+                               styler.ColourTo(i, StateToPrint);
+                               state = SCE_HPHP_HSTRING;
+                       }
+                       break;
                case SCE_HPHP_OPERATOR:
                case SCE_HPHP_DEFAULT:
                        styler.ColourTo(i - 1, StateToPrint);
                case SCE_HPHP_OPERATOR:
                case SCE_HPHP_DEFAULT:
                        styler.ColourTo(i - 1, StateToPrint);
@@ -1540,6 +1581,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                state = SCE_HPHP_COMMENTLINE;
                        } else if (ch == '\"') {
                                state = SCE_HPHP_HSTRING;
                                state = SCE_HPHP_COMMENTLINE;
                        } else if (ch == '\"') {
                                state = SCE_HPHP_HSTRING;
+                               strcpy(phpStringDelimiter, "\"");
+                       } else if (styler.Match(i, "<<<")) {
+                               state = SCE_HPHP_HSTRING;
+                               i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler);
                        } else if (ch == '\'') {
                                state = SCE_HPHP_SIMPLESTRING;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
                        } else if (ch == '\'') {
                                state = SCE_HPHP_SIMPLESTRING;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
@@ -1675,7 +1720,8 @@ static void ColouriseHTMLPiece(StyleContext &sc, WordList *keywordlists[]) {
        } else if (sc.state == SCE_H_ENTITY) {
                if (sc.ch == ';') {
                        sc.ForwardSetState(SCE_H_DEFAULT);
        } else if (sc.state == SCE_H_ENTITY) {
                if (sc.ch == ';') {
                        sc.ForwardSetState(SCE_H_DEFAULT);
-               } else if (sc.ch != '#' && (sc.ch < 0x80) && !isalnum(sc.ch)) { // Should check that '#' follows '&', but it is unlikely anyway...
+               } else if (sc.ch != '#' && (sc.ch < 0x80) && !isalnum(sc.ch)    // Should check that '#' follows '&', but it is unlikely anyway...
+                       && sc.ch != '.' && sc.ch != '-' && sc.ch != '_' && sc.ch != ':') { // valid in XML
                        sc.ChangeState(SCE_H_TAGUNKNOWN);
                        sc.SetState(SCE_H_DEFAULT);
                }
                        sc.ChangeState(SCE_H_TAGUNKNOWN);
                        sc.SetState(SCE_H_DEFAULT);
                }
diff --git a/contrib/src/stc/scintilla/src/LexKix.cxx b/contrib/src/stc/scintilla/src/LexKix.cxx
new file mode 100644 (file)
index 0000000..e439d4d
--- /dev/null
@@ -0,0 +1,122 @@
+// Scintilla source code edit control
+/** @file LexKix.cxx
+ ** Lexer for KIX-Scripts.
+ **/
+// Copyright 2004 by Manfred Becker <manfred@becker-trdf.de>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+// Extended to accept accented characters
+static inline bool IsAWordChar(int ch) {
+       return ch >= 0x80 || isalnum(ch) || ch == '_';
+}
+
+static inline bool IsOperator(const int ch) {
+       return (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '&' || ch == '|' || ch == '<' || ch == '>' || ch == '=');
+}
+
+static void ColouriseKixDoc(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];
+
+       styler.StartAt(startPos);
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.state == SCE_KIX_COMMENT) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_STRING1) {
+                       // This is a doubles quotes string
+                       if (sc.ch == '\"') {
+                               sc.ForwardSetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_STRING2) {
+                       // This is a single quote string
+                       if (sc.ch == '\'') {
+                               sc.ForwardSetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_NUMBER) {
+                       if (!IsADigit(sc.ch)) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_VAR) {
+                       if (!IsAWordChar(sc.ch)) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_MACRO) {
+                       if (!IsAWordChar(sc.ch) && !IsADigit(sc.ch)) {
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+
+                               if (!keywords3.InList(&s[1])) {
+                                       sc.ChangeState(SCE_KIX_DEFAULT);
+                               }
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_OPERATOR) {
+                       if (!IsOperator(sc.ch)) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_IDENTIFIER) {
+                       if (!IsAWordChar(sc.ch)) {
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+
+                               if (keywords.InList(s)) {
+                                       sc.ChangeState(SCE_KIX_KEYWORD);
+                               } else if (keywords2.InList(s)) {
+                                       sc.ChangeState(SCE_KIX_FUNCTIONS);
+                               }
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_KIX_DEFAULT) {
+                       if (sc.ch == ';') {
+                               sc.SetState(SCE_KIX_COMMENT);
+                       } else if (sc.ch == '\"') {
+                               sc.SetState(SCE_KIX_STRING1);
+                       } else if (sc.ch == '\'') {
+                               sc.SetState(SCE_KIX_STRING2);
+                       } else if (sc.ch == '$') {
+                               sc.SetState(SCE_KIX_VAR);
+                       } else if (sc.ch == '@') {
+                               sc.SetState(SCE_KIX_MACRO);
+                       } else if (IsADigit(sc.ch) || ((sc.ch == '.' || sc.ch == '&') && IsADigit(sc.chNext))) {
+                               sc.SetState(SCE_KIX_NUMBER);
+                       } else if (IsOperator(sc.ch)) {
+                               sc.SetState(SCE_KIX_OPERATOR);
+                       } else if (IsAWordChar(sc.ch)) {
+                               sc.SetState(SCE_KIX_IDENTIFIER);
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+
+LexerModule lmKix(SCLEX_KIX, ColouriseKixDoc, "kix");
+
diff --git a/contrib/src/stc/scintilla/src/LexMSSQL.cxx b/contrib/src/stc/scintilla/src/LexMSSQL.cxx
new file mode 100644 (file)
index 0000000..6019f24
--- /dev/null
@@ -0,0 +1,329 @@
+// Scintilla source code edit control
+/** @file LexMSSQL.cxx
+ ** Lexer for MSSQL.
+ **/
+// Copyright 1998-2002 by Filip Yaghob <fy@eg.cz>
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#define KW_MSSQL_STATEMENTS         0
+#define KW_MSSQL_DATA_TYPES         1
+#define KW_MSSQL_SYSTEM_TABLES      2
+#define KW_MSSQL_GLOBAL_VARIABLES   3
+#define KW_MSSQL_FUNCTIONS          4
+#define KW_MSSQL_STORED_PROCEDURES  5
+#define KW_MSSQL_OPERATORS          6
+
+//~ val SCE_MSSQL_DEFAULT=0
+//~ val SCE_MSSQL_COMMENT=1
+//~ val SCE_MSSQL_LINE_COMMENT=2
+//~ val SCE_MSSQL_NUMBER=3
+//~ val SCE_MSSQL_STRING=4
+//~ val SCE_MSSQL_OPERATOR=5
+//~ val SCE_MSSQL_IDENTIFIER=6
+//~ val SCE_MSSQL_VARIABLE=7
+//~ val SCE_MSSQL_COLUMN_NAME=8
+//~ val SCE_MSSQL_STATEMENT=9
+//~ val SCE_MSSQL_DATATYPE=10
+//~ val SCE_MSSQL_SYSTABLE=11
+//~ val SCE_MSSQL_GLOBAL_VARIABLE=12
+//~ val SCE_MSSQL_FUNCTION=13
+//~ val SCE_MSSQL_STORED_PROCEDURE=14
+//~ val SCE_MSSQL_DEFAULT_PREF_DATATYPE 15
+//~ val SCE_MSSQL_COLUMN_NAME_2 16
+
+static bool isMSSQLOperator(char ch) {
+       if (isascii(ch) && isalnum(ch))
+               return false;
+       // '.' left out as it is used to make up numbers
+       if (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||
+        ch == '-' || ch == '+' || ch == '=' || ch == '|' ||
+        ch == '<' || ch == '>' || ch == '/' ||
+        ch == '!' || ch == '~' || ch == '(' || ch == ')' ||
+               ch == ',')
+               return true;
+       return false;
+}
+
+static char classifyWordSQL(unsigned int start,
+                            unsigned int end,
+                            WordList *keywordlists[],
+                            Accessor &styler,
+                            unsigned int actualState,
+                                                       unsigned int prevState) {
+       char s[256];
+       bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
+
+       WordList &kwStatements          = *keywordlists[KW_MSSQL_STATEMENTS];
+    WordList &kwDataTypes           = *keywordlists[KW_MSSQL_DATA_TYPES];
+    WordList &kwSystemTables        = *keywordlists[KW_MSSQL_SYSTEM_TABLES];
+    WordList &kwGlobalVariables     = *keywordlists[KW_MSSQL_GLOBAL_VARIABLES];
+    WordList &kwFunctions           = *keywordlists[KW_MSSQL_FUNCTIONS];
+    WordList &kwStoredProcedures    = *keywordlists[KW_MSSQL_STORED_PROCEDURES];
+    WordList &kwOperators           = *keywordlists[KW_MSSQL_OPERATORS];
+
+       for (unsigned int i = 0; i < end - start + 1 && i < 128; i++) {
+               s[i] = static_cast<char>(tolower(styler[start + i]));
+               s[i + 1] = '\0';
+       }
+       char chAttr = SCE_MSSQL_IDENTIFIER;
+
+       if (actualState == SCE_MSSQL_GLOBAL_VARIABLE) {
+
+        if (kwGlobalVariables.InList(&s[2]))
+            chAttr = SCE_MSSQL_GLOBAL_VARIABLE;
+
+       } else if (wordIsNumber) {
+               chAttr = SCE_MSSQL_NUMBER;
+
+       } else if (prevState == SCE_MSSQL_DEFAULT_PREF_DATATYPE) {
+               // Look first in datatypes
+        if (kwDataTypes.InList(s))
+            chAttr = SCE_MSSQL_DATATYPE;
+               else if (kwOperators.InList(s))
+                       chAttr = SCE_MSSQL_OPERATOR;
+               else if (kwStatements.InList(s))
+                       chAttr = SCE_MSSQL_STATEMENT;
+               else if (kwSystemTables.InList(s))
+                       chAttr = SCE_MSSQL_SYSTABLE;
+               else if (kwFunctions.InList(s))
+            chAttr = SCE_MSSQL_FUNCTION;
+               else if (kwStoredProcedures.InList(s))
+                       chAttr = SCE_MSSQL_STORED_PROCEDURE;
+
+       } else {
+               if (kwOperators.InList(s))
+                       chAttr = SCE_MSSQL_OPERATOR;
+               else if (kwStatements.InList(s))
+                       chAttr = SCE_MSSQL_STATEMENT;
+               else if (kwSystemTables.InList(s))
+                       chAttr = SCE_MSSQL_SYSTABLE;
+               else if (kwFunctions.InList(s))
+                       chAttr = SCE_MSSQL_FUNCTION;
+               else if (kwStoredProcedures.InList(s))
+                       chAttr = SCE_MSSQL_STORED_PROCEDURE;
+               else if (kwDataTypes.InList(s))
+                       chAttr = SCE_MSSQL_DATATYPE;
+       }
+
+       styler.ColourTo(end, chAttr);
+
+       return chAttr;
+}
+
+static void ColouriseMSSQLDoc(unsigned int startPos, int length,
+                              int initStyle, WordList *keywordlists[], Accessor &styler) {
+
+
+       styler.StartAt(startPos);
+
+       bool fold = styler.GetPropertyInt("fold") != 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int spaceFlags = 0;
+/*
+       WordList &kwStatements          = *keywordlists[KW_MSSQL_STATEMENTS];
+    WordList &kwDataTypes           = *keywordlists[KW_MSSQL_DATA_TYPES];
+    WordList &kwSystemTables        = *keywordlists[KW_MSSQL_SYSTEM_TABLES];
+    WordList &kwGlobalVariables     = *keywordlists[KW_MSSQL_GLOBAL_VARIABLES];
+    WordList &kwFunctions           = *keywordlists[KW_MSSQL_FUNCTIONS];
+
+       char s[100];
+       int iixx = 0;
+       s[0] = 's';     s[1] = 'e'; s[2] = 'l'; s[3] = 'e'; s[4] = 'c'; s[5] = 't'; s[6] = 0;
+       if (kwStatements.InList(s))
+               iixx = 1;
+       s[0] = 's';     s[1] = 'e'; s[2] = 'r'; s[3] = 'v'; s[4] = 'e'; s[5] = 'r'; s[6] = 'n'; s[7] = 'a'; s[8] = 'm'; s[9] = 'e'; s[10] = 0;
+       if (kwGlobalVariables.InList(s))
+               iixx += 2;
+*/
+       int state = initStyle;
+       int prevState = initStyle;
+       char chPrev = ' ';
+       char chNext = styler[startPos];
+       styler.StartSegment(startPos);
+       unsigned int lengthDoc = startPos + length;
+       for (unsigned int i = startPos; i < lengthDoc; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+                       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);
+                       int lev = indentCurrent;
+                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
+                               // Only non whitespace lines can be headers
+                               int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);
+                               if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) {
+                                       lev |= SC_FOLDLEVELHEADERFLAG;
+                               }
+                       }
+                       if (fold) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+               }
+
+               if (styler.IsLeadByte(ch)) {
+                       chNext = styler.SafeGetCharAt(i + 2);
+                       chPrev = ' ';
+                       i += 1;
+                       continue;
+               }
+
+               // When the last char isn't part of the state (have to deal with it too)...
+               if ( (state == SCE_MSSQL_IDENTIFIER) ||
+                    (state == SCE_MSSQL_STORED_PROCEDURE) ||
+                    (state == SCE_MSSQL_DATATYPE) ||
+                    //~ (state == SCE_MSSQL_COLUMN_NAME) ||
+                    (state == SCE_MSSQL_FUNCTION) ||
+                    //~ (state == SCE_MSSQL_GLOBAL_VARIABLE) ||
+                    (state == SCE_MSSQL_VARIABLE)) {
+                       if (!iswordchar(ch)) {
+                               int stateTmp;
+
+                if ((state == SCE_MSSQL_VARIABLE) || (state == SCE_MSSQL_COLUMN_NAME)) {
+                    styler.ColourTo(i - 1, state);
+                                       stateTmp = state;
+                } else
+                    stateTmp = classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState);
+
+                               prevState = state;
+
+                               if (stateTmp == SCE_MSSQL_IDENTIFIER || stateTmp == SCE_MSSQL_VARIABLE)
+                                       state = SCE_MSSQL_DEFAULT_PREF_DATATYPE;
+                               else
+                                       state = SCE_MSSQL_DEFAULT;
+                       }
+               } else if (state == SCE_MSSQL_LINE_COMMENT) {
+                       if (ch == '\r' || ch == '\n') {
+                               styler.ColourTo(i - 1, state);
+                               prevState = state;
+                               state = SCE_MSSQL_DEFAULT;
+                       }
+               } else if (state == SCE_MSSQL_GLOBAL_VARIABLE) {
+                       if ((ch != '@') && !iswordchar(ch)) {
+                               classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState);
+                               prevState = state;
+                               state = SCE_MSSQL_DEFAULT;
+                       }
+               }
+
+               // If is the default or one of the above succeeded
+               if (state == SCE_MSSQL_DEFAULT || state == SCE_MSSQL_DEFAULT_PREF_DATATYPE) {
+                       if (iswordstart(ch)) {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_IDENTIFIER;
+                       } else if (ch == '/' && chNext == '*') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_COMMENT;
+                       } else if (ch == '-' && chNext == '-') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_LINE_COMMENT;
+                       } else if (ch == '\'') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_STRING;
+                       } else if (ch == '"') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_COLUMN_NAME;
+                       } else if (ch == '[') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_COLUMN_NAME_2;
+                       } else if (isMSSQLOperator(ch)) {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               styler.ColourTo(i, SCE_MSSQL_OPERATOR);
+                //~ style = SCE_MSSQL_DEFAULT;
+                               prevState = state;
+                               state = SCE_MSSQL_DEFAULT;
+                       } else if (ch == '@') {
+                styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                if (chNext == '@') {
+                    state = SCE_MSSQL_GLOBAL_VARIABLE;
+//                    i += 2;
+                } else
+                    state = SCE_MSSQL_VARIABLE;
+            }
+
+
+               // When the last char is part of the state...
+               } else if (state == SCE_MSSQL_COMMENT) {
+                               if (ch == '/' && chPrev == '*') {
+                                       if (((i > (styler.GetStartSegment() + 2)) || ((initStyle == SCE_MSSQL_COMMENT) &&
+                                           (styler.GetStartSegment() == startPos)))) {
+                                               styler.ColourTo(i, state);
+                                               //~ state = SCE_MSSQL_COMMENT;
+                                       prevState = state;
+                        state = SCE_MSSQL_DEFAULT;
+                                       }
+                               }
+                       } else if (state == SCE_MSSQL_STRING) {
+                               if (ch == '\'') {
+                                       if ( chNext == '\'' ) {
+                                               i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                                       } else {
+                                               styler.ColourTo(i, state);
+                                       prevState = state;
+                                               state = SCE_MSSQL_DEFAULT;
+                                       //i++;
+                                       }
+                               //ch = chNext;
+                               //chNext = styler.SafeGetCharAt(i + 1);
+                               }
+                       } else if (state == SCE_MSSQL_COLUMN_NAME) {
+                               if (ch == '"') {
+                                       if (chNext == '"') {
+                                               i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               } else {
+                    styler.ColourTo(i, state);
+                                       prevState = state;
+                                       state = SCE_MSSQL_DEFAULT_PREF_DATATYPE;
+                                       //i++;
+                }
+                }
+               } else if (state == SCE_MSSQL_COLUMN_NAME_2) {
+                       if (ch == ']') {
+                styler.ColourTo(i, state);
+                               prevState = state;
+                state = SCE_MSSQL_DEFAULT_PREF_DATATYPE;
+                //i++;
+                       }
+               }
+
+               chPrev = ch;
+       }
+       styler.ColourTo(lengthDoc - 1, state);
+}
+
+static const char * const sqlWordListDesc[] = {
+       "Statements",
+    "Data Types",
+    "System tables",
+    "Global variables",
+    "Functions",
+    "System Stored Procedures",
+    "Operators",
+       0,
+};
+
+LexerModule lmMSSQL(SCLEX_MSSQL, ColouriseMSSQLDoc, "mssql", 0, sqlWordListDesc);
index c09a8ae865d5b316313e4a594021bf1013804b69..0f969bbfb8c4d3c9b711dd8cc0bd66cc4de36f9b 100644 (file)
@@ -2,9 +2,9 @@
 /** @file LexNsis.cxx
  ** Lexer for NSIS
  **/
 /** @file LexNsis.cxx
  ** Lexer for NSIS
  **/
-// Copyright 2003 by Angelo Mandato <angelo@spaceblue.com>
+// Copyright 2003, 2004 by Angelo Mandato <angelo [at] spaceblue [dot] com>
+// Last Updated: 02/22/2004
 // The License.txt file describes the conditions under which this software may be distributed.
 // The License.txt file describes the conditions under which this software may be distributed.
-
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
@@ -20,8 +20,8 @@
 #include "SciLexer.h"
 
 /*
 #include "SciLexer.h"
 
 /*
-// Put in SciLexer.h
-#define SCLEX_NSIS 34
+// located in SciLexer.h
+#define SCLEX_NSIS 43
 
 #define SCE_NSIS_DEFAULT 0
 #define SCE_NSIS_COMMENT 1
 
 #define SCE_NSIS_DEFAULT 0
 #define SCE_NSIS_COMMENT 1
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
+#define SCE_NSIS_NUMBER 14
 */
 
 */
 
-static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler)
+static bool isNsisNumber(char ch)
+{
+  return (ch >= '0' && ch <= '9');
+}
+
+static bool isNsisChar(char ch)
+{
+  return (ch == '.' ) || (ch == '_' ) || isNsisNumber(ch) || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
+}
+
+static bool isNsisLetter(char ch)
+{
+  return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
+}
+
+static int NsisCmp( char *s1, char *s2, bool bIgnoreCase )
+{
+  if( bIgnoreCase )
+     return CompareCaseInsensitive( s1, s2);
+
+  return strcmp( s1, s2 );
+}
+
+static int calculateFoldNsis(unsigned int start, unsigned int end, int foldlevel, Accessor &styler )
+{
+  // If the word is too long, it is not what we are looking for
+  if( end - start > 13 )
+    return foldlevel;
+
+  // Check the style at this point, if it is not valid, then return zero
+  if( styler.StyleAt(end) != SCE_NSIS_FUNCTION && styler.StyleAt(end) != SCE_NSIS_SECTIONDEF &&
+      styler.StyleAt(end) != SCE_NSIS_SUBSECTIONDEF && styler.StyleAt(end) != SCE_NSIS_IFDEFINEDEF &&
+      styler.StyleAt(end) != SCE_NSIS_MACRODEF )
+        return foldlevel;
+
+  int newFoldlevel = foldlevel;
+  bool bIgnoreCase = false;
+  if( styler.GetPropertyInt("nsis.ignorecase") == 1 )
+    bIgnoreCase = true;
+
+  char s[15]; // The key word we are looking for has atmost 13 characters
+  for (unsigned int i = 0; i < end - start + 1 && i < 14; i++)
+       {
+               s[i] = static_cast<char>( styler[ start + i ] );
+               s[i + 1] = '\0';
+       }
+
+  if( s[0] == '!' )
+  {
+    if( NsisCmp(s, "!ifndef", bIgnoreCase) == 0 || NsisCmp(s, "!ifdef", bIgnoreCase ) == 0 || NsisCmp(s, "!macro", bIgnoreCase ) == 0 )
+      newFoldlevel++;
+    else if( NsisCmp(s, "!endif", bIgnoreCase) == 0 || NsisCmp(s, "!macroend", bIgnoreCase ) == 0 )
+      newFoldlevel--;
+  }
+  else
+  {
+    if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SubSection", bIgnoreCase ) == 0 )
+      newFoldlevel++;
+    else if( NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase ) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase ) == 0 )
+      newFoldlevel--;
+  }
+
+  return newFoldlevel;
+}
+
+static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler )
 {
 {
+  bool bIgnoreCase = false;
+  if( styler.GetPropertyInt("nsis.ignorecase") == 1 )
+    bIgnoreCase = true;
+
+  bool bUserVars = false;
+  if( styler.GetPropertyInt("nsis.uservars") == 1 )
+    bUserVars = true;
+
        char s[100];
 
        WordList &Functions = *keywordLists[0];
        char s[100];
 
        WordList &Functions = *keywordLists[0];
@@ -48,27 +122,29 @@ static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keyw
        WordList &Lables = *keywordLists[2];
        WordList &UserDefined = *keywordLists[3];
 
        WordList &Lables = *keywordLists[2];
        WordList &UserDefined = *keywordLists[3];
 
-       for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
+       for (unsigned int i = 0; i < end - start + 1 && i < 99; i++)
        {
        {
-               s[i] = static_cast<char>( styler[ start + i ] );
+    if( bIgnoreCase )
+      s[i] = static_cast<char>( tolower(styler[ start + i ] ) );
+    else
+                 s[i] = static_cast<char>( styler[ start + i ] );
                s[i + 1] = '\0';
        }
 
        // Check for special words...
                s[i + 1] = '\0';
        }
 
        // Check for special words...
-
-       if( strcmp(s, "!macro") == 0 || strcmp(s, "!macroend") == 0 ) // Covers !micro and !microend
+       if( NsisCmp(s, "!macro", bIgnoreCase ) == 0 || NsisCmp(s, "!macroend", bIgnoreCase) == 0 ) // Covers !micro and !microend
                return SCE_NSIS_MACRODEF;
 
                return SCE_NSIS_MACRODEF;
 
-       if( strcmp(s, "!ifdef") == 0 ||  strcmp(s, "!ifndef") == 0 ||  strcmp(s, "!endif") == 0 )
+       if( NsisCmp(s, "!ifdef", bIgnoreCase ) == 0 ||  NsisCmp(s, "!ifndef", bIgnoreCase) == 0 ||  NsisCmp(s, "!endif", bIgnoreCase) == 0 )
                return SCE_NSIS_IFDEFINEDEF;
 
                return SCE_NSIS_IFDEFINEDEF;
 
-       if( strcmp(s, "Section") == 0 || strcmp(s, "SectionEnd") == 0 ) // Covers Section and SectionEnd
+       if( NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase) == 0 ) // Covers Section and SectionEnd
                return SCE_NSIS_SECTIONDEF;
 
                return SCE_NSIS_SECTIONDEF;
 
-       if( strcmp(s, "SubSection") == 0 || strcmp(s, "SubSectionEnd") == 0 ) // Covers SubSection and SubSectionEnd
+       if( NsisCmp(s, "SubSection", bIgnoreCase) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd
                return SCE_NSIS_SUBSECTIONDEF;
 
                return SCE_NSIS_SUBSECTIONDEF;
 
-       if( strcmp(s, "Function") == 0 || strcmp(s, "FunctionEnd") == 0 ) // Covers SubSection and SubSectionEnd
+       if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd
                return SCE_NSIS_FUNCTION;
 
        if ( Functions.InList(s) )
                return SCE_NSIS_FUNCTION;
 
        if ( Functions.InList(s) )
@@ -83,12 +159,49 @@ static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keyw
        if( UserDefined.InList(s) )
                return SCE_NSIS_USERDEFINED;
 
        if( UserDefined.InList(s) )
                return SCE_NSIS_USERDEFINED;
 
-       if( strlen(s) > 2 )
+       if( strlen(s) > 3 )
        {
                if( s[1] == '{' && s[strlen(s)-1] == '}' )
                        return SCE_NSIS_VARIABLE;
        }
 
        {
                if( s[1] == '{' && s[strlen(s)-1] == '}' )
                        return SCE_NSIS_VARIABLE;
        }
 
+  // See if the variable is a user defined variable
+  if( s[0] == '$' && bUserVars )
+  {
+    bool bHasSimpleNsisChars = true;
+    for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)
+         {
+      if( !isNsisChar( s[j] ) )
+      {
+        bHasSimpleNsisChars = false;
+        break;
+      }
+         }
+
+    if( bHasSimpleNsisChars )
+      return SCE_NSIS_VARIABLE;
+  }
+
+  // To check for numbers
+  if( isNsisNumber( s[0] ) )
+  {
+    bool bHasSimpleNsisNumber = true;
+    for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)
+         {
+      if( s[j] == '\0' || s[j] == '\r' || s[j] == '\n' )
+        break;
+
+      if( !isNsisNumber( s[j] ) )
+      {
+        bHasSimpleNsisNumber = false;
+        break;
+      }
+         }
+
+    if( bHasSimpleNsisNumber )
+      return SCE_NSIS_NUMBER;
+  }
+
        return SCE_NSIS_DEFAULT;
 }
 
        return SCE_NSIS_DEFAULT;
 }
 
@@ -102,24 +215,18 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
        styler.StartSegment( startPos );
 
        char cCurrChar;
        styler.StartSegment( startPos );
 
        char cCurrChar;
-       bool bVarInString = true;
+       bool bVarInString = false;
+  bool bClassicVarInString = false;
 
        unsigned int i;
        for( i = startPos; i < nLengthDoc; i++ )
        {
                cCurrChar = styler.SafeGetCharAt( i );
 
        unsigned int i;
        for( i = startPos; i < nLengthDoc; i++ )
        {
                cCurrChar = styler.SafeGetCharAt( i );
-               char cNextChar = styler.SafeGetCharAt( i+1, EOF );
-
-
+               char cNextChar = styler.SafeGetCharAt(i+1);
 
                switch(state)
                {
                        case SCE_NSIS_DEFAULT:
 
                switch(state)
                {
                        case SCE_NSIS_DEFAULT:
-        if( cNextChar == EOF )
-        {
-          styler.ColourTo(i,SCE_NSIS_DEFAULT);
-                           break;
-        }
                                if( cCurrChar == ';' || cCurrChar == '#' ) // we have a comment line
                                {
                                        styler.ColourTo(i-1, state );
                                if( cCurrChar == ';' || cCurrChar == '#' ) // we have a comment line
                                {
                                        styler.ColourTo(i-1, state );
@@ -131,6 +238,7 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGDQ;
                                        bVarInString = false;
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGDQ;
                                        bVarInString = false;
+          bClassicVarInString = false;
                                        break;
                                }
                                if( cCurrChar == '\'' )
                                        break;
                                }
                                if( cCurrChar == '\'' )
@@ -138,6 +246,7 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGRQ;
                                        bVarInString = false;
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGRQ;
                                        bVarInString = false;
+          bClassicVarInString = false;
                                        break;
                                }
                                if( cCurrChar == '`' )
                                        break;
                                }
                                if( cCurrChar == '`' )
@@ -145,19 +254,25 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGLQ;
                                        bVarInString = false;
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGLQ;
                                        bVarInString = false;
+          bClassicVarInString = false;
                                        break;
                                }
 
                                // NSIS KeyWord,Function, Variable, UserDefined:
                                        break;
                                }
 
                                // NSIS KeyWord,Function, Variable, UserDefined:
-                               if( cCurrChar == '$' || iswordchar(cCurrChar) || cCurrChar == '!' )
+                               if( cCurrChar == '$' || isNsisChar(cCurrChar) || cCurrChar == '!' )
                                {
                                        styler.ColourTo(i-1,state);
                                  state = SCE_NSIS_FUNCTION;
                                {
                                        styler.ColourTo(i-1,state);
                                  state = SCE_NSIS_FUNCTION;
+
+          // If it is a number, we must check and set style here first...
+          if( isNsisNumber(cCurrChar) && (cNextChar == '\t' || cNextChar == ' ' || cNextChar == '\r' || cNextChar == '\n' ) )
+              styler.ColourTo( i, SCE_NSIS_NUMBER);
+
                                        break;
                                }
                                break;
                        case SCE_NSIS_COMMENT:
                                        break;
                                }
                                break;
                        case SCE_NSIS_COMMENT:
-                               if( cNextChar == '\n' || cNextChar == '\r' || cNextChar == EOF )
+                               if( cNextChar == '\n' || cNextChar == '\r' )
         {
                                  styler.ColourTo(i,state);
           state = SCE_NSIS_DEFAULT;
         {
                                  styler.ColourTo(i,state);
           state = SCE_NSIS_DEFAULT;
@@ -187,35 +302,45 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                        case SCE_NSIS_FUNCTION:
 
                                // NSIS KeyWord:
                        case SCE_NSIS_FUNCTION:
 
                                // NSIS KeyWord:
-                               if( (iswordchar(cCurrChar) && !iswordchar( cNextChar) && cNextChar != '}') || cCurrChar == '}' )
+        if( cCurrChar == '$' )
+          state = SCE_NSIS_DEFAULT;
+        else if( cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) )
+          state = SCE_NSIS_DEFAULT;
+                               else if( (isNsisChar(cCurrChar) && !isNsisChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' )
                                {
                                        state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
                                        styler.ColourTo( i, state);
                                {
                                        state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
                                        styler.ColourTo( i, state);
-                                       state = SCE_NSIS_DEFAULT; // Everything after goes back to the default state
+                                       state = SCE_NSIS_DEFAULT;
                                }
                                }
-                               else if( !iswordchar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' )
+                               else if( !isNsisChar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' )
                                {
                                {
+          if( classifyWordNsis( styler.GetStartSegment(), i-1, keywordLists, styler) == SCE_NSIS_NUMBER )
+             styler.ColourTo( i-1, SCE_NSIS_NUMBER );
+
                                        state = SCE_NSIS_DEFAULT;
 
                                        state = SCE_NSIS_DEFAULT;
 
-                                       if( cCurrChar == '"' ) // Next
+                                       if( cCurrChar == '"' )
                                        {
                                                state = SCE_NSIS_STRINGDQ;
                                                bVarInString = false;
                                        {
                                                state = SCE_NSIS_STRINGDQ;
                                                bVarInString = false;
+            bClassicVarInString = false;
                                        }
                                        }
-                                       if( cCurrChar == '`' )
+                                       else if( cCurrChar == '`' )
                                        {
                                                state = SCE_NSIS_STRINGLQ;
                                                bVarInString = false;
                                        {
                                                state = SCE_NSIS_STRINGLQ;
                                                bVarInString = false;
+            bClassicVarInString = false;
                                        }
                                        }
-                                       if( cCurrChar == '\'' )
+                                       else if( cCurrChar == '\'' )
                                        {
                                                state = SCE_NSIS_STRINGRQ;
                                                bVarInString = false;
                                        {
                                                state = SCE_NSIS_STRINGRQ;
                                                bVarInString = false;
+            bClassicVarInString = false;
                                        }
                                        }
-                                       if( cCurrChar == '#' || cCurrChar == ';' )
+                                       else if( cCurrChar == '#' || cCurrChar == ';' )
+          {
                                                state = SCE_NSIS_COMMENT;
                                                state = SCE_NSIS_COMMENT;
-
-                                       styler.ColourTo( i, state);
+          }
                                }
                                break;
                }
                                }
                                break;
                }
@@ -226,25 +351,70 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                }
                else if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ )
                {
                }
                else if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ )
                {
-                       // Check for var in String..
-                       if( bVarInString && (iswordchar(cCurrChar) || cCurrChar == '}') ) // || cCurrChar == '{' ) )
-                       {
-                               int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
+      bool bIngoreNextDollarSign = false;
+      bool bUserVars = false;
+      if( styler.GetPropertyInt("nsis.uservars") == 1 )
+        bUserVars = true;
+
+      if( bVarInString && cCurrChar == '$' )
+      {
+        bVarInString = false;
+        bIngoreNextDollarSign = true;
+      }
+      else if( bVarInString && cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) )
+      {
+        bVarInString = false;
+        bIngoreNextDollarSign = true;
+      }
+
+      // Covers "$INSTDIR and user vars like $MYVAR"
+      else if( bVarInString && !isNsisChar(cNextChar) )
+      {
+        int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
                                if( nWordState == SCE_NSIS_VARIABLE )
                                if( nWordState == SCE_NSIS_VARIABLE )
-                               {
                                        styler.ColourTo( i, SCE_NSIS_STRINGVAR);
                                        styler.ColourTo( i, SCE_NSIS_STRINGVAR);
-                                       bVarInString = false;
-                               }
-                       }
-                       if( cCurrChar == '$' )
+        else if( bUserVars )
+          styler.ColourTo( i, SCE_NSIS_STRINGVAR);
+        bVarInString = false;
+      }
+      // Covers "${TEST}..."
+      else if( bClassicVarInString && cNextChar == '}' )
+      {
+        styler.ColourTo( i+1, SCE_NSIS_STRINGVAR);
+                               bClassicVarInString = false;
+      }
+
+      // Start of var in string
+                       if( !bIngoreNextDollarSign && cCurrChar == '$' && cNextChar == '{' )
                        {
                                styler.ColourTo( i-1, state);
                        {
                                styler.ColourTo( i-1, state);
-                               bVarInString = true;
+                               bClassicVarInString = true;
+        bVarInString = false;
                        }
                        }
+      else if( !bIngoreNextDollarSign && cCurrChar == '$' )
+      {
+        styler.ColourTo( i-1, state);
+        bVarInString = true;
+        bClassicVarInString = false;
+      }
                }
        }
                }
        }
-}
 
 
+  // Colourise remaining document
+  switch( state )
+  {
+    case SCE_NSIS_COMMENT:
+    case SCE_NSIS_STRINGDQ:
+    case SCE_NSIS_STRINGLQ:
+    case SCE_NSIS_STRINGRQ:
+    case SCE_NSIS_VARIABLE:
+    case SCE_NSIS_STRINGVAR:
+      styler.ColourTo(nLengthDoc-1,state); break;
+
+    default:
+      styler.ColourTo(nLengthDoc-1,SCE_NSIS_DEFAULT); break;
+  }
+}
 
 static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
 
 static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
@@ -252,87 +422,57 @@ static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Ac
        if( styler.GetPropertyInt("fold") == 0 )
                return;
 
        if( styler.GetPropertyInt("fold") == 0 )
                return;
 
-       unsigned int endPos = startPos + length;
-       int lineCurrent = styler.GetLine(startPos);
-       int levelCurrent = SC_FOLDLEVELBASE;
+  int lineCurrent = styler.GetLine(startPos);
+  unsigned int safeStartPos = styler.LineStart( lineCurrent );
+
+  bool bArg1 = true;
+  int nWordStart = -1;
+
+  int levelCurrent = SC_FOLDLEVELBASE;
        if (lineCurrent > 0)
                levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
        int levelNext = levelCurrent;
        if (lineCurrent > 0)
                levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
        int levelNext = levelCurrent;
-       char chNext = styler[startPos];
-       int styleNext = styler.StyleAt(startPos);
-       int style;
 
 
-       for (unsigned int i = startPos; i < endPos; i++)
+  for (unsigned int i = safeStartPos; i < startPos + length; i++)
        {
        {
-               char ch = chNext;
-               chNext = styler.SafeGetCharAt(i + 1);
-               style = styleNext;
-               styleNext = styler.StyleAt(i + 1);
-               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
-               // Functions Start: Function, Section, SubSection
-               // Functions End: FunctionEnd, SectionEnd, SubSectionEnd
-               // Label Start: !ifdef, !ifndef
-               // Label End: !endif
-
-               if( style == SCE_NSIS_FUNCTION )
-               {
-                       if( styler.Match(i, "FunctionEnd") )
-                               levelNext--;
-                       else if( styler.Match(i, "Function") )
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_SECTIONDEF )
-               {
-                       if( styler.Match(i, "SectionEnd") )
-                               levelNext--;
-                       else if( styler.Match(i, "Section") )
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_SUBSECTIONDEF )
-               {
-                       if( styler.Match(i, "SubSectionEnd") )
-                               levelNext--;
-                       else if( styler.Match(i, "SubSection") )
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_IFDEFINEDEF )
-               {
-                       if( styler.Match(i, "!endif") )
-                               levelNext--;
-                       else if( styler.Match(i, "!ifdef") || styler.Match(i, "!ifndef"))
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_MACRODEF )
-               {
-                       if( styler.Match(i, "!macroend") )
-                               levelNext--;
-                       else if( styler.Match(i, "!macro") )
-                               levelNext++;
-               }
-
-               if( atEOL )
-               {
-                       int levelUse = levelCurrent;
+    char chCurr = styler.SafeGetCharAt(i);
+
+    if( bArg1 ) //&& chCurr != '\n' )
+    {
+      if( nWordStart == -1 && (isNsisLetter(chCurr) || chCurr == '!') )
+        nWordStart = i;
+      else if( !isNsisLetter(chCurr) && nWordStart > -1 )
+      {
+        int newLevel = calculateFoldNsis( nWordStart, i-1, levelNext, styler );
+        if( newLevel != levelNext )
+          levelNext = newLevel;
+        bArg1 = false;
+      }
+    }
+
+    if( chCurr == '\n' )
+    {
+      // If we are on a new line...
+      int levelUse = levelCurrent;
                        int lev = levelUse | levelNext << 16;
                        if (levelUse < levelNext)
                                lev |= SC_FOLDLEVELHEADERFLAG;
                        if (lev != styler.LevelAt(lineCurrent))
                        int lev = levelUse | levelNext << 16;
                        if (levelUse < levelNext)
                                lev |= SC_FOLDLEVELHEADERFLAG;
                        if (lev != styler.LevelAt(lineCurrent))
-                       {
                                styler.SetLevel(lineCurrent, lev);
                                styler.SetLevel(lineCurrent, lev);
-                       }
+
                        lineCurrent++;
                        levelCurrent = levelNext;
                        lineCurrent++;
                        levelCurrent = levelNext;
-               }
-       }
+      bArg1 = true; // New line, lets look at first argument again
+      nWordStart = -1;
+    }
+  }
 
        int levelUse = levelCurrent;
        int lev = levelUse | levelNext << 16;
        if (levelUse < levelNext)
                lev |= SC_FOLDLEVELHEADERFLAG;
        if (lev != styler.LevelAt(lineCurrent))
 
        int levelUse = levelCurrent;
        int lev = levelUse | levelNext << 16;
        if (levelUse < levelNext)
                lev |= SC_FOLDLEVELHEADERFLAG;
        if (lev != styler.LevelAt(lineCurrent))
-       {
                styler.SetLevel(lineCurrent, lev);
                styler.SetLevel(lineCurrent, lev);
-       }
 }
 
 static const char * const nsisWordLists[] = {
 }
 
 static const char * const nsisWordLists[] = {
index 819dd312905ade74736add7af3ac4781c450a7f7..1681ba5d4a6bd38c218d4ea4ad68cf1a90795d4b 100644 (file)
@@ -166,20 +166,39 @@ static void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) {
        // comment lines before the first "diff " or "--- ". If a real
        // difference starts then each line starting with ' ' is a whitespace
        // otherwise it is considered a comment (Only in..., Binary file...)
        // comment lines before the first "diff " or "--- ". If a real
        // difference starts then each line starting with ' ' is a whitespace
        // otherwise it is considered a comment (Only in..., Binary file...)
-       if (0 == strncmp(lineBuffer, "diff ", 3)) {
+       if (0 == strncmp(lineBuffer, "diff ", 5)) {
                styler.ColourTo(endLine, SCE_DIFF_COMMAND);
                styler.ColourTo(endLine, SCE_DIFF_COMMAND);
-       } else if (0 == strncmp(lineBuffer, "--- ", 3)) {
-               styler.ColourTo(endLine, SCE_DIFF_HEADER);
-       } else if (0 == strncmp(lineBuffer, "+++ ", 3)) {
-               styler.ColourTo(endLine, SCE_DIFF_HEADER);
+       } else if (0 == strncmp(lineBuffer, "--- ", 4)) {
+               // In a context diff, --- appears in both the header and the position markers
+               if (atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else
+                       styler.ColourTo(endLine, SCE_DIFF_HEADER);
+       } else if (0 == strncmp(lineBuffer, "+++ ", 4)) {
+               // I don't know of any diff where "+++ " is a position marker, but for
+               // consistency, do the same as with "--- " and "*** ".
+               if (atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else
+                       styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (0 == strncmp(lineBuffer, "====", 4)) {  // For p4's diff
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (0 == strncmp(lineBuffer, "====", 4)) {  // For p4's diff
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
-       } else if (0 == strncmp(lineBuffer, "***", 3)) {
-               styler.ColourTo(endLine, SCE_DIFF_HEADER);
+       } else if (0 == strncmp(lineBuffer, "***", 3)) {
+               // In a context diff, *** appears in both the header and the position markers.
+               // Also ******** is a chunk header, but here it's treated as part of the
+               // position marker since there is no separate style for a chunk header.
+               if (lineBuffer[3] == ' ' && atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else if (lineBuffer[3] == '*')
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else
+                       styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (0 == strncmp(lineBuffer, "? ", 2)) {    // For difflib
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (lineBuffer[0] == '@') {
                styler.ColourTo(endLine, SCE_DIFF_POSITION);
        } else if (0 == strncmp(lineBuffer, "? ", 2)) {    // For difflib
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (lineBuffer[0] == '@') {
                styler.ColourTo(endLine, SCE_DIFF_POSITION);
+       } else if (lineBuffer[0] >= '0' && lineBuffer[0] <= '9') {
+               styler.ColourTo(endLine, SCE_DIFF_POSITION);
        } else if (lineBuffer[0] == '-' || lineBuffer[0] == '<') {
                styler.ColourTo(endLine, SCE_DIFF_DELETED);
        } else if (lineBuffer[0] == '+' || lineBuffer[0] == '>') {
        } else if (lineBuffer[0] == '-' || lineBuffer[0] == '<') {
                styler.ColourTo(endLine, SCE_DIFF_DELETED);
        } else if (lineBuffer[0] == '+' || lineBuffer[0] == '>') {
@@ -210,6 +229,37 @@ static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[
        }
 }
 
        }
 }
 
+static void FoldDiffDoc(unsigned int startPos, int length, int, WordList*[], Accessor &styler) {
+       int curLine = styler.GetLine(startPos);
+       int prevLevel = SC_FOLDLEVELBASE;
+       if (curLine > 0)
+               prevLevel = styler.LevelAt(curLine-1);
+
+       int curLineStart = styler.LineStart(curLine);
+       do {
+               int nextLevel = prevLevel;
+               if (prevLevel & SC_FOLDLEVELHEADERFLAG)
+                       nextLevel = (prevLevel & SC_FOLDLEVELNUMBERMASK) + 1;
+               
+               int lineType = styler.StyleAt(curLineStart);
+               if (lineType == SCE_DIFF_COMMAND)
+                       nextLevel = (SC_FOLDLEVELBASE + 1) | SC_FOLDLEVELHEADERFLAG;
+               else if (lineType == SCE_DIFF_HEADER) {
+                       nextLevel = (SC_FOLDLEVELBASE + 2) | SC_FOLDLEVELHEADERFLAG;
+               } else if (lineType == SCE_DIFF_POSITION)
+                       nextLevel = (SC_FOLDLEVELBASE + 3) | SC_FOLDLEVELHEADERFLAG;
+               
+               if ((nextLevel & SC_FOLDLEVELHEADERFLAG) && (nextLevel == prevLevel))
+                       styler.SetLevel(curLine-1, prevLevel & ~SC_FOLDLEVELHEADERFLAG);
+
+               styler.SetLevel(curLine, nextLevel);
+               prevLevel = nextLevel;
+               
+               curLineStart = styler.LineStart(++curLine);
+       } while (static_cast<int>(startPos) + length > curLineStart);
+}
+
+
 static void ColourisePropsLine(
     char *lineBuffer,
     unsigned int lengthLine,
 static void ColourisePropsLine(
     char *lineBuffer,
     unsigned int lengthLine,
@@ -427,14 +477,14 @@ static void ColouriseErrorListLine(
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
+       } else if (lineBuffer[0] == '-') {
+               styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstart(lineBuffer, "cf90-")) {
                // Absoft Pro Fortran 90/95 v8.2 error and/or warning message
                styler.ColourTo(endPos, SCE_ERR_ABSF);
        } else if (strstart(lineBuffer, "fortcom:")) {
                // Intel Fortran Compiler v8.0 error/warning message
                styler.ColourTo(endPos, SCE_ERR_IFORT);
        } else if (strstart(lineBuffer, "cf90-")) {
                // Absoft Pro Fortran 90/95 v8.2 error and/or warning message
                styler.ColourTo(endPos, SCE_ERR_ABSF);
        } else if (strstart(lineBuffer, "fortcom:")) {
                // Intel Fortran Compiler v8.0 error/warning message
                styler.ColourTo(endPos, SCE_ERR_IFORT);
-       } else if (lineBuffer[0] == '-') {
-               styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
                styler.ColourTo(endPos, SCE_ERR_PYTHON);
        } else if (strstr(lineBuffer, " in ") && strstr(lineBuffer, " on line ")) {
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
                styler.ColourTo(endPos, SCE_ERR_PYTHON);
        } else if (strstr(lineBuffer, " in ") && strstr(lineBuffer, " on line ")) {
@@ -456,7 +506,7 @@ static void ColouriseErrorListLine(
                   (strstr(lineBuffer, "at line " ) < (lineBuffer + lengthLine)) &&
                   strstr(lineBuffer, "file ") &&
                   (strstr(lineBuffer, "file ") < (lineBuffer + lengthLine))) {
                   (strstr(lineBuffer, "at line " ) < (lineBuffer + lengthLine)) &&
                   strstr(lineBuffer, "file ") &&
                   (strstr(lineBuffer, "file ") < (lineBuffer + lengthLine))) {
-               // Lua error message
+               // Lua error message
                styler.ColourTo(endPos, SCE_ERR_LUA);
        } else if (strstr(lineBuffer, " at " ) &&
                   (strstr(lineBuffer, " at " ) < (lineBuffer + lengthLine)) &&
                styler.ColourTo(endPos, SCE_ERR_LUA);
        } else if (strstr(lineBuffer, " at " ) &&
                   (strstr(lineBuffer, " at " ) < (lineBuffer + lengthLine)) &&
@@ -478,6 +528,8 @@ static void ColouriseErrorListLine(
                // Look for Microsoft <filename>(line) :message
                // Look for Microsoft <filename>(line,pos)message
                // Look for CTags \tmessage
                // Look for Microsoft <filename>(line) :message
                // Look for Microsoft <filename>(line,pos)message
                // Look for CTags \tmessage
+               // Look for Lua 5 traceback \t<filename>:<line>:message
+               bool initialTab = (lineBuffer[0] == '\t');
                int state = 0;
                for (unsigned int i = 0; i < lengthLine; i++) {
                        char ch = lineBuffer[i];
                int state = 0;
                for (unsigned int i = 0; i < lengthLine; i++) {
                        char ch = lineBuffer[i];
@@ -486,17 +538,17 @@ static void ColouriseErrorListLine(
                                chNext = lineBuffer[i+1];
                        if (state == 0) {
                                if (ch == ':') {
                                chNext = lineBuffer[i+1];
                        if (state == 0) {
                                if (ch == ':') {
-                                       // May be GCC
+                                       // May be GCC, or might be Lua 5 (Lua traceback same but with tab prefix)
                                        if ((chNext != '\\') && (chNext != '/')) {
                                                // This check is not completely accurate as may be on
                                                // GTK+ with a file name that includes ':'.
                                                state = 1;
                                        }
                                        if ((chNext != '\\') && (chNext != '/')) {
                                                // This check is not completely accurate as may be on
                                                // GTK+ with a file name that includes ':'.
                                                state = 1;
                                        }
-                               } else if ((ch == '(') && Is1To9(chNext)) {
+                               } else if ((ch == '(') && Is1To9(chNext) && (!initialTab)) {
                                        // May be Microsoft
                                        // May be Microsoft
-                                       // Check againt '0' often removes phone numbers
+                                       // Check against '0' often removes phone numbers
                                        state = 10;
                                        state = 10;
-                               } else if (ch == '\t') {
+                               } else if ((ch == '\t') && (!initialTab)) {
                                        // May be CTags
                                        state = 20;
                                }
                                        // May be CTags
                                        state = 20;
                                }
@@ -520,10 +572,11 @@ static void ColouriseErrorListLine(
                                        state = unRecognized;
                                }
                        } else if (state == 12) {
                                        state = unRecognized;
                                }
                        } else if (state == 12) {
-                               if ((ch == ' ') && (chNext == ':'))
+                               if ((ch == ' ') && (chNext == ':')) {
                                        state = 13;
                                        state = 13;
-                               else
+                               } else {
                                        state = unRecognized;
                                        state = unRecognized;
+                               }
                        } else if (state == 14) {
                                if (ch == ')') {
                                        state = 15;
                        } else if (state == 14) {
                                if (ch == ')') {
                                        state = 15;
@@ -548,7 +601,7 @@ static void ColouriseErrorListLine(
                        styler.ColourTo(endPos, SCE_ERR_GCC);
                } else if ((state == 13) || (state == 14) || (state == 15)) {
                        styler.ColourTo(endPos, SCE_ERR_MS);
                        styler.ColourTo(endPos, SCE_ERR_GCC);
                } else if ((state == 13) || (state == 14) || (state == 15)) {
                        styler.ColourTo(endPos, SCE_ERR_MS);
-               } else if (((state == 22) || (state == 24)) && (lineBuffer[0] != '\t')) {
+               } else if ((state == 22) || (state == 24)) {
                        styler.ColourTo(endPos, SCE_ERR_CTAG);
                } else {
                        styler.ColourTo(endPos, SCE_ERR_DEFAULT);
                        styler.ColourTo(endPos, SCE_ERR_CTAG);
                } else {
                        styler.ColourTo(endPos, SCE_ERR_DEFAULT);
@@ -696,7 +749,7 @@ static void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[
 }
 
 LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", 0, batchWordListDesc);
 }
 
 LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", 0, batchWordListDesc);
-LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff", 0, emptyWordListDesc);
+LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff", FoldDiffDoc, emptyWordListDesc);
 LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props", FoldPropsDoc, emptyWordListDesc);
 LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", 0, emptyWordListDesc);
 LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist", 0, emptyWordListDesc);
 LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props", FoldPropsDoc, emptyWordListDesc);
 LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", 0, emptyWordListDesc);
 LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist", 0, emptyWordListDesc);
index d35944ecf7caebef022ff8a0aeea2041025f9b1e..775b5587257d750d34c214e05f6e1332b6b8f0d1 100644 (file)
@@ -1,26 +1,12 @@
 // Scintilla source code edit control
 // Scintilla source code edit control
-/** @file LexPB.cxx
- ** Lexer for PowerBasic by Roland Walter, roland@rowalt.de
- ** Last update: 17.10.2003 (toggling of subs/functions now until next sub/functin - this gives better results)
- **/
+// @file LexPB.cxx
+// Lexer for PowerBasic by Roland Walter, roland@rowalt.de (for PowerBasic see www.powerbasic.com)
 //
 //
-// Necessary changes in Scintilla project:
-//  - In SciLexer.h and Scintilla.iface:
-//
-//    #define SCLEX_PB 51                              //ID for PowerBasic lexer
-//    (...)
-//    #define SCE_B_DEFAULT 0                  //in both VB and PB lexer
-//    #define SCE_B_COMMENT 1                  //in both VB and PB lexer
-//    #define SCE_B_NUMBER 2                   //in both VB and PB lexer
-//    #define SCE_B_KEYWORD 3                  //in both VB and PB lexer
-//    #define SCE_B_STRING 4                   //in both VB and PB lexer
-//    #define SCE_B_PREPROCESSOR 5             //VB lexer only, unsupported by PB lexer
-//    #define SCE_B_OPERATOR 6                 //in both VB and PB lexer
-//    #define SCE_B_IDENTIFIER 7               //in both VB and PB lexer
-//    #define SCE_B_DATE 8                             //VB lexer only, unsupported by PB lexer
-
-//  - Statement added to KeyWords.cxx:      'LINK_LEXER(lmPB);'
-//  - Statement added to scintilla_vc6.mak: '$(DIR_O)\LexPB.obj: ...\src\LexPB.cxx $(LEX_HEADERS)'
+// Changes:
+// 17.10.2003 Toggling of subs/functions now until next sub/function - this gives better results
+// 29.10.2003 1. Bug: Toggling didn't work for subs/functions added in editor
+//            2. Own colors for PB constants and Inline Assembler SCE_B_CONSTANT and SCE_B_ASM
+//            3. Several smaller syntax coloring improvements and speed optimizations
 //
 // Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 //
 // Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 #include "Scintilla.h"
 #include "SciLexer.h"
 
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static inline bool IsTypeCharacter(const int ch) {
-       return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
+static inline bool IsTypeCharacter(const int ch)
+{
+    return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$' || ch == '?';
 }
 
 }
 
-static inline bool IsAWordChar(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+static inline bool IsAWordChar(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
 }
 
 }
 
-static inline bool IsAWordStart(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+static inline bool IsAWordStart(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
 bool MatchUpperCase(Accessor &styler, int pos, const char *s)   //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)
 {
 }
 
 bool MatchUpperCase(Accessor &styler, int pos, const char *s)   //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)
 {
-       char ch;
-       for (int i=0; *s; i++)
-       {
-               ch=styler.SafeGetCharAt(pos+i);
-               if (ch > 0x60) ch -= '\x20';
-               if (*s != ch) return false;
-               s++;
-       }
-       return true;
+    char ch;
+    for (int i=0; *s; i++)
+    {
+        ch=styler.SafeGetCharAt(pos+i);
+        if (ch > 0x60) ch -= '\x20';
+        if (*s != ch) return false;
+        s++;
+    }
+    return true;
 }
 
 }
 
-static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],
-                                                  Accessor &styler) {
-
-       WordList &keywords = *keywordlists[0];
-
-       styler.StartAt(startPos);
-
-       StyleContext sc(startPos, length, initStyle, styler);
-
-       for (; sc.More(); sc.Forward()) {
-
-               if (sc.state == SCE_B_OPERATOR)
-               {
-                       sc.SetState(SCE_B_DEFAULT);
-               }
-               else if (sc.state == SCE_B_KEYWORD)
-               {
-                       if (!IsAWordChar(sc.ch))
-                       {
-                               if (!IsTypeCharacter(sc.ch))
-                               {
-                                       if (sc.ch == ']') {sc.Forward();}
-                                       char s[100];
-                                       sc.GetCurrentLowered(s, sizeof(s));
-                                       if (keywords.InList(s))
-                                       {
-                                               if (strcmp(s, "rem") == 0)
-                                               {
-                                                       sc.ChangeState(SCE_B_COMMENT);
-                                                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
-                                               }
-                                               else
-                                               {
-                                                       sc.SetState(SCE_B_DEFAULT);
-                                               }
-                                       }
-                                       else
-                                       {
-                                               sc.ChangeState(SCE_B_IDENTIFIER);
-                                               sc.SetState(SCE_B_DEFAULT);
-                                       }
-                               }
-                       }
-               }
-               else if (sc.state == SCE_B_NUMBER)
-               {
-                       if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
-               }
-               else if (sc.state == SCE_B_STRING)
-               {
-                       // PB doubles quotes to preserve them, so just end this string
-                       // state now as a following quote will start again
-                       if (sc.ch == '\"')
-                       {
-                               if (tolower(sc.chNext) == 'c') {sc.Forward();}
-                               sc.ForwardSetState(SCE_B_DEFAULT);
-                       }
-               }
-               else if (sc.state == SCE_B_COMMENT)
-               {
-                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
-               }
-
-               if (sc.state == SCE_B_DEFAULT)
-               {
-                       if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);}
-                       else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);}
-                       else if (sc.ch == '#')
-                       {       int n = 1;
-                               int chSeek = ' ';
-                               while ((n < 100) && (chSeek == ' ' || chSeek == '\t'))
-                               {
-                                       chSeek = sc.GetRelative(n);
-                                       n++;
-                               }
-                               sc.SetState(SCE_B_OPERATOR);
-                       }
-                       else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}
-                       else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}
-                       else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}
-                       else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}
-                       else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {sc.SetState(SCE_B_KEYWORD);}
-                       else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);}
-               }
-
-       }
-       sc.Complete();
+static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],Accessor &styler) {
+
+    WordList &keywords = *keywordlists[0];
+
+    styler.StartAt(startPos);
+
+    StyleContext sc(startPos, length, initStyle, styler);
+
+    for (; sc.More(); sc.Forward()) {
+        switch (sc.state)
+        {
+            case SCE_B_OPERATOR:
+            {
+                sc.SetState(SCE_B_DEFAULT);
+                break;
+            }
+            case SCE_B_KEYWORD:
+            {
+                if (!IsAWordChar(sc.ch))
+                {
+                    if (!IsTypeCharacter(sc.ch))
+                    {
+                        char s[100];
+                        sc.GetCurrentLowered(s, sizeof(s));
+                        if (keywords.InList(s))
+                        {
+                            if (strcmp(s, "rem") == 0)
+                            {
+                                sc.ChangeState(SCE_B_COMMENT);
+                                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                            }
+                            else if (strcmp(s, "asm") == 0)
+                            {
+                                sc.ChangeState(SCE_B_ASM);
+                                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                            }
+                            else
+                            {
+                                sc.SetState(SCE_B_DEFAULT);
+                            }
+                        }
+                        else
+                        {
+                            sc.ChangeState(SCE_B_IDENTIFIER);
+                            sc.SetState(SCE_B_DEFAULT);
+                        }
+                    }
+                }
+                break;
+            }
+            case SCE_B_NUMBER:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_STRING:
+            {
+                if (sc.ch == '\"'){sc.ForwardSetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_CONSTANT:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_COMMENT:
+            {
+                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_ASM:
+            {
+                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+        }  //switch (sc.state)
+
+        // Determine if a new state should be entered:
+        if (sc.state == SCE_B_DEFAULT)
+        {
+            if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);}
+            else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);}
+            else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}
+            else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}
+            else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}
+            else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}
+            else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_B_KEYWORD);}
+            else if (sc.ch == '%') {sc.SetState(SCE_B_CONSTANT);}
+            else if (sc.ch == '$') {sc.SetState(SCE_B_CONSTANT);}
+            else if (sc.ch == '#') {sc.SetState(SCE_B_KEYWORD);}
+            else if (sc.ch == '!') {sc.SetState(SCE_B_ASM);}
+            else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);}
+        }
+    }      //for (; sc.More(); sc.Forward())
+    sc.Complete();
 }
 
 }
 
+//The folding routine for PowerBasic toggles SUBs and FUNCTIONs only. This was exactly what I wanted,
+//nothing more. I had worked with this kind of toggling for several years when I used the great good old
+//GFA Basic which is dead now. After testing the feature of toggling FOR-NEXT loops, WHILE-WEND loops
+//and so on too I found this is more disturbing then helping (for me). So if You think in another way
+//you can (or must) write Your own toggling routine ;-)
 static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
 static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
-       // No folding enabled, no reason to continue...
-       if( styler.GetPropertyInt("fold") == 0 )
-               return;
-
-       unsigned int endPos = startPos + length;
-       int lineCurrent = styler.GetLine(startPos);
-       int levelCurrent = SC_FOLDLEVELBASE;
-       if (lineCurrent > 0)
-               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
-       int levelNext = levelCurrent;
-       char chNext = styler[startPos];
-
-       bool atEOL=1;
-       for (unsigned int i = startPos; i < endPos; i++)
-       {
-               char ch = chNext;
-               chNext = styler.SafeGetCharAt(i + 1);
-
-               if( atEOL )                     //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)
-               {
-                       if( MatchUpperCase(styler,i,"FUNCTION") )  //else if(
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"STATIC FUNCTION") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"SUB") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"STATIC SUB") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       //else if( MatchUpperCase(styler,i,"MACRO") )  //ToDo: What's with single-line macros?
-               }
-
-               atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
-               if( atEOL )
-               {
-                       lineCurrent++;
-                       levelCurrent = levelNext;
-               }
-       }
-
-       if (levelNext == SC_FOLDLEVELBASE)
-       {
-               int levelUse = levelCurrent;
-               int lev = levelUse | levelNext << 16;
-               styler.SetLevel(lineCurrent, lev);
-       }
+    // No folding enabled, no reason to continue...
+    if( styler.GetPropertyInt("fold") == 0 )
+        return;
+
+    unsigned int endPos = startPos + length;
+    int lineCurrent = styler.GetLine(startPos);
+    int levelCurrent = SC_FOLDLEVELBASE;
+    if (lineCurrent > 0)
+        levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+    int levelNext = levelCurrent;
+    char chNext = styler[startPos];
+
+    bool fNewLine=true;
+    for (unsigned int i = startPos; i < endPos; i++)
+    {
+        char ch = chNext;
+        chNext = styler.SafeGetCharAt(i + 1);
+
+        if (fNewLine)            //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)
+        {
+            fNewLine=false;
+
+            switch (ch)
+            {
+            case ' ':      //Most lines start with space - so check this first
+                {
+                    int levelUse = levelCurrent;
+                    int lev = levelUse | levelNext << 16;
+                    styler.SetLevel(lineCurrent, lev);
+                    break;
+                }
+            case 'F':
+            case 'S':
+            case 'C':
+            case 'f':
+            case 's':
+            case 'c':
+                {
+                    if( MatchUpperCase(styler,i,"FUNCTION") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"SUB") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"STATIC FUNCTION") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"STATIC SUB") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                break;
+                }
+            default:
+                {
+                    int levelUse = levelCurrent;
+                    int lev = levelUse | levelNext << 16;
+                    styler.SetLevel(lineCurrent, lev);
+                    break;
+                }
+            }  //switch (ch)
+        }  //if( fNewLine )
+
+        switch (ch)
+        {
+            case '\n':
+            {
+                lineCurrent++;
+                levelCurrent = levelNext;
+                fNewLine=true;
+                break;
+            }
+            case '\r':
+            {
+                if (chNext != '\n')
+                {
+                    lineCurrent++;
+                    levelCurrent = levelNext;
+                    fNewLine=true;
+                }
+                break;
+            }
+        }  //switch (ch)
+    }  //for (unsigned int i = startPos; i < endPos; i++)
 }
 
 static const char * const pbWordListDesc[] = {
 }
 
 static const char * const pbWordListDesc[] = {
-       "Keywords",
-       0
+    "Keywords",
+    0
 };
 
 LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc);
 };
 
 LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc);
index 16a068778e774d06abdc879349c8e43886731e16..67d60fc1ae8f5a290718a732147f04c950f0d706 100644 (file)
@@ -2,8 +2,8 @@
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
-// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my> 20031020
-// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my> 2003-2004
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
@@ -40,13 +40,15 @@ static bool isSingleCharOp(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
-       if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '\\' ||
+       if (ch == '^' || ch == '&' || ch == '\\' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
                ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
                ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
-               ch == '<' || ch == '>' || ch == ',' || ch == '/' ||
+               ch == '>' || ch == ',' || 
                ch == '?' || ch == '!' || ch == '.' || ch == '~')
                return true;
                ch == '?' || ch == '!' || ch == '.' || ch == '~')
                return true;
+       // these chars are already tested before this call
+       // ch == '%' || ch == '*' || ch == '<' || ch == '/' ||
        return false;
 }
 
        return false;
 }
 
@@ -68,6 +70,7 @@ static inline bool isEndVar(char ch) {
               ch != '_' && ch != '\'';
 }
 
               ch != '_' && ch != '\'';
 }
 
+
 static inline bool isNonQuote(char ch) {
        return isalnum(ch) || ch == '_';
 }
 static inline bool isNonQuote(char ch) {
        return isalnum(ch) || ch == '_';
 }
@@ -192,6 +195,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
        || state == SCE_PL_BACKTICKS
        || state == SCE_PL_CHARACTER
        || state == SCE_PL_NUMBER
        || state == SCE_PL_BACKTICKS
        || state == SCE_PL_CHARACTER
        || state == SCE_PL_NUMBER
+       || state == SCE_PL_IDENTIFIER
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
@@ -275,7 +279,15 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        numState = PERLNUM_V_VECTOR;
                                }
                        } else if (iswordstart(ch)) {
                                        numState = PERLNUM_V_VECTOR;
                                }
                        } else if (iswordstart(ch)) {
-                               if (ch == 's' && !isNonQuote(chNext)) {
+                               if (chPrev == '>' && styler.SafeGetCharAt(i - 2) == '-') {
+                                       state = SCE_PL_IDENTIFIER;      // part of "->" expr
+                                       if ((!iswordchar(chNext) && chNext != '\'')
+                                               || (chNext == '.' && chNext2 == '.')) {
+                                               // We need that if length of word == 1!
+                                               styler.ColourTo(i, SCE_PL_IDENTIFIER);
+                                               state = SCE_PL_DEFAULT;
+                                       }
+                               } else if (ch == 's' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                } else if (ch == 'm' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                } else if (ch == 'm' && !isNonQuote(chNext)) {
@@ -391,13 +403,15 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        bk--;
                                }
                                if (bk == 0) {
                                        bk--;
                                }
                                if (bk == 0) {
+                                       // position 0 won't really be checked; rarely happens
+                                       // hard to fix due to an unsigned index i
                                        preferRE = true;
                                } else {
                                        int bkstyle = styler.StyleAt(bk);
                                        preferRE = true;
                                } else {
                                        int bkstyle = styler.StyleAt(bk);
+                                       bkch = styler.SafeGetCharAt(bk);
                                        switch(bkstyle) {
                                        case SCE_PL_OPERATOR:
                                                preferRE = true;
                                        switch(bkstyle) {
                                        case SCE_PL_OPERATOR:
                                                preferRE = true;
-                                               bkch = styler.SafeGetCharAt(bk);
                                                if (bkch == ')' || bkch == ']') {
                                                        preferRE = false;
                                                } else if (bkch == '}') {
                                                if (bkch == ')' || bkch == ']') {
                                                        preferRE = false;
                                                } else if (bkch == '}') {
@@ -408,7 +422,9 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                                bkstyle = styler.StyleAt(bk);
                                                                if (bkstyle == SCE_PL_OPERATOR) {
                                                                        bkch = styler.SafeGetCharAt(bk);
                                                                bkstyle = styler.StyleAt(bk);
                                                                if (bkstyle == SCE_PL_OPERATOR) {
                                                                        bkch = styler.SafeGetCharAt(bk);
-                                                                       if (bkch == '}') {
+                                                                       if (bkch == ';') {      // early out
+                                                                               break;
+                                                                       } else if (bkch == '}') {
                                                                                braceCount++;
                                                                        } else if (bkch == '{') {
                                                                                if (--braceCount == 0)
                                                                                braceCount++;
                                                                        } else if (bkch == '{') {
                                                                                if (--braceCount == 0)
@@ -419,21 +435,68 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                        if (bk == 0) {
                                                                // at beginning, true
                                                        } else if (braceCount == 0) {
                                                        if (bk == 0) {
                                                                // at beginning, true
                                                        } else if (braceCount == 0) {
-                                                               // balanced { found, check for variable
-                                                               bkstyle = styler.StyleAt(bk - 1);
+                                                               // balanced { found, bk>0, skip more whitespace
+                                                               if (styler.StyleAt(--bk) == SCE_PL_DEFAULT) {
+                                                                       while (bk > 0) {
+                                                                               bkstyle = styler.StyleAt(--bk);
+                                                                               if (bkstyle != SCE_PL_DEFAULT)
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                               bkstyle = styler.StyleAt(bk);
                                                                if (bkstyle == SCE_PL_SCALAR
                                                                 || bkstyle == SCE_PL_ARRAY
                                                                 || bkstyle == SCE_PL_HASH
                                                                if (bkstyle == SCE_PL_SCALAR
                                                                 || bkstyle == SCE_PL_ARRAY
                                                                 || bkstyle == SCE_PL_HASH
-                                                                || bkstyle == SCE_PL_SYMBOLTABLE) {
+                                                                || bkstyle == SCE_PL_SYMBOLTABLE
+                                                                || bkstyle == SCE_PL_OPERATOR) {
                                                                        preferRE = false;
                                                                }
                                                        }
                                                }
                                                break;
                                                                        preferRE = false;
                                                                }
                                                        }
                                                }
                                                break;
-                                       // other styles uses the default, preferRE=false
                                        case SCE_PL_IDENTIFIER:
                                        case SCE_PL_IDENTIFIER:
-                                       case SCE_PL_POD:
+                                               preferRE = true;
+                                               if (bkch == '>') {      // inputsymbol
+                                                       preferRE = false;
+                                                       break;
+                                               }
+                                               // backtrack to find "->" or "::" before identifier
+                                               while (bk > 0 && styler.StyleAt(bk) == SCE_PL_IDENTIFIER) {
+                                                       bk--;
+                                               }
+                                               while (bk > 0) {
+                                                       bkstyle = styler.StyleAt(bk);
+                                                       if (bkstyle == SCE_PL_DEFAULT ||
+                                                           bkstyle == SCE_PL_COMMENTLINE) {
+                                                       } else if (bkstyle == SCE_PL_OPERATOR) {
+                                                               // gcc 3.2.3 bloats if more compact form used
+                                                               bkch = styler.SafeGetCharAt(bk);
+                                                               if (bkch == '>') { // "->"
+                                                                       if (styler.SafeGetCharAt(bk - 1) == '-') {
+                                                                               preferRE = false;
+                                                                               break;
+                                                                       }
+                                                               } else if (bkch == ':') { // "::"
+                                                                       if (styler.SafeGetCharAt(bk - 1) == ':') {
+                                                                               preferRE = false;
+                                                                               break;
+                                                                       }
+                                                               }
+                                                       } else {// bare identifier, usually a function call but Perl
+                                                               // optimizes them as pseudo-constants, then the next
+                                                               // '/' will be a divide; favour divide over regex
+                                                               // if there is a whitespace after the '/'
+                                                               if (isspacechar(chNext)) {
+                                                                       preferRE = false;
+                                                               }
+                                                               break;
+                                                       }
+                                                       bk--;
+                                               }
+                                               break;
+                                       // other styles uses the default, preferRE=false
                                        case SCE_PL_WORD:
                                        case SCE_PL_WORD:
+                                       case SCE_PL_POD:
                                        case SCE_PL_HERE_Q:
                                        case SCE_PL_HERE_QQ:
                                        case SCE_PL_HERE_QX:
                                        case SCE_PL_HERE_Q:
                                        case SCE_PL_HERE_QQ:
                                        case SCE_PL_HERE_QX:
@@ -451,6 +514,27 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                        } else if (ch == '<' && chNext == '<') {
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
                        } else if (ch == '<' && chNext == '<') {
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
+                       } else if (ch == '<') {
+                               // looks forward for matching > on same line
+                               unsigned int fw = i + 1;
+                               while (fw < lengthDoc) {
+                                       char fwch = styler.SafeGetCharAt(fw);
+                                       if (isEOLChar(fwch) || isspacechar(fwch))
+                                               break;
+                                       else if (fwch == '>') {
+                                               if ((fw - i) == 2 &&    // '<=>' case
+                                                   styler.SafeGetCharAt(fw-1) == '=') {
+                                                       styler.ColourTo(fw, SCE_PL_OPERATOR);
+                                               } else {
+                                                       styler.ColourTo(fw, SCE_PL_IDENTIFIER);
+                                               }
+                                               i = fw;
+                                               ch = fwch;
+                                               chNext = styler.SafeGetCharAt(i+1);
+                                       }
+                                       fw++;
+                               }
+                               styler.ColourTo(i, SCE_PL_OPERATOR);
                        } else if (ch == '='    // POD
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
                        } else if (ch == '='    // POD
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
@@ -542,8 +626,9 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
-                               || (chNext == '.' && chNext2 == '.')) {
+                               || chNext == '.') {
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
+                               // "." never used in Perl variable names
                                // Archaic Perl has quotes inside names
                                if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")
                                 || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
                                // Archaic Perl has quotes inside names
                                if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")
                                 || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
@@ -555,6 +640,13 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        ch = ' ';
                                }
                        }
                                        ch = ' ';
                                }
                        }
+               } else if (state == SCE_PL_IDENTIFIER) {
+                       if ((!iswordchar(chNext) && chNext != '\'')
+                               || chNext == '.') {
+                               styler.ColourTo(i, SCE_PL_IDENTIFIER);
+                               state = SCE_PL_DEFAULT;
+                               ch = ' ';
+                       }
                } else {
                        if (state == SCE_PL_COMMENTLINE) {
                                if (isEOLChar(ch)) {
                } else {
                        if (state == SCE_PL_COMMENTLINE) {
                                if (isEOLChar(ch)) {
@@ -886,3 +978,4 @@ static const char * const perlWordListDesc[] = {
 };
 
 LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc, "perl", FoldPerlDoc, perlWordListDesc);
 };
 
 LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc, "perl", FoldPerlDoc, perlWordListDesc);
+
index 47974d1bced8911196416eb131c7334c0563e14f..d4d4f46fedb436e41403995919a5abf698c39725 100644 (file)
@@ -265,8 +265,7 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
                        } else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) {
                                unsigned int nextIndex = 0;
                                sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex));
                        } else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) {
                                unsigned int nextIndex = 0;
                                sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex));
-                               while (nextIndex > (sc.currentPos + 1)) {
-                                       sc.Forward();
+                               while (nextIndex > (sc.currentPos + 1) && sc.More()) {                                  sc.Forward();
                                }
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_P_IDENTIFIER);
                                }
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_P_IDENTIFIER);
index 144176855eeb149847ed4ef262a3bcb3cf85a140..8383eefb02efc556081b55b734ab2e521ad6aece 100644 (file)
@@ -44,6 +44,7 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
        styler.StartAt(startPos);
 
        bool fold = styler.GetPropertyInt("fold") != 0;
        styler.StartAt(startPos);
 
        bool fold = styler.GetPropertyInt("fold") != 0;
+       bool sqlBackslashEscapes = styler.GetPropertyInt("sql.backslash.escapes", 0) != 0;
        int lineCurrent = styler.GetLine(startPos);
        int spaceFlags = 0;
 
        int lineCurrent = styler.GetLine(startPos);
        int spaceFlags = 0;
 
@@ -88,6 +89,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
+                       } else if (ch == '#') {
+                               styler.ColourTo(i - 1, state);
+                               state = SCE_C_COMMENTLINEDOC;
                        } else if (ch == '\'') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_CHARACTER;
                        } else if (ch == '\'') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_CHARACTER;
@@ -106,6 +110,8 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
+                               } else if (ch == '#') {
+                                       state = SCE_C_COMMENTLINEDOC;
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
@@ -123,14 +129,18 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                                state = SCE_C_DEFAULT;
                                        }
                                }
                                                state = SCE_C_DEFAULT;
                                        }
                                }
-                       } else if (state == SCE_C_COMMENTLINE) {
+                       } else if (state == SCE_C_COMMENTLINE || state == SCE_C_COMMENTLINEDOC) {
                                if (ch == '\r' || ch == '\n') {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
                        } else if (state == SCE_C_CHARACTER) {
                                if (ch == '\r' || ch == '\n') {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
                        } else if (state == SCE_C_CHARACTER) {
-                               if (ch == '\'') {
-                                       if ( chNext == '\'' ) {
+                               if (sqlBackslashEscapes && ch == '\\') {
+                                       i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               } else if (ch == '\'') {
+                                       if (chNext == '\'') {
                                                i++;
                                        } else {
                                                styler.ColourTo(i, state);
                                                i++;
                                        } else {
                                                styler.ColourTo(i, state);
@@ -158,6 +168,8 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
+                               } else if (ch == '#') {
+                                       state = SCE_C_COMMENTLINEDOC;
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
diff --git a/contrib/src/stc/scintilla/src/LexSpecman.cxx b/contrib/src/stc/scintilla/src/LexSpecman.cxx
new file mode 100644 (file)
index 0000000..bf5d639
--- /dev/null
@@ -0,0 +1,286 @@
+// Scintilla source code edit control
+/** @file LexSpecman.cxx
+ ** Lexer for Specman E language.
+ ** Written by Avi Yegudin, based on C++ lexer by Neil Hodgson
+ **/
+// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\'');
+}
+
+static inline bool IsANumberChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '\'');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '`');
+}
+
+static void ColouriseSpecmanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                            Accessor &styler, bool caseSensitive) {
+
+       WordList &keywords = *keywordlists[0];
+       WordList &keywords2 = *keywordlists[1];
+       WordList &keywords3 = *keywordlists[2];
+       WordList &keywords4 = *keywordlists[3];
+
+       // Do not leak onto next line
+       if (initStyle == SCE_SN_STRINGEOL)
+               initStyle = SCE_SN_CODE;
+
+       int visibleChars = 0;
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.atLineStart && (sc.state == SCE_SN_STRING)) {
+                       // Prevent SCE_SN_STRINGEOL from leaking back to previous line
+                       sc.SetState(SCE_SN_STRING);
+               }
+
+               // Handle line continuation generically.
+               if (sc.ch == '\\') {
+                       if (sc.chNext == '\n' || sc.chNext == '\r') {
+                               sc.Forward();
+                               if (sc.ch == '\r' && sc.chNext == '\n') {
+                                       sc.Forward();
+                               }
+                               continue;
+                       }
+               }
+
+               // Determine if the current state should terminate.
+               if (sc.state == SCE_SN_OPERATOR) {
+                       sc.SetState(SCE_SN_CODE);
+               } else if (sc.state == SCE_SN_NUMBER) {
+                       if (!IsANumberChar(sc.ch)) {
+                               sc.SetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_IDENTIFIER) {
+                       if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
+                               char s[100];
+                               if (caseSensitive) {
+                                       sc.GetCurrent(s, sizeof(s));
+                               } else {
+                                       sc.GetCurrentLowered(s, sizeof(s));
+                               }
+                               if (keywords.InList(s)) {
+                                       sc.ChangeState(SCE_SN_WORD);
+                               } else if (keywords2.InList(s)) {
+                                       sc.ChangeState(SCE_SN_WORD2);
+                               } else if (keywords3.InList(s)) {
+                                        sc.ChangeState(SCE_SN_WORD3);
+                               } else if (keywords4.InList(s)) {
+                                       sc.ChangeState(SCE_SN_USER);
+                               }
+                               sc.SetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_PREPROCESSOR) {
+                        if (IsASpace(sc.ch)) {
+                                sc.SetState(SCE_SN_CODE);
+                        }
+               } else if (sc.state == SCE_SN_DEFAULT) {
+                       if (sc.Match('<', '\'')) {
+                               sc.Forward();
+                               sc.ForwardSetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_COMMENTLINE || sc.state == SCE_SN_COMMENTLINEBANG) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_SN_CODE);
+                               visibleChars = 0;
+                       }
+               } else if (sc.state == SCE_SN_STRING) {
+                       if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\"') {
+                               sc.ForwardSetState(SCE_SN_CODE);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_SN_STRINGEOL);
+                               sc.ForwardSetState(SCE_SN_CODE);
+                               visibleChars = 0;
+                       }
+               } else if (sc.state == SCE_SN_SIGNAL) {
+                       if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_SN_STRINGEOL);
+                               sc.ForwardSetState(SCE_SN_CODE);
+                               visibleChars = 0;
+                       } else if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\'') {
+                               sc.ForwardSetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_REGEXTAG) {
+                       if (!IsADigit(sc.ch)) {
+                               sc.SetState(SCE_SN_CODE);
+                       }
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_SN_CODE) {
+                       if (sc.ch == '$' && IsADigit(sc.chNext)) {
+                               sc.SetState(SCE_SN_REGEXTAG);
+                                sc.Forward();
+                       } else if (IsADigit(sc.ch)) {
+                                sc.SetState(SCE_SN_NUMBER);
+                       } else if (IsAWordStart(sc.ch)) {
+                               sc.SetState(SCE_SN_IDENTIFIER);
+                       } else if (sc.Match('\'', '>')) {
+                                sc.SetState(SCE_SN_DEFAULT);
+                               sc.Forward();   // Eat the * so it isn't used for the end of the comment
+                       } else if (sc.Match('/', '/')) {
+                               if (sc.Match("//!"))    // Nice to have a different comment style
+                                       sc.SetState(SCE_SN_COMMENTLINEBANG);
+                               else
+                                       sc.SetState(SCE_SN_COMMENTLINE);
+                       } else if (sc.Match('-', '-')) {
+                               if (sc.Match("--!"))    // Nice to have a different comment style
+                                       sc.SetState(SCE_SN_COMMENTLINEBANG);
+                               else
+                                       sc.SetState(SCE_SN_COMMENTLINE);
+                       } else if (sc.ch == '\"') {
+                               sc.SetState(SCE_SN_STRING);
+                       } else if (sc.ch == '\'') {
+                               sc.SetState(SCE_SN_SIGNAL);
+                       } else if (sc.ch == '#' && visibleChars == 0) {
+                               // Preprocessor commands are alone on their line
+                               sc.SetState(SCE_SN_PREPROCESSOR);
+                               // Skip whitespace between # and preprocessor word
+                               do {
+                                       sc.Forward();
+                               } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More());
+                               if (sc.atLineEnd) {
+                                       sc.SetState(SCE_SN_CODE);
+                               }
+                       } else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@') {
+                               sc.SetState(SCE_SN_OPERATOR);
+                       }
+               }
+
+               if (sc.atLineEnd) {
+                       // Reset states to begining of colourise so no surprises
+                       // if different sets of lines lexed.
+                       visibleChars = 0;
+               }
+               if (!IsASpace(sc.ch)) {
+                       visibleChars++;
+               }
+       }
+       sc.Complete();
+}
+
+// Store both the current line's fold level and the next lines in the
+// level store to make it easy to pick up with each increment
+// and to make it possible to fiddle the current level for "} else {".
+static void FoldNoBoxSpecmanDoc(unsigned int startPos, int length, int,
+                            Accessor &styler) {
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0;
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelCurrent = SC_FOLDLEVELBASE;
+       if (lineCurrent > 0)
+               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+       int levelMinCurrent = levelCurrent;
+       int levelNext = levelCurrent;
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       int style;
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               //int stylePrev = style;
+               style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if (foldComment && (style == SCE_SN_COMMENTLINE)) {
+                       if (((ch == '/') && (chNext == '/')) ||
+                            ((ch == '-') && (chNext == '-'))) {
+                               char chNext2 = styler.SafeGetCharAt(i + 2);
+                               if (chNext2 == '{') {
+                                       levelNext++;
+                               } else if (chNext2 == '}') {
+                                       levelNext--;
+                               }
+                       }
+               }
+               if (style == SCE_SN_OPERATOR) {
+                       if (ch == '{') {
+                               // Measure the minimum before a '{' to allow
+                               // folding on "} else {"
+                               if (levelMinCurrent > levelNext) {
+                                       levelMinCurrent = levelNext;
+                               }
+                               levelNext++;
+                       } else if (ch == '}') {
+                               levelNext--;
+                       }
+               }
+               if (atEOL) {
+                       int levelUse = levelCurrent;
+                       if (foldAtElse) {
+                               levelUse = levelMinCurrent;
+                       }
+                       int lev = levelUse | levelNext << 16;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if (levelUse < levelNext)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelCurrent = levelNext;
+                       levelMinCurrent = levelCurrent;
+                       visibleChars = 0;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+}
+
+static void FoldSpecmanDoc(unsigned int startPos, int length, int initStyle, WordList *[],
+                       Accessor &styler) {
+       FoldNoBoxSpecmanDoc(startPos, length, initStyle, styler);
+}
+
+static const char * const specmanWordLists[] = {
+            "Primary keywords and identifiers",
+            "Secondary keywords and identifiers",
+            "Sequence keywords and identifiers",
+            "User defined keywords and identifiers",
+            "Unused",
+            0,
+        };
+
+static void ColouriseSpecmanDocSensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                                     Accessor &styler) {
+       ColouriseSpecmanDoc(startPos, length, initStyle, keywordlists, styler, true);
+}
+
+
+LexerModule lmSpecman(SCLEX_SPECMAN, ColouriseSpecmanDocSensitive, "specman", FoldSpecmanDoc, specmanWordLists);
diff --git a/contrib/src/stc/scintilla/src/LexVerilog.cxx b/contrib/src/stc/scintilla/src/LexVerilog.cxx
new file mode 100644 (file)
index 0000000..43ef7eb
--- /dev/null
@@ -0,0 +1,299 @@
+// Scintilla source code edit control
+/** @file LexVerilog.cxx
+ ** Lexer for Verilog.
+ ** Written by Avi Yegudin, based on C++ lexer by Neil Hodgson
+ **/
+// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\'');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '$');
+}
+
+static void ColouriseVerilogDoc(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];
+
+       // Do not leak onto next line
+       if (initStyle == SCE_V_STRINGEOL)
+               initStyle = SCE_V_DEFAULT;
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.atLineStart && (sc.state == SCE_V_STRING)) {
+                       // Prevent SCE_V_STRINGEOL from leaking back to previous line
+                       sc.SetState(SCE_V_STRING);
+               }
+
+               // Handle line continuation generically.
+               if (sc.ch == '\\') {
+                       if (sc.chNext == '\n' || sc.chNext == '\r') {
+                               sc.Forward();
+                               if (sc.ch == '\r' && sc.chNext == '\n') {
+                                       sc.Forward();
+                               }
+                               continue;
+                       }
+               }
+
+               // Determine if the current state should terminate.
+               if (sc.state == SCE_V_OPERATOR) {
+                       sc.SetState(SCE_V_DEFAULT);
+               } else if (sc.state == SCE_V_NUMBER) {
+                       if (!IsAWordChar(sc.ch)) {
+                               sc.SetState(SCE_V_DEFAULT);
+                       }
+               } else if (sc.state == SCE_V_IDENTIFIER) {
+                       if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
+                               char s[100];
+                                sc.GetCurrent(s, sizeof(s));
+                               if (keywords.InList(s)) {
+                                       sc.ChangeState(SCE_V_WORD);
+                               } else if (keywords2.InList(s)) {
+                                       sc.ChangeState(SCE_V_WORD2);
+                               } else if (keywords3.InList(s)) {
+                                       sc.ChangeState(SCE_V_WORD3);
+                                } else if (keywords4.InList(s)) {
+                                       sc.ChangeState(SCE_V_USER);
+                               }
+                               sc.SetState(SCE_V_DEFAULT);
+                       }
+               } else if (sc.state == SCE_V_PREPROCESSOR) {
+                        if (!IsAWordChar(sc.ch)) {
+                                sc.SetState(SCE_V_DEFAULT);
+                        }
+               } else if (sc.state == SCE_V_COMMENT) {
+                       if (sc.Match('*', '/')) {
+                               sc.Forward();
+                               sc.ForwardSetState(SCE_V_DEFAULT);
+                       }
+               } else if (sc.state == SCE_V_COMMENTLINE || sc.state == SCE_V_COMMENTLINEBANG) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_V_DEFAULT);
+                       }
+                } else if (sc.state == SCE_V_STRING) {
+                       if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\"') {
+                               sc.ForwardSetState(SCE_V_DEFAULT);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_V_STRINGEOL);
+                               sc.ForwardSetState(SCE_V_DEFAULT);
+                       }
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_V_DEFAULT) {
+                       if (IsADigit(sc.ch) || (sc.ch == '\'') || (sc.ch == '.' && IsADigit(sc.chNext))) {
+                               sc.SetState(SCE_V_NUMBER);
+                       } else if (IsAWordStart(sc.ch)) {
+                               sc.SetState(SCE_V_IDENTIFIER);
+                       } else if (sc.Match('/', '*')) {
+                                sc.SetState(SCE_V_COMMENT);
+                               sc.Forward();   // Eat the * so it isn't used for the end of the comment
+                       } else if (sc.Match('/', '/')) {
+                               if (sc.Match("//!"))    // Nice to have a different comment style
+                                       sc.SetState(SCE_V_COMMENTLINEBANG);
+                               else
+                                       sc.SetState(SCE_V_COMMENTLINE);
+                       } else if (sc.ch == '\"') {
+                               sc.SetState(SCE_V_STRING);
+                       } else if (sc.ch == '`') {
+                               sc.SetState(SCE_V_PREPROCESSOR);
+                               // Skip whitespace between ` and preprocessor word
+                               do {
+                                       sc.Forward();
+                               } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More());
+                               if (sc.atLineEnd) {
+                                       sc.SetState(SCE_V_DEFAULT);
+                               }
+                       } else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '#') {
+                               sc.SetState(SCE_V_OPERATOR);
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+static bool IsStreamCommentStyle(int style) {
+       return style == SCE_V_COMMENT;
+}
+
+// Store both the current line's fold level and the next lines in the
+// level store to make it easy to pick up with each increment
+// and to make it possible to fiddle the current level for "} else {".
+static void FoldNoBoxVerilogDoc(unsigned int startPos, int length, int initStyle,
+                            Accessor &styler) {
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool foldPreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0;
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0;
+        // Verilog specific folding options:
+        // fold_at_module -
+        //      Generally used methodology in verilog code is
+        //      one module per file, so folding at module definition is useless.
+        // fold_at_brace/parenthese -
+        //      Folding of long port lists can be convenient. 
+       bool foldAtModule = styler.GetPropertyInt("fold.verilog.flags", 0) != 0;
+       bool foldAtBrace  = 1;
+       bool foldAtParenthese  = 1;
+                                
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelCurrent = SC_FOLDLEVELBASE;
+       if (lineCurrent > 0)
+               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+       int levelMinCurrent = levelCurrent;
+       int levelNext = levelCurrent;
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       int style = initStyle;
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               int stylePrev = style;
+               style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if (foldComment && IsStreamCommentStyle(style)) {
+                       if (!IsStreamCommentStyle(stylePrev)) {
+                               levelNext++;
+                       } else if (!IsStreamCommentStyle(styleNext) && !atEOL) {
+                               // Comments don't end at end of line and the next character may be unstyled.
+                               levelNext--;
+                       }
+               }
+               if (foldComment && (style == SCE_V_COMMENTLINE)) {
+                       if ((ch == '/') && (chNext == '/')) {
+                               char chNext2 = styler.SafeGetCharAt(i + 2);
+                               if (chNext2 == '{') {
+                                       levelNext++;
+                               } else if (chNext2 == '}') {
+                                       levelNext--;
+                               }
+                       }
+               }
+               if (foldPreprocessor && (style == SCE_V_PREPROCESSOR)) {
+                       if (ch == '`') {
+                               unsigned int j = i + 1;
+                               while ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {
+                                       j++;
+                               }
+                               if (styler.Match(j, "if")) {
+                                       levelNext++;
+                               } else if (styler.Match(j, "end")) {
+                                       levelNext--;
+                               }
+                       }
+               }
+                if (style == SCE_V_OPERATOR) {
+                    if (foldAtParenthese) {
+                       if (ch == '(') {
+                               levelNext++;
+                       } else if (ch == ')') {
+                               levelNext--;
+                       }
+                    }
+               }
+                if (style == SCE_V_OPERATOR) {
+                    if (foldAtBrace) {
+                       if (ch == '{') {
+                               levelNext++;
+                       } else if (ch == '}') {
+                               levelNext--;
+                       }
+                    }
+               }
+                if (style == SCE_V_WORD && stylePrev != SCE_V_WORD) {
+                        unsigned int j = i;
+                        if (styler.Match(j, "case") || 
+                            styler.Match(j, "casex") || 
+                            styler.Match(j, "casez") || 
+                            styler.Match(j, "function") || 
+                            styler.Match(j, "fork") || 
+                            styler.Match(j, "table") || 
+                            styler.Match(j, "task") || 
+                            styler.Match(j, "specify") || 
+                            styler.Match(j, "primitive") || 
+                            styler.Match(j, "module") && foldAtModule || 
+                            styler.Match(j, "begin")) {
+                                levelNext++;
+                        } else if (styler.Match(j, "endcase") || 
+                                   styler.Match(j, "endfunction") ||
+                                   styler.Match(j, "join") ||
+                                   styler.Match(j, "endtask") ||
+                                   styler.Match(j, "endtable") ||
+                                   styler.Match(j, "endspecify") ||
+                                   styler.Match(j, "endprimitive") ||
+                                   styler.Match(j, "endmodule") && foldAtModule ||
+                                   styler.Match(j, "end") && !IsAWordChar(styler.SafeGetCharAt(j+3))) {
+                                levelNext--;
+                        }
+               }
+               if (atEOL) {
+                       int levelUse = levelCurrent;
+                       if (foldAtElse) {
+                               levelUse = levelMinCurrent;
+                       }
+                       int lev = levelUse | levelNext << 16;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if (levelUse < levelNext)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelCurrent = levelNext;
+                       levelMinCurrent = levelCurrent;
+                       visibleChars = 0;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+}
+
+static void FoldVerilogDoc(unsigned int startPos, int length, int initStyle, WordList *[],
+                       Accessor &styler) {
+       FoldNoBoxVerilogDoc(startPos, length, initStyle, styler);
+}
+
+static const char * const verilogWordLists[] = {
+            "Primary keywords and identifiers",
+            "Secondary keywords and identifiers",
+            "System Tasks",
+            "User defined tasks and identifiers",
+            "Unused",
+            0,
+        };
+
+
+LexerModule lmVerilog(SCLEX_VERILOG, ColouriseVerilogDoc, "verilog", FoldVerilogDoc, verilogWordLists);
index 658d5046a431cd6532e050a42dd626dae6162ca2..d0a7f8b0f7f1c8ff6b69637e9a7d2aa7466d3b1f 100644 (file)
@@ -71,6 +71,264 @@ bool EqualCaseInsensitive(const char *a, const char *b) {
        return 0 == CompareCaseInsensitive(a, b);
 }
 
        return 0 == CompareCaseInsensitive(a, b);
 }
 
+// Since the CaseInsensitive functions declared in SString
+// are implemented here, I will for now put the non-inline
+// implementations of the SString members here as well, so
+// that I can quickly see what effect this has.
+
+SString::SString(int i) : sizeGrowth(sizeGrowthDefault) {
+       char number[32];
+       sprintf(number, "%0d", i);
+       s = StringAllocate(number);
+       sSize = sLen = (s) ? strlen(s) : 0;
+}
+
+SString::SString(double d, int precision) : sizeGrowth(sizeGrowthDefault) {
+       char number[32];
+       sprintf(number, "%.*f", precision, d);
+       s = StringAllocate(number);
+       sSize = sLen = (s) ? strlen(s) : 0;
+}
+
+bool SString::grow(lenpos_t lenNew) {
+       while (sizeGrowth * 6 < lenNew) {
+               sizeGrowth *= 2;
+       }
+       char *sNew = new char[lenNew + sizeGrowth + 1];
+       if (sNew) {
+               if (s) {
+                       memcpy(sNew, s, sLen);
+                       delete []s;
+               }
+               s = sNew;
+               s[sLen] = '\0';
+               sSize = lenNew + sizeGrowth;
+       }
+       return sNew != 0;
+}
+
+SString &SString::assign(const char *sOther, lenpos_t sSize_) {
+       if (!sOther) {
+               sSize_ = 0;
+       } else if (sSize_ == measure_length) {
+               sSize_ = strlen(sOther);
+       }
+       if (sSize > 0 && sSize_ <= sSize) {     // Does not allocate new buffer if the current is big enough
+               if (s && sSize_) {
+                       memcpy(s, sOther, sSize_);
+               }
+               s[sSize_] = '\0';
+               sLen = sSize_;
+       } else {
+               delete []s;
+               s = StringAllocate(sOther, sSize_);
+               if (s) {
+                       sSize = sSize_; // Allow buffer bigger than real string, thus providing space to grow
+                       sLen = strlen(s);
+               } else {
+                       sSize = sLen = 0;
+               }
+       }
+       return *this;
+}
+
+bool SString::operator==(const SString &sOther) const {
+       if ((s == 0) && (sOther.s == 0))
+               return true;
+       if ((s == 0) || (sOther.s == 0))
+               return false;
+       return strcmp(s, sOther.s) == 0;
+}
+
+bool SString::operator==(const char *sOther) const {
+       if ((s == 0) && (sOther == 0))
+               return true;
+       if ((s == 0) || (sOther == 0))
+               return false;
+       return strcmp(s, sOther) == 0;
+}
+
+SString SString::substr(lenpos_t subPos, lenpos_t subLen) const {
+       if (subPos >= sLen) {
+               return SString();                                       // return a null string if start index is out of bounds
+       }
+       if ((subLen == measure_length) || (subPos + subLen > sLen)) {
+               subLen = sLen - subPos;         // can't substr past end of source string
+       }
+       return SString(s, subPos, subPos + subLen);
+}
+
+SString &SString::lowercase(lenpos_t subPos, lenpos_t subLen) {
+       if ((subLen == measure_length) || (subPos + subLen > sLen)) {
+               subLen = sLen - subPos;         // don't apply past end of string
+       }
+       for (lenpos_t i = subPos; i < subPos + subLen; i++) {
+               if (s[i] < 'A' || s[i] > 'Z')
+                       continue;
+               else
+                       s[i] = static_cast<char>(s[i] - 'A' + 'a');
+       }
+       return *this;
+}
+
+SString &SString::uppercase(lenpos_t subPos, lenpos_t subLen) {
+       if ((subLen == measure_length) || (subPos + subLen > sLen)) {
+               subLen = sLen - subPos;         // don't apply past end of string
+       }
+       for (lenpos_t i = subPos; i < subPos + subLen; i++) {
+               if (s[i] < 'a' || s[i] > 'z')
+                       continue;
+               else
+                       s[i] = static_cast<char>(s[i] - 'a' + 'A');
+       }
+       return *this;
+}
+
+SString &SString::append(const char *sOther, lenpos_t sLenOther, char sep) {
+       if (!sOther) {
+               return *this;
+       }
+       if (sLenOther == measure_length) {
+               sLenOther = strlen(sOther);
+       }
+       int lenSep = 0;
+       if (sLen && sep) {      // Only add a separator if not empty
+               lenSep = 1;
+       }
+       lenpos_t lenNew = sLen + sLenOther + lenSep;
+       // Conservative about growing the buffer: don't do it, unless really needed
+       if ((lenNew < sSize) || (grow(lenNew))) {
+               if (lenSep) {
+                       s[sLen] = sep;
+                       sLen++;
+               }
+               memcpy(&s[sLen], sOther, sLenOther);
+               sLen += sLenOther;
+               s[sLen] = '\0';
+       }
+       return *this;
+}
+
+SString &SString::insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther) {
+       if (!sOther || pos > sLen) {
+               return *this;
+       }
+       if (sLenOther == measure_length) {
+               sLenOther = strlen(sOther);
+       }
+       lenpos_t lenNew = sLen + sLenOther;
+       // Conservative about growing the buffer: don't do it, unless really needed
+       if ((lenNew < sSize) || grow(lenNew)) {
+               lenpos_t moveChars = sLen - pos + 1;
+               for (lenpos_t i = moveChars; i > 0; i--) {
+                       s[pos + sLenOther + i - 1] = s[pos + i - 1];
+               }
+               memcpy(s + pos, sOther, sLenOther);
+               sLen = lenNew;
+       }
+       return *this;
+}
+
+/**
+ * Remove @a len characters from the @a pos position, included.
+ * Characters at pos + len and beyond replace characters at pos.
+ * If @a len is 0, or greater than the length of the string
+ * starting at @a pos, the string is just truncated at @a pos.
+ */
+void SString::remove(lenpos_t pos, lenpos_t len) {
+       if (pos >= sLen) {
+               return;
+       }
+       if (len < 1 || pos + len >= sLen) {
+               s[pos] = '\0';
+               sLen = pos;
+       } else {
+               for (lenpos_t i = pos; i < sLen - len + 1; i++) {
+                       s[i] = s[i+len];
+               }
+               sLen -= len;
+       }
+}
+
+bool SString::startswith(const char *prefix) {
+       lenpos_t lenPrefix = strlen(prefix);
+       if (lenPrefix > sLen) {
+               return false;
+       }
+       return strncmp(s, prefix, lenPrefix) == 0;
+}
+
+bool SString::endswith(const char *suffix) {
+       lenpos_t lenSuffix = strlen(suffix);
+       if (lenSuffix > sLen) {
+               return false;
+       }
+       return strncmp(s + sLen - lenSuffix, suffix, lenSuffix) == 0;
+}
+
+int SString::search(const char *sFind, lenpos_t start) const {
+       if (start < sLen) {
+               const char *sFound = strstr(s + start, sFind);
+               if (sFound) {
+                       return sFound - s;
+               }
+       }
+       return -1;
+}
+
+int SString::substitute(char chFind, char chReplace) {
+       int c = 0;
+       char *t = s;
+       while (t) {
+               t = strchr(t, chFind);
+               if (t) {
+                       *t = chReplace;
+                       t++;
+                       c++;
+               }
+       }
+       return c;
+}
+
+int SString::substitute(const char *sFind, const char *sReplace) {
+       int c = 0;
+       lenpos_t lenFind = strlen(sFind);
+       lenpos_t lenReplace = strlen(sReplace);
+       int posFound = search(sFind);
+       while (posFound >= 0) {
+               remove(posFound, lenFind);
+               insert(posFound, sReplace, lenReplace);
+               posFound = search(sFind, posFound + lenReplace);
+               c++;
+       }
+       return c;
+}
+
+char *SContainer::StringAllocate(lenpos_t len) {
+       if (len != measure_length) {
+               return new char[len + 1];
+       } else {
+               return 0;
+       }
+}
+
+char *SContainer::StringAllocate(const char *s, lenpos_t len) {
+       if (s == 0) {
+               return 0;
+       }
+       if (len == measure_length) {
+               len = strlen(s);
+       }
+       char *sNew = new char[len + 1];
+       if (sNew) {
+               memcpy(sNew, s, len);
+               sNew[len] = '\0';
+       }
+       return sNew;
+}
+
+// End SString functions
+
 PropSet::PropSet() {
        superPS = 0;
        for (int root = 0; root < hashRoots; root++)
 PropSet::PropSet() {
        superPS = 0;
        for (int root = 0; root < hashRoots; root++)
@@ -596,8 +854,8 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
-                                       } 
-                                       else if (cond > 0) 
+                                       }
+                                       else if (cond > 0)
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
@@ -633,8 +891,8 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
-                                       } 
-                                       else if (cond > 0) 
+                                       }
+                                       else if (cond > 0)
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
@@ -695,8 +953,9 @@ char *WordList::GetNearestWords(
     const char *wordStart,
     int searchLen /*= -1*/,
     bool ignoreCase /*= false*/,
     const char *wordStart,
     int searchLen /*= -1*/,
     bool ignoreCase /*= false*/,
-    char otherSeparator /*= '\0'*/) {
-       int wordlen; // length of the word part (before the '(' brace) of the api array element
+    char otherSeparator /*= '\0'*/,
+    bool exactLen /*=false*/) {
+       unsigned int wordlen; // length of the word part (before the '(' brace) of the api array element
        SString wordsNear;
        wordsNear.setsizegrowth(1000);
        int start = 0; // lower bound of the api array block to search
        SString wordsNear;
        wordsNear.setsizegrowth(1000);
        int start = 0; // lower bound of the api array block to search
@@ -726,6 +985,8 @@ char *WordList::GetNearestWords(
                                        (0 == CompareNCaseInsensitive(wordStart,
                                                wordsNoCase[pivot], searchLen))) {
                                        wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;
                                        (0 == CompareNCaseInsensitive(wordStart,
                                                wordsNoCase[pivot], searchLen))) {
                                        wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;
+                                       if (exactLen && wordlen != LengthWord(wordStart, otherSeparator) + 1)
+                                               break;
                                        wordsNear.append(wordsNoCase[pivot], wordlen, ' ');
                                        ++pivot;
                                }
                                        wordsNear.append(wordsNoCase[pivot], wordlen, ' ');
                                        ++pivot;
                                }
@@ -752,6 +1013,8 @@ char *WordList::GetNearestWords(
                                        (0 == strncmp(wordStart,
                                                words[pivot], searchLen))) {
                                        wordlen = LengthWord(words[pivot], otherSeparator) + 1;
                                        (0 == strncmp(wordStart,
                                                words[pivot], searchLen))) {
                                        wordlen = LengthWord(words[pivot], otherSeparator) + 1;
+                                       if (exactLen && wordlen != LengthWord(wordStart, otherSeparator) + 1)
+                                               break;
                                        wordsNear.append(words[pivot], wordlen, ' ');
                                        ++pivot;
                                }
                                        wordsNear.append(words[pivot], wordlen, ' ');
                                        ++pivot;
                                }
index e42b5dc65ea0b0e065295df708d615e6a3e0729b..cc02674b355995c6284b3b19579930c449420039 100644 (file)
@@ -297,7 +297,7 @@ void ScintillaBase::AutoCompleteCharacterAdded(char ch) {
 }
 
 void ScintillaBase::AutoCompleteCharacterDeleted() {
 }
 
 void ScintillaBase::AutoCompleteCharacterDeleted() {
-       if (currentPos <= ac.posStart - ac.startLen) {
+       if (currentPos < ac.posStart - ac.startLen) {
                ac.Cancel();
        } else if (ac.cancelAtStartPos && (currentPos <= ac.posStart)) {
                ac.Cancel();
                ac.Cancel();
        } else if (ac.cancelAtStartPos && (currentPos <= ac.posStart)) {
                ac.Cancel();
@@ -314,6 +314,8 @@ void ScintillaBase::AutoCompleteCompleted() {
                ac.lb->GetValue(item, selected, sizeof(selected));
        }
        ac.Cancel();
                ac.lb->GetValue(item, selected, sizeof(selected));
        }
        ac.Cancel();
+       if (item == -1)
+               return;
 
        if (listType > 0) {
                userListSelected = selected;
 
        if (listType > 0) {
                userListSelected = selected;
index 2aea5fef98b42c9dd5e4c4eb28a0cde878ee27cb..f01aee0826c820e8b9db9d069379abfe8507a4f1 100644 (file)
@@ -67,8 +67,8 @@ Style &Style::operator=(const Style &source) {
 
 void Style::Clear(ColourDesired fore_, ColourDesired back_, int size_,
                   const char *fontName_, int characterSet_,
 
 void Style::Clear(ColourDesired fore_, ColourDesired back_, int size_,
                   const char *fontName_, int characterSet_,
-                  bool bold_, bool italic_, bool eolFilled_, 
-                  bool underline_, ecaseForced caseForce_, 
+                  bool bold_, bool italic_, bool eolFilled_,
+                  bool underline_, ecaseForced caseForce_,
                  bool visible_, bool changeable_, bool hotspot_) {
        fore.desired = fore_;
        back.desired = back_;
                  bool visible_, bool changeable_, bool hotspot_) {
        fore.desired = fore_;
        back.desired = back_;
@@ -102,7 +102,7 @@ void Style::ClearTo(const Style &source) {
                source.eolFilled,
                source.underline,
                source.caseForce,
                source.eolFilled,
                source.underline,
                source.caseForce,
-               source.visible, 
+               source.visible,
                source.changeable,
                source.hotspot);
 }
                source.changeable,
                source.hotspot);
 }
index bb94c25ef5716889cfc704b3b496ce3ecc0861ac..c0f7eca266ac9e2f0225ec3e9d057b93ac05acc2 100644 (file)
@@ -44,8 +44,8 @@ public:
        void Clear(ColourDesired fore_, ColourDesired back_,
                   int size_,
                   const char *fontName_, int characterSet_,
        void Clear(ColourDesired fore_, ColourDesired back_,
                   int size_,
                   const char *fontName_, int characterSet_,
-                  bool bold_, bool italic_, bool eolFilled_, 
-                  bool underline_, ecaseForced caseForce_, 
+                  bool bold_, bool italic_, bool eolFilled_,
+                  bool underline_, ecaseForced caseForce_,
                   bool visible_, bool changeable_, bool hotspot_);
        void ClearTo(const Style &source);
        bool EquivalentFontTo(const Style *other) const;
                   bool visible_, bool changeable_, bool hotspot_);
        void ClearTo(const Style &source);
        bool EquivalentFontTo(const Style *other) const;
index 64fc7a048e0be5cc7d11a2e0dd679ec9d2a6ac5c..d9da0edc47af689c57944109764ee810b247d19e 100644 (file)
@@ -2,7 +2,7 @@
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // This file is in the public domain.
 
 #include <stdlib.h>
 // This file is in the public domain.
 
 #include <stdlib.h>
index f2f8305c940b1dbc8e06c7d8dc5eea8c7f4b9b22..aedebbc012cba8ecb134fb735d37aa87dd333e35 100644 (file)
@@ -2,7 +2,7 @@
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
-// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // This file is in the public domain.
 
 // All languages handled so far can treat all characters >= 0x80 as one class
 // This file is in the public domain.
 
 // All languages handled so far can treat all characters >= 0x80 as one class
@@ -156,3 +156,13 @@ inline bool IsASpaceOrTab(unsigned int ch) {
 inline bool IsADigit(unsigned int ch) {
        return (ch >= '0') && (ch <= '9');
 }
 inline bool IsADigit(unsigned int ch) {
        return (ch >= '0') && (ch <= '9');
 }
+
+inline bool IsADigit(unsigned int ch, unsigned int base) {
+       if (base <= 10) {
+               return (ch >= '0') && (ch < '0' + base);
+       } else {
+               return ((ch >= '0') && (ch <= '9')) ||
+                      ((ch >= 'A') && (ch < 'A' + base - 10)) ||
+                      ((ch >= 'a') && (ch < 'a' + base - 10));
+       }
+}
index 80e8fc8a0dcd7158430a1e9451efda40e6ced6a2..c52f1e47287a51a1a1ed45acf8a2f54500332a0e 100644 (file)
@@ -98,6 +98,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        edgecolour.desired = source.edgecolour.desired;
        edgeState = source.edgeState;
        caretWidth = source.caretWidth;
        edgecolour.desired = source.edgecolour.desired;
        edgeState = source.edgeState;
        caretWidth = source.caretWidth;
+       someStylesProtected = false;
        leftMarginWidth = source.leftMarginWidth;
        rightMarginWidth = source.rightMarginWidth;
        for (int i=0;i < margins; i++) {
        leftMarginWidth = source.leftMarginWidth;
        rightMarginWidth = source.rightMarginWidth;
        for (int i=0;i < margins; i++) {
@@ -111,7 +112,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        viewIndentationGuides = source.viewIndentationGuides;
        viewEOL = source.viewEOL;
        showMarkedLines = source.showMarkedLines;
        viewIndentationGuides = source.viewIndentationGuides;
        viewEOL = source.viewEOL;
        showMarkedLines = source.showMarkedLines;
-        extraFontFlag = source.extraFontFlag;
+       extraFontFlag = source.extraFontFlag;
 }
 
 ViewStyle::~ViewStyle() {
 }
 
 ViewStyle::~ViewStyle() {
@@ -193,7 +194,7 @@ void ViewStyle::Init() {
        viewIndentationGuides = false;
        viewEOL = false;
        showMarkedLines = true;
        viewIndentationGuides = false;
        viewEOL = false;
        showMarkedLines = true;
-        extraFontFlag = false;
+       extraFontFlag = false;
 }
 
 void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
 }
 
 void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
index 79d885fd9f7f7decf94abe9d2583e5d478f94cbd..d06c0200272de604f482998a7d609efb4971a252 100644 (file)
@@ -89,8 +89,8 @@ public:
        int edgeState;
        int caretWidth;
        bool someStylesProtected;
        int edgeState;
        int caretWidth;
        bool someStylesProtected;
-        bool extraFontFlag;
-    
+       bool extraFontFlag;
+
        ViewStyle();
        ViewStyle(const ViewStyle &source);
        ~ViewStyle();
        ViewStyle();
        ViewStyle(const ViewStyle &source);
        ~ViewStyle();
index e693736a21c3e50831cf2d876b91d523d43f4037..d3bbb4dcc12176b8a797a424cb8674f7ddfafb6d 100644 (file)
 #include "XPM.h"
 
 static const char *NextField(const char *s) {
 #include "XPM.h"
 
 static const char *NextField(const char *s) {
+       // In case there are leading spaces in the string
+       while (*s && *s == ' ') {
+               s++;
+       }
        while (*s && *s != ' ') {
                s++;
        }
        while (*s && *s != ' ') {
                s++;
        }
@@ -70,8 +74,10 @@ void XPM::Init(const char *textForm) {
        if ((0 == memcmp(textForm, "/* X", 4)) && (0 == memcmp(textForm, "/* XPM */", 9))) {
                // Build the lines form out of the text form
                const char **linesForm = LinesFormFromTextForm(textForm);
        if ((0 == memcmp(textForm, "/* X", 4)) && (0 == memcmp(textForm, "/* XPM */", 9))) {
                // Build the lines form out of the text form
                const char **linesForm = LinesFormFromTextForm(textForm);
-               Init(linesForm);
-               delete []linesForm;
+               if (linesForm != 0) {
+                       Init(linesForm);
+                       delete []linesForm;
+               }
        } else {
                // It is really in line form
                Init(reinterpret_cast<const char * const *>(textForm));
        } else {
                // It is really in line form
                Init(reinterpret_cast<const char * const *>(textForm));
@@ -190,9 +196,11 @@ const char **XPM::LinesFormFromTextForm(const char *textForm) {
        const char **linesForm = 0;
        int countQuotes = 0;
        int strings=1;
        const char **linesForm = 0;
        int countQuotes = 0;
        int strings=1;
-       for (int j=0; countQuotes < (2*strings); j++) {
+       int j=0;
+       for (; countQuotes < (2*strings) && textForm[j] != '\0'; j++) {
                if (textForm[j] == '\"') {
                        if (countQuotes == 0) {
                if (textForm[j] == '\"') {
                        if (countQuotes == 0) {
+                               // First field: width, height, number of colors, chars per pixel
                                const char *line0 = textForm + j + 1;
                                // Skip width
                                line0 = NextField(line0);
                                const char *line0 = textForm + j + 1;
                                // Skip width
                                line0 = NextField(line0);
@@ -202,13 +210,24 @@ const char **XPM::LinesFormFromTextForm(const char *textForm) {
                                // Add 1 line for each colour
                                strings += atoi(line0);
                                linesForm = new const char *[strings];
                                // Add 1 line for each colour
                                strings += atoi(line0);
                                linesForm = new const char *[strings];
+                               if (linesForm == 0) {
+                                       break;  // Memory error!
+                               }
+                       }
+                       if (countQuotes / 2 >= strings) {
+                               break;  // Bad height or number of colors!
                        }
                        }
-                       if (linesForm && ((countQuotes & 1) == 0)) {
+                       if ((countQuotes & 1) == 0) {
                                linesForm[countQuotes / 2] = textForm + j + 1;
                        }
                        countQuotes++;
                }
        }
                                linesForm[countQuotes / 2] = textForm + j + 1;
                        }
                        countQuotes++;
                }
        }
+       if (textForm[j] == '\0' || countQuotes / 2 > strings) {
+               // Malformed XPM! Height + number of colors too high or too low
+               delete []linesForm;
+               linesForm = 0;
+       }
        return linesForm;
 }
 
        return linesForm;
 }
 
index 8ab07a92ab201863553defe45bd764fa7ae9afe1..a9a1d9fffb1fc762e418b44e1e98f768aff8e806 100644 (file)
@@ -193,7 +193,7 @@ long wxStyledTextCtrl::SendMsg(int msg, long wp, long lp) {
 //       this file.  Edit stc.cpp.in or gen_iface.py instead and regenerate.
 
 
 //       this file.  Edit stc.cpp.in or gen_iface.py instead and regenerate.
 
 
-// Add text to the document.
+// Add text to the document at current position.
 void wxStyledTextCtrl::AddText(const wxString& text) {
                     wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
                     SendMsg(2001, strlen(buf), (long)(const char*)buf);
 void wxStyledTextCtrl::AddText(const wxString& text) {
                     wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
                     SendMsg(2001, strlen(buf), (long)(const char*)buf);
@@ -219,7 +219,7 @@ void wxStyledTextCtrl::ClearDocumentStyle() {
     SendMsg(2005, 0, 0);
 }
 
     SendMsg(2005, 0, 0);
 }
 
-// The number of characters in the document.
+// Returns the number of characters in the document.
 int wxStyledTextCtrl::GetLength() {
     return SendMsg(2006, 0, 0);
 }
 int wxStyledTextCtrl::GetLength() {
     return SendMsg(2006, 0, 0);
 }
@@ -1514,6 +1514,36 @@ int wxStyledTextCtrl::GetWrapMode() {
     return SendMsg(2269, 0, 0);
 }
 
     return SendMsg(2269, 0, 0);
 }
 
+// Set the display mode of visual flags for wrapped lines.
+void wxStyledTextCtrl::SetWrapVisualFlags(int wrapVisualFlags) {
+    SendMsg(2460, wrapVisualFlags, 0);
+}
+
+// Retrive the display mode of visual flags for wrapped lines.
+int wxStyledTextCtrl::GetWrapVisualFlags() {
+    return SendMsg(2461, 0, 0);
+}
+
+// Set the location of visual flags for wrapped lines.
+void wxStyledTextCtrl::SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation) {
+    SendMsg(2462, wrapVisualFlagsLocation, 0);
+}
+
+// Retrive the location of visual flags for wrapped lines.
+int wxStyledTextCtrl::GetWrapVisualFlagsLocation() {
+    return SendMsg(2463, 0, 0);
+}
+
+// Set the start indent for wrapped lines.
+void wxStyledTextCtrl::SetWrapStartIndent(int indent) {
+    SendMsg(2464, indent, 0);
+}
+
+// Retrive the start indent for wrapped lines.
+int wxStyledTextCtrl::GetWrapStartIndent() {
+    return SendMsg(2465, 0, 0);
+}
+
 // Sets the degree of caching of layout information.
 void wxStyledTextCtrl::SetLayoutCache(int mode) {
     SendMsg(2272, mode, 0);
 // Sets the degree of caching of layout information.
 void wxStyledTextCtrl::SetLayoutCache(int mode) {
     SendMsg(2272, mode, 0);
@@ -2345,6 +2375,11 @@ int wxStyledTextCtrl::AutoCompGetCurrent() {
     return SendMsg(2445, 0, 0);
 }
 
     return SendMsg(2445, 0, 0);
 }
 
+// Enlarge the document to a particular size of text bytes.
+void wxStyledTextCtrl::Allocate(int bytes) {
+    SendMsg(2446, bytes, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
index 32b6b7bf34fd5e8cb42c01d0252a83466fa56a56..39b826243015c13921ddcf51091ea7fe52dbd967 100644 (file)
 #define wxSTC_TIME_FOREVER 10000000
 #define wxSTC_WRAP_NONE 0
 #define wxSTC_WRAP_WORD 1
 #define wxSTC_TIME_FOREVER 10000000
 #define wxSTC_WRAP_NONE 0
 #define wxSTC_WRAP_WORD 1
+#define wxSTC_WRAPVISUALFLAG_NONE 0x0000
+#define wxSTC_WRAPVISUALFLAG_END 0x0001
+#define wxSTC_WRAPVISUALFLAG_START 0x0002
+#define wxSTC_WRAPVISUALFLAGLOC_DEFAULT 0x0000
+#define wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001
+#define wxSTC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002
 #define wxSTC_CACHE_NONE 0
 #define wxSTC_CACHE_CARET 1
 #define wxSTC_CACHE_PAGE 2
 #define wxSTC_CACHE_NONE 0
 #define wxSTC_CACHE_CARET 1
 #define wxSTC_CACHE_PAGE 2
 #define wxSTC_LEX_FORTH 52
 #define wxSTC_LEX_ERLANG 53
 #define wxSTC_LEX_OCTAVE 54
 #define wxSTC_LEX_FORTH 52
 #define wxSTC_LEX_ERLANG 53
 #define wxSTC_LEX_OCTAVE 54
+#define wxSTC_LEX_MSSQL 55
+#define wxSTC_LEX_VERILOG 56
+#define wxSTC_LEX_KIX 57
+#define wxSTC_LEX_GUI4CLI 58
+#define wxSTC_LEX_SPECMAN 59
+#define wxSTC_LEX_AU3 60
+#define wxSTC_LEX_APDL 61
+#define wxSTC_LEX_BASH 62
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 #define wxSTC_HP_OPERATOR 101
 #define wxSTC_HP_IDENTIFIER 102
 
 #define wxSTC_HP_OPERATOR 101
 #define wxSTC_HP_IDENTIFIER 102
 
+// PHP
+#define wxSTC_HPHP_COMPLEX_VARIABLE 104
+
 // ASP Python
 #define wxSTC_HPA_START 105
 #define wxSTC_HPA_DEFAULT 106
 // ASP Python
 #define wxSTC_HPA_START 105
 #define wxSTC_HPA_DEFAULT 106
 #define wxSTC_B_KEYWORD2 10
 #define wxSTC_B_KEYWORD3 11
 #define wxSTC_B_KEYWORD4 12
 #define wxSTC_B_KEYWORD2 10
 #define wxSTC_B_KEYWORD3 11
 #define wxSTC_B_KEYWORD4 12
+#define wxSTC_B_CONSTANT 13
+#define wxSTC_B_ASM 14
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 #define wxSTC_ERR_IFC 16
 #define wxSTC_ERR_IFORT 17
 #define wxSTC_ERR_ABSF 18
 #define wxSTC_ERR_IFC 16
 #define wxSTC_ERR_IFORT 17
 #define wxSTC_ERR_ABSF 18
+#define wxSTC_ERR_TIDY 19
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 #define wxSTC_NSIS_IFDEFINEDEF 11
 #define wxSTC_NSIS_MACRODEF 12
 #define wxSTC_NSIS_STRINGVAR 13
 #define wxSTC_NSIS_IFDEFINEDEF 11
 #define wxSTC_NSIS_MACRODEF 12
 #define wxSTC_NSIS_STRINGVAR 13
+#define wxSTC_NSIS_NUMBER 14
 
 // Lexical states for SCLEX_MMIXAL
 #define wxSTC_MMIXAL_LEADWS 0
 
 // Lexical states for SCLEX_MMIXAL
 #define wxSTC_MMIXAL_LEADWS 0
 #define wxSTC_ERLANG_NODE_NAME 13
 #define wxSTC_ERLANG_UNKNOWN 31
 
 #define wxSTC_ERLANG_NODE_NAME 13
 #define wxSTC_ERLANG_UNKNOWN 31
 
+// Lexical states for SCLEX_OCTAVE are identical to MatLab
+// Lexical states for SCLEX_MSSQL
+#define wxSTC_MSSQL_DEFAULT 0
+#define wxSTC_MSSQL_COMMENT 1
+#define wxSTC_MSSQL_LINE_COMMENT 2
+#define wxSTC_MSSQL_NUMBER 3
+#define wxSTC_MSSQL_STRING 4
+#define wxSTC_MSSQL_OPERATOR 5
+#define wxSTC_MSSQL_IDENTIFIER 6
+#define wxSTC_MSSQL_VARIABLE 7
+#define wxSTC_MSSQL_COLUMN_NAME 8
+#define wxSTC_MSSQL_STATEMENT 9
+#define wxSTC_MSSQL_DATATYPE 10
+#define wxSTC_MSSQL_SYSTABLE 11
+#define wxSTC_MSSQL_GLOBAL_VARIABLE 12
+#define wxSTC_MSSQL_FUNCTION 13
+#define wxSTC_MSSQL_STORED_PROCEDURE 14
+#define wxSTC_MSSQL_DEFAULT_PREF_DATATYPE 15
+#define wxSTC_MSSQL_COLUMN_NAME_2 16
+
+// Lexical states for SCLEX_VERILOG
+#define wxSTC_V_DEFAULT 0
+#define wxSTC_V_COMMENT 1
+#define wxSTC_V_COMMENTLINE 2
+#define wxSTC_V_COMMENTLINEBANG 3
+#define wxSTC_V_NUMBER 4
+#define wxSTC_V_WORD 5
+#define wxSTC_V_STRING 6
+#define wxSTC_V_WORD2 7
+#define wxSTC_V_WORD3 8
+#define wxSTC_V_PREPROCESSOR 9
+#define wxSTC_V_OPERATOR 10
+#define wxSTC_V_IDENTIFIER 11
+#define wxSTC_V_STRINGEOL 12
+#define wxSTC_V_USER 19
+
+// Lexical states for SCLEX_KIX
+#define wxSTC_KIX_DEFAULT 0
+#define wxSTC_KIX_COMMENT 1
+#define wxSTC_KIX_STRING1 2
+#define wxSTC_KIX_STRING2 3
+#define wxSTC_KIX_NUMBER 4
+#define wxSTC_KIX_VAR 5
+#define wxSTC_KIX_MACRO 6
+#define wxSTC_KIX_KEYWORD 7
+#define wxSTC_KIX_FUNCTIONS 8
+#define wxSTC_KIX_OPERATOR 9
+#define wxSTC_KIX_IDENTIFIER 31
+
+// Lexical states for SCLEX_GUI4CLI
+#define wxSTC_GC_DEFAULT 0
+#define wxSTC_GC_COMMENTLINE 1
+#define wxSTC_GC_COMMENTBLOCK 2
+#define wxSTC_GC_GLOBAL 3
+#define wxSTC_GC_EVENT 4
+#define wxSTC_GC_ATTRIBUTE 5
+#define wxSTC_GC_CONTROL 6
+#define wxSTC_GC_COMMAND 7
+#define wxSTC_GC_STRING 8
+#define wxSTC_GC_OPERATOR 9
+
+// Lexical states for SCLEX_SPECMAN
+#define wxSTC_SN_DEFAULT 0
+#define wxSTC_SN_CODE 1
+#define wxSTC_SN_COMMENTLINE 2
+#define wxSTC_SN_COMMENTLINEBANG 3
+#define wxSTC_SN_NUMBER 4
+#define wxSTC_SN_WORD 5
+#define wxSTC_SN_STRING 6
+#define wxSTC_SN_WORD2 7
+#define wxSTC_SN_WORD3 8
+#define wxSTC_SN_PREPROCESSOR 9
+#define wxSTC_SN_OPERATOR 10
+#define wxSTC_SN_IDENTIFIER 11
+#define wxSTC_SN_STRINGEOL 12
+#define wxSTC_SN_REGEXTAG 13
+#define wxSTC_SN_SIGNAL 14
+#define wxSTC_SN_USER 19
+
+// Lexical states for SCLEX_AU3
+#define wxSTC_AU3_DEFAULT 0
+#define wxSTC_AU3_COMMENT 1
+#define wxSTC_AU3_COMMENTBLOCK 2
+#define wxSTC_AU3_NUMBER 3
+#define wxSTC_AU3_FUNCTION 4
+#define wxSTC_AU3_KEYWORD 5
+#define wxSTC_AU3_MACRO 6
+#define wxSTC_AU3_STRING 7
+#define wxSTC_AU3_OPERATOR 8
+#define wxSTC_AU3_VARIABLE 9
+#define wxSTC_AU3_SENT 10
+#define wxSTC_AU3_PREPROCESSOR 11
+
+// Lexical states for SCLEX_APDL
+#define wxSTC_APDL_DEFAULT 0
+#define wxSTC_APDL_COMMENT 1
+#define wxSTC_APDL_COMMENTBLOCK 2
+#define wxSTC_APDL_NUMBER 3
+#define wxSTC_APDL_STRING 4
+#define wxSTC_APDL_WORD 5
+#define wxSTC_APDL_COMMAND 6
+#define wxSTC_APDL_PROCESSOR 7
+#define wxSTC_APDL_FUNCTION 8
+
+// Lexical states for SCLEX_BASH
+#define wxSTC_SH_DEFAULT 0
+#define wxSTC_SH_ERROR 1
+#define wxSTC_SH_COMMENTLINE 2
+#define wxSTC_SH_NUMBER 3
+#define wxSTC_SH_WORD 4
+#define wxSTC_SH_STRING 5
+#define wxSTC_SH_CHARACTER 6
+#define wxSTC_SH_OPERATOR 7
+#define wxSTC_SH_IDENTIFIER 8
+#define wxSTC_SH_SCALAR 9
+#define wxSTC_SH_PARAM 10
+#define wxSTC_SH_BACKTICKS 11
+#define wxSTC_SH_HERE_DELIM 12
+#define wxSTC_SH_HERE_Q 13
+
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
@@ -1339,7 +1480,7 @@ public:
 //       and regenerate
 
 
 //       and regenerate
 
 
-    // Add text to the document.
+    // Add text to the document at current position.
     void AddText(const wxString& text);
 
     // Add array of cells to document.
     void AddText(const wxString& text);
 
     // Add array of cells to document.
@@ -1354,7 +1495,7 @@ public:
     // Set all style bytes to 0, remove all folding information.
     void ClearDocumentStyle();
 
     // Set all style bytes to 0, remove all folding information.
     void ClearDocumentStyle();
 
-    // The number of characters in the document.
+    // Returns the number of characters in the document.
     int GetLength();
 
     // Returns the character byte at the position.
     int GetLength();
 
     // Returns the character byte at the position.
@@ -2071,6 +2212,24 @@ public:
     // Retrieve whether text is word wrapped.
     int GetWrapMode();
 
     // Retrieve whether text is word wrapped.
     int GetWrapMode();
 
+    // Set the display mode of visual flags for wrapped lines.
+    void SetWrapVisualFlags(int wrapVisualFlags);
+
+    // Retrive the display mode of visual flags for wrapped lines.
+    int GetWrapVisualFlags();
+
+    // Set the location of visual flags for wrapped lines.
+    void SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation);
+
+    // Retrive the location of visual flags for wrapped lines.
+    int GetWrapVisualFlagsLocation();
+
+    // Set the start indent for wrapped lines.
+    void SetWrapStartIndent(int indent);
+
+    // Retrive the start indent for wrapped lines.
+    int GetWrapStartIndent();
+
     // Sets the degree of caching of layout information.
     void SetLayoutCache(int mode);
 
     // Sets the degree of caching of layout information.
     void SetLayoutCache(int mode);
 
@@ -2575,6 +2734,9 @@ public:
     // Get currently selected item position in the auto-completion list
     int AutoCompGetCurrent();
 
     // Get currently selected item position in the auto-completion list
     int AutoCompGetCurrent();
 
+    // Enlarge the document to a particular size of text bytes.
+    void Allocate(int bytes);
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
index 44361f13d82146d67cc694f30f419bd3a9c8fdb7..c8368bb3d7acfd930c04f7de59804d63dee58d3e 100644 (file)
@@ -108,6 +108,14 @@ STCDLL_OBJECTS =  \
        stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexYAML.o \
        stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexYAML.o \
+       stcdll_LexAPDL.o \
+       stcdll_LexAU3.o \
+       stcdll_LexBash.o \
+       stcdll_LexGui4Cli.o \
+       stcdll_LexKix.o \
+       stcdll_LexMSSQL.o \
+       stcdll_LexSpecman.o \
+       stcdll_LexVerilog.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
@@ -174,6 +182,14 @@ STCLIB_OBJECTS =  \
        stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexYAML.o \
        stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexYAML.o \
+       stclib_LexAPDL.o \
+       stclib_LexAU3.o \
+       stclib_LexBash.o \
+       stclib_LexGui4Cli.o \
+       stclib_LexKix.o \
+       stclib_LexMSSQL.o \
+       stclib_LexSpecman.o \
+       stclib_LexVerilog.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
@@ -491,6 +507,30 @@ stcdll_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
 stcdll_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexAPDL.o: $(srcdir)/scintilla/src/LexAPDL.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexAU3.o: $(srcdir)/scintilla/src/LexAU3.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexBash.o: $(srcdir)/scintilla/src/LexBash.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexGui4Cli.o: $(srcdir)/scintilla/src/LexGui4Cli.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexMSSQL.o: $(srcdir)/scintilla/src/LexMSSQL.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexVerilog.o: $(srcdir)/scintilla/src/LexVerilog.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
@@ -674,6 +714,30 @@ stclib_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
 stclib_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexAPDL.o: $(srcdir)/scintilla/src/LexAPDL.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexAU3.o: $(srcdir)/scintilla/src/LexAU3.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexBash.o: $(srcdir)/scintilla/src/LexBash.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexGui4Cli.o: $(srcdir)/scintilla/src/LexGui4Cli.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexMSSQL.o: $(srcdir)/scintilla/src/LexMSSQL.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexVerilog.o: $(srcdir)/scintilla/src/LexVerilog.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
index f8ebdb02a6d196c246cd290fee67d6fb7a9fdc20..25dca357b17b24068edf3ed461726ca16dc43c80 100644 (file)
@@ -3,4 +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.
 
 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.58
+The current version of the Scintilla code is 1.61
+
index 1058242fb36c110776e1daf27ee46011f9ebdb26..e6385da71ddf818c245c11d665e81a64e35ffbb0 100644 (file)
@@ -284,7 +284,8 @@ public:
        Font();
        virtual ~Font();
 
        Font();
        virtual ~Font();
 
-       virtual void Create(const char *faceName, int characterSet, int size, bool bold, bool italic, bool extraFontFlag=false);
+       virtual void Create(const char *faceName, int characterSet, int size,
+               bool bold, bool italic, bool extraFontFlag=false);
        virtual void Release();
 
        FontID GetID() { return id; }
        virtual void Release();
 
        FontID GetID() { return id; }
index 62cd5da3a93620d26ea1d84515011dd8b0643270..0b4c2f58de2046a4a95d06e9769ff79cae2f187d 100644 (file)
@@ -56,6 +56,11 @@ public:
        char *ToString();       // Caller must delete[] the return value
        bool GetFirst(char **key, char **val);
        bool GetNext(char **key, char **val);
        char *ToString();       // Caller must delete[] the return value
        bool GetFirst(char **key, char **val);
        bool GetNext(char **key, char **val);
+
+private:
+       // copy-value semantics not implemented 
+       PropSet(const PropSet &copy);
+       void operator=(const PropSet &assign);
 };
 
 /**
 };
 
 /**
@@ -83,11 +88,18 @@ public:
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
                bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
                bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
-               bool ignoreCase=false, char otherSeparator='\0');
+               bool ignoreCase=false, char otherSeparator='\0', bool exactLen=false);
 };
 
 inline bool IsAlphabetic(unsigned int ch) {
        return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
 }
 
 };
 
 inline bool IsAlphabetic(unsigned int ch) {
        return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
 }
 
+
+#ifdef _MSC_VER
+// Visual C++ doesn't like the private copy idiom for disabling
+// the default copy constructor and operator=, but it's fine.
+#pragma warning(disable: 4511 4512)
+#endif
+
 #endif
 #endif
index 01602df7816fbc65d28c4fd4f7af1e4b6423fd09..5c2a93d33b7737cb1a28c3b3bbe8680f5bf35409 100644 (file)
@@ -2,7 +2,7 @@
 /** @file SString.h
  ** A simple string class.
  **/
 /** @file SString.h
  ** A simple string class.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SSTRING_H
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SSTRING_H
@@ -18,100 +18,148 @@ bool EqualCaseInsensitive(const char *a, const char *b);
 // An SString may contain embedded nul characters.
 
 /**
 // An SString may contain embedded nul characters.
 
 /**
- * @brief A simple string class.
- *
- * Hold the length of the string for quick operations,
- * can have a buffer bigger than the string to avoid too many memory allocations and copies.
- * May have embedded zeroes as a result of @a substitute, but relies too heavily on C string
- * functions to allow reliable manipulations of these strings, other than simple appends, etc.
- **/
-class SString {
+ * Base class from which the two other classes (SBuffer & SString)
+ * are derived.
+ */
+class SContainer {
 public:
        /** Type of string lengths (sizes) and positions (indexes). */
        typedef size_t lenpos_t;
        /** Out of bounds value indicating that the string argument should be measured. */
        enum { measure_length=0xffffffffU};
 
 public:
        /** Type of string lengths (sizes) and positions (indexes). */
        typedef size_t lenpos_t;
        /** Out of bounds value indicating that the string argument should be measured. */
        enum { measure_length=0xffffffffU};
 
-private:
+protected:
        char *s;                                ///< The C string
        lenpos_t sSize;                 ///< The size of the buffer, less 1: ie. the maximum size of the string
        char *s;                                ///< The C string
        lenpos_t sSize;                 ///< The size of the buffer, less 1: ie. the maximum size of the string
-       lenpos_t sLen;                  ///< The size of the string in s
-       lenpos_t sizeGrowth;    ///< Minimum growth size when appending strings
-       enum { sizeGrowthDefault = 64 };
-       bool grow(lenpos_t lenNew) {
-               while (sizeGrowth * 6 < lenNew) {
-                       sizeGrowth *= 2;
-               }
-               char *sNew = new char[lenNew + sizeGrowth + 1];
-               if (sNew) {
-                       if (s) {
-                               memcpy(sNew, s, sLen);
-                               delete []s;
-                       }
-                       s = sNew;
-                       s[sLen] = '\0';
-                       sSize = lenNew + sizeGrowth;
+
+       SContainer() : s(0), sSize(0) {}
+       ~SContainer() {
+               delete []s;     // Suppose it was allocated using StringAllocate
+               s = 0;
+               sSize = 0;
+       }
+       /** Size of buffer. */
+       lenpos_t size() const {
+               if (s) {
+                       return sSize;
+               } else {
+                       return 0;
                }
                }
-               return sNew != 0;
        }
        }
+public:
+       /**
+        * Allocate uninitialized memory big enough to fit a string of the given length.
+        * @return the pointer to the new string
+        */
+       static char *StringAllocate(lenpos_t len);
+       /**
+        * Duplicate a buffer/C string.
+        * Allocate memory of the given size, or big enough to fit the string if length isn't given;
+        * then copy the given string in the allocated memory.
+        * @return the pointer to the new string
+        */
+       static char *StringAllocate(
+               const char *s,                  ///< The string to duplicate
+               lenpos_t len=measure_length);   ///< The length of memory to allocate. Optional.
+};
 
 
-       SString &assign(const char *sOther, lenpos_t sSize_=measure_length) {
-               if (!sOther) {
-                       sSize_ = 0;
-               } else if (sSize_ == measure_length) {
-                       sSize_ = strlen(sOther);
-               }
-               if (sSize > 0 && sSize_ <= sSize) {     // Does not allocate new buffer if the current is big enough
-                       if (s && sSize_) {
-                               memcpy(s, sOther, sSize_);
-                       }
-                       s[sSize_] = '\0';
-                       sLen = sSize_;
+
+/**
+ * @brief A string buffer class.
+ *
+ * Main use is to ask an API the length of a string it can provide,
+ * then to allocate a buffer of the given size, and to provide this buffer
+ * to the API to put the string.
+ * This class is intended to be shortlived, to be transformed as SString
+ * as soon as it holds the string, so it has little members.
+ * Note: we assume the buffer is filled by the API. If the length can be shorter,
+ * we should set sLen to strlen(sb.ptr()) in related SString constructor and assignment.
+ */
+class SBuffer : protected SContainer {
+public:
+       SBuffer(lenpos_t len) {
+               s = StringAllocate(len);
+               if (s) {
+                       *s = '\0';
+               sSize = len;
                } else {
                } else {
+                       sSize = 0;
+               }
+       }
+private:
+       /// Copy constructor
+       // Here only to be on the safe size, user should avoid returning SBuffer values.
+       SBuffer(const SBuffer &source) : SContainer() {
+               s = StringAllocate(source.s, source.sSize);
+               sSize = (s) ? source.sSize : 0;
+       }
+       /// Default assignment operator
+       // Same here, shouldn't be used
+       SBuffer &operator=(const SBuffer &source) {
+               if (this != &source) {
                        delete []s;
                        delete []s;
-                       s = StringAllocate(sOther, sSize_);
-                       if (s) {
-                               sSize = sSize_; // Allow buffer bigger than real string, thus providing space to grow
-                               sLen = strlen(s);
-                       } else {
-                               sSize = sLen = 0;
-                       }
+                       s = StringAllocate(source.s, source.sSize);
+                       sSize = (s) ? source.sSize : 0;
                }
                return *this;
        }
                }
                return *this;
        }
-
 public:
 public:
-       SString() : s(0), sSize(0), sLen(0), sizeGrowth(sizeGrowthDefault) {
+       /** Provide direct read/write access to buffer. */
+       char *ptr() {
+           return s;
        }
        }
-       SString(const SString &source) : sizeGrowth(sizeGrowthDefault) {
-               s = StringAllocate(source.s);
-               sSize = sLen = (s) ? strlen(s) : 0;
+       /** Ownership of the buffer have been taken, so release it. */
+       void reset() {
+               s = 0;
+               sSize = 0;
+       }
+       /** Size of buffer. */
+       lenpos_t size() const {
+               return SContainer::size();
+       }
+};
+
+
+/**
+ * @brief A simple string class.
+ *
+ * Hold the length of the string for quick operations,
+ * can have a buffer bigger than the string to avoid too many memory allocations and copies.
+ * May have embedded zeroes as a result of @a substitute, but relies too heavily on C string
+ * functions to allow reliable manipulations of these strings, other than simple appends, etc.
+ */
+class SString : protected SContainer {
+       lenpos_t sLen;                  ///< The size of the string in s
+       lenpos_t sizeGrowth;    ///< Minimum growth size when appending strings
+       enum { sizeGrowthDefault = 64 };
+
+       bool grow(lenpos_t lenNew);
+       SString &assign(const char *sOther, lenpos_t sSize_=measure_length);
+
+public:
+       SString() : sLen(0), sizeGrowth(sizeGrowthDefault) {}
+       SString(const SString &source) : SContainer(), sizeGrowth(sizeGrowthDefault) {
+               s = StringAllocate(source.s, source.sLen);
+               sSize = sLen = (s) ? source.sLen : 0;
        }
        SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
                s = StringAllocate(s_);
                sSize = sLen = (s) ? strlen(s) : 0;
        }
        }
        SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
                s = StringAllocate(s_);
                sSize = sLen = (s) ? strlen(s) : 0;
        }
+       SString(SBuffer &buf) : sizeGrowth(sizeGrowthDefault) {
+               s = buf.ptr();
+               sSize = sLen = buf.size();
+               // Consumes the given buffer!
+               buf.reset();
+       }
        SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) {
                // note: expects the "last" argument to point one beyond the range end (a la STL iterators)
                s = StringAllocate(s_ + first, last - first);
        SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) {
                // note: expects the "last" argument to point one beyond the range end (a la STL iterators)
                s = StringAllocate(s_ + first, last - first);
-               sSize = sLen = (s) ? strlen(s) : 0;
-       }
-       SString(int i) : sizeGrowth(sizeGrowthDefault) {
-               char number[32];
-               sprintf(number, "%0d", i);
-               s = StringAllocate(number);
-               sSize = sLen = (s) ? strlen(s) : 0;
-       }
-       SString(double d, int precision) : sizeGrowth(sizeGrowthDefault) {
-               char number[32];
-               sprintf(number, "%.*f", precision, d);
-               s = StringAllocate(number);
-               sSize = sLen = (s) ? strlen(s) : 0;
+               sSize = sLen = (s) ? last - first : 0;
        }
        }
+       SString(int i);
+       SString(double d, int precision);
        ~SString() {
        ~SString() {
-               delete []s;
-               s = 0;
-               sSize = 0;
                sLen = 0;
        }
        void clear() {
                sLen = 0;
        }
        void clear() {
@@ -122,58 +170,41 @@ public:
        }
        /** Size of buffer. */
        lenpos_t size() const {
        }
        /** Size of buffer. */
        lenpos_t size() const {
-               if (s)
-                       return sSize;
-               else
-                       return 0;
+               return SContainer::size();
        }
        /** Size of string in buffer. */
        lenpos_t length() const {
                return sLen;
        }
        }
        /** Size of string in buffer. */
        lenpos_t length() const {
                return sLen;
        }
+       /** Read access to a character of the string. */
+       char operator[](lenpos_t i) const {
+               return (s && i < sSize) ? s[i] : '\0';
+       }
        SString &operator=(const char *source) {
                return assign(source);
        }
        SString &operator=(const SString &source) {
                if (this != &source) {
        SString &operator=(const char *source) {
                return assign(source);
        }
        SString &operator=(const SString &source) {
                if (this != &source) {
-                       assign(source.c_str());
+                       assign(source.s, source.sLen);
                }
                return *this;
        }
                }
                return *this;
        }
-       bool operator==(const SString &sOther) const {
-               if ((s == 0) && (sOther.s == 0))
-                       return true;
-               if ((s == 0) || (sOther.s == 0))
-                       return false;
-               return strcmp(s, sOther.s) == 0;
-       }
+       bool operator==(const SString &sOther) const;
        bool operator!=(const SString &sOther) const {
                return !operator==(sOther);
        }
        bool operator!=(const SString &sOther) const {
                return !operator==(sOther);
        }
-       bool operator==(const char *sOther) const {
-               if ((s == 0) && (sOther == 0))
-                       return true;
-               if ((s == 0) || (sOther == 0))
-                       return false;
-               return strcmp(s, sOther) == 0;
-       }
+       bool operator==(const char *sOther) const;
        bool operator!=(const char *sOther) const {
                return !operator==(sOther);
        }
        bool contains(char ch) {
        bool operator!=(const char *sOther) const {
                return !operator==(sOther);
        }
        bool contains(char ch) {
-               if (s && *s)
-                       return strchr(s, ch) != 0;
-               else
-                       return false;
+               return (s && *s) ? strchr(s, ch) != 0 : false;
        }
        void setsizegrowth(lenpos_t sizeGrowth_) {
                sizeGrowth = sizeGrowth_;
        }
        const char *c_str() const {
        }
        void setsizegrowth(lenpos_t sizeGrowth_) {
                sizeGrowth = sizeGrowth_;
        }
        const char *c_str() const {
-               if (s)
-                       return s;
-               else
-                       return "";
+               return s ? s : "";
        }
        /** Give ownership of buffer to caller which must use delete[] to free buffer. */
        char *detach() {
        }
        /** Give ownership of buffer to caller which must use delete[] to free buffer. */
        char *detach() {
@@ -183,57 +214,10 @@ public:
                sLen = 0;
                return sRet;
        }
                sLen = 0;
                return sRet;
        }
-       char operator[](lenpos_t i) const {
-               if (s && i < sSize)     // Or < sLen? Depends on the use, both are OK
-                       return s[i];
-               else
-                       return '\0';
-       }
-       SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const {
-               if (subPos >= sLen) {
-                       return SString();                                       // return a null string if start index is out of bounds
-               }
-               if ((subLen == measure_length) || (subPos + subLen > sLen)) {
-                       subLen = sLen - subPos;         // can't substr past end of source string
-               }
-               return SString(s, subPos, subPos + subLen);
-       }
-       SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length) {
-               if ((subLen == measure_length) || (subPos + subLen > sLen)) {
-                       subLen = sLen - subPos;         // don't apply past end of string
-               }
-               for (lenpos_t i = subPos; i < subPos + subLen; i++) {
-                       if (s[i] < 'A' || s[i] > 'Z')
-                               continue;
-                       else
-                               s[i] = static_cast<char>(s[i] - 'A' + 'a');
-               }
-               return *this;
-       }
-       SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0') {
-               if (!sOther) {
-                       return *this;
-               }
-               if (sLenOther == measure_length) {
-                       sLenOther = strlen(sOther);
-               }
-               int lenSep = 0;
-               if (sLen && sep) {      // Only add a separator if not empty
-                       lenSep = 1;
-               }
-               lenpos_t lenNew = sLen + sLenOther + lenSep;
-               // Conservative about growing the buffer: don't do it, unless really needed
-               if ((lenNew + 1 < sSize) || (grow(lenNew))) {
-                       if (lenSep) {
-                               s[sLen] = sep;
-                               sLen++;
-                       }
-                       memcpy(&s[sLen], sOther, sLenOther);
-                       sLen += sLenOther;
-                       s[sLen] = '\0';
-               }
-               return *this;
-       }
+       SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const;
+       SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length);
+       SString &uppercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length);
+       SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0');
        SString &operator+=(const char *sOther) {
                return append(sOther, static_cast<lenpos_t>(measure_length));
        }
        SString &operator+=(const char *sOther) {
                return append(sOther, static_cast<lenpos_t>(measure_length));
        }
@@ -246,121 +230,40 @@ public:
        SString &appendwithseparator(const char *sOther, char sep) {
                return append(sOther, strlen(sOther), sep);
        }
        SString &appendwithseparator(const char *sOther, char sep) {
                return append(sOther, strlen(sOther), sep);
        }
-       SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length) {
-               if (!sOther) {
-                       return *this;
-               }
-               if (sLenOther == measure_length) {
-                       sLenOther = strlen(sOther);
-               }
-               lenpos_t lenNew = sLen + sLenOther;
-               // Conservative about growing the buffer: don't do it, unless really needed
-               if ((lenNew + 1 < sSize) || grow(lenNew)) {
-                       lenpos_t moveChars = sLen - pos + 1;
-                       for (lenpos_t i = moveChars; i > 0; i--) {
-                               s[pos + sLenOther + i - 1] = s[pos + i - 1];
-                       }
-                       memcpy(s + pos, sOther, sLenOther);
-                       sLen = lenNew;
-               }
-               return *this;
-       }
-       /** Remove @a len characters from the @a pos position, included.
+       SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length);
+
+       /**
+        * Remove @a len characters from the @a pos position, included.
         * Characters at pos + len and beyond replace characters at pos.
         * If @a len is 0, or greater than the length of the string
         * starting at @a pos, the string is just truncated at @a pos.
         */
         * Characters at pos + len and beyond replace characters at pos.
         * If @a len is 0, or greater than the length of the string
         * starting at @a pos, the string is just truncated at @a pos.
         */
-       void remove(lenpos_t pos, lenpos_t len) {
-               if (len < 1 || pos + len >= sLen) {
-                       s[pos] = '\0';
-                       sLen = pos;
-               } else {
-                       for (lenpos_t i = pos; i < sLen - len + 1; i++) {
-                               s[i] = s[i+len];
-                       }
-                       sLen -= len;
-               }
-       }
+       void remove(lenpos_t pos, lenpos_t len);
+
        SString &change(lenpos_t pos, char ch) {
        SString &change(lenpos_t pos, char ch) {
-               if (pos >= sLen) {                                      // character changed must be in string bounds
-                       return *this;
+               if (pos < sLen) {                                       // character changed must be in string bounds
+                       *(s + pos) = ch;
                }
                }
-               *(s + pos) = ch;
                return *this;
        }
        /** Read an integral numeric value from the string. */
        int value() const {
                return *this;
        }
        /** Read an integral numeric value from the string. */
        int value() const {
-               if (s)
-                       return atoi(s);
-               else
-                       return 0;
-       }
-       int search(const char *sFind, lenpos_t start=0) const {
-               if (start < sLen) {
-                       const char *sFound = strstr(s + start, sFind);
-                       if (sFound) {
-                               return sFound - s;
-                       }
-               }
-               return -1;
+               return s ? atoi(s) : 0;
        }
        }
+       bool startswith(const char *prefix);
+       bool endswith(const char *suffix);
+       int search(const char *sFind, lenpos_t start=0) const;
        bool contains(const char *sFind) {
                return search(sFind) >= 0;
        }
        bool contains(const char *sFind) {
                return search(sFind) >= 0;
        }
-       int substitute(char chFind, char chReplace) {
-               int c = 0;
-               char *t = s;
-               while (t) {
-                       t = strchr(t, chFind);
-                       if (t) {
-                               *t = chReplace;
-                               t++;
-                               c++;
-                       }
-               }
-               return c;
-       }
-       int substitute(const char *sFind, const char *sReplace) {
-               int c = 0;
-               lenpos_t lenFind = strlen(sFind);
-               lenpos_t lenReplace = strlen(sReplace);
-               int posFound = search(sFind);
-               while (posFound >= 0) {
-                       remove(posFound, lenFind);
-                       insert(posFound, sReplace, lenReplace);
-                       posFound = search(sFind, posFound + lenReplace);
-                       c++;
-               }
-               return c;
-       }
+       int substitute(char chFind, char chReplace);
+       int substitute(const char *sFind, const char *sReplace);
        int remove(const char *sFind) {
                return substitute(sFind, "");
        }
        int remove(const char *sFind) {
                return substitute(sFind, "");
        }
-       /**
-        * Duplicate a C string.
-        * Allocate memory of the given size, or big enough to fit the string if length isn't given;
-        * then copy the given string in the allocated memory.
-        * @return the pointer to the new string
-        */
-       static char *StringAllocate(
-               const char *s,                  ///< The string to duplicate
-               lenpos_t len=measure_length)    ///< The length of memory to allocate. Optional.
-       {
-               if (s == 0) {
-                       return 0;
-               }
-               if (len == measure_length) {
-                       len = strlen(s);
-               }
-               char *sNew = new char[len + 1];
-               if (sNew) {
-                       memcpy(sNew, s, len);
-                       sNew[len] = '\0';
-               }
-               return sNew;
-       }
 };
 
 };
 
+
 /**
  * Duplicate a C string.
  * Allocate memory of the given size, or big enough to fit the string if length isn't given;
 /**
  * Duplicate a C string.
  * Allocate memory of the given size, or big enough to fit the string if length isn't given;
@@ -369,9 +272,9 @@ public:
  */
 inline char *StringDup(
        const char *s,                  ///< The string to duplicate
  */
 inline char *StringDup(
        const char *s,                  ///< The string to duplicate
-       SString::lenpos_t len=SString::measure_length)  ///< The length of memory to allocate. Optional.
+       SContainer::lenpos_t len=SContainer::measure_length)    ///< The length of memory to allocate. Optional.
 {
 {
-       return SString::StringAllocate(s, len);
+       return SContainer::StringAllocate(s, len);
 }
 
 #endif
 }
 
 #endif
index 44d5dcdcda215c47d92cf07d1729289f96001051..5c8307a59551bbbc805a5d6142a57ee9d6abf81f 100644 (file)
 #define SCLEX_FORTH 52
 #define SCLEX_ERLANG 53
 #define SCLEX_OCTAVE 54
 #define SCLEX_FORTH 52
 #define SCLEX_ERLANG 53
 #define SCLEX_OCTAVE 54
+#define SCLEX_MSSQL 55
+#define SCLEX_VERILOG 56
+#define SCLEX_KIX 57
+#define SCLEX_GUI4CLI 58
+#define SCLEX_SPECMAN 59
+#define SCLEX_AU3 60
+#define SCLEX_APDL 61
+#define SCLEX_BASH 62
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_HP_DEFNAME 100
 #define SCE_HP_OPERATOR 101
 #define SCE_HP_IDENTIFIER 102
 #define SCE_HP_DEFNAME 100
 #define SCE_HP_OPERATOR 101
 #define SCE_HP_IDENTIFIER 102
+#define SCE_HPHP_COMPLEX_VARIABLE 104
 #define SCE_HPA_START 105
 #define SCE_HPA_DEFAULT 106
 #define SCE_HPA_COMMENTLINE 107
 #define SCE_HPA_START 105
 #define SCE_HPA_DEFAULT 106
 #define SCE_HPA_COMMENTLINE 107
 #define SCE_B_KEYWORD2 10
 #define SCE_B_KEYWORD3 11
 #define SCE_B_KEYWORD4 12
 #define SCE_B_KEYWORD2 10
 #define SCE_B_KEYWORD3 11
 #define SCE_B_KEYWORD4 12
+#define SCE_B_CONSTANT 13
+#define SCE_B_ASM 14
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_ERR_IFC 16
 #define SCE_ERR_IFORT 17
 #define SCE_ERR_ABSF 18
 #define SCE_ERR_IFC 16
 #define SCE_ERR_IFORT 17
 #define SCE_ERR_ABSF 18
+#define SCE_ERR_TIDY 19
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
+#define SCE_NSIS_NUMBER 14
 #define SCE_MMIXAL_LEADWS 0
 #define SCE_MMIXAL_COMMENT 1
 #define SCE_MMIXAL_LABEL 2
 #define SCE_MMIXAL_LEADWS 0
 #define SCE_MMIXAL_COMMENT 1
 #define SCE_MMIXAL_LABEL 2
 #define SCE_ERLANG_SEPARATOR 12
 #define SCE_ERLANG_NODE_NAME 13
 #define SCE_ERLANG_UNKNOWN 31
 #define SCE_ERLANG_SEPARATOR 12
 #define SCE_ERLANG_NODE_NAME 13
 #define SCE_ERLANG_UNKNOWN 31
+#define SCE_MSSQL_DEFAULT 0
+#define SCE_MSSQL_COMMENT 1
+#define SCE_MSSQL_LINE_COMMENT 2
+#define SCE_MSSQL_NUMBER 3
+#define SCE_MSSQL_STRING 4
+#define SCE_MSSQL_OPERATOR 5
+#define SCE_MSSQL_IDENTIFIER 6
+#define SCE_MSSQL_VARIABLE 7
+#define SCE_MSSQL_COLUMN_NAME 8
+#define SCE_MSSQL_STATEMENT 9
+#define SCE_MSSQL_DATATYPE 10
+#define SCE_MSSQL_SYSTABLE 11
+#define SCE_MSSQL_GLOBAL_VARIABLE 12
+#define SCE_MSSQL_FUNCTION 13
+#define SCE_MSSQL_STORED_PROCEDURE 14
+#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15
+#define SCE_MSSQL_COLUMN_NAME_2 16
+#define SCE_V_DEFAULT 0
+#define SCE_V_COMMENT 1
+#define SCE_V_COMMENTLINE 2
+#define SCE_V_COMMENTLINEBANG 3
+#define SCE_V_NUMBER 4
+#define SCE_V_WORD 5
+#define SCE_V_STRING 6
+#define SCE_V_WORD2 7
+#define SCE_V_WORD3 8
+#define SCE_V_PREPROCESSOR 9
+#define SCE_V_OPERATOR 10
+#define SCE_V_IDENTIFIER 11
+#define SCE_V_STRINGEOL 12
+#define SCE_V_USER 19
+#define SCE_KIX_DEFAULT 0
+#define SCE_KIX_COMMENT 1
+#define SCE_KIX_STRING1 2
+#define SCE_KIX_STRING2 3
+#define SCE_KIX_NUMBER 4
+#define SCE_KIX_VAR 5
+#define SCE_KIX_MACRO 6
+#define SCE_KIX_KEYWORD 7
+#define SCE_KIX_FUNCTIONS 8
+#define SCE_KIX_OPERATOR 9
+#define SCE_KIX_IDENTIFIER 31
+#define SCE_GC_DEFAULT 0
+#define SCE_GC_COMMENTLINE 1
+#define SCE_GC_COMMENTBLOCK 2
+#define SCE_GC_GLOBAL 3
+#define SCE_GC_EVENT 4
+#define SCE_GC_ATTRIBUTE 5
+#define SCE_GC_CONTROL 6
+#define SCE_GC_COMMAND 7
+#define SCE_GC_STRING 8
+#define SCE_GC_OPERATOR 9
+#define SCE_SN_DEFAULT 0
+#define SCE_SN_CODE 1
+#define SCE_SN_COMMENTLINE 2
+#define SCE_SN_COMMENTLINEBANG 3
+#define SCE_SN_NUMBER 4
+#define SCE_SN_WORD 5
+#define SCE_SN_STRING 6
+#define SCE_SN_WORD2 7
+#define SCE_SN_WORD3 8
+#define SCE_SN_PREPROCESSOR 9
+#define SCE_SN_OPERATOR 10
+#define SCE_SN_IDENTIFIER 11
+#define SCE_SN_STRINGEOL 12
+#define SCE_SN_REGEXTAG 13
+#define SCE_SN_SIGNAL 14
+#define SCE_SN_USER 19
+#define SCE_AU3_DEFAULT 0
+#define SCE_AU3_COMMENT 1
+#define SCE_AU3_COMMENTBLOCK 2
+#define SCE_AU3_NUMBER 3
+#define SCE_AU3_FUNCTION 4
+#define SCE_AU3_KEYWORD 5
+#define SCE_AU3_MACRO 6
+#define SCE_AU3_STRING 7
+#define SCE_AU3_OPERATOR 8
+#define SCE_AU3_VARIABLE 9
+#define SCE_AU3_SENT 10
+#define SCE_AU3_PREPROCESSOR 11
+#define SCE_APDL_DEFAULT 0
+#define SCE_APDL_COMMENT 1
+#define SCE_APDL_COMMENTBLOCK 2
+#define SCE_APDL_NUMBER 3
+#define SCE_APDL_STRING 4
+#define SCE_APDL_WORD 5
+#define SCE_APDL_COMMAND 6
+#define SCE_APDL_PROCESSOR 7
+#define SCE_APDL_FUNCTION 8
+#define SCE_SH_DEFAULT 0
+#define SCE_SH_ERROR 1
+#define SCE_SH_COMMENTLINE 2
+#define SCE_SH_NUMBER 3
+#define SCE_SH_WORD 4
+#define SCE_SH_STRING 5
+#define SCE_SH_CHARACTER 6
+#define SCE_SH_OPERATOR 7
+#define SCE_SH_IDENTIFIER 8
+#define SCE_SH_SCALAR 9
+#define SCE_SH_PARAM 10
+#define SCE_SH_BACKTICKS 11
+#define SCE_SH_HERE_DELIM 12
+#define SCE_SH_HERE_Q 13
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
index 68c5427b616865fb82436926dd3d8d4c23f70950..1a4e4887228a2be9a0b17b771d3746e7e6cf7dd6 100644 (file)
@@ -388,6 +388,18 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SC_WRAP_WORD 1
 #define SCI_SETWRAPMODE 2268
 #define SCI_GETWRAPMODE 2269
 #define SC_WRAP_WORD 1
 #define SCI_SETWRAPMODE 2268
 #define SCI_GETWRAPMODE 2269
+#define SC_WRAPVISUALFLAG_NONE 0x0000
+#define SC_WRAPVISUALFLAG_END 0x0001
+#define SC_WRAPVISUALFLAG_START 0x0002
+#define SCI_SETWRAPVISUALFLAGS 2460
+#define SCI_GETWRAPVISUALFLAGS 2461
+#define SC_WRAPVISUALFLAGLOC_DEFAULT 0x0000
+#define SC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001
+#define SC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002
+#define SCI_SETWRAPVISUALFLAGSLOCATION 2462
+#define SCI_GETWRAPVISUALFLAGSLOCATION 2463
+#define SCI_SETWRAPSTARTINDENT 2464
+#define SCI_GETWRAPSTARTINDENT 2465
 #define SC_CACHE_NONE 0
 #define SC_CACHE_CARET 1
 #define SC_CACHE_PAGE 2
 #define SC_CACHE_NONE 0
 #define SC_CACHE_CARET 1
 #define SC_CACHE_PAGE 2
@@ -570,6 +582,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_SETWHITESPACECHARS 2443
 #define SCI_SETCHARSDEFAULT 2444
 #define SCI_AUTOCGETCURRENT 2445
 #define SCI_SETWHITESPACECHARS 2443
 #define SCI_SETCHARSDEFAULT 2444
 #define SCI_AUTOCGETCURRENT 2445
+#define SCI_ALLOCATE 2446
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
index 06ff4e5800b64c0bac1254e080230f24435b737b..fef371328ce7b64432bec109d8ee0f8724968cce 100644 (file)
@@ -53,7 +53,7 @@
 ##     position -> integer position in a document
 ##     colour -> colour integer containing red, green and blue bytes.
 ##     string -> pointer to const character
 ##     position -> integer position in a document
 ##     colour -> colour integer containing red, green and blue bytes.
 ##     string -> pointer to const character
-##     stringresult -> pointer to character
+##     stringresult -> pointer to character, NULL-> return size of result
 ##     cells -> pointer to array of cells, each cell containing a style byte and character byte
 ##     textrange -> range of a min and a max position with an output string
 ##     findtext -> searchrange, text -> foundposition
 ##     cells -> pointer to array of cells, each cell containing a style byte and character byte
 ##     textrange -> range of a min and a max position with an output string
 ##     findtext -> searchrange, text -> foundposition
 ## Client code should ignore definitions containing types it does not understand, except
 ## for possibly #defining the constants
 
 ## Client code should ignore definitions containing types it does not understand, except
 ## for possibly #defining the constants
 
+## Line numbers and positions start at 0.
 ## String arguments may contain NUL ('\0') characters where the calls provide a length
 ## argument and retrieve NUL characters. All retrieved strings except for those retrieved
 ## by GetLine also have a NUL appended but client code should calculate the size that
 ## will be returned rather than relying upon the NUL whenever possible. Allow for the
 ## String arguments may contain NUL ('\0') characters where the calls provide a length
 ## argument and retrieve NUL characters. All retrieved strings except for those retrieved
 ## by GetLine also have a NUL appended but client code should calculate the size that
 ## will be returned rather than relying upon the NUL whenever possible. Allow for the
-## extra NUL character when allocating buffers.
+## extra NUL character when allocating buffers. The size to allocate for a stringresult
+## can be determined by calling with a NULL (0) pointer.
 
 cat Basics
 
 
 cat Basics
 
@@ -87,7 +89,7 @@ val SCI_START=2000
 val SCI_OPTIONAL_START=3000
 val SCI_LEXER_START=4000
 
 val SCI_OPTIONAL_START=3000
 val SCI_LEXER_START=4000
 
-# Add text to the document.
+# Add text to the document at current position.
 fun void AddText=2001(int length, string text)
 
 # Add array of cells to document.
 fun void AddText=2001(int length, string text)
 
 # Add array of cells to document.
@@ -102,7 +104,7 @@ fun void ClearAll=2004(,)
 # Set all style bytes to 0, remove all folding information.
 fun void ClearDocumentStyle=2005(,)
 
 # Set all style bytes to 0, remove all folding information.
 fun void ClearDocumentStyle=2005(,)
 
-# The number of characters in the document.
+# Returns the number of characters in the document.
 get int GetLength=2006(,)
 
 # Returns the character byte at the position.
 get int GetLength=2006(,)
 
 # Returns the character byte at the position.
@@ -999,6 +1001,34 @@ set void SetWrapMode=2268(int mode,)
 # Retrieve whether text is word wrapped.
 get int GetWrapMode=2269(,)
 
 # Retrieve whether text is word wrapped.
 get int GetWrapMode=2269(,)
 
+enu WrapVisualFlag=SC_WRAPVISUALFLAG_
+val SC_WRAPVISUALFLAG_NONE=0x0000
+val SC_WRAPVISUALFLAG_END=0x0001
+val SC_WRAPVISUALFLAG_START=0x0002
+
+# Set the display mode of visual flags for wrapped lines.
+set void SetWrapVisualFlags=2460(int wrapVisualFlags,)
+
+# Retrive the display mode of visual flags for wrapped lines.
+get int GetWrapVisualFlags=2461(,)
+
+enu WrapVisualLocation=SC_WRAPVISUALFLAGLOC_
+val SC_WRAPVISUALFLAGLOC_DEFAULT=0x0000
+val SC_WRAPVISUALFLAGLOC_END_BY_TEXT=0x0001
+val SC_WRAPVISUALFLAGLOC_START_BY_TEXT=0x0002
+
+# Set the location of visual flags for wrapped lines.
+set void SetWrapVisualFlagsLocation=2462(int wrapVisualFlagsLocation,)
+
+# Retrive the location of visual flags for wrapped lines.
+get int GetWrapVisualFlagsLocation=2463(,)
+
+# Set the start indent for wrapped lines.
+set void SetWrapStartIndent=2464(int indent,)
+
+# Retrive the start indent for wrapped lines.
+get int GetWrapStartIndent=2465(,)
+
 enu LineCache=SC_CACHE_
 val SC_CACHE_NONE=0
 val SC_CACHE_CARET=1
 enu LineCache=SC_CACHE_
 val SC_CACHE_NONE=0
 val SC_CACHE_CARET=1
@@ -1550,6 +1580,9 @@ fun void SetCharsDefault=2444(,)
 # Get currently selected item position in the auto-completion list
 fun int AutoCGetCurrent=2445(,)
 
 # Get currently selected item position in the auto-completion list
 fun int AutoCGetCurrent=2445(,)
 
+# Enlarge the document to a particular size of text bytes.
+fun void Allocate=2446(int bytes,)
+
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
@@ -1692,6 +1725,14 @@ val SCLEX_POWERBASIC=51
 val SCLEX_FORTH=52
 val SCLEX_ERLANG=53
 val SCLEX_OCTAVE=54
 val SCLEX_FORTH=52
 val SCLEX_ERLANG=53
 val SCLEX_OCTAVE=54
+val SCLEX_MSSQL=55
+val SCLEX_VERILOG=56
+val SCLEX_KIX=57
+val SCLEX_GUI4CLI=58
+val SCLEX_SPECMAN=59
+val SCLEX_AU3=60
+val SCLEX_APDL=61
+val SCLEX_BASH=62
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
@@ -1840,6 +1881,8 @@ val SCE_HP_CLASSNAME=99
 val SCE_HP_DEFNAME=100
 val SCE_HP_OPERATOR=101
 val SCE_HP_IDENTIFIER=102
 val SCE_HP_DEFNAME=100
 val SCE_HP_OPERATOR=101
 val SCE_HP_IDENTIFIER=102
+# PHP
+val SCE_HPHP_COMPLEX_VARIABLE=104
 # ASP Python
 val SCE_HPA_START=105
 val SCE_HPA_DEFAULT=106
 # ASP Python
 val SCE_HPA_START=105
 val SCE_HPA_DEFAULT=106
@@ -1914,6 +1957,8 @@ val SCE_B_STRINGEOL=9
 val SCE_B_KEYWORD2=10
 val SCE_B_KEYWORD3=11
 val SCE_B_KEYWORD4=12
 val SCE_B_KEYWORD2=10
 val SCE_B_KEYWORD3=11
 val SCE_B_KEYWORD4=12
+val SCE_B_CONSTANT=13
+val SCE_B_ASM=14
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
@@ -1971,6 +2016,7 @@ val SCE_ERR_ELF=15
 val SCE_ERR_IFC=16
 val SCE_ERR_IFORT=17
 val SCE_ERR_ABSF=18
 val SCE_ERR_IFC=16
 val SCE_ERR_IFORT=17
 val SCE_ERR_ABSF=18
+val SCE_ERR_TIDY=19
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
@@ -2266,6 +2312,7 @@ val SCE_NSIS_SUBSECTIONDEF=10
 val SCE_NSIS_IFDEFINEDEF=11
 val SCE_NSIS_MACRODEF=12
 val SCE_NSIS_STRINGVAR=13
 val SCE_NSIS_IFDEFINEDEF=11
 val SCE_NSIS_MACRODEF=12
 val SCE_NSIS_STRINGVAR=13
+val SCE_NSIS_NUMBER=14
 # Lexical states for SCLEX_MMIXAL
 lex MMIXAL=SCLEX_MMIXAL SCE_MMIXAL_
 val SCE_MMIXAL_LEADWS=0
 # Lexical states for SCLEX_MMIXAL
 lex MMIXAL=SCLEX_MMIXAL SCE_MMIXAL_
 val SCE_MMIXAL_LEADWS=0
@@ -2358,7 +2405,124 @@ val SCE_ERLANG_NODE_NAME=13
 val SCE_ERLANG_UNKNOWN=31
 # Lexical states for SCLEX_OCTAVE are identical to MatLab
 lex Octave=SCLEX_OCTAVE SCE_MATLAB_
 val SCE_ERLANG_UNKNOWN=31
 # Lexical states for SCLEX_OCTAVE are identical to MatLab
 lex Octave=SCLEX_OCTAVE SCE_MATLAB_
-
+# Lexical states for SCLEX_MSSQL
+lex MSSQL=SCLEX_MSSQL SCE_MSSQL_
+val SCE_MSSQL_DEFAULT=0
+val SCE_MSSQL_COMMENT=1
+val SCE_MSSQL_LINE_COMMENT=2
+val SCE_MSSQL_NUMBER=3
+val SCE_MSSQL_STRING=4
+val SCE_MSSQL_OPERATOR=5
+val SCE_MSSQL_IDENTIFIER=6
+val SCE_MSSQL_VARIABLE=7
+val SCE_MSSQL_COLUMN_NAME=8
+val SCE_MSSQL_STATEMENT=9
+val SCE_MSSQL_DATATYPE=10
+val SCE_MSSQL_SYSTABLE=11
+val SCE_MSSQL_GLOBAL_VARIABLE=12
+val SCE_MSSQL_FUNCTION=13
+val SCE_MSSQL_STORED_PROCEDURE=14
+val SCE_MSSQL_DEFAULT_PREF_DATATYPE=15
+val SCE_MSSQL_COLUMN_NAME_2=16
+# Lexical states for SCLEX_VERILOG
+lex Verilog=SCLEX_VERILOG SCE_V_
+val SCE_V_DEFAULT=0
+val SCE_V_COMMENT=1
+val SCE_V_COMMENTLINE=2
+val SCE_V_COMMENTLINEBANG=3
+val SCE_V_NUMBER=4
+val SCE_V_WORD=5
+val SCE_V_STRING=6
+val SCE_V_WORD2=7
+val SCE_V_WORD3=8
+val SCE_V_PREPROCESSOR=9
+val SCE_V_OPERATOR=10
+val SCE_V_IDENTIFIER=11
+val SCE_V_STRINGEOL=12
+val SCE_V_USER=19
+# Lexical states for SCLEX_KIX
+lex Kix=SCLEX_KIX SCE_KIX_
+val SCE_KIX_DEFAULT=0
+val SCE_KIX_COMMENT=1
+val SCE_KIX_STRING1=2
+val SCE_KIX_STRING2=3
+val SCE_KIX_NUMBER=4
+val SCE_KIX_VAR=5
+val SCE_KIX_MACRO=6
+val SCE_KIX_KEYWORD=7
+val SCE_KIX_FUNCTIONS=8
+val SCE_KIX_OPERATOR=9
+val SCE_KIX_IDENTIFIER=31
+# Lexical states for SCLEX_GUI4CLI
+val SCE_GC_DEFAULT=0
+val SCE_GC_COMMENTLINE=1
+val SCE_GC_COMMENTBLOCK=2
+val SCE_GC_GLOBAL=3
+val SCE_GC_EVENT=4
+val SCE_GC_ATTRIBUTE=5
+val SCE_GC_CONTROL=6
+val SCE_GC_COMMAND=7
+val SCE_GC_STRING=8
+val SCE_GC_OPERATOR=9
+# Lexical states for SCLEX_SPECMAN
+lex Specman=SCLEX_SPECMAN SCE_SN_
+val SCE_SN_DEFAULT=0
+val SCE_SN_CODE=1
+val SCE_SN_COMMENTLINE=2
+val SCE_SN_COMMENTLINEBANG=3
+val SCE_SN_NUMBER=4
+val SCE_SN_WORD=5
+val SCE_SN_STRING=6
+val SCE_SN_WORD2=7
+val SCE_SN_WORD3=8
+val SCE_SN_PREPROCESSOR=9
+val SCE_SN_OPERATOR=10
+val SCE_SN_IDENTIFIER=11
+val SCE_SN_STRINGEOL=12
+val SCE_SN_REGEXTAG=13
+val SCE_SN_SIGNAL=14
+val SCE_SN_USER=19
+# Lexical states for SCLEX_AU3
+lex Au3=SCLEX_AU3 SCE_AU3_
+val SCE_AU3_DEFAULT=0
+val SCE_AU3_COMMENT=1
+val SCE_AU3_COMMENTBLOCK=2
+val SCE_AU3_NUMBER=3
+val SCE_AU3_FUNCTION=4
+val SCE_AU3_KEYWORD=5
+val SCE_AU3_MACRO=6
+val SCE_AU3_STRING=7
+val SCE_AU3_OPERATOR=8
+val SCE_AU3_VARIABLE=9
+val SCE_AU3_SENT=10
+val SCE_AU3_PREPROCESSOR=11
+# Lexical states for SCLEX_APDL
+lex APDL=SCLEX_APDL SCE_APDL_
+val SCE_APDL_DEFAULT=0
+val SCE_APDL_COMMENT=1
+val SCE_APDL_COMMENTBLOCK=2
+val SCE_APDL_NUMBER=3
+val SCE_APDL_STRING=4
+val SCE_APDL_WORD=5
+val SCE_APDL_COMMAND=6
+val SCE_APDL_PROCESSOR=7
+val SCE_APDL_FUNCTION=8
+# Lexical states for SCLEX_BASH
+lex Bash=SCLEX_BASH SCE_SH_
+val SCE_SH_DEFAULT=0
+val SCE_SH_ERROR=1
+val SCE_SH_COMMENTLINE=2
+val SCE_SH_NUMBER=3
+val SCE_SH_WORD=4
+val SCE_SH_STRING=5
+val SCE_SH_CHARACTER=6
+val SCE_SH_OPERATOR=7
+val SCE_SH_IDENTIFIER=8
+val SCE_SH_SCALAR=9
+val SCE_SH_PARAM=10
+val SCE_SH_BACKTICKS=11
+val SCE_SH_HERE_DELIM=12
+val SCE_SH_HERE_Q=13
 # Events
 
 evt void StyleNeeded=2000(int position)
 # Events
 
 evt void StyleNeeded=2000(int position)
index 2f299afffd4f30b90b7b4d3c376aaccbb90d906f..93e888d0e6b9f77f7a9d202d8130e806f074df20 100644 (file)
@@ -49,7 +49,7 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
 }
 
 static bool IsArrowCharacter(char ch) {
 }
 
 static bool IsArrowCharacter(char ch) {
-       return (ch >= 0) && (ch <= '\002');
+       return (ch == 0) || (ch == '\001') || (ch == '\002');
 }
 
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
 }
 
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
index 6dae67507527f33fa135e9042e3993ccfba24ff5..27e62ac61c1aedbd5ea11b4e4affbe8a7862e196 100644 (file)
@@ -627,21 +627,11 @@ void CellBuffer::RoomFor(int insertionLength) {
        //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
        if (gaplen <= insertionLength) {
                //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
        //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
        if (gaplen <= insertionLength) {
                //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
-               GapTo(length);
                if (growSize * 6 < size)
                        growSize *= 2;
                int newSize = size + insertionLength + growSize;
                if (growSize * 6 < size)
                        growSize *= 2;
                int newSize = size + insertionLength + growSize;
-               //Platform::DebugPrintf("moved gap %d\n", newSize);
-               char *newBody = new char[newSize];
-               memcpy(newBody, body, size);
-               delete []body;
-               body = newBody;
-               gaplen += newSize - size;
-               part2body = body + gaplen;
-               size = newSize;
-               //Platform::DebugPrintf("end need room %d %d - size=%d length=%d\n", gaplen, insertionLength,size,length);
+               Allocate(newSize);
        }
        }
-
 }
 
 // To make it easier to write code that uses ByteAt, a position outside the range of the buffer
 }
 
 // To make it easier to write code that uses ByteAt, a position outside the range of the buffer
@@ -791,6 +781,19 @@ int CellBuffer::Length() {
        return ByteLength() / 2;
 }
 
        return ByteLength() / 2;
 }
 
+void CellBuffer::Allocate(int newSize) {
+       if (newSize > length) {
+               GapTo(length);
+               char *newBody = new char[newSize];
+               memcpy(newBody, body, length);
+               delete []body;
+               body = newBody;
+               gaplen += newSize - size;
+               part2body = body + gaplen;
+               size = newSize;
+       }
+}
+
 int CellBuffer::Lines() {
        //Platform::DebugPrintf("Lines = %d\n", lv.lines);
        return lv.lines;
 int CellBuffer::Lines() {
        //Platform::DebugPrintf("Lines = %d\n", lv.lines);
        return lv.lines;
index 5cfcbfe1f01fcaac2f1601f029401227dc187f4c..bf4a102f2268ea418e1d6199ca260d6a0a3d382a 100644 (file)
@@ -2,7 +2,7 @@
 /** @file CellBuffer.h
  ** Manages the text of the document.
  **/
 /** @file CellBuffer.h
  ** Manages the text of the document.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CELLBUFFER_H
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CELLBUFFER_H
@@ -150,12 +150,14 @@ public:
  */
 class CellBuffer {
 private:
  */
 class CellBuffer {
 private:
-       char *body;
-       int size;
-       int length;
-       int part1len;
-       int gaplen;
-       char *part2body;
+       char *body;             ///< The cell buffer itself.
+       int size;               ///< Allocated size of the buffer.
+       int length;             ///< Total length of the data.
+       int part1len;   ///< Length of the first part.
+       int gaplen;             ///< Length of the gap between the two parts.
+       char *part2body;        ///< The second part of the cell buffer.
+                                               ///< Doesn't point after the gap but set so that
+                                               ///< part2body[position] is consistent with body[position].
        bool readOnly;
        int growSize;
 
        bool readOnly;
        int growSize;
 
@@ -184,6 +186,7 @@ public:
 
        int ByteLength();
        int Length();
 
        int ByteLength();
        int Length();
+       void Allocate(int newSize);
        int Lines();
        int LineStart(int line);
        int LineFromPosition(int pos) { return lv.LineFromPosition(pos); }
        int Lines();
        int LineStart(int line);
        int LineFromPosition(int pos) { return lv.LineFromPosition(pos); }
@@ -212,7 +215,7 @@ public:
        int GetMark(int line);
        void DeleteAllMarks(int markerNum);
        int LineFromHandle(int markerHandle);
        int GetMark(int line);
        void DeleteAllMarks(int markerNum);
        int LineFromHandle(int markerHandle);
+
        /// Actions without undo
        void BasicInsertString(int position, char *s, int insertLength);
        void BasicDeleteChars(int position, int deleteLength);
        /// Actions without undo
        void BasicInsertString(int position, char *s, int insertLength);
        void BasicDeleteChars(int position, int deleteLength);
index fb28144dd7d40021f9d97dd20e5b9bc53e009077..97abd6254600de6e2a835c2c1ab93344b116c565 100644 (file)
@@ -50,13 +50,14 @@ Document::Document() {
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
-       SetDefaultCharClasses();
+       SetDefaultCharClasses(true);
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
        enteredReadOnlyCount = 0;
        tabInChars = 8;
        indentInChars = 0;
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
        enteredReadOnlyCount = 0;
        tabInChars = 8;
        indentInChars = 0;
+       actualIndentInChars = 8;
        useTabs = true;
        tabIndents = true;
        backspaceUnindents = false;
        useTabs = true;
        tabIndents = true;
        backspaceUnindents = false;
@@ -206,7 +207,7 @@ int Document::GetLastChild(int lineParent, int level) {
 }
 
 int Document::GetFoldParent(int line) {
 }
 
 int Document::GetFoldParent(int line) {
-       int level = GetLevel(line);
+       int level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK;
        int lineLook = line - 1;
        while ((lineLook > 0) && (
                    (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||
        int lineLook = line - 1;
        while ((lineLook > 0) && (
                    (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||
@@ -379,6 +380,9 @@ bool Document::DeleteChars(int pos, int len) {
        return !cb.IsReadOnly();
 }
 
        return !cb.IsReadOnly();
 }
 
+/**
+ * Insert a styled string (char/style pairs) with a length.
+ */
 bool Document::InsertStyledString(int position, char *s, int insertLength) {
        if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
                enteredReadOnlyCount++;
 bool Document::InsertStyledString(int position, char *s, int insertLength) {
        if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
                enteredReadOnlyCount++;
@@ -498,6 +502,9 @@ int Document::Redo() {
        return newPos;
 }
 
        return newPos;
 }
 
+/**
+ * Insert a single character.
+ */
 bool Document::InsertChar(int pos, char ch) {
        char chs[2];
        chs[0] = ch;
 bool Document::InsertChar(int pos, char ch) {
        char chs[2];
        chs[0] = ch;
@@ -505,12 +512,16 @@ bool Document::InsertChar(int pos, char ch) {
        return InsertStyledString(pos*2, chs, 2);
 }
 
        return InsertStyledString(pos*2, chs, 2);
 }
 
-// Insert a null terminated string
+/**
+ * Insert a null terminated string.
+ */
 bool Document::InsertString(int position, const char *s) {
        return InsertString(position, s, strlen(s));
 }
 
 bool Document::InsertString(int position, const char *s) {
        return InsertString(position, s, strlen(s));
 }
 
-// Insert a string with a length
+/**
+ * Insert a string with a length.
+ */
 bool Document::InsertString(int position, const char *s, size_t insertLength) {
        bool changed = false;
        char *sWithStyle = new char[insertLength * 2];
 bool Document::InsertString(int position, const char *s, size_t insertLength) {
        bool changed = false;
        char *sWithStyle = new char[insertLength * 2];
@@ -1163,21 +1174,21 @@ void Document::ChangeCase(Range r, bool makeUpperCase) {
        }
 }
 
        }
 }
 
-void Document::SetDefaultCharClasses() {
+void Document::SetDefaultCharClasses(bool includeWordClass) {
        // Initialize all char classes to default values
        for (int ch = 0; ch < 256; ch++) {
                if (ch == '\r' || ch == '\n')
                        charClass[ch] = ccNewLine;
                else if (ch < 0x20 || ch == ' ')
                        charClass[ch] = ccSpace;
        // Initialize all char classes to default values
        for (int ch = 0; ch < 256; ch++) {
                if (ch == '\r' || ch == '\n')
                        charClass[ch] = ccNewLine;
                else if (ch < 0x20 || ch == ' ')
                        charClass[ch] = ccSpace;
-               else if (ch >= 0x80 || isalnum(ch) || ch == '_')
+               else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))
                        charClass[ch] = ccWord;
                else
                        charClass[ch] = ccPunctuation;
        }
 }
 
                        charClass[ch] = ccWord;
                else
                        charClass[ch] = ccPunctuation;
        }
 }
 
-void Document::SetCharClasses(unsigned char *chars, charClassification newCharClass) {
+void Document::SetCharClasses(const unsigned char *chars, charClassification newCharClass) {
        // Apply the newCharClass to the specifed chars
        if (chars) {
                while (*chars) {
        // Apply the newCharClass to the specifed chars
        if (chars) {
                while (*chars) {
@@ -1246,10 +1257,7 @@ bool Document::SetStyles(int length, char *styles) {
 
 bool Document::EnsureStyledTo(int pos) {
        if (pos > GetEndStyled()) {
 
 bool Document::EnsureStyledTo(int pos) {
        if (pos > GetEndStyled()) {
-               styleClock++;
-               if (styleClock > 0x100000) {
-                       styleClock = 0;
-               }
+               IncrementStyleClock();
                // Ask the watchers to style, and stop as soon as one responds.
                for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) {
                        watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos);
                // Ask the watchers to style, and stop as soon as one responds.
                for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) {
                        watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos);
@@ -1258,6 +1266,13 @@ bool Document::EnsureStyledTo(int pos) {
        return pos <= GetEndStyled();
 }
 
        return pos <= GetEndStyled();
 }
 
+void Document::IncrementStyleClock() {
+       styleClock++;
+       if (styleClock > 0x100000) {
+               styleClock = 0;
+       }
+}
+
 bool Document::AddWatcher(DocWatcher *watcher, void *userData) {
        for (int i = 0; i < lenWatchers; i++) {
                if ((watchers[i].watcher == watcher) &&
 bool Document::AddWatcher(DocWatcher *watcher, void *userData) {
        for (int i = 0; i < lenWatchers; i++) {
                if ((watchers[i].watcher == watcher) &&
index dc9e38e21dda01e46f84716511a6ef995ca1d874..54ecadb004535e261d6cabeaca8ca5d024ab6c0a 100644 (file)
@@ -87,7 +87,7 @@ public:
                        userData = 0;
                }
        };
                        userData = 0;
                }
        };
-       
+
        enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
 
 private:
        enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
 
 private:
@@ -116,6 +116,7 @@ public:
        int dbcsCodePage;
        int tabInChars;
        int indentInChars;
        int dbcsCodePage;
        int tabInChars;
        int indentInChars;
+       int actualIndentInChars;
        bool useTabs;
        bool tabIndents;
        bool backspaceUnindents;
        bool useTabs;
        bool tabIndents;
        bool backspaceUnindents;
@@ -193,6 +194,7 @@ public:
        int NextWordStart(int pos, int delta);
        int NextWordEnd(int pos, int delta);
        int Length() { return cb.Length(); }
        int NextWordStart(int pos, int delta);
        int NextWordEnd(int pos, int delta);
        int Length() { return cb.Length(); }
+       void Allocate(int newSize) { cb.Allocate(newSize*2); }
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
        long FindText(int iMessage, unsigned long wParam, long lParam);
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
        long FindText(int iMessage, unsigned long wParam, long lParam);
@@ -200,9 +202,9 @@ public:
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
-       
-       void SetDefaultCharClasses();
-       void SetCharClasses(unsigned char *chars, charClassification newCharClass);
+
+       void SetDefaultCharClasses(bool includeWordClass);
+       void SetCharClasses(const unsigned char *chars, charClassification newCharClass);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
@@ -210,6 +212,7 @@ public:
        int GetEndStyled() { return endStyled; }
        bool EnsureStyledTo(int pos);
        int GetStyleClock() { return styleClock; }
        int GetEndStyled() { return endStyled; }
        bool EnsureStyledTo(int pos);
        int GetStyleClock() { return styleClock; }
+       void IncrementStyleClock();
 
        int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
        int GetLineState(int line) { return cb.GetLineState(line); }
 
        int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
        int GetLineState(int line) { return cb.GetLineState(line); }
@@ -226,6 +229,7 @@ public:
        int ExtendStyleRange(int pos, int delta, bool singleLine = false);
        int ParaUp(int pos);
        int ParaDown(int pos);
        int ExtendStyleRange(int pos, int delta, bool singleLine = false);
        int ParaUp(int pos);
        int ParaDown(int pos);
+       int IndentSize() { return actualIndentInChars; }
 
 private:
        charClassification WordCharClass(unsigned char ch);
 
 private:
        charClassification WordCharClass(unsigned char ch);
@@ -237,8 +241,6 @@ private:
        void NotifyModifyAttempt();
        void NotifySavePoint(bool atSavePoint);
        void NotifyModified(DocModification mh);
        void NotifyModifyAttempt();
        void NotifySavePoint(bool atSavePoint);
        void NotifyModified(DocModification mh);
-
-       int IndentSize() { return indentInChars ? indentInChars : tabInChars; }
 };
 
 /**
 };
 
 /**
index f0f10e25a3f810eafffc9dff1629a7595980e2bd..1ab36610b0f8bd84dd1fc9d87ef2527398f16168 100644 (file)
@@ -2,7 +2,7 @@
 /** @file Editor.cxx
  ** Main code for the edit control.
  **/
 /** @file Editor.cxx
  ** Main code for the edit control.
  **/
-// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
@@ -71,7 +71,7 @@ void LineLayout::Resize(int maxLineLength_) {
        if (maxLineLength_ > maxLineLength) {
                Free();
                chars = new char[maxLineLength_ + 1];
        if (maxLineLength_ > maxLineLength) {
                Free();
                chars = new char[maxLineLength_ + 1];
-               styles = new char[maxLineLength_ + 1];
+               styles = new unsigned char[maxLineLength_ + 1];
                indicators = new char[maxLineLength_ + 1];
                // Extra position allocated as sometimes the Windows
                // GetTextExtentExPoint API writes an extra element.
                indicators = new char[maxLineLength_ + 1];
                // Extra position allocated as sometimes the Windows
                // GetTextExtentExPoint API writes an extra element.
@@ -240,10 +240,14 @@ LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChar
        allInvalidated = false;
        int pos = -1;
        LineLayout *ret = 0;
        allInvalidated = false;
        int pos = -1;
        LineLayout *ret = 0;
-       if (((level == llcCaret) || (level == llcPage)) && (lineNumber == lineCaret)) {
+       if (level == llcCaret) {
                pos = 0;
        } else if (level == llcPage) {
                pos = 0;
        } else if (level == llcPage) {
-               pos = lineNumber % length;
+               if (lineNumber == lineCaret) {
+                       pos = length;
+               } else {
+                       pos = lineNumber % length;
+               }
        } else if (level == llcDocument) {
                pos = lineNumber;
        }
        } else if (level == llcDocument) {
                pos = lineNumber;
        }
@@ -381,6 +385,10 @@ Editor::Editor() {
        docLineLastWrapped = -1;
        docLastLineToWrap = -1;
        backgroundWrapEnabled = true;
        docLineLastWrapped = -1;
        docLastLineToWrap = -1;
        backgroundWrapEnabled = true;
+       wrapVisualFlags = 0;
+       wrapVisualFlagsLocation = 0;
+       wrapVisualStartIndent = 0;
+       actualWrapVisualStartIndent = 0;
 
        hsStart = -1;
        hsEnd = -1;
 
        hsStart = -1;
        hsEnd = -1;
@@ -489,7 +497,7 @@ int Editor::MaxScrollPos() {
        }
 }
 
        }
 }
 
-static inline bool IsControlCharacter(char ch) {
+static inline bool IsControlCharacter(int ch) {
        // iscntrl returns true for lots of chars > 127 which are displayable
        return ch >= 0 && ch < ' ';
 }
        // iscntrl returns true for lots of chars > 127 which are displayable
        return ch >= 0 && ch < ' ';
 }
@@ -632,9 +640,15 @@ Point Editor::LocationFromPosition(int pos) {
                if (posInLine > ll->maxLineLength) {
                        pt.x = ll->positions[ll->maxLineLength] - ll->positions[ll->LineStart(ll->lines)];
                }
                if (posInLine > ll->maxLineLength) {
                        pt.x = ll->positions[ll->maxLineLength] - ll->positions[ll->LineStart(ll->lines)];
                }
+
                for (int subLine = 0; subLine < ll->lines; subLine++) {
                        if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) {
                                pt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)];
                for (int subLine = 0; subLine < ll->lines; subLine++) {
                        if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) {
                                pt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)];
+                               if (actualWrapVisualStartIndent != 0) {
+                                       int lineStart = ll->LineStart(subLine);
+                                       if (lineStart != 0)     // Wrapped
+                                               pt.x += actualWrapVisualStartIndent * vs.aveCharWidth;
+                               }
                        }
                        if (posInLine >= ll->LineStart(subLine)) {
                                pt.y += vs.lineHeight;
                        }
                        if (posInLine >= ll->LineStart(subLine)) {
                                pt.y += vs.lineHeight;
@@ -687,6 +701,11 @@ int Editor::PositionFromLocation(Point pt) {
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
+
+                       if (actualWrapVisualStartIndent != 0) {
+                               if (lineStart != 0)     // Wrapped
+                                       pt.x -= actualWrapVisualStartIndent * vs.aveCharWidth;
+                       }
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
@@ -731,6 +750,11 @@ int Editor::PositionFromLocationClose(Point pt) {
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
                        int lineStart = ll->LineStart(subLine);
                        int lineEnd = ll->LineStart(subLine + 1);
                        int subLineStart = ll->positions[lineStart];
+
+                       if (actualWrapVisualStartIndent != 0) {
+                               if (lineStart != 0)     // Wrapped
+                                       pt.x -= actualWrapVisualStartIndent * vs.aveCharWidth;
+                       }
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
                        for (int i = lineStart; i < lineEnd; i++) {
                                if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                        IsEOLChar(ll->chars[i])) {
@@ -763,6 +787,11 @@ int Editor::PositionFromLineX(int lineDoc, int x) {
                int lineStart = ll->LineStart(subLine);
                int lineEnd = ll->LineStart(subLine + 1);
                int subLineStart = ll->positions[lineStart];
                int lineStart = ll->LineStart(subLine);
                int lineEnd = ll->LineStart(subLine + 1);
                int subLineStart = ll->positions[lineStart];
+
+               if (actualWrapVisualStartIndent != 0) {
+                       if (lineStart != 0)     // Wrapped
+                               x -= actualWrapVisualStartIndent * vs.aveCharWidth;
+               }
                for (int i = lineStart; i < lineEnd; i++) {
                        if (x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                IsEOLChar(ll->chars[i])) {
                for (int i = lineStart; i < lineEnd; i++) {
                        if (x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) ||
                                IsEOLChar(ll->chars[i])) {
@@ -1390,6 +1419,8 @@ void Editor::InvalidateCaret() {
 }
 
 void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
 }
 
 void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
+       docLineStartWrapping = Platform::Minimum(docLineStartWrapping, pdoc->LinesTotal()-1);
+       docLineEndWrapping = Platform::Minimum(docLineEndWrapping, pdoc->LinesTotal()-1);
        bool noWrap = (docLastLineToWrap == docLineLastWrapped);
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
        bool noWrap = (docLastLineToWrap == docLineLastWrapped);
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
@@ -1407,7 +1438,9 @@ void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
        if (docLastLineToWrap >= pdoc->LinesTotal())
                docLastLineToWrap = pdoc->LinesTotal()-1;
        // Wrap lines during idle.
        if (docLastLineToWrap >= pdoc->LinesTotal())
                docLastLineToWrap = pdoc->LinesTotal()-1;
        // Wrap lines during idle.
-       if (backgroundWrapEnabled && docLastLineToWrap != docLineLastWrapped ) {
+       if ((wrapState != eWrapNone) &&
+               backgroundWrapEnabled &&
+               (docLastLineToWrap != docLineLastWrapped)) {
                SetIdle(true);
        }
 }
                SetIdle(true);
        }
 }
@@ -1488,6 +1521,7 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                                        firstLineToWrap++;
                                        if (!priorityWrap)
                                                docLineLastWrapped++;
                                        firstLineToWrap++;
                                        if (!priorityWrap)
                                                docLineLastWrapped++;
+                                       if (firstLineToWrap < pdoc->LinesTotal()) {
                                        AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
                                        AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
@@ -1496,6 +1530,7 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                                        }
                                        if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
                                        }
                                        if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
+                                               }
                                        }
                                }
                                // If wrapping is done, bring it to resting position
                                        }
                                }
                                // If wrapping is done, bring it to resting position
@@ -1982,6 +2017,9 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                        // Simple common case where line does not need wrapping.
                        ll->lines = 1;
                } else {
                        // Simple common case where line does not need wrapping.
                        ll->lines = 1;
                } else {
+                       if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) {
+                               width -= vstyle.aveCharWidth; // take into account the space for end wrap mark
+                       }
                        ll->lines = 0;
                        // Calculate line start positions based upon width.
                        // For now this is simplistic - wraps on byte rather than character and
                        ll->lines = 0;
                        // Calculate line start positions based upon width.
                        // For now this is simplistic - wraps on byte rather than character and
@@ -2008,6 +2046,8 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                                        ll->lines++;
                                        ll->SetLineStart(ll->lines, lastGoodBreak);
                                        startOffset = ll->positions[lastGoodBreak];
                                        ll->lines++;
                                        ll->SetLineStart(ll->lines, lastGoodBreak);
                                        startOffset = ll->positions[lastGoodBreak];
+                                       // take into account the space for start wrap mark and indent
+                                       startOffset -= actualWrapVisualStartIndent * vstyle.aveCharWidth;
                                        p = lastGoodBreak + 1;
                                        continue;
                                }
                                        p = lastGoodBreak + 1;
                                        continue;
                                }
@@ -2055,9 +2095,56 @@ void Editor::DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight,
                      highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide);
 }
 
                      highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide);
 }
 
+void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace,
+                            bool isEndMarker, ColourAllocated wrapColour) {
+       surface->PenColour(wrapColour);
+
+       enum { xa = 1 }; // gap before start
+       int w = rcPlace.right - rcPlace.left - xa - 1;
+
+       bool xStraight = isEndMarker;  // x-mirrored symbol for start marker
+       bool yStraight = true;
+       //bool yStraight= isEndMarker; // comment in for start marker y-mirrowed
+
+       int x0 = xStraight ? rcPlace.left : rcPlace.right - 1;
+       int y0 = yStraight ? rcPlace.top : rcPlace.bottom - 1;
+
+       int dy = (rcPlace.bottom - rcPlace.top) / 5;
+       int y = (rcPlace.bottom - rcPlace.top) / 2 + dy;
+
+       struct Relative {
+               Surface *surface;
+               int xBase;
+               int xDir;
+               int yBase;
+               int yDir;
+               void MoveTo(int xRelative, int yRelative) {
+                   surface->MoveTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
+               }
+               void LineTo(int xRelative, int yRelative) {
+                   surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
+               }
+       };
+       Relative rel = {surface, x0, xStraight?1:-1, y0, yStraight?1:-1};
+
+       // arrow head
+       rel.MoveTo(xa, y);
+       rel.LineTo(xa + 2*w / 3, y - dy);
+       rel.MoveTo(xa, y);
+       rel.LineTo(xa + 2*w / 3, y + dy);
+
+       // arrow body
+       rel.MoveTo(xa, y);
+       rel.LineTo(xa + w, y);
+       rel.LineTo(xa + w, y - 2 * dy);
+       rel.LineTo(xa - 1,   // on windows lineto is exclusive endpoint, perhaps GTK not...
+                       y - 2 * dy);
+}
+
 void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                      int line, int lineEnd, int xStart, int subLine, int subLineStart,
 void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                      int line, int lineEnd, int xStart, int subLine, int subLineStart,
-                     bool overrideBackground, ColourAllocated background) {
+                     bool overrideBackground, ColourAllocated background,
+                     bool drawWrapMarkEnd, ColourAllocated wrapColour) {
 
        int styleMask = pdoc->stylingBitsMask;
        PRectangle rcSegment = rcLine;
 
        int styleMask = pdoc->stylingBitsMask;
        PRectangle rcSegment = rcLine;
@@ -2069,6 +2156,7 @@ void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, Lin
        int posLineEnd = pdoc->LineStart(line + 1);
        bool eolInSelection = (subLine == (ll->lines - 1)) &&
                              (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd);
        int posLineEnd = pdoc->LineStart(line + 1);
        bool eolInSelection = (subLine == (ll->lines - 1)) &&
                              (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd);
+
        if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) {
                if (primarySelection)
                        surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
        if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) {
                if (primarySelection)
                        surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
@@ -2089,6 +2177,20 @@ void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, Lin
        } else {
                surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated);
        }
        } else {
                surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated);
        }
+
+       if (drawWrapMarkEnd) {
+               PRectangle rcPlace = rcSegment;
+
+               if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_END_BY_TEXT) {
+                       rcPlace.left = xEol + xStart;
+                       rcPlace.right = rcPlace.left + vsDraw.aveCharWidth;
+               } else {
+                       // draw left of the right text margin, to avoid clipping by the current clip rect
+                       rcPlace.right = rcLine.right - vs.rightMarginWidth;
+                       rcPlace.left = rcPlace.right - vsDraw.aveCharWidth;
+               }
+               DrawWrapMarker(surface, rcPlace, true, wrapColour);
+       }
 }
 
 void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
 }
 
 void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
@@ -2141,9 +2243,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                                        (!overrideBackground) && (vsDraw.whitespaceBackgroundSet);
 
        bool inIndentation = subLine == 0;      // Do not handle indentation except on first subline.
                                        (!overrideBackground) && (vsDraw.whitespaceBackgroundSet);
 
        bool inIndentation = subLine == 0;      // Do not handle indentation except on first subline.
-       int indentWidth = pdoc->indentInChars * vsDraw.spaceWidth;
-       if (indentWidth == 0)
-               indentWidth = pdoc->tabInChars * vsDraw.spaceWidth;
+       int indentWidth = pdoc->IndentSize() * vsDraw.spaceWidth;
 
        int posLineStart = pdoc->LineStart(line);
 
 
        int posLineStart = pdoc->LineStart(line);
 
@@ -2155,6 +2255,51 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                lineStart = ll->LineStart(subLine);
                lineEnd = ll->LineStart(subLine + 1);
        }
                lineStart = ll->LineStart(subLine);
                lineEnd = ll->LineStart(subLine + 1);
        }
+
+       bool drawWrapMarkEnd = false;
+
+       if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) {
+               if (subLine + 1 < ll->lines) {
+                       drawWrapMarkEnd = ll->LineStart(subLine + 1) != 0;
+               }
+       }
+
+       if (actualWrapVisualStartIndent != 0) {
+
+               bool continuedWrapLine = false;
+               if (subLine < ll->lines) {
+                       continuedWrapLine = ll->LineStart(subLine) != 0;
+               }
+
+               if (continuedWrapLine) {
+                       // draw continuation rect
+                       PRectangle rcPlace = rcSegment;
+
+                       rcPlace.left = ll->positions[startseg] + xStart - subLineStart;
+                       rcPlace.right = rcPlace.left + actualWrapVisualStartIndent * vsDraw.aveCharWidth;
+
+                       // default bgnd here..
+                       surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated);
+
+                       // main line style would be below but this would be inconsistent with end markers
+                       // also would possibly not be the style at wrap point
+                       //int styleMain = ll->styles[lineStart];
+                       //surface->FillRectangle(rcPlace, vsDraw.styles[styleMain].back.allocated);
+
+                       if (wrapVisualFlags & SC_WRAPVISUALFLAG_START) {
+
+                               if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_START_BY_TEXT)
+                                       rcPlace.left = rcPlace.right - vsDraw.aveCharWidth;
+                               else
+                                       rcPlace.right = rcPlace.left + vsDraw.aveCharWidth;
+
+                               DrawWrapMarker(surface, rcPlace, false, vsDraw.whitespaceForeground.allocated);
+                       }
+
+                       xStart += actualWrapVisualStartIndent * vsDraw.aveCharWidth;
+               }
+       }
+
        int i;
 
        // Background drawing loop
        int i;
 
        // Background drawing loop
@@ -2212,7 +2357,8 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 
        if (twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
 
        if (twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
-                       xStart, subLine, subLineStart, overrideBackground, background);
+                       xStart, subLine, subLineStart, overrideBackground, background,
+                       drawWrapMarkEnd, vsDraw.whitespaceForeground.allocated);
        }
 
        inIndentation = subLine == 0;   // Do not handle indentation except on first subline.
        }
 
        inIndentation = subLine == 0;   // Do not handle indentation except on first subline.
@@ -2402,10 +2548,10 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                }
        }
        // End of the drawing of the current line
                }
        }
        // End of the drawing of the current line
-
        if (!twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
        if (!twoPhaseDraw) {
                DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,
-                       xStart, subLine, subLineStart, overrideBackground, background);
+                       xStart, subLine, subLineStart, overrideBackground, background,
+                       drawWrapMarkEnd, vsDraw.whitespaceForeground.allocated);
        }
 
        if (vsDraw.edgeState == EDGE_LINE) {
        }
 
        if (vsDraw.edgeState == EDGE_LINE) {
@@ -2604,6 +2750,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                        // and determine the x position at which each character starts.
                        //ElapsedTime et;
                        if (lineDoc != lineDocPrevious) {
                        // and determine the x position at which each character starts.
                        //ElapsedTime et;
                        if (lineDoc != lineDocPrevious) {
+                               ll.Set(0);
                                ll.Set(RetrieveLineLayout(lineDoc));
                                LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                lineDocPrevious = lineDoc;
                                ll.Set(RetrieveLineLayout(lineDoc));
                                LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                lineDocPrevious = lineDoc;
@@ -2670,7 +2817,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                                        int FoldLevelCurr = (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelPrev = (pdoc->GetLevel(lineDoc - 1) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelFlags = (pdoc->GetLevel(lineDoc) & ~SC_FOLDLEVELNUMBERMASK) & ~(0xFFF0000);
                                        int FoldLevelCurr = (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelPrev = (pdoc->GetLevel(lineDoc - 1) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE;
                                        int FoldLevelFlags = (pdoc->GetLevel(lineDoc) & ~SC_FOLDLEVELNUMBERMASK) & ~(0xFFF0000);
-                                       int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+                                       int indentationStep = pdoc->IndentSize();
                                        // Draw line above fold
                                        if ((FoldLevelPrev < FoldLevelCurr)
                                                ||
                                        // Draw line above fold
                                        if ((FoldLevelPrev < FoldLevelCurr)
                                                ||
@@ -2708,6 +2855,12 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                                        if ((offset >= ll->LineStart(subLine)) &&
                                                ((offset < ll->LineStart(subLine + 1)) || offset == ll->numCharsInLine)) {
                                                int xposCaret = ll->positions[offset] - ll->positions[ll->LineStart(subLine)] + xStart;
                                        if ((offset >= ll->LineStart(subLine)) &&
                                                ((offset < ll->LineStart(subLine + 1)) || offset == ll->numCharsInLine)) {
                                                int xposCaret = ll->positions[offset] - ll->positions[ll->LineStart(subLine)] + xStart;
+
+                                               if (actualWrapVisualStartIndent != 0) {
+                                                       int lineStart = ll->LineStart(subLine);
+                                                       if (lineStart != 0)     // Wrapped
+                                                               xposCaret += actualWrapVisualStartIndent * vs.aveCharWidth;
+                                               }
                                                int widthOverstrikeCaret;
                                                if (posCaret == pdoc->Length()) {   // At end of document
                                                        widthOverstrikeCaret = vs.aveCharWidth;
                                                int widthOverstrikeCaret;
                                                if (posCaret == pdoc->Length()) {   // At end of document
                                                        widthOverstrikeCaret = vs.aveCharWidth;
@@ -3238,7 +3391,7 @@ void Editor::DelCharBack(bool allowLineStartDeletion) {
                                        pdoc->GetColumn(currentPos) > 0 && pdoc->backspaceUnindents) {
                                        pdoc->BeginUndoAction();
                                        int indentation = pdoc->GetLineIndentation(lineCurrentPos);
                                        pdoc->GetColumn(currentPos) > 0 && pdoc->backspaceUnindents) {
                                        pdoc->BeginUndoAction();
                                        int indentation = pdoc->GetLineIndentation(lineCurrentPos);
-                                       int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+                                       int indentationStep = pdoc->IndentSize();
                                        if (indentation % indentationStep == 0) {
                                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                        } else {
                                        if (indentation % indentationStep == 0) {
                                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                        } else {
@@ -3452,6 +3605,7 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
+               pdoc->IncrementStyleClock();
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
                                // Styling performed before this view
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
                                // Styling performed before this view
@@ -4280,8 +4434,8 @@ void Editor::Indent(bool forwards) {
                        if (pdoc->GetColumn(currentPos) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) &&
                                pdoc->tabIndents) {
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
                        if (pdoc->GetColumn(currentPos) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) &&
                                pdoc->tabIndents) {
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
-                               int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
-                               pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep);
+                               int indentationStep = pdoc->IndentSize();
+                               pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep - indentation % indentationStep);
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                        } else {
                                if (pdoc->useTabs) {
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                        } else {
                                if (pdoc->useTabs) {
@@ -4304,7 +4458,7 @@ void Editor::Indent(bool forwards) {
                                pdoc->tabIndents) {
                                pdoc->BeginUndoAction();
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
                                pdoc->tabIndents) {
                                pdoc->BeginUndoAction();
                                int indentation = pdoc->GetLineIndentation(lineCurrentPos);
-                               int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+                               int indentationStep = pdoc->IndentSize();
                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                                pdoc->EndUndoAction();
                                pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
                                SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
                                pdoc->EndUndoAction();
@@ -4477,7 +4631,8 @@ char *Editor::CopyRange(int start, int end) {
 }
 
 void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) {
 }
 
 void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) {
-       ss->Set(CopyRange(start, end), end - start + 1, false);
+       ss->Set(CopyRange(start, end), end - start + 1,
+               pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
@@ -4519,7 +4674,8 @@ void Editor::CopySelectionRange(SelectionText *ss) {
                                text[size] = '\0';
                        }
                }
                                text[size] = '\0';
                        }
                }
-               ss->Set(text, size + 1, selType == selRectangle);
+               ss->Set(text, size + 1, pdoc->dbcsCodePage,
+                       vs.styles[STYLE_DEFAULT].characterSet, selType == selRectangle);
        }
 }
 
        }
 }
 
@@ -4527,13 +4683,15 @@ void Editor::CopyRangeToClipboard(int start, int end) {
        start = pdoc->ClampPositionIntoDocument(start);
        end = pdoc->ClampPositionIntoDocument(end);
        SelectionText selectedText;
        start = pdoc->ClampPositionIntoDocument(start);
        end = pdoc->ClampPositionIntoDocument(end);
        SelectionText selectedText;
-       selectedText.Set(CopyRange(start, end), end - start + 1);
+       selectedText.Set(CopyRange(start, end), end - start + 1,
+               pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
        CopyToClipboard(selectedText);
 }
 
 void Editor::CopyText(int length, const char *text) {
        SelectionText selectedText;
        CopyToClipboard(selectedText);
 }
 
 void Editor::CopyText(int length, const char *text) {
        SelectionText selectedText;
-       selectedText.Copy(text, length);
+       selectedText.Copy(text, length,
+               pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
        CopyToClipboard(selectedText);
 }
 
        CopyToClipboard(selectedText);
 }
 
@@ -4929,7 +5087,8 @@ void Editor::ButtonMove(Point pt) {
                }
                // While dragging to make rectangular selection, we don't want the current
                // position to jump to the end of smaller or empty lines.
                }
                // While dragging to make rectangular selection, we don't want the current
                // position to jump to the end of smaller or empty lines.
-               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
+               //xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
+               xEndSelect = XFromPosition(movePos);
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
@@ -5006,7 +5165,7 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
                                        } else {
                                                SetEmptySelection(newPos);
                                        }
                                        } else {
                                                SetEmptySelection(newPos);
                                        }
-                                       drag.Set(0, 0);
+                                       drag.Free();
                                }
                                selectionType = selChar;
                        }
                                }
                                selectionType = selChar;
                        }
@@ -5238,6 +5397,9 @@ void Editor::SetDocPointer(Document *document) {
        targetStart = 0;
        targetEnd = 0;
 
        targetStart = 0;
        targetEnd = 0;
 
+       braces[0] = invalidPosition;
+       braces[1] = invalidPosition;
+
        // Reset the contraction state to fully shown.
        cs.Clear();
        cs.InsertLines(0, pdoc->LinesTotal() - 1);
        // Reset the contraction state to fully shown.
        cs.Clear();
        cs.InsertLines(0, pdoc->LinesTotal() - 1);
@@ -5272,16 +5434,34 @@ void Editor::Expand(int &line, bool doExpand) {
 }
 
 void Editor::ToggleContraction(int line) {
 }
 
 void Editor::ToggleContraction(int line) {
-       if (pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) {
+       if (line >= 0) {
+               if ((pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) == 0) {
+                       line = pdoc->GetFoldParent(line);
+                       if (line < 0)
+                               return;
+               }
+
                if (cs.GetExpanded(line)) {
                        int lineMaxSubord = pdoc->GetLastChild(line);
                        cs.SetExpanded(line, 0);
                        if (lineMaxSubord > line) {
                                cs.SetVisible(line + 1, lineMaxSubord, false);
                if (cs.GetExpanded(line)) {
                        int lineMaxSubord = pdoc->GetLastChild(line);
                        cs.SetExpanded(line, 0);
                        if (lineMaxSubord > line) {
                                cs.SetVisible(line + 1, lineMaxSubord, false);
+
+                               int lineCurrent = pdoc->LineFromPosition(currentPos);
+                               if (lineCurrent > line && lineCurrent <= lineMaxSubord) {
+                                       // This does not re-expand the fold
+                                       EnsureCaretVisible();
+                               }
+
                                SetScrollBars();
                                Redraw();
                        }
                                SetScrollBars();
                                Redraw();
                        }
+
                } else {
                } else {
+                       if (!(cs.GetVisible(line))) {
+                               EnsureLineVisible(line, false);
+                               GoToLine(line);
+                       }
                        cs.SetExpanded(line, 1);
                        Expand(line, true);
                        SetScrollBars();
                        cs.SetExpanded(line, 1);
                        Expand(line, true);
                        SetScrollBars();
@@ -5383,7 +5563,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_GETTEXT: {
                        if (lParam == 0)
 
        case SCI_GETTEXT: {
                        if (lParam == 0)
-                               return 0;
+                               return pdoc->Length() + 1;
                        if (wParam == 0)
                                return 0;
                        char *ptr = CharPtrFromSPtr(lParam);
                        if (wParam == 0)
                                return 0;
                        char *ptr = CharPtrFromSPtr(lParam);
@@ -5397,9 +5577,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_SETTEXT: {
                        if (lParam == 0)
                                return 0;
        case SCI_SETTEXT: {
                        if (lParam == 0)
                                return 0;
+                       pdoc->BeginUndoAction();
                        pdoc->DeleteChars(0, pdoc->Length());
                        SetEmptySelection(0);
                        pdoc->InsertString(0, CharPtrFromSPtr(lParam));
                        pdoc->DeleteChars(0, pdoc->Length());
                        SetEmptySelection(0);
                        pdoc->InsertString(0, CharPtrFromSPtr(lParam));
+                       pdoc->EndUndoAction();
                        return 1;
                }
 
                        return 1;
                }
 
@@ -5451,11 +5633,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return topLine;
 
        case SCI_GETLINE: {     // Risk of overwriting the end of the buffer
                return topLine;
 
        case SCI_GETLINE: {     // Risk of overwriting the end of the buffer
-                       if (lParam == 0) {
-                               return 0;
-                       }
                        int lineStart = pdoc->LineStart(wParam);
                        int lineEnd = pdoc->LineStart(wParam + 1);
                        int lineStart = pdoc->LineStart(wParam);
                        int lineEnd = pdoc->LineStart(wParam + 1);
+                       if (lParam == 0) {
+                               return lineEnd - lineStart;
+                       }
                        char *ptr = CharPtrFromSPtr(lParam);
                        int iPlace = 0;
                        for (int iChar = lineStart; iChar < lineEnd; iChar++) {
                        char *ptr = CharPtrFromSPtr(lParam);
                        int iPlace = 0;
                        for (int iChar = lineStart; iChar < lineEnd; iChar++) {
@@ -5487,8 +5669,23 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_GETSELTEXT: {
                break;
 
        case SCI_GETSELTEXT: {
-                       if (lParam == 0)
-                               return 0;
+                       if (lParam == 0) {
+                               if (selType == selStream) {
+                                       return 1 + SelectionEnd() - SelectionStart();
+                               } else {
+                                       // TODO: why is selLines handled the slow way?
+                                       int size = 0;
+                                       int extraCharsPerLine = 0;
+                                       if (selType != selLines)
+                                               extraCharsPerLine = (pdoc->eolMode == SC_EOL_CRLF) ? 2 : 1;
+                                       SelectionLineIterator lineIterator(this);
+                                       while (lineIterator.Iterate()) {
+                                               size += lineIterator.endPos + extraCharsPerLine - lineIterator.startPos;
+                                       }
+
+                                       return 1 + size;
+                               }
+                       }
                        SelectionText selectedText;
                        CopySelectionRange(&selectedText);
                        char *ptr = CharPtrFromSPtr(lParam);
                        SelectionText selectedText;
                        CopySelectionRange(&selectedText);
                        char *ptr = CharPtrFromSPtr(lParam);
@@ -5745,7 +5942,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETWORDCHARS: {
                break;
 
        case SCI_SETWORDCHARS: {
-                       pdoc->SetDefaultCharClasses();
+                       pdoc->SetDefaultCharClasses(false);
                        if (lParam == 0)
                                return 0;
                        pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
                        if (lParam == 0)
                                return 0;
                        pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
@@ -5760,12 +5957,16 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETCHARSDEFAULT:
                break;
 
        case SCI_SETCHARSDEFAULT:
-               pdoc->SetDefaultCharClasses();
+               pdoc->SetDefaultCharClasses(true);
                break;
 
        case SCI_GETLENGTH:
                return pdoc->Length();
 
                break;
 
        case SCI_GETLENGTH:
                return pdoc->Length();
 
+       case SCI_ALLOCATE:
+               pdoc->Allocate(wParam);
+               break;
+
        case SCI_GETCHARAT:
                return pdoc->CharAt(wParam);
 
        case SCI_GETCHARAT:
                return pdoc->CharAt(wParam);
 
@@ -5885,12 +6086,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_GETCURLINE: {
                break;
 
        case SCI_GETCURLINE: {
-                       if (lParam == 0) {
-                               return 0;
-                       }
                        int lineCurrentPos = pdoc->LineFromPosition(currentPos);
                        int lineStart = pdoc->LineStart(lineCurrentPos);
                        unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1);
                        int lineCurrentPos = pdoc->LineFromPosition(currentPos);
                        int lineStart = pdoc->LineStart(lineCurrentPos);
                        unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1);
+                       if (lParam == 0) {
+                               return 1 + lineEnd - lineStart;
+                       }
                        char *ptr = CharPtrFromSPtr(lParam);
                        unsigned int iPlace = 0;
                        for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) {
                        char *ptr = CharPtrFromSPtr(lParam);
                        unsigned int iPlace = 0;
                        for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) {
@@ -5940,8 +6141,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETTABWIDTH:
                break;
 
        case SCI_SETTABWIDTH:
-               if (wParam > 0)
+               if (wParam > 0) {
                        pdoc->tabInChars = wParam;
                        pdoc->tabInChars = wParam;
+                       if (pdoc->indentInChars == 0)
+                               pdoc->actualIndentInChars = pdoc->tabInChars;
+               }
                InvalidateStyleRedraw();
                break;
 
                InvalidateStyleRedraw();
                break;
 
@@ -5950,6 +6154,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_SETINDENT:
                pdoc->indentInChars = wParam;
 
        case SCI_SETINDENT:
                pdoc->indentInChars = wParam;
+               if (pdoc->indentInChars != 0)
+                       pdoc->actualIndentInChars = pdoc->indentInChars;
+               else
+                       pdoc->actualIndentInChars = pdoc->tabInChars;
                InvalidateStyleRedraw();
                break;
 
                InvalidateStyleRedraw();
                break;
 
@@ -6012,6 +6220,38 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_GETWRAPMODE:
                return wrapState;
 
        case SCI_GETWRAPMODE:
                return wrapState;
 
+       case SCI_SETWRAPVISUALFLAGS:
+               wrapVisualFlags = wParam;
+               actualWrapVisualStartIndent = wrapVisualStartIndent;
+               if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0))
+                       actualWrapVisualStartIndent = 1; // must indent to show start visual
+               InvalidateStyleRedraw();
+               ReconfigureScrollBars();
+               break;
+
+       case SCI_GETWRAPVISUALFLAGS:
+               return wrapVisualFlags;
+
+       case SCI_SETWRAPVISUALFLAGSLOCATION:
+               wrapVisualFlagsLocation = wParam;
+               InvalidateStyleRedraw();
+               break;
+
+       case SCI_GETWRAPVISUALFLAGSLOCATION:
+               return wrapVisualFlagsLocation;
+
+       case SCI_SETWRAPSTARTINDENT:
+               wrapVisualStartIndent = wParam;
+               actualWrapVisualStartIndent = wrapVisualStartIndent;
+               if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0))
+                       actualWrapVisualStartIndent = 1; // must indent to show start visual
+               InvalidateStyleRedraw();
+               ReconfigureScrollBars();
+               break;
+
+       case SCI_GETWRAPSTARTINDENT:
+               return wrapVisualStartIndent;
+
        case SCI_SETLAYOUTCACHE:
                llc.SetLevel(wParam);
                break;
        case SCI_SETLAYOUTCACHE:
                llc.SetLevel(wParam);
                break;
index 08c56f7a4175205864c2936edf361c13f5c24e92..b9bda04ab4678c4ec19ed761a5bdfd4f688bc436 100644 (file)
@@ -63,7 +63,7 @@ public:
        bool containsCaret;
        int edgeColumn;
        char *chars;
        bool containsCaret;
        int edgeColumn;
        char *chars;
-       char *styles;
+       unsigned char *styles;
        char *indicators;
        int *positions;
        char bracePreviousStyles[2];
        char *indicators;
        int *positions;
        char bracePreviousStyles[2];
@@ -134,20 +134,27 @@ public:
        char *s;
        int len;
        bool rectangular;
        char *s;
        int len;
        bool rectangular;
-       SelectionText() : s(0), len(0), rectangular(false) {}
+       int codePage;
+       int characterSet;
+       SelectionText() : s(0), len(0), rectangular(false), codePage(0), characterSet(0) {}
        ~SelectionText() {
        ~SelectionText() {
-               Set(0, 0);
+               Free();
        }
        }
-       void Set(char *s_, int len_, bool rectangular_=false) {
+       void Free() {
+               Set(0, 0, 0, 0, false);
+       }
+       void Set(char *s_, int len_, int codePage_, int characterSet_, bool rectangular_) {
                delete []s;
                s = s_;
                if (s)
                        len = len_;
                else
                        len = 0;
                delete []s;
                s = s_;
                if (s)
                        len = len_;
                else
                        len = 0;
+               codePage = codePage_;
+               characterSet = characterSet_;
                rectangular = rectangular_;
        }
                rectangular = rectangular_;
        }
-       void Copy(const char *s_, int len_, bool rectangular_=false) {
+       void Copy(const char *s_, int len_, int codePage_, int characterSet_, bool rectangular_) {
                delete []s;
                s = new char[len_];
                if (s) {
                delete []s;
                s = new char[len_];
                if (s) {
@@ -158,8 +165,13 @@ public:
                } else {
                        len = 0;
                }
                } else {
                        len = 0;
                }
+               codePage = codePage_;
+               characterSet = characterSet_;
                rectangular = rectangular_;
        }
                rectangular = rectangular_;
        }
+       void Copy(const SelectionText &other) {
+               Copy(other.s, other.len, other.codePage, other.characterSet, other.rectangular);
+       }
 };
 
 /**
 };
 
 /**
@@ -293,6 +305,10 @@ protected: // ScintillaBase subclass needs access to much of Editor
        int wrapWidth;
        int docLineLastWrapped;
        int docLastLineToWrap;
        int wrapWidth;
        int docLineLastWrapped;
        int docLastLineToWrap;
+       int wrapVisualFlags;
+       int wrapVisualFlagsLocation;
+       int wrapVisualStartIndent;
+       int actualWrapVisualStartIndent;
 
        Document *pdoc;
 
 
        Document *pdoc;
 
@@ -365,9 +381,11 @@ protected: // ScintillaBase subclass needs access to much of Editor
                int width=LineLayout::wrapWidthInfinite);
        ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll);
        void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
                int width=LineLayout::wrapWidthInfinite);
        ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll);
        void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
+       void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourAllocated wrapColour);
        void DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                int line, int lineEnd, int xStart, int subLine, int subLineStart,
        void DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                int line, int lineEnd, int xStart, int subLine, int subLineStart,
-               bool overrideBackground, ColourAllocated background);
+               bool overrideBackground, ColourAllocated background,
+               bool drawWrapMark, ColourAllocated wrapColour);
        void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
                PRectangle rcLine, LineLayout *ll, int subLine=0);
        void RefreshPixMaps(Surface *surfaceWindow);
        void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
                PRectangle rcLine, LineLayout *ll, int subLine=0);
        void RefreshPixMaps(Surface *surfaceWindow);
index 206a333b0028f3dde430854d1db31d7d66f58f1d..def79f6ecdce17cfe32c1801e71064bbfb300a65 100644 (file)
@@ -130,9 +130,12 @@ int Scintilla_LinkLexers() {
 //++Autogenerated -- run src/LexGen.py to regenerate
 //**\(\tLINK_LEXER(\*);\n\)
        LINK_LEXER(lmAda);
 //++Autogenerated -- run src/LexGen.py to regenerate
 //**\(\tLINK_LEXER(\*);\n\)
        LINK_LEXER(lmAda);
+       LINK_LEXER(lmAPDL);
        LINK_LEXER(lmAsm);
        LINK_LEXER(lmAsm);
+       LINK_LEXER(lmAU3);
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
+       LINK_LEXER(lmBash);
        LINK_LEXER(lmBullant);
        LINK_LEXER(lmClw);
        LINK_LEXER(lmClwNoCase);
        LINK_LEXER(lmBullant);
        LINK_LEXER(lmClw);
        LINK_LEXER(lmClwNoCase);
@@ -149,10 +152,12 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmForth);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
        LINK_LEXER(lmForth);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
+       LINK_LEXER(lmGui4Cli);
        LINK_LEXER(lmHTML);
        LINK_LEXER(lmXML);
        LINK_LEXER(lmASP);
        LINK_LEXER(lmPHP);
        LINK_LEXER(lmHTML);
        LINK_LEXER(lmXML);
        LINK_LEXER(lmASP);
        LINK_LEXER(lmPHP);
+       LINK_LEXER(lmKix);
        LINK_LEXER(lmLISP);
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
        LINK_LEXER(lmLISP);
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
@@ -161,6 +166,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmMETAPOST);
        LINK_LEXER(lmMMIXAL);
        LINK_LEXER(lmLot);
        LINK_LEXER(lmMETAPOST);
        LINK_LEXER(lmMMIXAL);
        LINK_LEXER(lmLot);
+       LINK_LEXER(lmMSSQL);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
@@ -177,10 +183,12 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmPython);
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmPython);
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
+       LINK_LEXER(lmSpecman);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmTeX);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmTeX);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
+       LINK_LEXER(lmVerilog);
        LINK_LEXER(lmYAML);
 
 //--Autogenerated -- end of automatically generated section
        LINK_LEXER(lmYAML);
 
 //--Autogenerated -- end of automatically generated section
diff --git a/src/stc/scintilla/src/LexAPDL.cxx b/src/stc/scintilla/src/LexAPDL.cxx
new file mode 100644 (file)
index 0000000..b739e9a
--- /dev/null
@@ -0,0 +1,174 @@
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '/' || ch == '*');
+}
+
+inline bool IsABlank(unsigned int ch) {
+    return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
+}
+
+
+
+static void ColouriseAPDLDoc(unsigned int startPos, int length, int initStyle,
+                              WordList *keywordlists[], Accessor &styler)
+{
+
+    //~ FILE *fp;
+    //~ fp = fopen("myoutput.txt", "w");
+
+    WordList &commands = *keywordlists[0];
+    WordList &processors = *keywordlists[1];
+    WordList &functions = *keywordlists[2];
+
+
+    // backtrack to the beginning of the document, this may be slow for big documents.
+    initStyle = SCE_APDL_DEFAULT;
+    StyleContext sc(0, startPos+length, initStyle, styler);
+
+    // backtrack to the nearest keyword
+    //~ while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_APDL_WORD)) {
+            //~ startPos--;
+    //~ }
+    //~ startPos = styler.LineStart(styler.GetLine(startPos));
+    //~ initStyle = styler.StyleAt(startPos - 1);
+    //~ StyleContext sc(startPos, endPos-startPos, initStyle, styler);
+
+    bool firstInLine = true;
+    bool atEOL;
+
+    for (; sc.More(); sc.Forward()) {
+
+        atEOL = (sc.ch == '\r' && sc.chNext == '\n') || (sc.ch == '\n');
+
+        //~ if (sc.ch == '\r') {
+            //~ fprintf(fp,"CR\t%d\t%d", atEOL, firstInLine);
+        //~ } else if (sc.ch == '\n') {
+            //~ fprintf(fp,"LF\t%d\t%d", atEOL, firstInLine);
+        //~ } else {
+            //~ fprintf(fp,"%c\t%d\t%d", sc.ch, atEOL, firstInLine);
+        //~ }
+
+        // Determine if the current state should terminate.
+        if (sc.state == SCE_APDL_COMMENT) {
+            //~ fprintf(fp,"\tCOMMENT");
+            if (atEOL) {
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_COMMENTBLOCK) {
+            //~ fprintf(fp,"\tCOMMENTBLOCK");
+            if (atEOL) {
+                if (sc.ch == '\r') {
+                    sc.Forward();
+                }
+                sc.ForwardSetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_NUMBER) {
+            //~ fprintf(fp,"\tNUMBER");
+            if (isdigit(sc.ch)) {
+            } else if ((sc.ch == 'e' || sc.ch == 'E') && (isdigit(sc.chNext) || sc.chNext == '+' || sc.chNext == '-')) {
+            } else if (sc.ch == '.') {
+            } else if ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')) {
+            } else {
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_STRING) {
+            //~ fprintf(fp,"\tSTRING");
+            if (sc.ch == '\"') {
+                //~ sc.ForwardSetState(SCE_APDL_DEFAULT);
+                sc.Forward();
+                atEOL = (sc.ch == '\r' && sc.chNext == '\n') || (sc.ch == '\n');
+                if (atEOL) {
+                    firstInLine = true;
+                }
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        } else if (sc.state == SCE_APDL_WORD) {
+            //~ fprintf(fp,"\tWORD");
+            if (!IsAWordChar(sc.ch) || sc.ch == '%') {
+                char s[100];
+                sc.GetCurrentLowered(s, sizeof(s));
+                if (commands.InList(s) && firstInLine) {
+                    if (IsABlank(sc.ch) || sc.ch == ',' || atEOL) {
+                        sc.ChangeState(SCE_APDL_COMMAND);
+                    }
+                    if (sc.ch != '\n') {
+                        firstInLine = false;
+                    }
+                } else if (processors.InList(s)) {
+                    if (IsABlank(sc.ch) || atEOL) {
+                        sc.ChangeState(SCE_APDL_PROCESSOR);
+                        while (sc.ch != '\n') {
+                            sc.Forward();
+                        }
+                        sc.Forward();
+                    }
+                } else if (functions.InList(s)) {
+                    sc.ChangeState(SCE_APDL_FUNCTION);
+                    if (sc.ch != '\n') {
+                        firstInLine = false;
+                    }
+                } else {
+                    if (sc.ch != '\n') {
+                        firstInLine = false;
+                    }
+                }
+                sc.SetState(SCE_APDL_DEFAULT);
+            }
+        }
+
+        // Determine if a new state should be entered.
+        if (sc.state == SCE_APDL_DEFAULT) {
+            if (sc.ch == '!' && sc.chNext != '!') {
+                sc.SetState(SCE_APDL_COMMENT);
+            } else if (sc.ch == '!' && sc.chNext == '!') {
+                sc.SetState(SCE_APDL_COMMENTBLOCK);
+            } else if (IsADigit(sc.ch) && !IsAWordChar(sc.chPrev)) {
+                sc.SetState(SCE_APDL_NUMBER);
+            } else if (sc.ch == '.' && (isoperator(static_cast<char>(sc.chPrev)) ||
+               IsABlank(sc.chPrev) || sc.chPrev == '\n' || sc.chPrev == '\r')) {
+                sc.SetState(SCE_APDL_NUMBER);
+            } else if (sc.ch == '\"') {
+                sc.SetState(SCE_APDL_STRING);
+            } else if (IsAWordStart(sc.ch) && (!IsADigit(sc.chPrev))) {
+                sc.SetState(SCE_APDL_WORD);
+            }
+
+        }
+        //~ fprintf(fp,"\n");
+
+        if (atEOL) {
+            firstInLine = true;
+        }
+
+    }
+    sc.Complete();
+}
+
+static const char * const apdlWordListDesc[] = {
+    "Commands",
+    "Processors",
+    "Functions",
+    0
+};
+
+LexerModule lmAPDL(SCLEX_APDL, ColouriseAPDLDoc, "apdl", 0, apdlWordListDesc);
diff --git a/src/stc/scintilla/src/LexAU3.cxx b/src/stc/scintilla/src/LexAU3.cxx
new file mode 100644 (file)
index 0000000..8bc1f06
--- /dev/null
@@ -0,0 +1,369 @@
+// Scintilla source code edit control
+// @file LexAU3.cxx
+// Lexer for AutoIt3  http://www.hiddensoft.com/autoit3
+// by Jos van der Zande, jvdzande@yahoo.com 
+//
+// Changes:
+// March 28, 2004 - Added the standard Folding code
+// April 21, 2004 - Added Preprosessor Table + Syntax Highlighting
+//                  Fixed Number highlighting
+//                  Changed default isoperator to IsAOperator to have a better match to AutoIt3
+//                  Fixed "#comments_start" -> "#comments-start"  
+//                  Fixed "#comments_end" -> "#comments-end"  
+//                  Fixed Sendkeys in Strings when not terminated with }
+//                  Added support for Sendkey strings that have second parameter e.g. {UP 5} or {a down}
+// April 26, 2004   Fixed # pre-processor statement inside of comment block would invalidly change the color.
+//                  Added logic for #include <xyz.au3> to treat the <> as string
+//                  Added underscore to IsAOperator.
+// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+// Scintilla source code edit control
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static bool IsAU3Comment(Accessor &styler, int pos, int len) {
+       return len>0 && styler[pos]==';';
+}
+
+static inline bool IsTypeCharacter(const int ch)
+{
+    return ch == '$';
+}
+static inline bool IsAWordChar(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '-');
+}
+
+static inline bool IsAWordStart(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$');
+}
+
+static inline bool IsAOperator(char ch) {
+       if (isascii(ch) && isalnum(ch))
+               return false;
+       if (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||
+           ch == '&' || ch == '^' || ch == '=' || ch == '<' || ch == '>' ||
+           ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '_' )
+               return true;
+       return false;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// GetSendKey() filters the portion before and after a/multiple space(s)
+// and return the first portion to be looked-up in the table
+// also check if the second portion is valid... (up,down.on.off,toggle or a number)
+///////////////////////////////////////////////////////////////////////////////
+
+static int GetSendKey(const char *szLine, char *szKey)
+{
+       int             nFlag   = 0;
+       int             nKeyPos = 0;
+       int             nSpecPos= 0;
+       int             nSpecNum= 1;
+       int             nPos    = 0;
+       char    cTemp;
+       char    szSpecial[100];
+
+       // split the portion of the sendkey in the part before and after the spaces
+       while ( ( (cTemp = szLine[nPos]) != '\0'))
+       {
+               if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space
+               {
+                       nFlag = 1;
+                       // Add } to the end of the first bit for table lookup later.
+                       szKey[nKeyPos++] = '}';
+               }
+               else if (cTemp == ' ')
+               {
+                       // skip other spaces 
+               }
+               else if (nFlag == 0)
+               {
+                       // save first portion into var till space or } is hit
+                       szKey[nKeyPos++] = cTemp;
+               }
+               else if ((nFlag == 1) && (cTemp != '}'))
+               {
+                       // Save second portion into var...
+                       szSpecial[nSpecPos++] = cTemp;
+                       // check if Second portion is all numbers for repeat fuction
+                       if (isdigit(cTemp) == false) {nSpecNum = 0;} 
+               }
+               nPos++;                                                                 // skip to next char
+
+       } // End While
+
+
+       // Check if the second portion is either a number or one of these keywords
+       szKey[nKeyPos] = '\0';
+       szSpecial[nSpecPos] = '\0';
+       if (strcmp(szSpecial,"down")==0    || strcmp(szSpecial,"up")==0  ||
+               strcmp(szSpecial,"on")==0      || strcmp(szSpecial,"off")==0 || 
+               strcmp(szSpecial,"toggle")==0  || nSpecNum == 1 )
+       {
+               nFlag = 0;
+       }
+       else
+       {
+               nFlag = 1;
+       }
+       return nFlag;  // 1 is bad, 0 is good
+
+} // GetSendKey()
+
+static void ColouriseAU3Doc(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];
+    styler.StartAt(startPos);
+
+    StyleContext sc(startPos, length, initStyle, styler);
+       char si;     // string indicator "=1 '=2
+       si=0;
+       //$$$
+    for (; sc.More(); sc.Forward()) {
+               char s[100];
+               sc.GetCurrentLowered(s, sizeof(s));
+               switch (sc.state)
+        {
+            case SCE_AU3_COMMENTBLOCK:
+            {
+                               if (!IsAWordChar(sc.ch))
+                               {
+                                       if ((strcmp(s, "#ce")==0 || strcmp(s, "#comments-end")==0)) 
+                                       {sc.SetState(SCE_AU3_COMMENT);}  // set to comment line for the rest of the line
+                                       else
+                                       {sc.SetState(SCE_AU3_COMMENTBLOCK);}
+                               }
+                break;
+                       }
+            case SCE_AU3_COMMENT:
+            {
+                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_OPERATOR:
+            {
+                sc.SetState(SCE_AU3_DEFAULT);
+                break;
+            }
+            case SCE_AU3_KEYWORD:
+            {
+                if (!IsAWordChar(sc.ch))
+                {
+                    if (!IsTypeCharacter(sc.ch))
+                    {
+                                               if (strcmp(s, "#cs")==0 || strcmp(s, "#comments-start")==0 )
+                                               {
+                                                       sc.ChangeState(SCE_AU3_COMMENTBLOCK);
+                                                       sc.SetState(SCE_AU3_COMMENTBLOCK);
+                                               }
+                                               else if (keywords.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_KEYWORD);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                               else if (keywords2.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_FUNCTION);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                               else if (keywords3.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_MACRO);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                               else if (keywords5.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_PREPROCESSOR);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                                       if (strcmp(s, "#include")==0)
+                                                       {
+                                                               si = 3;   // use to determine string start for #inlude <>
+                                                       }
+                                               }
+                                               else if (!IsAWordChar(sc.ch)) {
+                                                       sc.ChangeState(SCE_AU3_DEFAULT);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
+                                       }
+                               }       
+                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_NUMBER:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_VARIABLE:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_AU3_DEFAULT);}
+                break;
+            }
+            case SCE_AU3_STRING:
+            {
+                               // check for " to end a double qouted string or
+                               // check for ' to end a single qouted string 
+                   if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>'))
+                               {
+                                       sc.ForwardSetState(SCE_AU3_DEFAULT);
+                               }
+                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+                               // find Sendkeys in a STRING
+                               if (sc.ch == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               break;
+            }
+            
+            case SCE_AU3_SENT:
+            {
+                               // Send key string ended 
+                               if (sc.chPrev == '}' && sc.ch != '}') 
+                               {
+                                       // set color to SENDKEY when valid sendkey .. else set back to regular string
+                                       char sk[100];
+                                       // split {111 222} and return {111} and check if 222 is valid.
+                                       // if return code = 1 then invalid 222 so must be string
+                                       if (GetSendKey(s,sk))   
+                                       {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                       }
+                                       // if single char between {?} then its ok as sendkey for a single character
+                                       else if (strlen(sk) == 3)  
+                                       {
+                                               sc.ChangeState(SCE_AU3_SENT);
+                                       }
+                                       // if sendkey {111} is in table then ok as sendkey
+                                       else if (keywords4.InList(sk)) 
+                                       {
+                                               sc.ChangeState(SCE_AU3_SENT);
+                                       }
+                                       else
+                                       {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                       }
+                                       sc.SetState(SCE_AU3_STRING);
+                               }
+                               // check if next portion is again a sendkey
+                               if (sc.atLineEnd) 
+                               {
+                                       sc.SetState(SCE_AU3_DEFAULT);
+                                       si = 0;  // reset string indicator
+                               }
+                               if (sc.ch == '{' && sc.chPrev != '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               // check to see if the string ended...
+                               // Sentkey string isn't complete but the string ended....
+                               if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\''))
+                               {
+                                       sc.ChangeState(SCE_AU3_STRING);
+                                       sc.ForwardSetState(SCE_AU3_DEFAULT);
+                               }
+                               break;
+            }
+        }  //switch (sc.state)
+
+        // Determine if a new state should be entered:
+
+               if (sc.state == SCE_AU3_DEFAULT)
+        {
+            if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);}
+            else if (sc.ch == '#') {sc.SetState(SCE_AU3_KEYWORD);}
+            else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);}
+            else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);}
+            else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);}  // string after #include 
+            else if (sc.ch == '\"') {
+                               sc.SetState(SCE_AU3_STRING);
+                               si = 1; }
+            else if (sc.ch == '\'') {
+                               sc.SetState(SCE_AU3_STRING);
+                               si = 2; }
+            else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_AU3_NUMBER);}
+            else if (IsAOperator(static_cast<char>(sc.ch))) {sc.SetState(SCE_AU3_OPERATOR);}
+            else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);}
+                       else if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}
+        }
+    }      //for (; sc.More(); sc.Forward())
+    sc.Complete();
+}
+
+//
+//
+static void FoldAU3Doc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
+{
+               int endPos = startPos + length;
+
+       // Backtrack to previous line in case need to fix its fold status
+       int lineCurrent = styler.GetLine(startPos);
+       if (startPos > 0) {
+               if (lineCurrent > 0) {
+                       lineCurrent--;
+                       startPos = styler.LineStart(lineCurrent);
+               }
+       }
+       int spaceFlags = 0;
+       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsAU3Comment);
+       char chNext = styler[startPos];
+       for (int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
+                       int lev = indentCurrent;
+                       int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsAU3Comment);
+                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
+                               // Only non whitespace lines can be headers
+                               if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
+                                       lev |= SC_FOLDLEVELHEADERFLAG;
+                               } else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
+                                       // Line after is blank so check the next - maybe should continue further?
+                                       int spaceFlags2 = 0;
+                                       int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsAU3Comment);
+                                       if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+                                               lev |= SC_FOLDLEVELHEADERFLAG;
+                                       }
+                               }
+                       }
+                       indentCurrent = indentNext;
+                       styler.SetLevel(lineCurrent, lev);
+                       lineCurrent++;
+               }
+       }
+
+}
+
+
+//
+
+static const char * const AU3WordLists[] = {
+    "#autoit keywords",
+    "#autoit functions",
+    "#autoit macros",
+    "#autoit Sent keys",
+    "#autoit Pre-processors",
+    0
+};
+LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", FoldAU3Doc , AU3WordLists);
diff --git a/src/stc/scintilla/src/LexBash.cxx b/src/stc/scintilla/src/LexBash.cxx
new file mode 100644 (file)
index 0000000..abd02c4
--- /dev/null
@@ -0,0 +1,645 @@
+// Scintilla source code edit control
+/** @file LexBash.cxx
+ ** Lexer for Bash.
+ **/
+// Copyright 2004 by Neil Hodgson <neilh@scintilla.org>
+// Adapted from LexPerl by Kein-Hong Man <mkh@pl.jaring.my> 2004
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#define BASH_BASE_ERROR                65
+#define BASH_BASE_DECIMAL      66
+#define BASH_BASE_HEX          67
+#define BASH_BASE_OCTAL                68
+#define BASH_BASE_OCTAL_ERROR  69
+
+#define HERE_DELIM_MAX 256
+
+static inline int translateBashDigit(char ch) {
+       if (ch >= '0' && ch <= '9') {
+               return ch - '0';
+       } else if (ch >= 'a' && ch <= 'z') {
+               return ch - 'a' + 10;
+       } else if (ch >= 'A' && ch <= 'Z') {
+               return ch - 'A' + 36;
+       } else if (ch == '@') {
+               return 62;
+       } else if (ch == '_') {
+               return 63;
+       }
+       return BASH_BASE_ERROR;
+}
+
+static inline bool isEOLChar(char ch) {
+       return (ch == '\r') || (ch == '\n');
+}
+
+static bool isSingleCharOp(char ch) {
+       char strCharSet[2];
+       strCharSet[0] = ch;
+       strCharSet[1] = '\0';
+       return (NULL != strstr("rwxoRWXOezsfdlpSbctugkTBMACahGLNn", strCharSet));
+}
+
+static inline bool isBashOperator(char ch) {
+       if (ch == '^' || ch == '&' || ch == '\\' || ch == '%' ||
+               ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
+               ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
+               ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
+               ch == '>' || ch == ',' || ch == '/' || ch == '<' ||
+               ch == '?' || ch == '!' || ch == '.' || ch == '~' ||
+               ch == '@')
+               return true;
+       return false;
+}
+
+static int classifyWordBash(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
+       char s[100];
+       for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
+               s[i] = styler[start + i];
+               s[i + 1] = '\0';
+       }
+       char chAttr = SCE_SH_IDENTIFIER;
+       if (keywords.InList(s))
+               chAttr = SCE_SH_WORD;
+       styler.ColourTo(end, chAttr);
+       return chAttr;
+}
+
+static inline int getBashNumberBase(unsigned int start, unsigned int end, Accessor &styler) {
+       int base = 0;
+       for (unsigned int i = 0; i < end - start + 1 && i < 10; i++) {
+               base = base * 10 + (styler[start + i] - '0');
+       }
+       if (base > 64 || (end - start) > 1) {
+               return BASH_BASE_ERROR;
+       }
+       return base;
+}
+
+static inline bool isEndVar(char ch) {
+       return !isalnum(ch) && ch != '$' && ch != '_';
+}
+
+static inline bool isNonQuote(char ch) {
+       return isalnum(ch) || ch == '_';
+}
+
+static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
+       if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
+               return false;
+       }
+       while (*val) {
+               if (*val != styler[pos++]) {
+                       return false;
+               }
+               val++;
+       }
+       return true;
+}
+
+static char opposite(char ch) {
+       if (ch == '(')
+               return ')';
+       if (ch == '[')
+               return ']';
+       if (ch == '{')
+               return '}';
+       if (ch == '<')
+               return '>';
+       return ch;
+}
+
+static void ColouriseBashDoc(unsigned int startPos, int length, int initStyle,
+                             WordList *keywordlists[], Accessor &styler) {
+
+       // Lexer for bash often has to backtrack to start of current style to determine
+       // which characters are being used as quotes, how deeply nested is the
+       // start position and what the termination string is for here documents
+
+       WordList &keywords = *keywordlists[0];
+
+       class HereDocCls {
+       public:
+               int State;              // 0: '<<' encountered
+               // 1: collect the delimiter
+               // 2: here doc text (lines after the delimiter)
+               char Quote;             // the char after '<<'
+               bool Quoted;            // true if Quote in ('\'','"','`')
+               bool Indent;            // indented delimiter (for <<-)
+               int DelimiterLength;    // strlen(Delimiter)
+               char *Delimiter;        // the Delimiter, 256: sizeof PL_tokenbuf
+               HereDocCls() {
+                       State = 0;
+                       DelimiterLength = 0;
+                       Delimiter = new char[HERE_DELIM_MAX];
+                       Delimiter[0] = '\0';
+               }
+               ~HereDocCls() {
+                       delete []Delimiter;
+               }
+       };
+       HereDocCls HereDoc;
+
+       class QuoteCls {
+               public:
+               int  Rep;
+               int  Count;
+               char Up;
+               char Down;
+               QuoteCls() {
+                       this->New(1);
+               }
+               void New(int r) {
+                       Rep   = r;
+                       Count = 0;
+                       Up    = '\0';
+                       Down  = '\0';
+               }
+               void Open(char u) {
+                       Count++;
+                       Up    = u;
+                       Down  = opposite(Up);
+               }
+       };
+       QuoteCls Quote;
+
+       int state = initStyle;
+       int numBase = 0;
+       unsigned int lengthDoc = startPos + length;
+
+       // If in a long distance lexical state, seek to the beginning to find quote characters
+       // Bash strings can be multi-line with embedded newlines, so backtrack.
+       // Bash numbers have additional state during lexing, so backtrack too.
+       if (state == SCE_SH_HERE_Q) {
+               while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_SH_HERE_DELIM)) {
+                       startPos--;
+               }
+               startPos = styler.LineStart(styler.GetLine(startPos));
+               state = styler.StyleAt(startPos - 1);
+       }
+       if (state == SCE_SH_STRING
+        || state == SCE_SH_BACKTICKS
+        || state == SCE_SH_CHARACTER
+        || state == SCE_SH_NUMBER
+        || state == SCE_SH_IDENTIFIER
+        || state == SCE_SH_COMMENTLINE
+       ) {
+               while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
+                       startPos--;
+               }
+               state = SCE_SH_DEFAULT;
+       }
+
+       styler.StartAt(startPos);
+       char chPrev = styler.SafeGetCharAt(startPos - 1);
+       if (startPos == 0)
+               chPrev = '\n';
+       char chNext = styler[startPos];
+       styler.StartSegment(startPos);
+
+       for (unsigned int i = startPos; i < lengthDoc; i++) {
+               char ch = chNext;
+               // if the current character is not consumed due to the completion of an
+               // earlier style, lexing can be restarted via a simple goto
+       restartLexer:
+               chNext = styler.SafeGetCharAt(i + 1);
+               char chNext2 = styler.SafeGetCharAt(i + 2);
+
+               if (styler.IsLeadByte(ch)) {
+                       chNext = styler.SafeGetCharAt(i + 2);
+                       chPrev = ' ';
+                       i += 1;
+                       continue;
+               }
+
+               if ((chPrev == '\r' && ch == '\n')) {   // skip on DOS/Windows
+                       styler.ColourTo(i, state);
+                       chPrev = ch;
+                       continue;
+               }
+
+               if (HereDoc.State == 1 && isEOLChar(ch)) {
+                       // Begin of here-doc (the line after the here-doc delimiter):
+                       // Lexically, the here-doc starts from the next line after the >>, but the
+                       // first line of here-doc seem to follow the style of the last EOL sequence
+                       HereDoc.State = 2;
+                       if (HereDoc.Quoted) {
+                               if (state == SCE_SH_HERE_DELIM) {
+                                       // Missing quote at end of string! We are stricter than bash.
+                                       // Colour here-doc anyway while marking this bit as an error.
+                                       state = SCE_SH_ERROR;
+                               }
+                               styler.ColourTo(i - 1, state);
+                               // HereDoc.Quote always == '\''
+                               state = SCE_SH_HERE_Q;
+                       } else {
+                               styler.ColourTo(i - 1, state);
+                               // always switch
+                               state = SCE_SH_HERE_Q;
+                       }
+               }
+
+               if (state == SCE_SH_DEFAULT) {
+                       if (ch == '\\') {       // escaped character
+                               i++;
+                               ch = chNext;
+                               chNext = chNext2;
+                               styler.ColourTo(i, SCE_SH_IDENTIFIER);
+                       } else if (isdigit(ch)) {
+                               state = SCE_SH_NUMBER;
+                               numBase = BASH_BASE_DECIMAL;
+                               if (ch == '0') {        // hex,octal
+                                       if (chNext == 'x' || chNext == 'X') {
+                                               numBase = BASH_BASE_HEX;
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       } else if (isdigit(chNext)) {
+                                               numBase = BASH_BASE_OCTAL;
+                                       }
+                               }
+                       } else if (iswordstart(ch)) {
+                               state = SCE_SH_WORD;
+                               if (!iswordchar(chNext) && chNext != '+' && chNext != '-') {
+                                       // We need that if length of word == 1!
+                                       // This test is copied from the SCE_SH_WORD handler.
+                                       classifyWordBash(styler.GetStartSegment(), i, keywords, styler);
+                                       state = SCE_SH_DEFAULT;
+                               }
+                       } else if (ch == '#') {
+                               state = SCE_SH_COMMENTLINE;
+                       } else if (ch == '\"') {
+                               state = SCE_SH_STRING;
+                               Quote.New(1);
+                               Quote.Open(ch);
+                       } else if (ch == '\'') {
+                               state = SCE_SH_CHARACTER;
+                               Quote.New(1);
+                               Quote.Open(ch);
+                       } else if (ch == '`') {
+                               state = SCE_SH_BACKTICKS;
+                               Quote.New(1);
+                               Quote.Open(ch);
+                       } else if (ch == '$') {
+                               if (chNext == '{') {
+                                       state = SCE_SH_PARAM;
+                                       goto startQuote;
+                               } else if (chNext == '\'') {
+                                       state = SCE_SH_CHARACTER;
+                                       goto startQuote;
+                               } else if (chNext == '"') {
+                                       state = SCE_SH_STRING;
+                                       goto startQuote;
+                               } else if (chNext == '(' && chNext2 == '(') {
+                                       styler.ColourTo(i, SCE_SH_OPERATOR);
+                                       state = SCE_SH_DEFAULT;
+                                       goto skipChar;
+                               } else if (chNext == '(' || chNext == '`') {
+                                       state = SCE_SH_BACKTICKS;
+                               startQuote:
+                                       Quote.New(1);
+                                       Quote.Open(chNext);
+                                       goto skipChar;
+                               } else {
+                                       state = SCE_SH_SCALAR;
+                               skipChar:
+                                       i++;
+                                       ch = chNext;
+                                       chNext = chNext2;
+                               }
+                       } else if (ch == '*') {
+                               if (chNext == '*') {    // exponentiation
+                                       i++;
+                                       ch = chNext;
+                                       chNext = chNext2;
+                               }
+                               styler.ColourTo(i, SCE_SH_OPERATOR);
+                       } else if (ch == '<' && chNext == '<') {
+                               state = SCE_SH_HERE_DELIM;
+                               HereDoc.State = 0;
+                               HereDoc.Indent = false;
+                       } else if (ch == '-'    // file test operators
+                                  && isSingleCharOp(chNext)
+                                  && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
+                               styler.ColourTo(i + 1, SCE_SH_WORD);
+                               state = SCE_SH_DEFAULT;
+                               i++;
+                               ch = chNext;
+                               chNext = chNext2;
+                       } else if (isBashOperator(ch)) {
+                               styler.ColourTo(i, SCE_SH_OPERATOR);
+                       } else {
+                               // keep colouring defaults to make restart easier
+                               styler.ColourTo(i, SCE_SH_DEFAULT);
+                       }
+               } else if (state == SCE_SH_NUMBER) {
+                       int digit = translateBashDigit(ch);
+                       if (numBase == BASH_BASE_DECIMAL) {
+                               if (ch == '#') {
+                                       numBase = getBashNumberBase(styler.GetStartSegment(), i - 1, styler);
+                                       if (numBase == BASH_BASE_ERROR) // take the rest as comment
+                                               goto numAtEnd;
+                               } else if (!isdigit(ch))
+                                       goto numAtEnd;
+                       } else if (numBase == BASH_BASE_HEX) {
+                               if ((digit < 16) || (digit >= 36 && digit <= 41)) {
+                                       // hex digit 0-9a-fA-F
+                               } else
+                                       goto numAtEnd;
+                       } else if (numBase == BASH_BASE_OCTAL ||
+                                  numBase == BASH_BASE_OCTAL_ERROR) {
+                               if (digit > 7) {
+                                       if (digit <= 9) {
+                                               numBase = BASH_BASE_OCTAL_ERROR;
+                                       } else
+                                               goto numAtEnd;
+                               }
+                       } else if (numBase == BASH_BASE_ERROR) {
+                               if (digit > 9)
+                                       goto numAtEnd;
+                       } else {        // DD#DDDD number style handling
+                               if (digit != BASH_BASE_ERROR) {
+                                       if (numBase <= 36) {
+                                               // case-insensitive if base<=36
+                                               if (digit >= 36) digit -= 26;
+                                       }
+                                       if (digit >= numBase) {
+                                               if (digit <= 9) {
+                                                       numBase = BASH_BASE_ERROR;
+                                               } else
+                                                       goto numAtEnd;
+                                       }
+                               } else {
+                       numAtEnd:
+                                       if (numBase == BASH_BASE_ERROR ||
+                                           numBase == BASH_BASE_OCTAL_ERROR)
+                                               state = SCE_SH_ERROR;
+                                       styler.ColourTo(i - 1, state);
+                                       state = SCE_SH_DEFAULT;
+                                       goto restartLexer;
+                               }
+                       }
+               } else if (state == SCE_SH_WORD) {
+                       if (!iswordchar(chNext) && chNext != '+' && chNext != '-') {
+                               // "." never used in Bash variable names
+                               // but used in file names
+                               classifyWordBash(styler.GetStartSegment(), i, keywords, styler);
+                               state = SCE_SH_DEFAULT;
+                               ch = ' ';
+                       }
+               } else if (state == SCE_SH_IDENTIFIER) {
+                       if (!iswordchar(chNext) && chNext != '+' && chNext != '-') {
+                               styler.ColourTo(i, SCE_SH_IDENTIFIER);
+                               state = SCE_SH_DEFAULT;
+                               ch = ' ';
+                       }
+               } else {
+                       if (state == SCE_SH_COMMENTLINE) {
+                               if (ch == '\\' && isEOLChar(chNext)) {
+                                       // comment continuation
+                                       if (chNext == '\r' && chNext2 == '\n') {
+                                               i += 2;
+                                               ch = styler.SafeGetCharAt(i);
+                                               chNext = styler.SafeGetCharAt(i + 1);
+                                       } else {
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       }
+                               } else if (isEOLChar(ch)) {
+                                       styler.ColourTo(i - 1, state);
+                                       state = SCE_SH_DEFAULT;
+                                       goto restartLexer;
+                               } else if (isEOLChar(chNext)) {
+                                       styler.ColourTo(i, state);
+                                       state = SCE_SH_DEFAULT;
+                               }
+                       } else if (state == SCE_SH_HERE_DELIM) {
+                               //
+                               // From Bash info:
+                               // ---------------
+                               // Specifier format is: <<[-]WORD
+                               // Optional '-' is for removal of leading tabs from here-doc.
+                               // Whitespace acceptable after <<[-] operator
+                               //
+                               if (HereDoc.State == 0) { // '<<' encountered
+                                       HereDoc.State = 1;
+                                       HereDoc.Quote = chNext;
+                                       HereDoc.Quoted = false;
+                                       HereDoc.DelimiterLength = 0;
+                                       HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+                                       if (chNext == '\'') {   // a quoted here-doc delimiter (' only)
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                               HereDoc.Quoted = true;
+                                       } else if (!HereDoc.Indent && chNext == '-') {  // <<- indent case
+                                               HereDoc.Indent = true;
+                                               HereDoc.State = 0;
+                                       } else if (isalpha(chNext) || chNext == '_' || chNext == '\\'
+                                               || chNext == '-' || chNext == '+') {
+                                               // an unquoted here-doc delimiter, no special handling
+                                       } else if (chNext == '<') {     // HERE string <<<
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                               styler.ColourTo(i, SCE_SH_HERE_DELIM);
+                                               state = SCE_SH_DEFAULT;
+                                               HereDoc.State = 0;
+                                       } else if (isspacechar(chNext)) {
+                                               // eat whitespace
+                                               HereDoc.State = 0;
+                                       } else if (isdigit(chNext) || chNext == '=' || chNext == '$') {
+                                               // left shift << or <<= operator cases
+                                               styler.ColourTo(i, SCE_SH_OPERATOR);
+                                               state = SCE_SH_DEFAULT;
+                                               HereDoc.State = 0;
+                                       } else {
+                                               // symbols terminates; deprecated zero-length delimiter
+                                       }
+                               } else if (HereDoc.State == 1) { // collect the delimiter
+                                       if (HereDoc.Quoted) { // a quoted here-doc delimiter
+                                               if (ch == HereDoc.Quote) { // closing quote => end of delimiter
+                                                       styler.ColourTo(i, state);
+                                                       state = SCE_SH_DEFAULT;
+                                               } else {
+                                                       if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote
+                                                               i++;
+                                                               ch = chNext;
+                                                               chNext = chNext2;
+                                                       }
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+                                               }
+                                       } else { // an unquoted here-doc delimiter
+                                               if (isalnum(ch) || ch == '_' || ch == '-' || ch == '+') {
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+                                                       HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+                                               } else if (ch == '\\') {
+                                                       // skip escape prefix
+                                               } else {
+                                                       styler.ColourTo(i - 1, state);
+                                                       state = SCE_SH_DEFAULT;
+                                                       goto restartLexer;
+                                               }
+                                       }
+                                       if (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) {
+                                               styler.ColourTo(i - 1, state);
+                                               state = SCE_SH_ERROR;
+                                               goto restartLexer;
+                                       }
+                               }
+                       } else if (HereDoc.State == 2) {
+                               // state == SCE_SH_HERE_Q
+                               if (isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {
+                                       if (!HereDoc.Indent && isEOLChar(chPrev)) {
+                                       endHereDoc:
+                                               // standard HERE delimiter
+                                               i += HereDoc.DelimiterLength;
+                                               chPrev = styler.SafeGetCharAt(i - 1);
+                                               ch = styler.SafeGetCharAt(i);
+                                               if (isEOLChar(ch)) {
+                                                       styler.ColourTo(i - 1, state);
+                                                       state = SCE_SH_DEFAULT;
+                                                       HereDoc.State = 0;
+                                                       goto restartLexer;
+                                               }
+                                               chNext = styler.SafeGetCharAt(i + 1);
+                                       } else if (HereDoc.Indent) {
+                                               // indented HERE delimiter
+                                               unsigned int bk = (i > 0)? i - 1: 0;
+                                               while (i > 0) {
+                                                       ch = styler.SafeGetCharAt(bk--);
+                                                       if (isEOLChar(ch)) {
+                                                               goto endHereDoc;
+                                                       } else if (!isspacechar(ch)) {
+                                                               break;  // got leading non-whitespace
+                                                       }
+                                               }
+                                       }
+                               }
+                       } else if (state == SCE_SH_SCALAR) {    // variable names
+                               if (isEndVar(ch)) {
+                                       if ((state == SCE_SH_SCALAR)
+                                           && i == (styler.GetStartSegment() + 1)) {
+                                               // Special variable: $(, $_ etc.
+                                               styler.ColourTo(i, state);
+                                               state = SCE_SH_DEFAULT;
+                                       } else {
+                                               styler.ColourTo(i - 1, state);
+                                               state = SCE_SH_DEFAULT;
+                                               goto restartLexer;
+                                       }
+                               }
+                       } else if (state == SCE_SH_STRING
+                               || state == SCE_SH_CHARACTER
+                               || state == SCE_SH_BACKTICKS
+                               || state == SCE_SH_PARAM
+                               ) {
+                               if (!Quote.Down && !isspacechar(ch)) {
+                                       Quote.Open(ch);
+                               } else if (ch == '\\' && Quote.Up != '\\') {
+                                       i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               } else if (ch == Quote.Down) {
+                                       Quote.Count--;
+                                       if (Quote.Count == 0) {
+                                               Quote.Rep--;
+                                               if (Quote.Rep <= 0) {
+                                                       styler.ColourTo(i, state);
+                                                       state = SCE_SH_DEFAULT;
+                                                       ch = ' ';
+                                               }
+                                               if (Quote.Up == Quote.Down) {
+                                                       Quote.Count++;
+                                               }
+                                       }
+                               } else if (ch == Quote.Up) {
+                                       Quote.Count++;
+                               }
+                       }
+               }
+               if (state == SCE_SH_ERROR) {
+                       break;
+               }
+               chPrev = ch;
+       }
+       styler.ColourTo(lengthDoc - 1, state);
+}
+
+static void FoldBashDoc(unsigned int startPos, int length, int, WordList *[],
+                            Accessor &styler) {
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+       int levelCurrent = levelPrev;
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               int style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if (foldComment && (style == SCE_SH_COMMENTLINE)) {
+                       if ((ch == '/') && (chNext == '/')) {
+                               char chNext2 = styler.SafeGetCharAt(i + 2);
+                               if (chNext2 == '{') {
+                                       levelCurrent++;
+                               } else if (chNext2 == '}') {
+                                       levelCurrent--;
+                               }
+                       }
+               }
+               if (style == SCE_C_OPERATOR) {
+                       if (ch == '{') {
+                               levelCurrent++;
+                       } else if (ch == '}') {
+                               levelCurrent--;
+                       }
+               }
+               if (atEOL) {
+                       int lev = levelPrev;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if ((levelCurrent > levelPrev) && (visibleChars > 0))
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelPrev = levelCurrent;
+                       visibleChars = 0;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+       // Fill in the real level of the next line, keeping the current flags as they will be filled in later
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+}
+
+static const char * const bashWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+LexerModule lmBash(SCLEX_BASH, ColouriseBashDoc, "bash", FoldBashDoc, bashWordListDesc);
diff --git a/src/stc/scintilla/src/LexGui4Cli.cxx b/src/stc/scintilla/src/LexGui4Cli.cxx
new file mode 100644 (file)
index 0000000..2e3c02c
--- /dev/null
@@ -0,0 +1,309 @@
+// Scintilla source code edit control
+// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+/*
+This is the Lexer for Gui4Cli, included in SciLexer.dll
+- by d. Keletsekis, 2/10/2003
+
+To add to SciLexer.dll:
+1. Add the values below to INCLUDE\Scintilla.iface
+2. Run the include/HFacer.py script
+3. Run the src/lexGen.py script
+
+val SCE_GC_DEFAULT=0
+val SCE_GC_COMMENTLINE=1
+val SCE_GC_COMMENTBLOCK=2
+val SCE_GC_GLOBAL=3
+val SCE_GC_EVENT=4
+val SCE_GC_ATTRIBUTE=5
+val SCE_GC_CONTROL=6
+val SCE_GC_COMMAND=7
+val SCE_GC_STRING=8
+val SCE_GC_OPERATOR=9
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#define debug Platform::DebugPrintf
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
+}
+
+inline bool isGCOperator(int ch)
+{      if (isalnum(ch))
+               return false;
+       // '.' left out as it is used to make up numbers
+       if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
+                ch == '(' || ch == ')' || ch == '=' || ch == '%' ||
+                ch == '[' || ch == ']' || ch == '<' || ch == '>' ||
+                ch == ',' || ch == ';' || ch == ':')
+               return true;
+       return false;
+}
+
+#define isSpace(x)             ((x)==' ' || (x)=='\t')
+#define isNL(x)                        ((x)=='\n' || (x)=='\r')
+#define isSpaceOrNL(x)  (isSpace(x) || isNL(x))
+#define BUFFSIZE 500
+#define isFoldPoint(x)  ((styler.LevelAt(x) & SC_FOLDLEVELNUMBERMASK) == 1024)
+
+static void colorFirstWord(WordList *keywordlists[], Accessor &styler,
+                                                                       StyleContext *sc, char *buff, int length, int)
+{
+       int c = 0;
+       while (sc->More() && isSpaceOrNL(sc->ch))
+       {       sc->Forward();
+       }
+       styler.ColourTo(sc->currentPos - 1, sc->state);
+
+       if (!IsAWordChar(sc->ch)) // comment, marker, etc..
+               return;
+
+       while (sc->More() && !isSpaceOrNL(sc->ch) && (c < length-1) && !isGCOperator(sc->ch))
+       {       buff[c] = static_cast<char>(sc->ch);
+               ++c; sc->Forward();
+       }
+       buff[c] = '\0';
+       char *p = buff;
+       while (*p)      // capitalize..
+       {       if (islower(*p)) *p = static_cast<char>(toupper(*p));
+               ++p;
+       }
+
+       WordList &kGlobal               = *keywordlists[0];     // keyword lists set by the user
+       WordList &kEvent                = *keywordlists[1];
+       WordList &kAttribute    = *keywordlists[2];
+       WordList &kControl      = *keywordlists[3];
+       WordList &kCommand      = *keywordlists[4];
+
+       int state = 0;
+       // int level = styler.LevelAt(line) & SC_FOLDLEVELNUMBERMASK;
+       // debug ("line = %d, level = %d", line, level);
+
+       if           (kGlobal.InList(buff))             state = SCE_GC_GLOBAL;
+       else if (kAttribute.InList(buff))       state = SCE_GC_ATTRIBUTE;
+       else if (kControl.InList(buff))         state = SCE_GC_CONTROL;
+       else if (kCommand.InList(buff))         state = SCE_GC_COMMAND;
+       else if (kEvent.InList(buff))                   state = SCE_GC_EVENT;
+
+       if (state)
+       {       sc->ChangeState(state);
+               styler.ColourTo(sc->currentPos - 1, sc->state);
+               sc->ChangeState(SCE_GC_DEFAULT);
+       }
+       else
+       {       sc->ChangeState(SCE_GC_DEFAULT);
+               styler.ColourTo(sc->currentPos - 1, sc->state);
+       }
+}
+
+// Main colorizing function called by Scintilla
+static void
+ColouriseGui4CliDoc(unsigned int startPos, int length, int initStyle,
+                    WordList *keywordlists[], Accessor &styler)
+{
+       styler.StartAt(startPos);
+
+       int quotestart = 0, oldstate, currentline = styler.GetLine(startPos);
+       styler.StartSegment(startPos);
+       bool noforward;
+       char buff[BUFFSIZE+1];  // buffer for command name
+
+       StyleContext sc(startPos, length, initStyle, styler);
+       buff[0] = '\0'; // cbuff = 0;
+
+       if (sc.state != SCE_GC_COMMENTBLOCK) // colorize 1st word..
+               colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);
+
+       while (sc.More())
+       {       noforward = 0;
+
+               switch (sc.ch)
+               {
+                       case '/':
+                               if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_STRING)
+                                       break;
+                               if (sc.chNext == '/')   // line comment
+                               {       sc.SetState (SCE_GC_COMMENTLINE);
+                                       sc.Forward();
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               }
+                               else if (sc.chNext == '*')      // block comment
+                               {       sc.SetState(SCE_GC_COMMENTBLOCK);
+                                       sc.Forward();
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               }
+                               else
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               break;
+
+                       case '*':       // end of comment block, or operator..
+                               if (sc.state == SCE_GC_STRING)
+                                       break;
+                               if (sc.state == SCE_GC_COMMENTBLOCK && sc.chNext == '/')
+                               {       sc.Forward();
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                                       sc.ChangeState (SCE_GC_DEFAULT);
+                               }
+                               else
+                                       styler.ColourTo(sc.currentPos, sc.state);
+                               break;
+
+                       case '\'':      case '\"': // strings..
+                               if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_COMMENTLINE)
+                                       break;
+                               if (sc.state == SCE_GC_STRING)
+                               {       if (sc.ch == quotestart)        // match same quote char..
+                                       {       styler.ColourTo(sc.currentPos, sc.state);
+                                               sc.ChangeState(SCE_GC_DEFAULT);
+                                               quotestart = 0;
+                               }       }
+                               else
+                               {       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       sc.ChangeState(SCE_GC_STRING);
+                                       quotestart = sc.ch;
+                               }
+                               break;
+
+                       case ';':       // end of commandline character
+                               if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE &&
+                                        sc.state != SCE_GC_STRING)
+                               {
+                                       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);
+                                       sc.ChangeState(SCE_GC_DEFAULT);
+                                       sc.Forward();
+                                       colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);
+                                       noforward = 1; // don't move forward - already positioned at next char..
+                               }
+                               break;
+
+                       case '+': case '-': case '=':   case '!':       // operators..
+                       case '<': case '>': case '&': case '|': case '$':
+                               if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE &&
+                                        sc.state != SCE_GC_STRING)
+                               {
+                                       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);
+                                       sc.ChangeState(SCE_GC_DEFAULT);
+                               }
+                               break;
+
+                       case '\\':      // escape - same as operator, but also mark in strings..
+                               if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE)
+                               {
+                                       oldstate = sc.state;
+                                       styler.ColourTo(sc.currentPos - 1, sc.state);
+                                       sc.Forward(); // mark also the next char..
+                                       styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);
+                                       sc.ChangeState(oldstate);
+                               }
+                               break;
+
+                       case '\n': case '\r':
+                               ++currentline;
+                               if (sc.state == SCE_GC_COMMENTLINE)
+                               {       styler.ColourTo(sc.currentPos, sc.state);
+                                       sc.ChangeState (SCE_GC_DEFAULT);
+                               }
+                               else if (sc.state != SCE_GC_COMMENTBLOCK)
+                               {       colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);
+                                       noforward = 1; // don't move forward - already positioned at next char..
+                               }
+                               break;
+
+//                     case ' ': case '\t':
+//                     default :
+               }
+
+               if (!noforward) sc.Forward();
+
+       }
+       styler.ColourTo(sc.currentPos, sc.state);
+}
+
+// Main folding function called by Scintilla - (based on props (.ini) files function)
+static void FoldGui4Cli(unsigned int startPos, int length, int,
+                                                               WordList *[], Accessor &styler)
+{
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       bool headerPoint = false;
+
+       for (unsigned int i = startPos; i < endPos; i++)
+       {
+               char ch = chNext;
+               chNext = styler[i+1];
+
+               int style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+
+               if (style == SCE_GC_EVENT || style == SCE_GC_GLOBAL)
+               {       headerPoint = true; // fold at events and globals
+               }
+
+               if (atEOL)
+               {       int lev = SC_FOLDLEVELBASE+1;
+
+                       if (headerPoint)
+                               lev = SC_FOLDLEVELBASE;
+
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+
+                       if (headerPoint)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+
+                       if (lev != styler.LevelAt(lineCurrent)) // set level, if not already correct
+                       {       styler.SetLevel(lineCurrent, lev);
+                       }
+
+                       lineCurrent++;          // re-initialize our flags
+                       visibleChars = 0;
+                       headerPoint = false;
+               }
+
+               if (!(isspacechar(ch))) // || (style == SCE_GC_COMMENTLINE) || (style != SCE_GC_COMMENTBLOCK)))
+                       visibleChars++;
+       }
+
+       int lev = headerPoint ? SC_FOLDLEVELBASE : SC_FOLDLEVELBASE+1;
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, lev | flagsNext);
+}
+
+// I have no idea what these are for.. probably accessible by some message.
+static const char * const gui4cliWordListDesc[] = {
+       "Globals", "Events", "Attributes", "Control", "Commands",
+       0
+};
+
+// Declare language & pass our function pointers to Scintilla
+LexerModule lmGui4Cli(SCLEX_GUI4CLI, ColouriseGui4CliDoc, "gui4cli", FoldGui4Cli, gui4cliWordListDesc);
+
+#undef debug
+
index e442054b36275965101a3e0d0100ace166727639..d2cd30f60e2ee44335d3806f317b9cc63b51e755 100644 (file)
@@ -145,6 +145,8 @@ static inline bool isStringState(int state) {
        case SCE_HPA_STRING:
        case SCE_HPHP_HSTRING:
        case SCE_HPHP_SIMPLESTRING:
        case SCE_HPA_STRING:
        case SCE_HPHP_HSTRING:
        case SCE_HPHP_SIMPLESTRING:
+       case SCE_HPHP_HSTRING_VARIABLE:
+       case SCE_HPHP_COMPLEX_VARIABLE:
                bResult = true;
                break;
        default :
                bResult = true;
                break;
        default :
@@ -416,7 +418,21 @@ static bool isPHPStringState(int state) {
        return
            (state == SCE_HPHP_HSTRING) ||
            (state == SCE_HPHP_SIMPLESTRING) ||
        return
            (state == SCE_HPHP_HSTRING) ||
            (state == SCE_HPHP_SIMPLESTRING) ||
-           (state == SCE_HPHP_HSTRING_VARIABLE);
+           (state == SCE_HPHP_HSTRING_VARIABLE) ||
+           (state == SCE_HPHP_COMPLEX_VARIABLE);
+}
+
+static int FindPhpStringDelimiter(char *phpStringDelimiter, const int phpStringDelimiterSize, int i, const int lengthDoc, Accessor &styler) {
+       int j;
+       phpStringDelimiter[0] = '\n';
+       for (j = i; j < lengthDoc && styler[j] != '\n' && styler[j] != '\r'; j++) {
+               if (j - i < phpStringDelimiterSize - 2)
+                       phpStringDelimiter[j-i+1] = styler[j];
+               else
+                       i++;
+       }
+       phpStringDelimiter[j-i+1] = '\0';
+       return j;
 }
 
 static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
 }
 
 static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
@@ -432,6 +448,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
        styler.StartAt(startPos, STYLE_MAX);
        char prevWord[200];
        prevWord[0] = '\0';
        styler.StartAt(startPos, STYLE_MAX);
        char prevWord[200];
        prevWord[0] = '\0';
+       char phpStringDelimiter[200]; // PHP is not limited in length, we are
+       phpStringDelimiter[0] = '\0';
        int StateToPrint = initStyle;
        int state = stateForPrintState(StateToPrint);
 
        int StateToPrint = initStyle;
        int state = stateForPrintState(StateToPrint);
 
@@ -443,6 +461,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                }
                state = SCE_H_DEFAULT;
        }
                }
                state = SCE_H_DEFAULT;
        }
+       // String can be heredoc, must find a delimiter first
+       while (startPos > 0 && isPHPStringState(state) && state != SCE_HPHP_SIMPLESTRING) {
+               startPos--;
+               length++;
+               state = styler.StyleAt(startPos);
+       }
        styler.StartAt(startPos, STYLE_MAX);
 
        int lineCurrent = styler.GetLine(startPos);
        styler.StartAt(startPos, STYLE_MAX);
 
        int lineCurrent = styler.GetLine(startPos);
@@ -930,7 +954,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_H_DEFAULT;
                        }
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_H_DEFAULT;
                        }
-                       if (ch != '#' && !(isascii(ch) && isalnum(ch))) {       // Should check that '#' follows '&', but it is unlikely anyway...
+                       if (ch != '#' && !(isascii(ch) && isalnum(ch))  // Should check that '#' follows '&', but it is unlikely anyway...
+                               && ch != '.' && ch != '-' && ch != '_' && ch != ':') { // valid in XML
                                styler.ColourTo(i, SCE_H_TAGUNKNOWN);
                                state = SCE_H_DEFAULT;
                        }
                                styler.ColourTo(i, SCE_H_TAGUNKNOWN);
                                state = SCE_H_DEFAULT;
                        }
@@ -1454,6 +1479,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                        state = SCE_HPHP_COMMENTLINE;
                                } else if (ch == '\"') {
                                        state = SCE_HPHP_HSTRING;
                                        state = SCE_HPHP_COMMENTLINE;
                                } else if (ch == '\"') {
                                        state = SCE_HPHP_HSTRING;
+                                       strcpy(phpStringDelimiter, "\"");
+                               } else if (styler.Match(i, "<<<")) {
+                                       state = SCE_HPHP_HSTRING;
+                                       i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler);
                                } else if (ch == '\'') {
                                        state = SCE_HPHP_SIMPLESTRING;
                                } else if (ch == '$' && IsPhpWordStart(chNext)) {
                                } else if (ch == '\'') {
                                        state = SCE_HPHP_SIMPLESTRING;
                                } else if (ch == '$' && IsPhpWordStart(chNext)) {
@@ -1496,13 +1525,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                        }
                        break;
                case SCE_HPHP_HSTRING:
                        }
                        break;
                case SCE_HPHP_HSTRING:
-                       if (ch == '\\') {
+                       if (ch == '\\' && (phpStringDelimiter[0] == '\"' || chNext == '$' || chNext == '{')) {
                                // skip the next char
                                i++;
                                // skip the next char
                                i++;
+                       } else if (((ch == '{' && chNext == '$') || (ch == '$' && chNext == '{'))
+                               && IsPhpWordStart(chNext2)) {
+                               styler.ColourTo(i - 1, StateToPrint);
+                               state = SCE_HPHP_COMPLEX_VARIABLE;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
                                styler.ColourTo(i - 1, StateToPrint);
                                state = SCE_HPHP_HSTRING_VARIABLE;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
                                styler.ColourTo(i - 1, StateToPrint);
                                state = SCE_HPHP_HSTRING_VARIABLE;
-                       } else if (ch == '\"') {
+                       } else if (styler.Match(i, phpStringDelimiter)) {
+                               if (strlen(phpStringDelimiter) > 1)
+                                       i += strlen(phpStringDelimiter) - 1;
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_HPHP_DEFAULT;
                        }
                                styler.ColourTo(i, StateToPrint);
                                state = SCE_HPHP_DEFAULT;
                        }
@@ -1523,6 +1558,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                state = SCE_HPHP_HSTRING;
                        }
                        break;
                                state = SCE_HPHP_HSTRING;
                        }
                        break;
+               case SCE_HPHP_COMPLEX_VARIABLE:
+                       if (ch == '}') {
+                               styler.ColourTo(i, StateToPrint);
+                               state = SCE_HPHP_HSTRING;
+                       }
+                       break;
                case SCE_HPHP_OPERATOR:
                case SCE_HPHP_DEFAULT:
                        styler.ColourTo(i - 1, StateToPrint);
                case SCE_HPHP_OPERATOR:
                case SCE_HPHP_DEFAULT:
                        styler.ColourTo(i - 1, StateToPrint);
@@ -1540,6 +1581,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                                state = SCE_HPHP_COMMENTLINE;
                        } else if (ch == '\"') {
                                state = SCE_HPHP_HSTRING;
                                state = SCE_HPHP_COMMENTLINE;
                        } else if (ch == '\"') {
                                state = SCE_HPHP_HSTRING;
+                               strcpy(phpStringDelimiter, "\"");
+                       } else if (styler.Match(i, "<<<")) {
+                               state = SCE_HPHP_HSTRING;
+                               i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler);
                        } else if (ch == '\'') {
                                state = SCE_HPHP_SIMPLESTRING;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
                        } else if (ch == '\'') {
                                state = SCE_HPHP_SIMPLESTRING;
                        } else if (ch == '$' && IsPhpWordStart(chNext)) {
@@ -1675,7 +1720,8 @@ static void ColouriseHTMLPiece(StyleContext &sc, WordList *keywordlists[]) {
        } else if (sc.state == SCE_H_ENTITY) {
                if (sc.ch == ';') {
                        sc.ForwardSetState(SCE_H_DEFAULT);
        } else if (sc.state == SCE_H_ENTITY) {
                if (sc.ch == ';') {
                        sc.ForwardSetState(SCE_H_DEFAULT);
-               } else if (sc.ch != '#' && (sc.ch < 0x80) && !isalnum(sc.ch)) { // Should check that '#' follows '&', but it is unlikely anyway...
+               } else if (sc.ch != '#' && (sc.ch < 0x80) && !isalnum(sc.ch)    // Should check that '#' follows '&', but it is unlikely anyway...
+                       && sc.ch != '.' && sc.ch != '-' && sc.ch != '_' && sc.ch != ':') { // valid in XML
                        sc.ChangeState(SCE_H_TAGUNKNOWN);
                        sc.SetState(SCE_H_DEFAULT);
                }
                        sc.ChangeState(SCE_H_TAGUNKNOWN);
                        sc.SetState(SCE_H_DEFAULT);
                }
diff --git a/src/stc/scintilla/src/LexKix.cxx b/src/stc/scintilla/src/LexKix.cxx
new file mode 100644 (file)
index 0000000..e439d4d
--- /dev/null
@@ -0,0 +1,122 @@
+// Scintilla source code edit control
+/** @file LexKix.cxx
+ ** Lexer for KIX-Scripts.
+ **/
+// Copyright 2004 by Manfred Becker <manfred@becker-trdf.de>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+// Extended to accept accented characters
+static inline bool IsAWordChar(int ch) {
+       return ch >= 0x80 || isalnum(ch) || ch == '_';
+}
+
+static inline bool IsOperator(const int ch) {
+       return (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '&' || ch == '|' || ch == '<' || ch == '>' || ch == '=');
+}
+
+static void ColouriseKixDoc(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];
+
+       styler.StartAt(startPos);
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.state == SCE_KIX_COMMENT) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_STRING1) {
+                       // This is a doubles quotes string
+                       if (sc.ch == '\"') {
+                               sc.ForwardSetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_STRING2) {
+                       // This is a single quote string
+                       if (sc.ch == '\'') {
+                               sc.ForwardSetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_NUMBER) {
+                       if (!IsADigit(sc.ch)) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_VAR) {
+                       if (!IsAWordChar(sc.ch)) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_MACRO) {
+                       if (!IsAWordChar(sc.ch) && !IsADigit(sc.ch)) {
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+
+                               if (!keywords3.InList(&s[1])) {
+                                       sc.ChangeState(SCE_KIX_DEFAULT);
+                               }
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_OPERATOR) {
+                       if (!IsOperator(sc.ch)) {
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               } else if (sc.state == SCE_KIX_IDENTIFIER) {
+                       if (!IsAWordChar(sc.ch)) {
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+
+                               if (keywords.InList(s)) {
+                                       sc.ChangeState(SCE_KIX_KEYWORD);
+                               } else if (keywords2.InList(s)) {
+                                       sc.ChangeState(SCE_KIX_FUNCTIONS);
+                               }
+                               sc.SetState(SCE_KIX_DEFAULT);
+                       }
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_KIX_DEFAULT) {
+                       if (sc.ch == ';') {
+                               sc.SetState(SCE_KIX_COMMENT);
+                       } else if (sc.ch == '\"') {
+                               sc.SetState(SCE_KIX_STRING1);
+                       } else if (sc.ch == '\'') {
+                               sc.SetState(SCE_KIX_STRING2);
+                       } else if (sc.ch == '$') {
+                               sc.SetState(SCE_KIX_VAR);
+                       } else if (sc.ch == '@') {
+                               sc.SetState(SCE_KIX_MACRO);
+                       } else if (IsADigit(sc.ch) || ((sc.ch == '.' || sc.ch == '&') && IsADigit(sc.chNext))) {
+                               sc.SetState(SCE_KIX_NUMBER);
+                       } else if (IsOperator(sc.ch)) {
+                               sc.SetState(SCE_KIX_OPERATOR);
+                       } else if (IsAWordChar(sc.ch)) {
+                               sc.SetState(SCE_KIX_IDENTIFIER);
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+
+LexerModule lmKix(SCLEX_KIX, ColouriseKixDoc, "kix");
+
diff --git a/src/stc/scintilla/src/LexMSSQL.cxx b/src/stc/scintilla/src/LexMSSQL.cxx
new file mode 100644 (file)
index 0000000..6019f24
--- /dev/null
@@ -0,0 +1,329 @@
+// Scintilla source code edit control
+/** @file LexMSSQL.cxx
+ ** Lexer for MSSQL.
+ **/
+// Copyright 1998-2002 by Filip Yaghob <fy@eg.cz>
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#define KW_MSSQL_STATEMENTS         0
+#define KW_MSSQL_DATA_TYPES         1
+#define KW_MSSQL_SYSTEM_TABLES      2
+#define KW_MSSQL_GLOBAL_VARIABLES   3
+#define KW_MSSQL_FUNCTIONS          4
+#define KW_MSSQL_STORED_PROCEDURES  5
+#define KW_MSSQL_OPERATORS          6
+
+//~ val SCE_MSSQL_DEFAULT=0
+//~ val SCE_MSSQL_COMMENT=1
+//~ val SCE_MSSQL_LINE_COMMENT=2
+//~ val SCE_MSSQL_NUMBER=3
+//~ val SCE_MSSQL_STRING=4
+//~ val SCE_MSSQL_OPERATOR=5
+//~ val SCE_MSSQL_IDENTIFIER=6
+//~ val SCE_MSSQL_VARIABLE=7
+//~ val SCE_MSSQL_COLUMN_NAME=8
+//~ val SCE_MSSQL_STATEMENT=9
+//~ val SCE_MSSQL_DATATYPE=10
+//~ val SCE_MSSQL_SYSTABLE=11
+//~ val SCE_MSSQL_GLOBAL_VARIABLE=12
+//~ val SCE_MSSQL_FUNCTION=13
+//~ val SCE_MSSQL_STORED_PROCEDURE=14
+//~ val SCE_MSSQL_DEFAULT_PREF_DATATYPE 15
+//~ val SCE_MSSQL_COLUMN_NAME_2 16
+
+static bool isMSSQLOperator(char ch) {
+       if (isascii(ch) && isalnum(ch))
+               return false;
+       // '.' left out as it is used to make up numbers
+       if (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||
+        ch == '-' || ch == '+' || ch == '=' || ch == '|' ||
+        ch == '<' || ch == '>' || ch == '/' ||
+        ch == '!' || ch == '~' || ch == '(' || ch == ')' ||
+               ch == ',')
+               return true;
+       return false;
+}
+
+static char classifyWordSQL(unsigned int start,
+                            unsigned int end,
+                            WordList *keywordlists[],
+                            Accessor &styler,
+                            unsigned int actualState,
+                                                       unsigned int prevState) {
+       char s[256];
+       bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
+
+       WordList &kwStatements          = *keywordlists[KW_MSSQL_STATEMENTS];
+    WordList &kwDataTypes           = *keywordlists[KW_MSSQL_DATA_TYPES];
+    WordList &kwSystemTables        = *keywordlists[KW_MSSQL_SYSTEM_TABLES];
+    WordList &kwGlobalVariables     = *keywordlists[KW_MSSQL_GLOBAL_VARIABLES];
+    WordList &kwFunctions           = *keywordlists[KW_MSSQL_FUNCTIONS];
+    WordList &kwStoredProcedures    = *keywordlists[KW_MSSQL_STORED_PROCEDURES];
+    WordList &kwOperators           = *keywordlists[KW_MSSQL_OPERATORS];
+
+       for (unsigned int i = 0; i < end - start + 1 && i < 128; i++) {
+               s[i] = static_cast<char>(tolower(styler[start + i]));
+               s[i + 1] = '\0';
+       }
+       char chAttr = SCE_MSSQL_IDENTIFIER;
+
+       if (actualState == SCE_MSSQL_GLOBAL_VARIABLE) {
+
+        if (kwGlobalVariables.InList(&s[2]))
+            chAttr = SCE_MSSQL_GLOBAL_VARIABLE;
+
+       } else if (wordIsNumber) {
+               chAttr = SCE_MSSQL_NUMBER;
+
+       } else if (prevState == SCE_MSSQL_DEFAULT_PREF_DATATYPE) {
+               // Look first in datatypes
+        if (kwDataTypes.InList(s))
+            chAttr = SCE_MSSQL_DATATYPE;
+               else if (kwOperators.InList(s))
+                       chAttr = SCE_MSSQL_OPERATOR;
+               else if (kwStatements.InList(s))
+                       chAttr = SCE_MSSQL_STATEMENT;
+               else if (kwSystemTables.InList(s))
+                       chAttr = SCE_MSSQL_SYSTABLE;
+               else if (kwFunctions.InList(s))
+            chAttr = SCE_MSSQL_FUNCTION;
+               else if (kwStoredProcedures.InList(s))
+                       chAttr = SCE_MSSQL_STORED_PROCEDURE;
+
+       } else {
+               if (kwOperators.InList(s))
+                       chAttr = SCE_MSSQL_OPERATOR;
+               else if (kwStatements.InList(s))
+                       chAttr = SCE_MSSQL_STATEMENT;
+               else if (kwSystemTables.InList(s))
+                       chAttr = SCE_MSSQL_SYSTABLE;
+               else if (kwFunctions.InList(s))
+                       chAttr = SCE_MSSQL_FUNCTION;
+               else if (kwStoredProcedures.InList(s))
+                       chAttr = SCE_MSSQL_STORED_PROCEDURE;
+               else if (kwDataTypes.InList(s))
+                       chAttr = SCE_MSSQL_DATATYPE;
+       }
+
+       styler.ColourTo(end, chAttr);
+
+       return chAttr;
+}
+
+static void ColouriseMSSQLDoc(unsigned int startPos, int length,
+                              int initStyle, WordList *keywordlists[], Accessor &styler) {
+
+
+       styler.StartAt(startPos);
+
+       bool fold = styler.GetPropertyInt("fold") != 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int spaceFlags = 0;
+/*
+       WordList &kwStatements          = *keywordlists[KW_MSSQL_STATEMENTS];
+    WordList &kwDataTypes           = *keywordlists[KW_MSSQL_DATA_TYPES];
+    WordList &kwSystemTables        = *keywordlists[KW_MSSQL_SYSTEM_TABLES];
+    WordList &kwGlobalVariables     = *keywordlists[KW_MSSQL_GLOBAL_VARIABLES];
+    WordList &kwFunctions           = *keywordlists[KW_MSSQL_FUNCTIONS];
+
+       char s[100];
+       int iixx = 0;
+       s[0] = 's';     s[1] = 'e'; s[2] = 'l'; s[3] = 'e'; s[4] = 'c'; s[5] = 't'; s[6] = 0;
+       if (kwStatements.InList(s))
+               iixx = 1;
+       s[0] = 's';     s[1] = 'e'; s[2] = 'r'; s[3] = 'v'; s[4] = 'e'; s[5] = 'r'; s[6] = 'n'; s[7] = 'a'; s[8] = 'm'; s[9] = 'e'; s[10] = 0;
+       if (kwGlobalVariables.InList(s))
+               iixx += 2;
+*/
+       int state = initStyle;
+       int prevState = initStyle;
+       char chPrev = ' ';
+       char chNext = styler[startPos];
+       styler.StartSegment(startPos);
+       unsigned int lengthDoc = startPos + length;
+       for (unsigned int i = startPos; i < lengthDoc; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+                       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);
+                       int lev = indentCurrent;
+                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
+                               // Only non whitespace lines can be headers
+                               int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);
+                               if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) {
+                                       lev |= SC_FOLDLEVELHEADERFLAG;
+                               }
+                       }
+                       if (fold) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+               }
+
+               if (styler.IsLeadByte(ch)) {
+                       chNext = styler.SafeGetCharAt(i + 2);
+                       chPrev = ' ';
+                       i += 1;
+                       continue;
+               }
+
+               // When the last char isn't part of the state (have to deal with it too)...
+               if ( (state == SCE_MSSQL_IDENTIFIER) ||
+                    (state == SCE_MSSQL_STORED_PROCEDURE) ||
+                    (state == SCE_MSSQL_DATATYPE) ||
+                    //~ (state == SCE_MSSQL_COLUMN_NAME) ||
+                    (state == SCE_MSSQL_FUNCTION) ||
+                    //~ (state == SCE_MSSQL_GLOBAL_VARIABLE) ||
+                    (state == SCE_MSSQL_VARIABLE)) {
+                       if (!iswordchar(ch)) {
+                               int stateTmp;
+
+                if ((state == SCE_MSSQL_VARIABLE) || (state == SCE_MSSQL_COLUMN_NAME)) {
+                    styler.ColourTo(i - 1, state);
+                                       stateTmp = state;
+                } else
+                    stateTmp = classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState);
+
+                               prevState = state;
+
+                               if (stateTmp == SCE_MSSQL_IDENTIFIER || stateTmp == SCE_MSSQL_VARIABLE)
+                                       state = SCE_MSSQL_DEFAULT_PREF_DATATYPE;
+                               else
+                                       state = SCE_MSSQL_DEFAULT;
+                       }
+               } else if (state == SCE_MSSQL_LINE_COMMENT) {
+                       if (ch == '\r' || ch == '\n') {
+                               styler.ColourTo(i - 1, state);
+                               prevState = state;
+                               state = SCE_MSSQL_DEFAULT;
+                       }
+               } else if (state == SCE_MSSQL_GLOBAL_VARIABLE) {
+                       if ((ch != '@') && !iswordchar(ch)) {
+                               classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState);
+                               prevState = state;
+                               state = SCE_MSSQL_DEFAULT;
+                       }
+               }
+
+               // If is the default or one of the above succeeded
+               if (state == SCE_MSSQL_DEFAULT || state == SCE_MSSQL_DEFAULT_PREF_DATATYPE) {
+                       if (iswordstart(ch)) {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_IDENTIFIER;
+                       } else if (ch == '/' && chNext == '*') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_COMMENT;
+                       } else if (ch == '-' && chNext == '-') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_LINE_COMMENT;
+                       } else if (ch == '\'') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_STRING;
+                       } else if (ch == '"') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_COLUMN_NAME;
+                       } else if (ch == '[') {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                               state = SCE_MSSQL_COLUMN_NAME_2;
+                       } else if (isMSSQLOperator(ch)) {
+                               styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               styler.ColourTo(i, SCE_MSSQL_OPERATOR);
+                //~ style = SCE_MSSQL_DEFAULT;
+                               prevState = state;
+                               state = SCE_MSSQL_DEFAULT;
+                       } else if (ch == '@') {
+                styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);
+                               prevState = state;
+                if (chNext == '@') {
+                    state = SCE_MSSQL_GLOBAL_VARIABLE;
+//                    i += 2;
+                } else
+                    state = SCE_MSSQL_VARIABLE;
+            }
+
+
+               // When the last char is part of the state...
+               } else if (state == SCE_MSSQL_COMMENT) {
+                               if (ch == '/' && chPrev == '*') {
+                                       if (((i > (styler.GetStartSegment() + 2)) || ((initStyle == SCE_MSSQL_COMMENT) &&
+                                           (styler.GetStartSegment() == startPos)))) {
+                                               styler.ColourTo(i, state);
+                                               //~ state = SCE_MSSQL_COMMENT;
+                                       prevState = state;
+                        state = SCE_MSSQL_DEFAULT;
+                                       }
+                               }
+                       } else if (state == SCE_MSSQL_STRING) {
+                               if (ch == '\'') {
+                                       if ( chNext == '\'' ) {
+                                               i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                                       } else {
+                                               styler.ColourTo(i, state);
+                                       prevState = state;
+                                               state = SCE_MSSQL_DEFAULT;
+                                       //i++;
+                                       }
+                               //ch = chNext;
+                               //chNext = styler.SafeGetCharAt(i + 1);
+                               }
+                       } else if (state == SCE_MSSQL_COLUMN_NAME) {
+                               if (ch == '"') {
+                                       if (chNext == '"') {
+                                               i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               } else {
+                    styler.ColourTo(i, state);
+                                       prevState = state;
+                                       state = SCE_MSSQL_DEFAULT_PREF_DATATYPE;
+                                       //i++;
+                }
+                }
+               } else if (state == SCE_MSSQL_COLUMN_NAME_2) {
+                       if (ch == ']') {
+                styler.ColourTo(i, state);
+                               prevState = state;
+                state = SCE_MSSQL_DEFAULT_PREF_DATATYPE;
+                //i++;
+                       }
+               }
+
+               chPrev = ch;
+       }
+       styler.ColourTo(lengthDoc - 1, state);
+}
+
+static const char * const sqlWordListDesc[] = {
+       "Statements",
+    "Data Types",
+    "System tables",
+    "Global variables",
+    "Functions",
+    "System Stored Procedures",
+    "Operators",
+       0,
+};
+
+LexerModule lmMSSQL(SCLEX_MSSQL, ColouriseMSSQLDoc, "mssql", 0, sqlWordListDesc);
index c09a8ae865d5b316313e4a594021bf1013804b69..0f969bbfb8c4d3c9b711dd8cc0bd66cc4de36f9b 100644 (file)
@@ -2,9 +2,9 @@
 /** @file LexNsis.cxx
  ** Lexer for NSIS
  **/
 /** @file LexNsis.cxx
  ** Lexer for NSIS
  **/
-// Copyright 2003 by Angelo Mandato <angelo@spaceblue.com>
+// Copyright 2003, 2004 by Angelo Mandato <angelo [at] spaceblue [dot] com>
+// Last Updated: 02/22/2004
 // The License.txt file describes the conditions under which this software may be distributed.
 // The License.txt file describes the conditions under which this software may be distributed.
-
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
@@ -20,8 +20,8 @@
 #include "SciLexer.h"
 
 /*
 #include "SciLexer.h"
 
 /*
-// Put in SciLexer.h
-#define SCLEX_NSIS 34
+// located in SciLexer.h
+#define SCLEX_NSIS 43
 
 #define SCE_NSIS_DEFAULT 0
 #define SCE_NSIS_COMMENT 1
 
 #define SCE_NSIS_DEFAULT 0
 #define SCE_NSIS_COMMENT 1
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
 #define SCE_NSIS_IFDEFINEDEF 11
 #define SCE_NSIS_MACRODEF 12
 #define SCE_NSIS_STRINGVAR 13
+#define SCE_NSIS_NUMBER 14
 */
 
 */
 
-static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler)
+static bool isNsisNumber(char ch)
+{
+  return (ch >= '0' && ch <= '9');
+}
+
+static bool isNsisChar(char ch)
+{
+  return (ch == '.' ) || (ch == '_' ) || isNsisNumber(ch) || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
+}
+
+static bool isNsisLetter(char ch)
+{
+  return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
+}
+
+static int NsisCmp( char *s1, char *s2, bool bIgnoreCase )
+{
+  if( bIgnoreCase )
+     return CompareCaseInsensitive( s1, s2);
+
+  return strcmp( s1, s2 );
+}
+
+static int calculateFoldNsis(unsigned int start, unsigned int end, int foldlevel, Accessor &styler )
+{
+  // If the word is too long, it is not what we are looking for
+  if( end - start > 13 )
+    return foldlevel;
+
+  // Check the style at this point, if it is not valid, then return zero
+  if( styler.StyleAt(end) != SCE_NSIS_FUNCTION && styler.StyleAt(end) != SCE_NSIS_SECTIONDEF &&
+      styler.StyleAt(end) != SCE_NSIS_SUBSECTIONDEF && styler.StyleAt(end) != SCE_NSIS_IFDEFINEDEF &&
+      styler.StyleAt(end) != SCE_NSIS_MACRODEF )
+        return foldlevel;
+
+  int newFoldlevel = foldlevel;
+  bool bIgnoreCase = false;
+  if( styler.GetPropertyInt("nsis.ignorecase") == 1 )
+    bIgnoreCase = true;
+
+  char s[15]; // The key word we are looking for has atmost 13 characters
+  for (unsigned int i = 0; i < end - start + 1 && i < 14; i++)
+       {
+               s[i] = static_cast<char>( styler[ start + i ] );
+               s[i + 1] = '\0';
+       }
+
+  if( s[0] == '!' )
+  {
+    if( NsisCmp(s, "!ifndef", bIgnoreCase) == 0 || NsisCmp(s, "!ifdef", bIgnoreCase ) == 0 || NsisCmp(s, "!macro", bIgnoreCase ) == 0 )
+      newFoldlevel++;
+    else if( NsisCmp(s, "!endif", bIgnoreCase) == 0 || NsisCmp(s, "!macroend", bIgnoreCase ) == 0 )
+      newFoldlevel--;
+  }
+  else
+  {
+    if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SubSection", bIgnoreCase ) == 0 )
+      newFoldlevel++;
+    else if( NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase ) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase ) == 0 )
+      newFoldlevel--;
+  }
+
+  return newFoldlevel;
+}
+
+static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler )
 {
 {
+  bool bIgnoreCase = false;
+  if( styler.GetPropertyInt("nsis.ignorecase") == 1 )
+    bIgnoreCase = true;
+
+  bool bUserVars = false;
+  if( styler.GetPropertyInt("nsis.uservars") == 1 )
+    bUserVars = true;
+
        char s[100];
 
        WordList &Functions = *keywordLists[0];
        char s[100];
 
        WordList &Functions = *keywordLists[0];
@@ -48,27 +122,29 @@ static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keyw
        WordList &Lables = *keywordLists[2];
        WordList &UserDefined = *keywordLists[3];
 
        WordList &Lables = *keywordLists[2];
        WordList &UserDefined = *keywordLists[3];
 
-       for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
+       for (unsigned int i = 0; i < end - start + 1 && i < 99; i++)
        {
        {
-               s[i] = static_cast<char>( styler[ start + i ] );
+    if( bIgnoreCase )
+      s[i] = static_cast<char>( tolower(styler[ start + i ] ) );
+    else
+                 s[i] = static_cast<char>( styler[ start + i ] );
                s[i + 1] = '\0';
        }
 
        // Check for special words...
                s[i + 1] = '\0';
        }
 
        // Check for special words...
-
-       if( strcmp(s, "!macro") == 0 || strcmp(s, "!macroend") == 0 ) // Covers !micro and !microend
+       if( NsisCmp(s, "!macro", bIgnoreCase ) == 0 || NsisCmp(s, "!macroend", bIgnoreCase) == 0 ) // Covers !micro and !microend
                return SCE_NSIS_MACRODEF;
 
                return SCE_NSIS_MACRODEF;
 
-       if( strcmp(s, "!ifdef") == 0 ||  strcmp(s, "!ifndef") == 0 ||  strcmp(s, "!endif") == 0 )
+       if( NsisCmp(s, "!ifdef", bIgnoreCase ) == 0 ||  NsisCmp(s, "!ifndef", bIgnoreCase) == 0 ||  NsisCmp(s, "!endif", bIgnoreCase) == 0 )
                return SCE_NSIS_IFDEFINEDEF;
 
                return SCE_NSIS_IFDEFINEDEF;
 
-       if( strcmp(s, "Section") == 0 || strcmp(s, "SectionEnd") == 0 ) // Covers Section and SectionEnd
+       if( NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase) == 0 ) // Covers Section and SectionEnd
                return SCE_NSIS_SECTIONDEF;
 
                return SCE_NSIS_SECTIONDEF;
 
-       if( strcmp(s, "SubSection") == 0 || strcmp(s, "SubSectionEnd") == 0 ) // Covers SubSection and SubSectionEnd
+       if( NsisCmp(s, "SubSection", bIgnoreCase) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd
                return SCE_NSIS_SUBSECTIONDEF;
 
                return SCE_NSIS_SUBSECTIONDEF;
 
-       if( strcmp(s, "Function") == 0 || strcmp(s, "FunctionEnd") == 0 ) // Covers SubSection and SubSectionEnd
+       if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd
                return SCE_NSIS_FUNCTION;
 
        if ( Functions.InList(s) )
                return SCE_NSIS_FUNCTION;
 
        if ( Functions.InList(s) )
@@ -83,12 +159,49 @@ static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keyw
        if( UserDefined.InList(s) )
                return SCE_NSIS_USERDEFINED;
 
        if( UserDefined.InList(s) )
                return SCE_NSIS_USERDEFINED;
 
-       if( strlen(s) > 2 )
+       if( strlen(s) > 3 )
        {
                if( s[1] == '{' && s[strlen(s)-1] == '}' )
                        return SCE_NSIS_VARIABLE;
        }
 
        {
                if( s[1] == '{' && s[strlen(s)-1] == '}' )
                        return SCE_NSIS_VARIABLE;
        }
 
+  // See if the variable is a user defined variable
+  if( s[0] == '$' && bUserVars )
+  {
+    bool bHasSimpleNsisChars = true;
+    for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)
+         {
+      if( !isNsisChar( s[j] ) )
+      {
+        bHasSimpleNsisChars = false;
+        break;
+      }
+         }
+
+    if( bHasSimpleNsisChars )
+      return SCE_NSIS_VARIABLE;
+  }
+
+  // To check for numbers
+  if( isNsisNumber( s[0] ) )
+  {
+    bool bHasSimpleNsisNumber = true;
+    for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)
+         {
+      if( s[j] == '\0' || s[j] == '\r' || s[j] == '\n' )
+        break;
+
+      if( !isNsisNumber( s[j] ) )
+      {
+        bHasSimpleNsisNumber = false;
+        break;
+      }
+         }
+
+    if( bHasSimpleNsisNumber )
+      return SCE_NSIS_NUMBER;
+  }
+
        return SCE_NSIS_DEFAULT;
 }
 
        return SCE_NSIS_DEFAULT;
 }
 
@@ -102,24 +215,18 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
        styler.StartSegment( startPos );
 
        char cCurrChar;
        styler.StartSegment( startPos );
 
        char cCurrChar;
-       bool bVarInString = true;
+       bool bVarInString = false;
+  bool bClassicVarInString = false;
 
        unsigned int i;
        for( i = startPos; i < nLengthDoc; i++ )
        {
                cCurrChar = styler.SafeGetCharAt( i );
 
        unsigned int i;
        for( i = startPos; i < nLengthDoc; i++ )
        {
                cCurrChar = styler.SafeGetCharAt( i );
-               char cNextChar = styler.SafeGetCharAt( i+1, EOF );
-
-
+               char cNextChar = styler.SafeGetCharAt(i+1);
 
                switch(state)
                {
                        case SCE_NSIS_DEFAULT:
 
                switch(state)
                {
                        case SCE_NSIS_DEFAULT:
-        if( cNextChar == EOF )
-        {
-          styler.ColourTo(i,SCE_NSIS_DEFAULT);
-                           break;
-        }
                                if( cCurrChar == ';' || cCurrChar == '#' ) // we have a comment line
                                {
                                        styler.ColourTo(i-1, state );
                                if( cCurrChar == ';' || cCurrChar == '#' ) // we have a comment line
                                {
                                        styler.ColourTo(i-1, state );
@@ -131,6 +238,7 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGDQ;
                                        bVarInString = false;
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGDQ;
                                        bVarInString = false;
+          bClassicVarInString = false;
                                        break;
                                }
                                if( cCurrChar == '\'' )
                                        break;
                                }
                                if( cCurrChar == '\'' )
@@ -138,6 +246,7 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGRQ;
                                        bVarInString = false;
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGRQ;
                                        bVarInString = false;
+          bClassicVarInString = false;
                                        break;
                                }
                                if( cCurrChar == '`' )
                                        break;
                                }
                                if( cCurrChar == '`' )
@@ -145,19 +254,25 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGLQ;
                                        bVarInString = false;
                                        styler.ColourTo(i-1, state );
                                        state = SCE_NSIS_STRINGLQ;
                                        bVarInString = false;
+          bClassicVarInString = false;
                                        break;
                                }
 
                                // NSIS KeyWord,Function, Variable, UserDefined:
                                        break;
                                }
 
                                // NSIS KeyWord,Function, Variable, UserDefined:
-                               if( cCurrChar == '$' || iswordchar(cCurrChar) || cCurrChar == '!' )
+                               if( cCurrChar == '$' || isNsisChar(cCurrChar) || cCurrChar == '!' )
                                {
                                        styler.ColourTo(i-1,state);
                                  state = SCE_NSIS_FUNCTION;
                                {
                                        styler.ColourTo(i-1,state);
                                  state = SCE_NSIS_FUNCTION;
+
+          // If it is a number, we must check and set style here first...
+          if( isNsisNumber(cCurrChar) && (cNextChar == '\t' || cNextChar == ' ' || cNextChar == '\r' || cNextChar == '\n' ) )
+              styler.ColourTo( i, SCE_NSIS_NUMBER);
+
                                        break;
                                }
                                break;
                        case SCE_NSIS_COMMENT:
                                        break;
                                }
                                break;
                        case SCE_NSIS_COMMENT:
-                               if( cNextChar == '\n' || cNextChar == '\r' || cNextChar == EOF )
+                               if( cNextChar == '\n' || cNextChar == '\r' )
         {
                                  styler.ColourTo(i,state);
           state = SCE_NSIS_DEFAULT;
         {
                                  styler.ColourTo(i,state);
           state = SCE_NSIS_DEFAULT;
@@ -187,35 +302,45 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                        case SCE_NSIS_FUNCTION:
 
                                // NSIS KeyWord:
                        case SCE_NSIS_FUNCTION:
 
                                // NSIS KeyWord:
-                               if( (iswordchar(cCurrChar) && !iswordchar( cNextChar) && cNextChar != '}') || cCurrChar == '}' )
+        if( cCurrChar == '$' )
+          state = SCE_NSIS_DEFAULT;
+        else if( cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) )
+          state = SCE_NSIS_DEFAULT;
+                               else if( (isNsisChar(cCurrChar) && !isNsisChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' )
                                {
                                        state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
                                        styler.ColourTo( i, state);
                                {
                                        state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
                                        styler.ColourTo( i, state);
-                                       state = SCE_NSIS_DEFAULT; // Everything after goes back to the default state
+                                       state = SCE_NSIS_DEFAULT;
                                }
                                }
-                               else if( !iswordchar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' )
+                               else if( !isNsisChar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' )
                                {
                                {
+          if( classifyWordNsis( styler.GetStartSegment(), i-1, keywordLists, styler) == SCE_NSIS_NUMBER )
+             styler.ColourTo( i-1, SCE_NSIS_NUMBER );
+
                                        state = SCE_NSIS_DEFAULT;
 
                                        state = SCE_NSIS_DEFAULT;
 
-                                       if( cCurrChar == '"' ) // Next
+                                       if( cCurrChar == '"' )
                                        {
                                                state = SCE_NSIS_STRINGDQ;
                                                bVarInString = false;
                                        {
                                                state = SCE_NSIS_STRINGDQ;
                                                bVarInString = false;
+            bClassicVarInString = false;
                                        }
                                        }
-                                       if( cCurrChar == '`' )
+                                       else if( cCurrChar == '`' )
                                        {
                                                state = SCE_NSIS_STRINGLQ;
                                                bVarInString = false;
                                        {
                                                state = SCE_NSIS_STRINGLQ;
                                                bVarInString = false;
+            bClassicVarInString = false;
                                        }
                                        }
-                                       if( cCurrChar == '\'' )
+                                       else if( cCurrChar == '\'' )
                                        {
                                                state = SCE_NSIS_STRINGRQ;
                                                bVarInString = false;
                                        {
                                                state = SCE_NSIS_STRINGRQ;
                                                bVarInString = false;
+            bClassicVarInString = false;
                                        }
                                        }
-                                       if( cCurrChar == '#' || cCurrChar == ';' )
+                                       else if( cCurrChar == '#' || cCurrChar == ';' )
+          {
                                                state = SCE_NSIS_COMMENT;
                                                state = SCE_NSIS_COMMENT;
-
-                                       styler.ColourTo( i, state);
+          }
                                }
                                break;
                }
                                }
                                break;
                }
@@ -226,25 +351,70 @@ static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *k
                }
                else if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ )
                {
                }
                else if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ )
                {
-                       // Check for var in String..
-                       if( bVarInString && (iswordchar(cCurrChar) || cCurrChar == '}') ) // || cCurrChar == '{' ) )
-                       {
-                               int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
+      bool bIngoreNextDollarSign = false;
+      bool bUserVars = false;
+      if( styler.GetPropertyInt("nsis.uservars") == 1 )
+        bUserVars = true;
+
+      if( bVarInString && cCurrChar == '$' )
+      {
+        bVarInString = false;
+        bIngoreNextDollarSign = true;
+      }
+      else if( bVarInString && cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) )
+      {
+        bVarInString = false;
+        bIngoreNextDollarSign = true;
+      }
+
+      // Covers "$INSTDIR and user vars like $MYVAR"
+      else if( bVarInString && !isNsisChar(cNextChar) )
+      {
+        int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
                                if( nWordState == SCE_NSIS_VARIABLE )
                                if( nWordState == SCE_NSIS_VARIABLE )
-                               {
                                        styler.ColourTo( i, SCE_NSIS_STRINGVAR);
                                        styler.ColourTo( i, SCE_NSIS_STRINGVAR);
-                                       bVarInString = false;
-                               }
-                       }
-                       if( cCurrChar == '$' )
+        else if( bUserVars )
+          styler.ColourTo( i, SCE_NSIS_STRINGVAR);
+        bVarInString = false;
+      }
+      // Covers "${TEST}..."
+      else if( bClassicVarInString && cNextChar == '}' )
+      {
+        styler.ColourTo( i+1, SCE_NSIS_STRINGVAR);
+                               bClassicVarInString = false;
+      }
+
+      // Start of var in string
+                       if( !bIngoreNextDollarSign && cCurrChar == '$' && cNextChar == '{' )
                        {
                                styler.ColourTo( i-1, state);
                        {
                                styler.ColourTo( i-1, state);
-                               bVarInString = true;
+                               bClassicVarInString = true;
+        bVarInString = false;
                        }
                        }
+      else if( !bIngoreNextDollarSign && cCurrChar == '$' )
+      {
+        styler.ColourTo( i-1, state);
+        bVarInString = true;
+        bClassicVarInString = false;
+      }
                }
        }
                }
        }
-}
 
 
+  // Colourise remaining document
+  switch( state )
+  {
+    case SCE_NSIS_COMMENT:
+    case SCE_NSIS_STRINGDQ:
+    case SCE_NSIS_STRINGLQ:
+    case SCE_NSIS_STRINGRQ:
+    case SCE_NSIS_VARIABLE:
+    case SCE_NSIS_STRINGVAR:
+      styler.ColourTo(nLengthDoc-1,state); break;
+
+    default:
+      styler.ColourTo(nLengthDoc-1,SCE_NSIS_DEFAULT); break;
+  }
+}
 
 static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
 
 static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
@@ -252,87 +422,57 @@ static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Ac
        if( styler.GetPropertyInt("fold") == 0 )
                return;
 
        if( styler.GetPropertyInt("fold") == 0 )
                return;
 
-       unsigned int endPos = startPos + length;
-       int lineCurrent = styler.GetLine(startPos);
-       int levelCurrent = SC_FOLDLEVELBASE;
+  int lineCurrent = styler.GetLine(startPos);
+  unsigned int safeStartPos = styler.LineStart( lineCurrent );
+
+  bool bArg1 = true;
+  int nWordStart = -1;
+
+  int levelCurrent = SC_FOLDLEVELBASE;
        if (lineCurrent > 0)
                levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
        int levelNext = levelCurrent;
        if (lineCurrent > 0)
                levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
        int levelNext = levelCurrent;
-       char chNext = styler[startPos];
-       int styleNext = styler.StyleAt(startPos);
-       int style;
 
 
-       for (unsigned int i = startPos; i < endPos; i++)
+  for (unsigned int i = safeStartPos; i < startPos + length; i++)
        {
        {
-               char ch = chNext;
-               chNext = styler.SafeGetCharAt(i + 1);
-               style = styleNext;
-               styleNext = styler.StyleAt(i + 1);
-               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
-               // Functions Start: Function, Section, SubSection
-               // Functions End: FunctionEnd, SectionEnd, SubSectionEnd
-               // Label Start: !ifdef, !ifndef
-               // Label End: !endif
-
-               if( style == SCE_NSIS_FUNCTION )
-               {
-                       if( styler.Match(i, "FunctionEnd") )
-                               levelNext--;
-                       else if( styler.Match(i, "Function") )
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_SECTIONDEF )
-               {
-                       if( styler.Match(i, "SectionEnd") )
-                               levelNext--;
-                       else if( styler.Match(i, "Section") )
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_SUBSECTIONDEF )
-               {
-                       if( styler.Match(i, "SubSectionEnd") )
-                               levelNext--;
-                       else if( styler.Match(i, "SubSection") )
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_IFDEFINEDEF )
-               {
-                       if( styler.Match(i, "!endif") )
-                               levelNext--;
-                       else if( styler.Match(i, "!ifdef") || styler.Match(i, "!ifndef"))
-                               levelNext++;
-               }
-               else if( style == SCE_NSIS_MACRODEF )
-               {
-                       if( styler.Match(i, "!macroend") )
-                               levelNext--;
-                       else if( styler.Match(i, "!macro") )
-                               levelNext++;
-               }
-
-               if( atEOL )
-               {
-                       int levelUse = levelCurrent;
+    char chCurr = styler.SafeGetCharAt(i);
+
+    if( bArg1 ) //&& chCurr != '\n' )
+    {
+      if( nWordStart == -1 && (isNsisLetter(chCurr) || chCurr == '!') )
+        nWordStart = i;
+      else if( !isNsisLetter(chCurr) && nWordStart > -1 )
+      {
+        int newLevel = calculateFoldNsis( nWordStart, i-1, levelNext, styler );
+        if( newLevel != levelNext )
+          levelNext = newLevel;
+        bArg1 = false;
+      }
+    }
+
+    if( chCurr == '\n' )
+    {
+      // If we are on a new line...
+      int levelUse = levelCurrent;
                        int lev = levelUse | levelNext << 16;
                        if (levelUse < levelNext)
                                lev |= SC_FOLDLEVELHEADERFLAG;
                        if (lev != styler.LevelAt(lineCurrent))
                        int lev = levelUse | levelNext << 16;
                        if (levelUse < levelNext)
                                lev |= SC_FOLDLEVELHEADERFLAG;
                        if (lev != styler.LevelAt(lineCurrent))
-                       {
                                styler.SetLevel(lineCurrent, lev);
                                styler.SetLevel(lineCurrent, lev);
-                       }
+
                        lineCurrent++;
                        levelCurrent = levelNext;
                        lineCurrent++;
                        levelCurrent = levelNext;
-               }
-       }
+      bArg1 = true; // New line, lets look at first argument again
+      nWordStart = -1;
+    }
+  }
 
        int levelUse = levelCurrent;
        int lev = levelUse | levelNext << 16;
        if (levelUse < levelNext)
                lev |= SC_FOLDLEVELHEADERFLAG;
        if (lev != styler.LevelAt(lineCurrent))
 
        int levelUse = levelCurrent;
        int lev = levelUse | levelNext << 16;
        if (levelUse < levelNext)
                lev |= SC_FOLDLEVELHEADERFLAG;
        if (lev != styler.LevelAt(lineCurrent))
-       {
                styler.SetLevel(lineCurrent, lev);
                styler.SetLevel(lineCurrent, lev);
-       }
 }
 
 static const char * const nsisWordLists[] = {
 }
 
 static const char * const nsisWordLists[] = {
index 819dd312905ade74736add7af3ac4781c450a7f7..1681ba5d4a6bd38c218d4ea4ad68cf1a90795d4b 100644 (file)
@@ -166,20 +166,39 @@ static void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) {
        // comment lines before the first "diff " or "--- ". If a real
        // difference starts then each line starting with ' ' is a whitespace
        // otherwise it is considered a comment (Only in..., Binary file...)
        // comment lines before the first "diff " or "--- ". If a real
        // difference starts then each line starting with ' ' is a whitespace
        // otherwise it is considered a comment (Only in..., Binary file...)
-       if (0 == strncmp(lineBuffer, "diff ", 3)) {
+       if (0 == strncmp(lineBuffer, "diff ", 5)) {
                styler.ColourTo(endLine, SCE_DIFF_COMMAND);
                styler.ColourTo(endLine, SCE_DIFF_COMMAND);
-       } else if (0 == strncmp(lineBuffer, "--- ", 3)) {
-               styler.ColourTo(endLine, SCE_DIFF_HEADER);
-       } else if (0 == strncmp(lineBuffer, "+++ ", 3)) {
-               styler.ColourTo(endLine, SCE_DIFF_HEADER);
+       } else if (0 == strncmp(lineBuffer, "--- ", 4)) {
+               // In a context diff, --- appears in both the header and the position markers
+               if (atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else
+                       styler.ColourTo(endLine, SCE_DIFF_HEADER);
+       } else if (0 == strncmp(lineBuffer, "+++ ", 4)) {
+               // I don't know of any diff where "+++ " is a position marker, but for
+               // consistency, do the same as with "--- " and "*** ".
+               if (atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else
+                       styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (0 == strncmp(lineBuffer, "====", 4)) {  // For p4's diff
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (0 == strncmp(lineBuffer, "====", 4)) {  // For p4's diff
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
-       } else if (0 == strncmp(lineBuffer, "***", 3)) {
-               styler.ColourTo(endLine, SCE_DIFF_HEADER);
+       } else if (0 == strncmp(lineBuffer, "***", 3)) {
+               // In a context diff, *** appears in both the header and the position markers.
+               // Also ******** is a chunk header, but here it's treated as part of the
+               // position marker since there is no separate style for a chunk header.
+               if (lineBuffer[3] == ' ' && atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else if (lineBuffer[3] == '*')
+                       styler.ColourTo(endLine, SCE_DIFF_POSITION);
+               else
+                       styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (0 == strncmp(lineBuffer, "? ", 2)) {    // For difflib
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (lineBuffer[0] == '@') {
                styler.ColourTo(endLine, SCE_DIFF_POSITION);
        } else if (0 == strncmp(lineBuffer, "? ", 2)) {    // For difflib
                styler.ColourTo(endLine, SCE_DIFF_HEADER);
        } else if (lineBuffer[0] == '@') {
                styler.ColourTo(endLine, SCE_DIFF_POSITION);
+       } else if (lineBuffer[0] >= '0' && lineBuffer[0] <= '9') {
+               styler.ColourTo(endLine, SCE_DIFF_POSITION);
        } else if (lineBuffer[0] == '-' || lineBuffer[0] == '<') {
                styler.ColourTo(endLine, SCE_DIFF_DELETED);
        } else if (lineBuffer[0] == '+' || lineBuffer[0] == '>') {
        } else if (lineBuffer[0] == '-' || lineBuffer[0] == '<') {
                styler.ColourTo(endLine, SCE_DIFF_DELETED);
        } else if (lineBuffer[0] == '+' || lineBuffer[0] == '>') {
@@ -210,6 +229,37 @@ static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[
        }
 }
 
        }
 }
 
+static void FoldDiffDoc(unsigned int startPos, int length, int, WordList*[], Accessor &styler) {
+       int curLine = styler.GetLine(startPos);
+       int prevLevel = SC_FOLDLEVELBASE;
+       if (curLine > 0)
+               prevLevel = styler.LevelAt(curLine-1);
+
+       int curLineStart = styler.LineStart(curLine);
+       do {
+               int nextLevel = prevLevel;
+               if (prevLevel & SC_FOLDLEVELHEADERFLAG)
+                       nextLevel = (prevLevel & SC_FOLDLEVELNUMBERMASK) + 1;
+               
+               int lineType = styler.StyleAt(curLineStart);
+               if (lineType == SCE_DIFF_COMMAND)
+                       nextLevel = (SC_FOLDLEVELBASE + 1) | SC_FOLDLEVELHEADERFLAG;
+               else if (lineType == SCE_DIFF_HEADER) {
+                       nextLevel = (SC_FOLDLEVELBASE + 2) | SC_FOLDLEVELHEADERFLAG;
+               } else if (lineType == SCE_DIFF_POSITION)
+                       nextLevel = (SC_FOLDLEVELBASE + 3) | SC_FOLDLEVELHEADERFLAG;
+               
+               if ((nextLevel & SC_FOLDLEVELHEADERFLAG) && (nextLevel == prevLevel))
+                       styler.SetLevel(curLine-1, prevLevel & ~SC_FOLDLEVELHEADERFLAG);
+
+               styler.SetLevel(curLine, nextLevel);
+               prevLevel = nextLevel;
+               
+               curLineStart = styler.LineStart(++curLine);
+       } while (static_cast<int>(startPos) + length > curLineStart);
+}
+
+
 static void ColourisePropsLine(
     char *lineBuffer,
     unsigned int lengthLine,
 static void ColourisePropsLine(
     char *lineBuffer,
     unsigned int lengthLine,
@@ -427,14 +477,14 @@ static void ColouriseErrorListLine(
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
+       } else if (lineBuffer[0] == '-') {
+               styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstart(lineBuffer, "cf90-")) {
                // Absoft Pro Fortran 90/95 v8.2 error and/or warning message
                styler.ColourTo(endPos, SCE_ERR_ABSF);
        } else if (strstart(lineBuffer, "fortcom:")) {
                // Intel Fortran Compiler v8.0 error/warning message
                styler.ColourTo(endPos, SCE_ERR_IFORT);
        } else if (strstart(lineBuffer, "cf90-")) {
                // Absoft Pro Fortran 90/95 v8.2 error and/or warning message
                styler.ColourTo(endPos, SCE_ERR_ABSF);
        } else if (strstart(lineBuffer, "fortcom:")) {
                // Intel Fortran Compiler v8.0 error/warning message
                styler.ColourTo(endPos, SCE_ERR_IFORT);
-       } else if (lineBuffer[0] == '-') {
-               styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
                styler.ColourTo(endPos, SCE_ERR_PYTHON);
        } else if (strstr(lineBuffer, " in ") && strstr(lineBuffer, " on line ")) {
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
                styler.ColourTo(endPos, SCE_ERR_PYTHON);
        } else if (strstr(lineBuffer, " in ") && strstr(lineBuffer, " on line ")) {
@@ -456,7 +506,7 @@ static void ColouriseErrorListLine(
                   (strstr(lineBuffer, "at line " ) < (lineBuffer + lengthLine)) &&
                   strstr(lineBuffer, "file ") &&
                   (strstr(lineBuffer, "file ") < (lineBuffer + lengthLine))) {
                   (strstr(lineBuffer, "at line " ) < (lineBuffer + lengthLine)) &&
                   strstr(lineBuffer, "file ") &&
                   (strstr(lineBuffer, "file ") < (lineBuffer + lengthLine))) {
-               // Lua error message
+               // Lua error message
                styler.ColourTo(endPos, SCE_ERR_LUA);
        } else if (strstr(lineBuffer, " at " ) &&
                   (strstr(lineBuffer, " at " ) < (lineBuffer + lengthLine)) &&
                styler.ColourTo(endPos, SCE_ERR_LUA);
        } else if (strstr(lineBuffer, " at " ) &&
                   (strstr(lineBuffer, " at " ) < (lineBuffer + lengthLine)) &&
@@ -478,6 +528,8 @@ static void ColouriseErrorListLine(
                // Look for Microsoft <filename>(line) :message
                // Look for Microsoft <filename>(line,pos)message
                // Look for CTags \tmessage
                // Look for Microsoft <filename>(line) :message
                // Look for Microsoft <filename>(line,pos)message
                // Look for CTags \tmessage
+               // Look for Lua 5 traceback \t<filename>:<line>:message
+               bool initialTab = (lineBuffer[0] == '\t');
                int state = 0;
                for (unsigned int i = 0; i < lengthLine; i++) {
                        char ch = lineBuffer[i];
                int state = 0;
                for (unsigned int i = 0; i < lengthLine; i++) {
                        char ch = lineBuffer[i];
@@ -486,17 +538,17 @@ static void ColouriseErrorListLine(
                                chNext = lineBuffer[i+1];
                        if (state == 0) {
                                if (ch == ':') {
                                chNext = lineBuffer[i+1];
                        if (state == 0) {
                                if (ch == ':') {
-                                       // May be GCC
+                                       // May be GCC, or might be Lua 5 (Lua traceback same but with tab prefix)
                                        if ((chNext != '\\') && (chNext != '/')) {
                                                // This check is not completely accurate as may be on
                                                // GTK+ with a file name that includes ':'.
                                                state = 1;
                                        }
                                        if ((chNext != '\\') && (chNext != '/')) {
                                                // This check is not completely accurate as may be on
                                                // GTK+ with a file name that includes ':'.
                                                state = 1;
                                        }
-                               } else if ((ch == '(') && Is1To9(chNext)) {
+                               } else if ((ch == '(') && Is1To9(chNext) && (!initialTab)) {
                                        // May be Microsoft
                                        // May be Microsoft
-                                       // Check againt '0' often removes phone numbers
+                                       // Check against '0' often removes phone numbers
                                        state = 10;
                                        state = 10;
-                               } else if (ch == '\t') {
+                               } else if ((ch == '\t') && (!initialTab)) {
                                        // May be CTags
                                        state = 20;
                                }
                                        // May be CTags
                                        state = 20;
                                }
@@ -520,10 +572,11 @@ static void ColouriseErrorListLine(
                                        state = unRecognized;
                                }
                        } else if (state == 12) {
                                        state = unRecognized;
                                }
                        } else if (state == 12) {
-                               if ((ch == ' ') && (chNext == ':'))
+                               if ((ch == ' ') && (chNext == ':')) {
                                        state = 13;
                                        state = 13;
-                               else
+                               } else {
                                        state = unRecognized;
                                        state = unRecognized;
+                               }
                        } else if (state == 14) {
                                if (ch == ')') {
                                        state = 15;
                        } else if (state == 14) {
                                if (ch == ')') {
                                        state = 15;
@@ -548,7 +601,7 @@ static void ColouriseErrorListLine(
                        styler.ColourTo(endPos, SCE_ERR_GCC);
                } else if ((state == 13) || (state == 14) || (state == 15)) {
                        styler.ColourTo(endPos, SCE_ERR_MS);
                        styler.ColourTo(endPos, SCE_ERR_GCC);
                } else if ((state == 13) || (state == 14) || (state == 15)) {
                        styler.ColourTo(endPos, SCE_ERR_MS);
-               } else if (((state == 22) || (state == 24)) && (lineBuffer[0] != '\t')) {
+               } else if ((state == 22) || (state == 24)) {
                        styler.ColourTo(endPos, SCE_ERR_CTAG);
                } else {
                        styler.ColourTo(endPos, SCE_ERR_DEFAULT);
                        styler.ColourTo(endPos, SCE_ERR_CTAG);
                } else {
                        styler.ColourTo(endPos, SCE_ERR_DEFAULT);
@@ -696,7 +749,7 @@ static void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[
 }
 
 LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", 0, batchWordListDesc);
 }
 
 LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", 0, batchWordListDesc);
-LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff", 0, emptyWordListDesc);
+LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff", FoldDiffDoc, emptyWordListDesc);
 LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props", FoldPropsDoc, emptyWordListDesc);
 LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", 0, emptyWordListDesc);
 LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist", 0, emptyWordListDesc);
 LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props", FoldPropsDoc, emptyWordListDesc);
 LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", 0, emptyWordListDesc);
 LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist", 0, emptyWordListDesc);
index d35944ecf7caebef022ff8a0aeea2041025f9b1e..775b5587257d750d34c214e05f6e1332b6b8f0d1 100644 (file)
@@ -1,26 +1,12 @@
 // Scintilla source code edit control
 // Scintilla source code edit control
-/** @file LexPB.cxx
- ** Lexer for PowerBasic by Roland Walter, roland@rowalt.de
- ** Last update: 17.10.2003 (toggling of subs/functions now until next sub/functin - this gives better results)
- **/
+// @file LexPB.cxx
+// Lexer for PowerBasic by Roland Walter, roland@rowalt.de (for PowerBasic see www.powerbasic.com)
 //
 //
-// Necessary changes in Scintilla project:
-//  - In SciLexer.h and Scintilla.iface:
-//
-//    #define SCLEX_PB 51                              //ID for PowerBasic lexer
-//    (...)
-//    #define SCE_B_DEFAULT 0                  //in both VB and PB lexer
-//    #define SCE_B_COMMENT 1                  //in both VB and PB lexer
-//    #define SCE_B_NUMBER 2                   //in both VB and PB lexer
-//    #define SCE_B_KEYWORD 3                  //in both VB and PB lexer
-//    #define SCE_B_STRING 4                   //in both VB and PB lexer
-//    #define SCE_B_PREPROCESSOR 5             //VB lexer only, unsupported by PB lexer
-//    #define SCE_B_OPERATOR 6                 //in both VB and PB lexer
-//    #define SCE_B_IDENTIFIER 7               //in both VB and PB lexer
-//    #define SCE_B_DATE 8                             //VB lexer only, unsupported by PB lexer
-
-//  - Statement added to KeyWords.cxx:      'LINK_LEXER(lmPB);'
-//  - Statement added to scintilla_vc6.mak: '$(DIR_O)\LexPB.obj: ...\src\LexPB.cxx $(LEX_HEADERS)'
+// Changes:
+// 17.10.2003 Toggling of subs/functions now until next sub/function - this gives better results
+// 29.10.2003 1. Bug: Toggling didn't work for subs/functions added in editor
+//            2. Own colors for PB constants and Inline Assembler SCE_B_CONSTANT and SCE_B_ASM
+//            3. Several smaller syntax coloring improvements and speed optimizations
 //
 // Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 //
 // Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 #include "Scintilla.h"
 #include "SciLexer.h"
 
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static inline bool IsTypeCharacter(const int ch) {
-       return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
+static inline bool IsTypeCharacter(const int ch)
+{
+    return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$' || ch == '?';
 }
 
 }
 
-static inline bool IsAWordChar(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+static inline bool IsAWordChar(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
 }
 
 }
 
-static inline bool IsAWordStart(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+static inline bool IsAWordStart(const int ch)
+{
+    return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
 bool MatchUpperCase(Accessor &styler, int pos, const char *s)   //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)
 {
 }
 
 bool MatchUpperCase(Accessor &styler, int pos, const char *s)   //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)
 {
-       char ch;
-       for (int i=0; *s; i++)
-       {
-               ch=styler.SafeGetCharAt(pos+i);
-               if (ch > 0x60) ch -= '\x20';
-               if (*s != ch) return false;
-               s++;
-       }
-       return true;
+    char ch;
+    for (int i=0; *s; i++)
+    {
+        ch=styler.SafeGetCharAt(pos+i);
+        if (ch > 0x60) ch -= '\x20';
+        if (*s != ch) return false;
+        s++;
+    }
+    return true;
 }
 
 }
 
-static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],
-                                                  Accessor &styler) {
-
-       WordList &keywords = *keywordlists[0];
-
-       styler.StartAt(startPos);
-
-       StyleContext sc(startPos, length, initStyle, styler);
-
-       for (; sc.More(); sc.Forward()) {
-
-               if (sc.state == SCE_B_OPERATOR)
-               {
-                       sc.SetState(SCE_B_DEFAULT);
-               }
-               else if (sc.state == SCE_B_KEYWORD)
-               {
-                       if (!IsAWordChar(sc.ch))
-                       {
-                               if (!IsTypeCharacter(sc.ch))
-                               {
-                                       if (sc.ch == ']') {sc.Forward();}
-                                       char s[100];
-                                       sc.GetCurrentLowered(s, sizeof(s));
-                                       if (keywords.InList(s))
-                                       {
-                                               if (strcmp(s, "rem") == 0)
-                                               {
-                                                       sc.ChangeState(SCE_B_COMMENT);
-                                                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
-                                               }
-                                               else
-                                               {
-                                                       sc.SetState(SCE_B_DEFAULT);
-                                               }
-                                       }
-                                       else
-                                       {
-                                               sc.ChangeState(SCE_B_IDENTIFIER);
-                                               sc.SetState(SCE_B_DEFAULT);
-                                       }
-                               }
-                       }
-               }
-               else if (sc.state == SCE_B_NUMBER)
-               {
-                       if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
-               }
-               else if (sc.state == SCE_B_STRING)
-               {
-                       // PB doubles quotes to preserve them, so just end this string
-                       // state now as a following quote will start again
-                       if (sc.ch == '\"')
-                       {
-                               if (tolower(sc.chNext) == 'c') {sc.Forward();}
-                               sc.ForwardSetState(SCE_B_DEFAULT);
-                       }
-               }
-               else if (sc.state == SCE_B_COMMENT)
-               {
-                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
-               }
-
-               if (sc.state == SCE_B_DEFAULT)
-               {
-                       if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);}
-                       else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);}
-                       else if (sc.ch == '#')
-                       {       int n = 1;
-                               int chSeek = ' ';
-                               while ((n < 100) && (chSeek == ' ' || chSeek == '\t'))
-                               {
-                                       chSeek = sc.GetRelative(n);
-                                       n++;
-                               }
-                               sc.SetState(SCE_B_OPERATOR);
-                       }
-                       else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}
-                       else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}
-                       else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}
-                       else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}
-                       else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {sc.SetState(SCE_B_KEYWORD);}
-                       else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);}
-               }
-
-       }
-       sc.Complete();
+static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],Accessor &styler) {
+
+    WordList &keywords = *keywordlists[0];
+
+    styler.StartAt(startPos);
+
+    StyleContext sc(startPos, length, initStyle, styler);
+
+    for (; sc.More(); sc.Forward()) {
+        switch (sc.state)
+        {
+            case SCE_B_OPERATOR:
+            {
+                sc.SetState(SCE_B_DEFAULT);
+                break;
+            }
+            case SCE_B_KEYWORD:
+            {
+                if (!IsAWordChar(sc.ch))
+                {
+                    if (!IsTypeCharacter(sc.ch))
+                    {
+                        char s[100];
+                        sc.GetCurrentLowered(s, sizeof(s));
+                        if (keywords.InList(s))
+                        {
+                            if (strcmp(s, "rem") == 0)
+                            {
+                                sc.ChangeState(SCE_B_COMMENT);
+                                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                            }
+                            else if (strcmp(s, "asm") == 0)
+                            {
+                                sc.ChangeState(SCE_B_ASM);
+                                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                            }
+                            else
+                            {
+                                sc.SetState(SCE_B_DEFAULT);
+                            }
+                        }
+                        else
+                        {
+                            sc.ChangeState(SCE_B_IDENTIFIER);
+                            sc.SetState(SCE_B_DEFAULT);
+                        }
+                    }
+                }
+                break;
+            }
+            case SCE_B_NUMBER:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_STRING:
+            {
+                if (sc.ch == '\"'){sc.ForwardSetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_CONSTANT:
+            {
+                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_COMMENT:
+            {
+                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+            case SCE_B_ASM:
+            {
+                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                break;
+            }
+        }  //switch (sc.state)
+
+        // Determine if a new state should be entered:
+        if (sc.state == SCE_B_DEFAULT)
+        {
+            if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);}
+            else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);}
+            else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}
+            else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}
+            else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}
+            else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}
+            else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_B_KEYWORD);}
+            else if (sc.ch == '%') {sc.SetState(SCE_B_CONSTANT);}
+            else if (sc.ch == '$') {sc.SetState(SCE_B_CONSTANT);}
+            else if (sc.ch == '#') {sc.SetState(SCE_B_KEYWORD);}
+            else if (sc.ch == '!') {sc.SetState(SCE_B_ASM);}
+            else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);}
+        }
+    }      //for (; sc.More(); sc.Forward())
+    sc.Complete();
 }
 
 }
 
+//The folding routine for PowerBasic toggles SUBs and FUNCTIONs only. This was exactly what I wanted,
+//nothing more. I had worked with this kind of toggling for several years when I used the great good old
+//GFA Basic which is dead now. After testing the feature of toggling FOR-NEXT loops, WHILE-WEND loops
+//and so on too I found this is more disturbing then helping (for me). So if You think in another way
+//you can (or must) write Your own toggling routine ;-)
 static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
 static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
 {
-       // No folding enabled, no reason to continue...
-       if( styler.GetPropertyInt("fold") == 0 )
-               return;
-
-       unsigned int endPos = startPos + length;
-       int lineCurrent = styler.GetLine(startPos);
-       int levelCurrent = SC_FOLDLEVELBASE;
-       if (lineCurrent > 0)
-               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
-       int levelNext = levelCurrent;
-       char chNext = styler[startPos];
-
-       bool atEOL=1;
-       for (unsigned int i = startPos; i < endPos; i++)
-       {
-               char ch = chNext;
-               chNext = styler.SafeGetCharAt(i + 1);
-
-               if( atEOL )                     //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)
-               {
-                       if( MatchUpperCase(styler,i,"FUNCTION") )  //else if(
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"STATIC FUNCTION") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"SUB") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       else if( MatchUpperCase(styler,i,"STATIC SUB") )
-                       {
-                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
-                               levelNext=SC_FOLDLEVELBASE+1;
-                       }
-                       //else if( MatchUpperCase(styler,i,"MACRO") )  //ToDo: What's with single-line macros?
-               }
-
-               atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
-               if( atEOL )
-               {
-                       lineCurrent++;
-                       levelCurrent = levelNext;
-               }
-       }
-
-       if (levelNext == SC_FOLDLEVELBASE)
-       {
-               int levelUse = levelCurrent;
-               int lev = levelUse | levelNext << 16;
-               styler.SetLevel(lineCurrent, lev);
-       }
+    // No folding enabled, no reason to continue...
+    if( styler.GetPropertyInt("fold") == 0 )
+        return;
+
+    unsigned int endPos = startPos + length;
+    int lineCurrent = styler.GetLine(startPos);
+    int levelCurrent = SC_FOLDLEVELBASE;
+    if (lineCurrent > 0)
+        levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+    int levelNext = levelCurrent;
+    char chNext = styler[startPos];
+
+    bool fNewLine=true;
+    for (unsigned int i = startPos; i < endPos; i++)
+    {
+        char ch = chNext;
+        chNext = styler.SafeGetCharAt(i + 1);
+
+        if (fNewLine)            //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)
+        {
+            fNewLine=false;
+
+            switch (ch)
+            {
+            case ' ':      //Most lines start with space - so check this first
+                {
+                    int levelUse = levelCurrent;
+                    int lev = levelUse | levelNext << 16;
+                    styler.SetLevel(lineCurrent, lev);
+                    break;
+                }
+            case 'F':
+            case 'S':
+            case 'C':
+            case 'f':
+            case 's':
+            case 'c':
+                {
+                    if( MatchUpperCase(styler,i,"FUNCTION") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"SUB") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"STATIC FUNCTION") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                else if( MatchUpperCase(styler,i,"STATIC SUB") )
+                    {
+                        styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                        levelNext=SC_FOLDLEVELBASE+1;
+                    }
+                break;
+                }
+            default:
+                {
+                    int levelUse = levelCurrent;
+                    int lev = levelUse | levelNext << 16;
+                    styler.SetLevel(lineCurrent, lev);
+                    break;
+                }
+            }  //switch (ch)
+        }  //if( fNewLine )
+
+        switch (ch)
+        {
+            case '\n':
+            {
+                lineCurrent++;
+                levelCurrent = levelNext;
+                fNewLine=true;
+                break;
+            }
+            case '\r':
+            {
+                if (chNext != '\n')
+                {
+                    lineCurrent++;
+                    levelCurrent = levelNext;
+                    fNewLine=true;
+                }
+                break;
+            }
+        }  //switch (ch)
+    }  //for (unsigned int i = startPos; i < endPos; i++)
 }
 
 static const char * const pbWordListDesc[] = {
 }
 
 static const char * const pbWordListDesc[] = {
-       "Keywords",
-       0
+    "Keywords",
+    0
 };
 
 LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc);
 };
 
 LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc);
index 16a068778e774d06abdc879349c8e43886731e16..67d60fc1ae8f5a290718a732147f04c950f0d706 100644 (file)
@@ -2,8 +2,8 @@
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
-// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my> 20031020
-// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my> 2003-2004
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
@@ -40,13 +40,15 @@ static bool isSingleCharOp(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
-       if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '\\' ||
+       if (ch == '^' || ch == '&' || ch == '\\' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
                ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
                ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
-               ch == '<' || ch == '>' || ch == ',' || ch == '/' ||
+               ch == '>' || ch == ',' || 
                ch == '?' || ch == '!' || ch == '.' || ch == '~')
                return true;
                ch == '?' || ch == '!' || ch == '.' || ch == '~')
                return true;
+       // these chars are already tested before this call
+       // ch == '%' || ch == '*' || ch == '<' || ch == '/' ||
        return false;
 }
 
        return false;
 }
 
@@ -68,6 +70,7 @@ static inline bool isEndVar(char ch) {
               ch != '_' && ch != '\'';
 }
 
               ch != '_' && ch != '\'';
 }
 
+
 static inline bool isNonQuote(char ch) {
        return isalnum(ch) || ch == '_';
 }
 static inline bool isNonQuote(char ch) {
        return isalnum(ch) || ch == '_';
 }
@@ -192,6 +195,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
        || state == SCE_PL_BACKTICKS
        || state == SCE_PL_CHARACTER
        || state == SCE_PL_NUMBER
        || state == SCE_PL_BACKTICKS
        || state == SCE_PL_CHARACTER
        || state == SCE_PL_NUMBER
+       || state == SCE_PL_IDENTIFIER
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
@@ -275,7 +279,15 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        numState = PERLNUM_V_VECTOR;
                                }
                        } else if (iswordstart(ch)) {
                                        numState = PERLNUM_V_VECTOR;
                                }
                        } else if (iswordstart(ch)) {
-                               if (ch == 's' && !isNonQuote(chNext)) {
+                               if (chPrev == '>' && styler.SafeGetCharAt(i - 2) == '-') {
+                                       state = SCE_PL_IDENTIFIER;      // part of "->" expr
+                                       if ((!iswordchar(chNext) && chNext != '\'')
+                                               || (chNext == '.' && chNext2 == '.')) {
+                                               // We need that if length of word == 1!
+                                               styler.ColourTo(i, SCE_PL_IDENTIFIER);
+                                               state = SCE_PL_DEFAULT;
+                                       }
+                               } else if (ch == 's' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                } else if (ch == 'm' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                } else if (ch == 'm' && !isNonQuote(chNext)) {
@@ -391,13 +403,15 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        bk--;
                                }
                                if (bk == 0) {
                                        bk--;
                                }
                                if (bk == 0) {
+                                       // position 0 won't really be checked; rarely happens
+                                       // hard to fix due to an unsigned index i
                                        preferRE = true;
                                } else {
                                        int bkstyle = styler.StyleAt(bk);
                                        preferRE = true;
                                } else {
                                        int bkstyle = styler.StyleAt(bk);
+                                       bkch = styler.SafeGetCharAt(bk);
                                        switch(bkstyle) {
                                        case SCE_PL_OPERATOR:
                                                preferRE = true;
                                        switch(bkstyle) {
                                        case SCE_PL_OPERATOR:
                                                preferRE = true;
-                                               bkch = styler.SafeGetCharAt(bk);
                                                if (bkch == ')' || bkch == ']') {
                                                        preferRE = false;
                                                } else if (bkch == '}') {
                                                if (bkch == ')' || bkch == ']') {
                                                        preferRE = false;
                                                } else if (bkch == '}') {
@@ -408,7 +422,9 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                                bkstyle = styler.StyleAt(bk);
                                                                if (bkstyle == SCE_PL_OPERATOR) {
                                                                        bkch = styler.SafeGetCharAt(bk);
                                                                bkstyle = styler.StyleAt(bk);
                                                                if (bkstyle == SCE_PL_OPERATOR) {
                                                                        bkch = styler.SafeGetCharAt(bk);
-                                                                       if (bkch == '}') {
+                                                                       if (bkch == ';') {      // early out
+                                                                               break;
+                                                                       } else if (bkch == '}') {
                                                                                braceCount++;
                                                                        } else if (bkch == '{') {
                                                                                if (--braceCount == 0)
                                                                                braceCount++;
                                                                        } else if (bkch == '{') {
                                                                                if (--braceCount == 0)
@@ -419,21 +435,68 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                        if (bk == 0) {
                                                                // at beginning, true
                                                        } else if (braceCount == 0) {
                                                        if (bk == 0) {
                                                                // at beginning, true
                                                        } else if (braceCount == 0) {
-                                                               // balanced { found, check for variable
-                                                               bkstyle = styler.StyleAt(bk - 1);
+                                                               // balanced { found, bk>0, skip more whitespace
+                                                               if (styler.StyleAt(--bk) == SCE_PL_DEFAULT) {
+                                                                       while (bk > 0) {
+                                                                               bkstyle = styler.StyleAt(--bk);
+                                                                               if (bkstyle != SCE_PL_DEFAULT)
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                               bkstyle = styler.StyleAt(bk);
                                                                if (bkstyle == SCE_PL_SCALAR
                                                                 || bkstyle == SCE_PL_ARRAY
                                                                 || bkstyle == SCE_PL_HASH
                                                                if (bkstyle == SCE_PL_SCALAR
                                                                 || bkstyle == SCE_PL_ARRAY
                                                                 || bkstyle == SCE_PL_HASH
-                                                                || bkstyle == SCE_PL_SYMBOLTABLE) {
+                                                                || bkstyle == SCE_PL_SYMBOLTABLE
+                                                                || bkstyle == SCE_PL_OPERATOR) {
                                                                        preferRE = false;
                                                                }
                                                        }
                                                }
                                                break;
                                                                        preferRE = false;
                                                                }
                                                        }
                                                }
                                                break;
-                                       // other styles uses the default, preferRE=false
                                        case SCE_PL_IDENTIFIER:
                                        case SCE_PL_IDENTIFIER:
-                                       case SCE_PL_POD:
+                                               preferRE = true;
+                                               if (bkch == '>') {      // inputsymbol
+                                                       preferRE = false;
+                                                       break;
+                                               }
+                                               // backtrack to find "->" or "::" before identifier
+                                               while (bk > 0 && styler.StyleAt(bk) == SCE_PL_IDENTIFIER) {
+                                                       bk--;
+                                               }
+                                               while (bk > 0) {
+                                                       bkstyle = styler.StyleAt(bk);
+                                                       if (bkstyle == SCE_PL_DEFAULT ||
+                                                           bkstyle == SCE_PL_COMMENTLINE) {
+                                                       } else if (bkstyle == SCE_PL_OPERATOR) {
+                                                               // gcc 3.2.3 bloats if more compact form used
+                                                               bkch = styler.SafeGetCharAt(bk);
+                                                               if (bkch == '>') { // "->"
+                                                                       if (styler.SafeGetCharAt(bk - 1) == '-') {
+                                                                               preferRE = false;
+                                                                               break;
+                                                                       }
+                                                               } else if (bkch == ':') { // "::"
+                                                                       if (styler.SafeGetCharAt(bk - 1) == ':') {
+                                                                               preferRE = false;
+                                                                               break;
+                                                                       }
+                                                               }
+                                                       } else {// bare identifier, usually a function call but Perl
+                                                               // optimizes them as pseudo-constants, then the next
+                                                               // '/' will be a divide; favour divide over regex
+                                                               // if there is a whitespace after the '/'
+                                                               if (isspacechar(chNext)) {
+                                                                       preferRE = false;
+                                                               }
+                                                               break;
+                                                       }
+                                                       bk--;
+                                               }
+                                               break;
+                                       // other styles uses the default, preferRE=false
                                        case SCE_PL_WORD:
                                        case SCE_PL_WORD:
+                                       case SCE_PL_POD:
                                        case SCE_PL_HERE_Q:
                                        case SCE_PL_HERE_QQ:
                                        case SCE_PL_HERE_QX:
                                        case SCE_PL_HERE_Q:
                                        case SCE_PL_HERE_QQ:
                                        case SCE_PL_HERE_QX:
@@ -451,6 +514,27 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                        } else if (ch == '<' && chNext == '<') {
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
                        } else if (ch == '<' && chNext == '<') {
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
+                       } else if (ch == '<') {
+                               // looks forward for matching > on same line
+                               unsigned int fw = i + 1;
+                               while (fw < lengthDoc) {
+                                       char fwch = styler.SafeGetCharAt(fw);
+                                       if (isEOLChar(fwch) || isspacechar(fwch))
+                                               break;
+                                       else if (fwch == '>') {
+                                               if ((fw - i) == 2 &&    // '<=>' case
+                                                   styler.SafeGetCharAt(fw-1) == '=') {
+                                                       styler.ColourTo(fw, SCE_PL_OPERATOR);
+                                               } else {
+                                                       styler.ColourTo(fw, SCE_PL_IDENTIFIER);
+                                               }
+                                               i = fw;
+                                               ch = fwch;
+                                               chNext = styler.SafeGetCharAt(i+1);
+                                       }
+                                       fw++;
+                               }
+                               styler.ColourTo(i, SCE_PL_OPERATOR);
                        } else if (ch == '='    // POD
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
                        } else if (ch == '='    // POD
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
@@ -542,8 +626,9 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
-                               || (chNext == '.' && chNext2 == '.')) {
+                               || chNext == '.') {
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
+                               // "." never used in Perl variable names
                                // Archaic Perl has quotes inside names
                                if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")
                                 || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
                                // Archaic Perl has quotes inside names
                                if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")
                                 || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
@@ -555,6 +640,13 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        ch = ' ';
                                }
                        }
                                        ch = ' ';
                                }
                        }
+               } else if (state == SCE_PL_IDENTIFIER) {
+                       if ((!iswordchar(chNext) && chNext != '\'')
+                               || chNext == '.') {
+                               styler.ColourTo(i, SCE_PL_IDENTIFIER);
+                               state = SCE_PL_DEFAULT;
+                               ch = ' ';
+                       }
                } else {
                        if (state == SCE_PL_COMMENTLINE) {
                                if (isEOLChar(ch)) {
                } else {
                        if (state == SCE_PL_COMMENTLINE) {
                                if (isEOLChar(ch)) {
@@ -886,3 +978,4 @@ static const char * const perlWordListDesc[] = {
 };
 
 LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc, "perl", FoldPerlDoc, perlWordListDesc);
 };
 
 LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc, "perl", FoldPerlDoc, perlWordListDesc);
+
index 47974d1bced8911196416eb131c7334c0563e14f..d4d4f46fedb436e41403995919a5abf698c39725 100644 (file)
@@ -265,8 +265,7 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
                        } else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) {
                                unsigned int nextIndex = 0;
                                sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex));
                        } else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) {
                                unsigned int nextIndex = 0;
                                sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex));
-                               while (nextIndex > (sc.currentPos + 1)) {
-                                       sc.Forward();
+                               while (nextIndex > (sc.currentPos + 1) && sc.More()) {                                  sc.Forward();
                                }
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_P_IDENTIFIER);
                                }
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_P_IDENTIFIER);
index 144176855eeb149847ed4ef262a3bcb3cf85a140..8383eefb02efc556081b55b734ab2e521ad6aece 100644 (file)
@@ -44,6 +44,7 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
        styler.StartAt(startPos);
 
        bool fold = styler.GetPropertyInt("fold") != 0;
        styler.StartAt(startPos);
 
        bool fold = styler.GetPropertyInt("fold") != 0;
+       bool sqlBackslashEscapes = styler.GetPropertyInt("sql.backslash.escapes", 0) != 0;
        int lineCurrent = styler.GetLine(startPos);
        int spaceFlags = 0;
 
        int lineCurrent = styler.GetLine(startPos);
        int spaceFlags = 0;
 
@@ -88,6 +89,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
+                       } else if (ch == '#') {
+                               styler.ColourTo(i - 1, state);
+                               state = SCE_C_COMMENTLINEDOC;
                        } else if (ch == '\'') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_CHARACTER;
                        } else if (ch == '\'') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_CHARACTER;
@@ -106,6 +110,8 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
+                               } else if (ch == '#') {
+                                       state = SCE_C_COMMENTLINEDOC;
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
@@ -123,14 +129,18 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                                state = SCE_C_DEFAULT;
                                        }
                                }
                                                state = SCE_C_DEFAULT;
                                        }
                                }
-                       } else if (state == SCE_C_COMMENTLINE) {
+                       } else if (state == SCE_C_COMMENTLINE || state == SCE_C_COMMENTLINEDOC) {
                                if (ch == '\r' || ch == '\n') {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
                        } else if (state == SCE_C_CHARACTER) {
                                if (ch == '\r' || ch == '\n') {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
                        } else if (state == SCE_C_CHARACTER) {
-                               if (ch == '\'') {
-                                       if ( chNext == '\'' ) {
+                               if (sqlBackslashEscapes && ch == '\\') {
+                                       i++;
+                                       ch = chNext;
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               } else if (ch == '\'') {
+                                       if (chNext == '\'') {
                                                i++;
                                        } else {
                                                styler.ColourTo(i, state);
                                                i++;
                                        } else {
                                                styler.ColourTo(i, state);
@@ -158,6 +168,8 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
+                               } else if (ch == '#') {
+                                       state = SCE_C_COMMENTLINEDOC;
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
                                } else if (ch == '\'') {
                                        state = SCE_C_CHARACTER;
                                } else if (ch == '"') {
diff --git a/src/stc/scintilla/src/LexSpecman.cxx b/src/stc/scintilla/src/LexSpecman.cxx
new file mode 100644 (file)
index 0000000..bf5d639
--- /dev/null
@@ -0,0 +1,286 @@
+// Scintilla source code edit control
+/** @file LexSpecman.cxx
+ ** Lexer for Specman E language.
+ ** Written by Avi Yegudin, based on C++ lexer by Neil Hodgson
+ **/
+// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\'');
+}
+
+static inline bool IsANumberChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '\'');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '`');
+}
+
+static void ColouriseSpecmanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                            Accessor &styler, bool caseSensitive) {
+
+       WordList &keywords = *keywordlists[0];
+       WordList &keywords2 = *keywordlists[1];
+       WordList &keywords3 = *keywordlists[2];
+       WordList &keywords4 = *keywordlists[3];
+
+       // Do not leak onto next line
+       if (initStyle == SCE_SN_STRINGEOL)
+               initStyle = SCE_SN_CODE;
+
+       int visibleChars = 0;
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.atLineStart && (sc.state == SCE_SN_STRING)) {
+                       // Prevent SCE_SN_STRINGEOL from leaking back to previous line
+                       sc.SetState(SCE_SN_STRING);
+               }
+
+               // Handle line continuation generically.
+               if (sc.ch == '\\') {
+                       if (sc.chNext == '\n' || sc.chNext == '\r') {
+                               sc.Forward();
+                               if (sc.ch == '\r' && sc.chNext == '\n') {
+                                       sc.Forward();
+                               }
+                               continue;
+                       }
+               }
+
+               // Determine if the current state should terminate.
+               if (sc.state == SCE_SN_OPERATOR) {
+                       sc.SetState(SCE_SN_CODE);
+               } else if (sc.state == SCE_SN_NUMBER) {
+                       if (!IsANumberChar(sc.ch)) {
+                               sc.SetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_IDENTIFIER) {
+                       if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
+                               char s[100];
+                               if (caseSensitive) {
+                                       sc.GetCurrent(s, sizeof(s));
+                               } else {
+                                       sc.GetCurrentLowered(s, sizeof(s));
+                               }
+                               if (keywords.InList(s)) {
+                                       sc.ChangeState(SCE_SN_WORD);
+                               } else if (keywords2.InList(s)) {
+                                       sc.ChangeState(SCE_SN_WORD2);
+                               } else if (keywords3.InList(s)) {
+                                        sc.ChangeState(SCE_SN_WORD3);
+                               } else if (keywords4.InList(s)) {
+                                       sc.ChangeState(SCE_SN_USER);
+                               }
+                               sc.SetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_PREPROCESSOR) {
+                        if (IsASpace(sc.ch)) {
+                                sc.SetState(SCE_SN_CODE);
+                        }
+               } else if (sc.state == SCE_SN_DEFAULT) {
+                       if (sc.Match('<', '\'')) {
+                               sc.Forward();
+                               sc.ForwardSetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_COMMENTLINE || sc.state == SCE_SN_COMMENTLINEBANG) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_SN_CODE);
+                               visibleChars = 0;
+                       }
+               } else if (sc.state == SCE_SN_STRING) {
+                       if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\"') {
+                               sc.ForwardSetState(SCE_SN_CODE);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_SN_STRINGEOL);
+                               sc.ForwardSetState(SCE_SN_CODE);
+                               visibleChars = 0;
+                       }
+               } else if (sc.state == SCE_SN_SIGNAL) {
+                       if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_SN_STRINGEOL);
+                               sc.ForwardSetState(SCE_SN_CODE);
+                               visibleChars = 0;
+                       } else if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\'') {
+                               sc.ForwardSetState(SCE_SN_CODE);
+                       }
+               } else if (sc.state == SCE_SN_REGEXTAG) {
+                       if (!IsADigit(sc.ch)) {
+                               sc.SetState(SCE_SN_CODE);
+                       }
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_SN_CODE) {
+                       if (sc.ch == '$' && IsADigit(sc.chNext)) {
+                               sc.SetState(SCE_SN_REGEXTAG);
+                                sc.Forward();
+                       } else if (IsADigit(sc.ch)) {
+                                sc.SetState(SCE_SN_NUMBER);
+                       } else if (IsAWordStart(sc.ch)) {
+                               sc.SetState(SCE_SN_IDENTIFIER);
+                       } else if (sc.Match('\'', '>')) {
+                                sc.SetState(SCE_SN_DEFAULT);
+                               sc.Forward();   // Eat the * so it isn't used for the end of the comment
+                       } else if (sc.Match('/', '/')) {
+                               if (sc.Match("//!"))    // Nice to have a different comment style
+                                       sc.SetState(SCE_SN_COMMENTLINEBANG);
+                               else
+                                       sc.SetState(SCE_SN_COMMENTLINE);
+                       } else if (sc.Match('-', '-')) {
+                               if (sc.Match("--!"))    // Nice to have a different comment style
+                                       sc.SetState(SCE_SN_COMMENTLINEBANG);
+                               else
+                                       sc.SetState(SCE_SN_COMMENTLINE);
+                       } else if (sc.ch == '\"') {
+                               sc.SetState(SCE_SN_STRING);
+                       } else if (sc.ch == '\'') {
+                               sc.SetState(SCE_SN_SIGNAL);
+                       } else if (sc.ch == '#' && visibleChars == 0) {
+                               // Preprocessor commands are alone on their line
+                               sc.SetState(SCE_SN_PREPROCESSOR);
+                               // Skip whitespace between # and preprocessor word
+                               do {
+                                       sc.Forward();
+                               } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More());
+                               if (sc.atLineEnd) {
+                                       sc.SetState(SCE_SN_CODE);
+                               }
+                       } else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@') {
+                               sc.SetState(SCE_SN_OPERATOR);
+                       }
+               }
+
+               if (sc.atLineEnd) {
+                       // Reset states to begining of colourise so no surprises
+                       // if different sets of lines lexed.
+                       visibleChars = 0;
+               }
+               if (!IsASpace(sc.ch)) {
+                       visibleChars++;
+               }
+       }
+       sc.Complete();
+}
+
+// Store both the current line's fold level and the next lines in the
+// level store to make it easy to pick up with each increment
+// and to make it possible to fiddle the current level for "} else {".
+static void FoldNoBoxSpecmanDoc(unsigned int startPos, int length, int,
+                            Accessor &styler) {
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0;
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelCurrent = SC_FOLDLEVELBASE;
+       if (lineCurrent > 0)
+               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+       int levelMinCurrent = levelCurrent;
+       int levelNext = levelCurrent;
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       int style;
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               //int stylePrev = style;
+               style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if (foldComment && (style == SCE_SN_COMMENTLINE)) {
+                       if (((ch == '/') && (chNext == '/')) ||
+                            ((ch == '-') && (chNext == '-'))) {
+                               char chNext2 = styler.SafeGetCharAt(i + 2);
+                               if (chNext2 == '{') {
+                                       levelNext++;
+                               } else if (chNext2 == '}') {
+                                       levelNext--;
+                               }
+                       }
+               }
+               if (style == SCE_SN_OPERATOR) {
+                       if (ch == '{') {
+                               // Measure the minimum before a '{' to allow
+                               // folding on "} else {"
+                               if (levelMinCurrent > levelNext) {
+                                       levelMinCurrent = levelNext;
+                               }
+                               levelNext++;
+                       } else if (ch == '}') {
+                               levelNext--;
+                       }
+               }
+               if (atEOL) {
+                       int levelUse = levelCurrent;
+                       if (foldAtElse) {
+                               levelUse = levelMinCurrent;
+                       }
+                       int lev = levelUse | levelNext << 16;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if (levelUse < levelNext)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelCurrent = levelNext;
+                       levelMinCurrent = levelCurrent;
+                       visibleChars = 0;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+}
+
+static void FoldSpecmanDoc(unsigned int startPos, int length, int initStyle, WordList *[],
+                       Accessor &styler) {
+       FoldNoBoxSpecmanDoc(startPos, length, initStyle, styler);
+}
+
+static const char * const specmanWordLists[] = {
+            "Primary keywords and identifiers",
+            "Secondary keywords and identifiers",
+            "Sequence keywords and identifiers",
+            "User defined keywords and identifiers",
+            "Unused",
+            0,
+        };
+
+static void ColouriseSpecmanDocSensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                                     Accessor &styler) {
+       ColouriseSpecmanDoc(startPos, length, initStyle, keywordlists, styler, true);
+}
+
+
+LexerModule lmSpecman(SCLEX_SPECMAN, ColouriseSpecmanDocSensitive, "specman", FoldSpecmanDoc, specmanWordLists);
diff --git a/src/stc/scintilla/src/LexVerilog.cxx b/src/stc/scintilla/src/LexVerilog.cxx
new file mode 100644 (file)
index 0000000..43ef7eb
--- /dev/null
@@ -0,0 +1,299 @@
+// Scintilla source code edit control
+/** @file LexVerilog.cxx
+ ** Lexer for Verilog.
+ ** Written by Avi Yegudin, based on C++ lexer by Neil Hodgson
+ **/
+// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\'');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '$');
+}
+
+static void ColouriseVerilogDoc(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];
+
+       // Do not leak onto next line
+       if (initStyle == SCE_V_STRINGEOL)
+               initStyle = SCE_V_DEFAULT;
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.atLineStart && (sc.state == SCE_V_STRING)) {
+                       // Prevent SCE_V_STRINGEOL from leaking back to previous line
+                       sc.SetState(SCE_V_STRING);
+               }
+
+               // Handle line continuation generically.
+               if (sc.ch == '\\') {
+                       if (sc.chNext == '\n' || sc.chNext == '\r') {
+                               sc.Forward();
+                               if (sc.ch == '\r' && sc.chNext == '\n') {
+                                       sc.Forward();
+                               }
+                               continue;
+                       }
+               }
+
+               // Determine if the current state should terminate.
+               if (sc.state == SCE_V_OPERATOR) {
+                       sc.SetState(SCE_V_DEFAULT);
+               } else if (sc.state == SCE_V_NUMBER) {
+                       if (!IsAWordChar(sc.ch)) {
+                               sc.SetState(SCE_V_DEFAULT);
+                       }
+               } else if (sc.state == SCE_V_IDENTIFIER) {
+                       if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
+                               char s[100];
+                                sc.GetCurrent(s, sizeof(s));
+                               if (keywords.InList(s)) {
+                                       sc.ChangeState(SCE_V_WORD);
+                               } else if (keywords2.InList(s)) {
+                                       sc.ChangeState(SCE_V_WORD2);
+                               } else if (keywords3.InList(s)) {
+                                       sc.ChangeState(SCE_V_WORD3);
+                                } else if (keywords4.InList(s)) {
+                                       sc.ChangeState(SCE_V_USER);
+                               }
+                               sc.SetState(SCE_V_DEFAULT);
+                       }
+               } else if (sc.state == SCE_V_PREPROCESSOR) {
+                        if (!IsAWordChar(sc.ch)) {
+                                sc.SetState(SCE_V_DEFAULT);
+                        }
+               } else if (sc.state == SCE_V_COMMENT) {
+                       if (sc.Match('*', '/')) {
+                               sc.Forward();
+                               sc.ForwardSetState(SCE_V_DEFAULT);
+                       }
+               } else if (sc.state == SCE_V_COMMENTLINE || sc.state == SCE_V_COMMENTLINEBANG) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_V_DEFAULT);
+                       }
+                } else if (sc.state == SCE_V_STRING) {
+                       if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\"') {
+                               sc.ForwardSetState(SCE_V_DEFAULT);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_V_STRINGEOL);
+                               sc.ForwardSetState(SCE_V_DEFAULT);
+                       }
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_V_DEFAULT) {
+                       if (IsADigit(sc.ch) || (sc.ch == '\'') || (sc.ch == '.' && IsADigit(sc.chNext))) {
+                               sc.SetState(SCE_V_NUMBER);
+                       } else if (IsAWordStart(sc.ch)) {
+                               sc.SetState(SCE_V_IDENTIFIER);
+                       } else if (sc.Match('/', '*')) {
+                                sc.SetState(SCE_V_COMMENT);
+                               sc.Forward();   // Eat the * so it isn't used for the end of the comment
+                       } else if (sc.Match('/', '/')) {
+                               if (sc.Match("//!"))    // Nice to have a different comment style
+                                       sc.SetState(SCE_V_COMMENTLINEBANG);
+                               else
+                                       sc.SetState(SCE_V_COMMENTLINE);
+                       } else if (sc.ch == '\"') {
+                               sc.SetState(SCE_V_STRING);
+                       } else if (sc.ch == '`') {
+                               sc.SetState(SCE_V_PREPROCESSOR);
+                               // Skip whitespace between ` and preprocessor word
+                               do {
+                                       sc.Forward();
+                               } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More());
+                               if (sc.atLineEnd) {
+                                       sc.SetState(SCE_V_DEFAULT);
+                               }
+                       } else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '#') {
+                               sc.SetState(SCE_V_OPERATOR);
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+static bool IsStreamCommentStyle(int style) {
+       return style == SCE_V_COMMENT;
+}
+
+// Store both the current line's fold level and the next lines in the
+// level store to make it easy to pick up with each increment
+// and to make it possible to fiddle the current level for "} else {".
+static void FoldNoBoxVerilogDoc(unsigned int startPos, int length, int initStyle,
+                            Accessor &styler) {
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool foldPreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0;
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0;
+        // Verilog specific folding options:
+        // fold_at_module -
+        //      Generally used methodology in verilog code is
+        //      one module per file, so folding at module definition is useless.
+        // fold_at_brace/parenthese -
+        //      Folding of long port lists can be convenient. 
+       bool foldAtModule = styler.GetPropertyInt("fold.verilog.flags", 0) != 0;
+       bool foldAtBrace  = 1;
+       bool foldAtParenthese  = 1;
+                                
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelCurrent = SC_FOLDLEVELBASE;
+       if (lineCurrent > 0)
+               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+       int levelMinCurrent = levelCurrent;
+       int levelNext = levelCurrent;
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       int style = initStyle;
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               int stylePrev = style;
+               style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if (foldComment && IsStreamCommentStyle(style)) {
+                       if (!IsStreamCommentStyle(stylePrev)) {
+                               levelNext++;
+                       } else if (!IsStreamCommentStyle(styleNext) && !atEOL) {
+                               // Comments don't end at end of line and the next character may be unstyled.
+                               levelNext--;
+                       }
+               }
+               if (foldComment && (style == SCE_V_COMMENTLINE)) {
+                       if ((ch == '/') && (chNext == '/')) {
+                               char chNext2 = styler.SafeGetCharAt(i + 2);
+                               if (chNext2 == '{') {
+                                       levelNext++;
+                               } else if (chNext2 == '}') {
+                                       levelNext--;
+                               }
+                       }
+               }
+               if (foldPreprocessor && (style == SCE_V_PREPROCESSOR)) {
+                       if (ch == '`') {
+                               unsigned int j = i + 1;
+                               while ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {
+                                       j++;
+                               }
+                               if (styler.Match(j, "if")) {
+                                       levelNext++;
+                               } else if (styler.Match(j, "end")) {
+                                       levelNext--;
+                               }
+                       }
+               }
+                if (style == SCE_V_OPERATOR) {
+                    if (foldAtParenthese) {
+                       if (ch == '(') {
+                               levelNext++;
+                       } else if (ch == ')') {
+                               levelNext--;
+                       }
+                    }
+               }
+                if (style == SCE_V_OPERATOR) {
+                    if (foldAtBrace) {
+                       if (ch == '{') {
+                               levelNext++;
+                       } else if (ch == '}') {
+                               levelNext--;
+                       }
+                    }
+               }
+                if (style == SCE_V_WORD && stylePrev != SCE_V_WORD) {
+                        unsigned int j = i;
+                        if (styler.Match(j, "case") || 
+                            styler.Match(j, "casex") || 
+                            styler.Match(j, "casez") || 
+                            styler.Match(j, "function") || 
+                            styler.Match(j, "fork") || 
+                            styler.Match(j, "table") || 
+                            styler.Match(j, "task") || 
+                            styler.Match(j, "specify") || 
+                            styler.Match(j, "primitive") || 
+                            styler.Match(j, "module") && foldAtModule || 
+                            styler.Match(j, "begin")) {
+                                levelNext++;
+                        } else if (styler.Match(j, "endcase") || 
+                                   styler.Match(j, "endfunction") ||
+                                   styler.Match(j, "join") ||
+                                   styler.Match(j, "endtask") ||
+                                   styler.Match(j, "endtable") ||
+                                   styler.Match(j, "endspecify") ||
+                                   styler.Match(j, "endprimitive") ||
+                                   styler.Match(j, "endmodule") && foldAtModule ||
+                                   styler.Match(j, "end") && !IsAWordChar(styler.SafeGetCharAt(j+3))) {
+                                levelNext--;
+                        }
+               }
+               if (atEOL) {
+                       int levelUse = levelCurrent;
+                       if (foldAtElse) {
+                               levelUse = levelMinCurrent;
+                       }
+                       int lev = levelUse | levelNext << 16;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if (levelUse < levelNext)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelCurrent = levelNext;
+                       levelMinCurrent = levelCurrent;
+                       visibleChars = 0;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+}
+
+static void FoldVerilogDoc(unsigned int startPos, int length, int initStyle, WordList *[],
+                       Accessor &styler) {
+       FoldNoBoxVerilogDoc(startPos, length, initStyle, styler);
+}
+
+static const char * const verilogWordLists[] = {
+            "Primary keywords and identifiers",
+            "Secondary keywords and identifiers",
+            "System Tasks",
+            "User defined tasks and identifiers",
+            "Unused",
+            0,
+        };
+
+
+LexerModule lmVerilog(SCLEX_VERILOG, ColouriseVerilogDoc, "verilog", FoldVerilogDoc, verilogWordLists);
index 658d5046a431cd6532e050a42dd626dae6162ca2..d0a7f8b0f7f1c8ff6b69637e9a7d2aa7466d3b1f 100644 (file)
@@ -71,6 +71,264 @@ bool EqualCaseInsensitive(const char *a, const char *b) {
        return 0 == CompareCaseInsensitive(a, b);
 }
 
        return 0 == CompareCaseInsensitive(a, b);
 }
 
+// Since the CaseInsensitive functions declared in SString
+// are implemented here, I will for now put the non-inline
+// implementations of the SString members here as well, so
+// that I can quickly see what effect this has.
+
+SString::SString(int i) : sizeGrowth(sizeGrowthDefault) {
+       char number[32];
+       sprintf(number, "%0d", i);
+       s = StringAllocate(number);
+       sSize = sLen = (s) ? strlen(s) : 0;
+}
+
+SString::SString(double d, int precision) : sizeGrowth(sizeGrowthDefault) {
+       char number[32];
+       sprintf(number, "%.*f", precision, d);
+       s = StringAllocate(number);
+       sSize = sLen = (s) ? strlen(s) : 0;
+}
+
+bool SString::grow(lenpos_t lenNew) {
+       while (sizeGrowth * 6 < lenNew) {
+               sizeGrowth *= 2;
+       }
+       char *sNew = new char[lenNew + sizeGrowth + 1];
+       if (sNew) {
+               if (s) {
+                       memcpy(sNew, s, sLen);
+                       delete []s;
+               }
+               s = sNew;
+               s[sLen] = '\0';
+               sSize = lenNew + sizeGrowth;
+       }
+       return sNew != 0;
+}
+
+SString &SString::assign(const char *sOther, lenpos_t sSize_) {
+       if (!sOther) {
+               sSize_ = 0;
+       } else if (sSize_ == measure_length) {
+               sSize_ = strlen(sOther);
+       }
+       if (sSize > 0 && sSize_ <= sSize) {     // Does not allocate new buffer if the current is big enough
+               if (s && sSize_) {
+                       memcpy(s, sOther, sSize_);
+               }
+               s[sSize_] = '\0';
+               sLen = sSize_;
+       } else {
+               delete []s;
+               s = StringAllocate(sOther, sSize_);
+               if (s) {
+                       sSize = sSize_; // Allow buffer bigger than real string, thus providing space to grow
+                       sLen = strlen(s);
+               } else {
+                       sSize = sLen = 0;
+               }
+       }
+       return *this;
+}
+
+bool SString::operator==(const SString &sOther) const {
+       if ((s == 0) && (sOther.s == 0))
+               return true;
+       if ((s == 0) || (sOther.s == 0))
+               return false;
+       return strcmp(s, sOther.s) == 0;
+}
+
+bool SString::operator==(const char *sOther) const {
+       if ((s == 0) && (sOther == 0))
+               return true;
+       if ((s == 0) || (sOther == 0))
+               return false;
+       return strcmp(s, sOther) == 0;
+}
+
+SString SString::substr(lenpos_t subPos, lenpos_t subLen) const {
+       if (subPos >= sLen) {
+               return SString();                                       // return a null string if start index is out of bounds
+       }
+       if ((subLen == measure_length) || (subPos + subLen > sLen)) {
+               subLen = sLen - subPos;         // can't substr past end of source string
+       }
+       return SString(s, subPos, subPos + subLen);
+}
+
+SString &SString::lowercase(lenpos_t subPos, lenpos_t subLen) {
+       if ((subLen == measure_length) || (subPos + subLen > sLen)) {
+               subLen = sLen - subPos;         // don't apply past end of string
+       }
+       for (lenpos_t i = subPos; i < subPos + subLen; i++) {
+               if (s[i] < 'A' || s[i] > 'Z')
+                       continue;
+               else
+                       s[i] = static_cast<char>(s[i] - 'A' + 'a');
+       }
+       return *this;
+}
+
+SString &SString::uppercase(lenpos_t subPos, lenpos_t subLen) {
+       if ((subLen == measure_length) || (subPos + subLen > sLen)) {
+               subLen = sLen - subPos;         // don't apply past end of string
+       }
+       for (lenpos_t i = subPos; i < subPos + subLen; i++) {
+               if (s[i] < 'a' || s[i] > 'z')
+                       continue;
+               else
+                       s[i] = static_cast<char>(s[i] - 'a' + 'A');
+       }
+       return *this;
+}
+
+SString &SString::append(const char *sOther, lenpos_t sLenOther, char sep) {
+       if (!sOther) {
+               return *this;
+       }
+       if (sLenOther == measure_length) {
+               sLenOther = strlen(sOther);
+       }
+       int lenSep = 0;
+       if (sLen && sep) {      // Only add a separator if not empty
+               lenSep = 1;
+       }
+       lenpos_t lenNew = sLen + sLenOther + lenSep;
+       // Conservative about growing the buffer: don't do it, unless really needed
+       if ((lenNew < sSize) || (grow(lenNew))) {
+               if (lenSep) {
+                       s[sLen] = sep;
+                       sLen++;
+               }
+               memcpy(&s[sLen], sOther, sLenOther);
+               sLen += sLenOther;
+               s[sLen] = '\0';
+       }
+       return *this;
+}
+
+SString &SString::insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther) {
+       if (!sOther || pos > sLen) {
+               return *this;
+       }
+       if (sLenOther == measure_length) {
+               sLenOther = strlen(sOther);
+       }
+       lenpos_t lenNew = sLen + sLenOther;
+       // Conservative about growing the buffer: don't do it, unless really needed
+       if ((lenNew < sSize) || grow(lenNew)) {
+               lenpos_t moveChars = sLen - pos + 1;
+               for (lenpos_t i = moveChars; i > 0; i--) {
+                       s[pos + sLenOther + i - 1] = s[pos + i - 1];
+               }
+               memcpy(s + pos, sOther, sLenOther);
+               sLen = lenNew;
+       }
+       return *this;
+}
+
+/**
+ * Remove @a len characters from the @a pos position, included.
+ * Characters at pos + len and beyond replace characters at pos.
+ * If @a len is 0, or greater than the length of the string
+ * starting at @a pos, the string is just truncated at @a pos.
+ */
+void SString::remove(lenpos_t pos, lenpos_t len) {
+       if (pos >= sLen) {
+               return;
+       }
+       if (len < 1 || pos + len >= sLen) {
+               s[pos] = '\0';
+               sLen = pos;
+       } else {
+               for (lenpos_t i = pos; i < sLen - len + 1; i++) {
+                       s[i] = s[i+len];
+               }
+               sLen -= len;
+       }
+}
+
+bool SString::startswith(const char *prefix) {
+       lenpos_t lenPrefix = strlen(prefix);
+       if (lenPrefix > sLen) {
+               return false;
+       }
+       return strncmp(s, prefix, lenPrefix) == 0;
+}
+
+bool SString::endswith(const char *suffix) {
+       lenpos_t lenSuffix = strlen(suffix);
+       if (lenSuffix > sLen) {
+               return false;
+       }
+       return strncmp(s + sLen - lenSuffix, suffix, lenSuffix) == 0;
+}
+
+int SString::search(const char *sFind, lenpos_t start) const {
+       if (start < sLen) {
+               const char *sFound = strstr(s + start, sFind);
+               if (sFound) {
+                       return sFound - s;
+               }
+       }
+       return -1;
+}
+
+int SString::substitute(char chFind, char chReplace) {
+       int c = 0;
+       char *t = s;
+       while (t) {
+               t = strchr(t, chFind);
+               if (t) {
+                       *t = chReplace;
+                       t++;
+                       c++;
+               }
+       }
+       return c;
+}
+
+int SString::substitute(const char *sFind, const char *sReplace) {
+       int c = 0;
+       lenpos_t lenFind = strlen(sFind);
+       lenpos_t lenReplace = strlen(sReplace);
+       int posFound = search(sFind);
+       while (posFound >= 0) {
+               remove(posFound, lenFind);
+               insert(posFound, sReplace, lenReplace);
+               posFound = search(sFind, posFound + lenReplace);
+               c++;
+       }
+       return c;
+}
+
+char *SContainer::StringAllocate(lenpos_t len) {
+       if (len != measure_length) {
+               return new char[len + 1];
+       } else {
+               return 0;
+       }
+}
+
+char *SContainer::StringAllocate(const char *s, lenpos_t len) {
+       if (s == 0) {
+               return 0;
+       }
+       if (len == measure_length) {
+               len = strlen(s);
+       }
+       char *sNew = new char[len + 1];
+       if (sNew) {
+               memcpy(sNew, s, len);
+               sNew[len] = '\0';
+       }
+       return sNew;
+}
+
+// End SString functions
+
 PropSet::PropSet() {
        superPS = 0;
        for (int root = 0; root < hashRoots; root++)
 PropSet::PropSet() {
        superPS = 0;
        for (int root = 0; root < hashRoots; root++)
@@ -596,8 +854,8 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
-                                       } 
-                                       else if (cond > 0) 
+                                       }
+                                       else if (cond > 0)
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
@@ -633,8 +891,8 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
                                                // Found another word
                                                first = pivot;
                                                end = pivot - 1;
-                                       } 
-                                       else if (cond > 0) 
+                                       }
+                                       else if (cond > 0)
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
                                                start = pivot + 1;
                                        else if (cond <= 0)
                                                break;
@@ -695,8 +953,9 @@ char *WordList::GetNearestWords(
     const char *wordStart,
     int searchLen /*= -1*/,
     bool ignoreCase /*= false*/,
     const char *wordStart,
     int searchLen /*= -1*/,
     bool ignoreCase /*= false*/,
-    char otherSeparator /*= '\0'*/) {
-       int wordlen; // length of the word part (before the '(' brace) of the api array element
+    char otherSeparator /*= '\0'*/,
+    bool exactLen /*=false*/) {
+       unsigned int wordlen; // length of the word part (before the '(' brace) of the api array element
        SString wordsNear;
        wordsNear.setsizegrowth(1000);
        int start = 0; // lower bound of the api array block to search
        SString wordsNear;
        wordsNear.setsizegrowth(1000);
        int start = 0; // lower bound of the api array block to search
@@ -726,6 +985,8 @@ char *WordList::GetNearestWords(
                                        (0 == CompareNCaseInsensitive(wordStart,
                                                wordsNoCase[pivot], searchLen))) {
                                        wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;
                                        (0 == CompareNCaseInsensitive(wordStart,
                                                wordsNoCase[pivot], searchLen))) {
                                        wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;
+                                       if (exactLen && wordlen != LengthWord(wordStart, otherSeparator) + 1)
+                                               break;
                                        wordsNear.append(wordsNoCase[pivot], wordlen, ' ');
                                        ++pivot;
                                }
                                        wordsNear.append(wordsNoCase[pivot], wordlen, ' ');
                                        ++pivot;
                                }
@@ -752,6 +1013,8 @@ char *WordList::GetNearestWords(
                                        (0 == strncmp(wordStart,
                                                words[pivot], searchLen))) {
                                        wordlen = LengthWord(words[pivot], otherSeparator) + 1;
                                        (0 == strncmp(wordStart,
                                                words[pivot], searchLen))) {
                                        wordlen = LengthWord(words[pivot], otherSeparator) + 1;
+                                       if (exactLen && wordlen != LengthWord(wordStart, otherSeparator) + 1)
+                                               break;
                                        wordsNear.append(words[pivot], wordlen, ' ');
                                        ++pivot;
                                }
                                        wordsNear.append(words[pivot], wordlen, ' ');
                                        ++pivot;
                                }
index e42b5dc65ea0b0e065295df708d615e6a3e0729b..cc02674b355995c6284b3b19579930c449420039 100644 (file)
@@ -297,7 +297,7 @@ void ScintillaBase::AutoCompleteCharacterAdded(char ch) {
 }
 
 void ScintillaBase::AutoCompleteCharacterDeleted() {
 }
 
 void ScintillaBase::AutoCompleteCharacterDeleted() {
-       if (currentPos <= ac.posStart - ac.startLen) {
+       if (currentPos < ac.posStart - ac.startLen) {
                ac.Cancel();
        } else if (ac.cancelAtStartPos && (currentPos <= ac.posStart)) {
                ac.Cancel();
                ac.Cancel();
        } else if (ac.cancelAtStartPos && (currentPos <= ac.posStart)) {
                ac.Cancel();
@@ -314,6 +314,8 @@ void ScintillaBase::AutoCompleteCompleted() {
                ac.lb->GetValue(item, selected, sizeof(selected));
        }
        ac.Cancel();
                ac.lb->GetValue(item, selected, sizeof(selected));
        }
        ac.Cancel();
+       if (item == -1)
+               return;
 
        if (listType > 0) {
                userListSelected = selected;
 
        if (listType > 0) {
                userListSelected = selected;
index 2aea5fef98b42c9dd5e4c4eb28a0cde878ee27cb..f01aee0826c820e8b9db9d069379abfe8507a4f1 100644 (file)
@@ -67,8 +67,8 @@ Style &Style::operator=(const Style &source) {
 
 void Style::Clear(ColourDesired fore_, ColourDesired back_, int size_,
                   const char *fontName_, int characterSet_,
 
 void Style::Clear(ColourDesired fore_, ColourDesired back_, int size_,
                   const char *fontName_, int characterSet_,
-                  bool bold_, bool italic_, bool eolFilled_, 
-                  bool underline_, ecaseForced caseForce_, 
+                  bool bold_, bool italic_, bool eolFilled_,
+                  bool underline_, ecaseForced caseForce_,
                  bool visible_, bool changeable_, bool hotspot_) {
        fore.desired = fore_;
        back.desired = back_;
                  bool visible_, bool changeable_, bool hotspot_) {
        fore.desired = fore_;
        back.desired = back_;
@@ -102,7 +102,7 @@ void Style::ClearTo(const Style &source) {
                source.eolFilled,
                source.underline,
                source.caseForce,
                source.eolFilled,
                source.underline,
                source.caseForce,
-               source.visible, 
+               source.visible,
                source.changeable,
                source.hotspot);
 }
                source.changeable,
                source.hotspot);
 }
index bb94c25ef5716889cfc704b3b496ce3ecc0861ac..c0f7eca266ac9e2f0225ec3e9d057b93ac05acc2 100644 (file)
@@ -44,8 +44,8 @@ public:
        void Clear(ColourDesired fore_, ColourDesired back_,
                   int size_,
                   const char *fontName_, int characterSet_,
        void Clear(ColourDesired fore_, ColourDesired back_,
                   int size_,
                   const char *fontName_, int characterSet_,
-                  bool bold_, bool italic_, bool eolFilled_, 
-                  bool underline_, ecaseForced caseForce_, 
+                  bool bold_, bool italic_, bool eolFilled_,
+                  bool underline_, ecaseForced caseForce_,
                   bool visible_, bool changeable_, bool hotspot_);
        void ClearTo(const Style &source);
        bool EquivalentFontTo(const Style *other) const;
                   bool visible_, bool changeable_, bool hotspot_);
        void ClearTo(const Style &source);
        bool EquivalentFontTo(const Style *other) const;
index 64fc7a048e0be5cc7d11a2e0dd679ec9d2a6ac5c..d9da0edc47af689c57944109764ee810b247d19e 100644 (file)
@@ -2,7 +2,7 @@
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // This file is in the public domain.
 
 #include <stdlib.h>
 // This file is in the public domain.
 
 #include <stdlib.h>
index f2f8305c940b1dbc8e06c7d8dc5eea8c7f4b9b22..aedebbc012cba8ecb134fb735d37aa87dd333e35 100644 (file)
@@ -2,7 +2,7 @@
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
 /** @file StyleContext.cxx
  ** Lexer infrastructure.
  **/
-// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
 // This file is in the public domain.
 
 // All languages handled so far can treat all characters >= 0x80 as one class
 // This file is in the public domain.
 
 // All languages handled so far can treat all characters >= 0x80 as one class
@@ -156,3 +156,13 @@ inline bool IsASpaceOrTab(unsigned int ch) {
 inline bool IsADigit(unsigned int ch) {
        return (ch >= '0') && (ch <= '9');
 }
 inline bool IsADigit(unsigned int ch) {
        return (ch >= '0') && (ch <= '9');
 }
+
+inline bool IsADigit(unsigned int ch, unsigned int base) {
+       if (base <= 10) {
+               return (ch >= '0') && (ch < '0' + base);
+       } else {
+               return ((ch >= '0') && (ch <= '9')) ||
+                      ((ch >= 'A') && (ch < 'A' + base - 10)) ||
+                      ((ch >= 'a') && (ch < 'a' + base - 10));
+       }
+}
index 80e8fc8a0dcd7158430a1e9451efda40e6ced6a2..c52f1e47287a51a1a1ed45acf8a2f54500332a0e 100644 (file)
@@ -98,6 +98,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        edgecolour.desired = source.edgecolour.desired;
        edgeState = source.edgeState;
        caretWidth = source.caretWidth;
        edgecolour.desired = source.edgecolour.desired;
        edgeState = source.edgeState;
        caretWidth = source.caretWidth;
+       someStylesProtected = false;
        leftMarginWidth = source.leftMarginWidth;
        rightMarginWidth = source.rightMarginWidth;
        for (int i=0;i < margins; i++) {
        leftMarginWidth = source.leftMarginWidth;
        rightMarginWidth = source.rightMarginWidth;
        for (int i=0;i < margins; i++) {
@@ -111,7 +112,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        viewIndentationGuides = source.viewIndentationGuides;
        viewEOL = source.viewEOL;
        showMarkedLines = source.showMarkedLines;
        viewIndentationGuides = source.viewIndentationGuides;
        viewEOL = source.viewEOL;
        showMarkedLines = source.showMarkedLines;
-        extraFontFlag = source.extraFontFlag;
+       extraFontFlag = source.extraFontFlag;
 }
 
 ViewStyle::~ViewStyle() {
 }
 
 ViewStyle::~ViewStyle() {
@@ -193,7 +194,7 @@ void ViewStyle::Init() {
        viewIndentationGuides = false;
        viewEOL = false;
        showMarkedLines = true;
        viewIndentationGuides = false;
        viewEOL = false;
        showMarkedLines = true;
-        extraFontFlag = false;
+       extraFontFlag = false;
 }
 
 void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
 }
 
 void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
index 79d885fd9f7f7decf94abe9d2583e5d478f94cbd..d06c0200272de604f482998a7d609efb4971a252 100644 (file)
@@ -89,8 +89,8 @@ public:
        int edgeState;
        int caretWidth;
        bool someStylesProtected;
        int edgeState;
        int caretWidth;
        bool someStylesProtected;
-        bool extraFontFlag;
-    
+       bool extraFontFlag;
+
        ViewStyle();
        ViewStyle(const ViewStyle &source);
        ~ViewStyle();
        ViewStyle();
        ViewStyle(const ViewStyle &source);
        ~ViewStyle();
index e693736a21c3e50831cf2d876b91d523d43f4037..d3bbb4dcc12176b8a797a424cb8674f7ddfafb6d 100644 (file)
 #include "XPM.h"
 
 static const char *NextField(const char *s) {
 #include "XPM.h"
 
 static const char *NextField(const char *s) {
+       // In case there are leading spaces in the string
+       while (*s && *s == ' ') {
+               s++;
+       }
        while (*s && *s != ' ') {
                s++;
        }
        while (*s && *s != ' ') {
                s++;
        }
@@ -70,8 +74,10 @@ void XPM::Init(const char *textForm) {
        if ((0 == memcmp(textForm, "/* X", 4)) && (0 == memcmp(textForm, "/* XPM */", 9))) {
                // Build the lines form out of the text form
                const char **linesForm = LinesFormFromTextForm(textForm);
        if ((0 == memcmp(textForm, "/* X", 4)) && (0 == memcmp(textForm, "/* XPM */", 9))) {
                // Build the lines form out of the text form
                const char **linesForm = LinesFormFromTextForm(textForm);
-               Init(linesForm);
-               delete []linesForm;
+               if (linesForm != 0) {
+                       Init(linesForm);
+                       delete []linesForm;
+               }
        } else {
                // It is really in line form
                Init(reinterpret_cast<const char * const *>(textForm));
        } else {
                // It is really in line form
                Init(reinterpret_cast<const char * const *>(textForm));
@@ -190,9 +196,11 @@ const char **XPM::LinesFormFromTextForm(const char *textForm) {
        const char **linesForm = 0;
        int countQuotes = 0;
        int strings=1;
        const char **linesForm = 0;
        int countQuotes = 0;
        int strings=1;
-       for (int j=0; countQuotes < (2*strings); j++) {
+       int j=0;
+       for (; countQuotes < (2*strings) && textForm[j] != '\0'; j++) {
                if (textForm[j] == '\"') {
                        if (countQuotes == 0) {
                if (textForm[j] == '\"') {
                        if (countQuotes == 0) {
+                               // First field: width, height, number of colors, chars per pixel
                                const char *line0 = textForm + j + 1;
                                // Skip width
                                line0 = NextField(line0);
                                const char *line0 = textForm + j + 1;
                                // Skip width
                                line0 = NextField(line0);
@@ -202,13 +210,24 @@ const char **XPM::LinesFormFromTextForm(const char *textForm) {
                                // Add 1 line for each colour
                                strings += atoi(line0);
                                linesForm = new const char *[strings];
                                // Add 1 line for each colour
                                strings += atoi(line0);
                                linesForm = new const char *[strings];
+                               if (linesForm == 0) {
+                                       break;  // Memory error!
+                               }
+                       }
+                       if (countQuotes / 2 >= strings) {
+                               break;  // Bad height or number of colors!
                        }
                        }
-                       if (linesForm && ((countQuotes & 1) == 0)) {
+                       if ((countQuotes & 1) == 0) {
                                linesForm[countQuotes / 2] = textForm + j + 1;
                        }
                        countQuotes++;
                }
        }
                                linesForm[countQuotes / 2] = textForm + j + 1;
                        }
                        countQuotes++;
                }
        }
+       if (textForm[j] == '\0' || countQuotes / 2 > strings) {
+               // Malformed XPM! Height + number of colors too high or too low
+               delete []linesForm;
+               linesForm = 0;
+       }
        return linesForm;
 }
 
        return linesForm;
 }
 
index 8ab07a92ab201863553defe45bd764fa7ae9afe1..a9a1d9fffb1fc762e418b44e1e98f768aff8e806 100644 (file)
@@ -193,7 +193,7 @@ long wxStyledTextCtrl::SendMsg(int msg, long wp, long lp) {
 //       this file.  Edit stc.cpp.in or gen_iface.py instead and regenerate.
 
 
 //       this file.  Edit stc.cpp.in or gen_iface.py instead and regenerate.
 
 
-// Add text to the document.
+// Add text to the document at current position.
 void wxStyledTextCtrl::AddText(const wxString& text) {
                     wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
                     SendMsg(2001, strlen(buf), (long)(const char*)buf);
 void wxStyledTextCtrl::AddText(const wxString& text) {
                     wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
                     SendMsg(2001, strlen(buf), (long)(const char*)buf);
@@ -219,7 +219,7 @@ void wxStyledTextCtrl::ClearDocumentStyle() {
     SendMsg(2005, 0, 0);
 }
 
     SendMsg(2005, 0, 0);
 }
 
-// The number of characters in the document.
+// Returns the number of characters in the document.
 int wxStyledTextCtrl::GetLength() {
     return SendMsg(2006, 0, 0);
 }
 int wxStyledTextCtrl::GetLength() {
     return SendMsg(2006, 0, 0);
 }
@@ -1514,6 +1514,36 @@ int wxStyledTextCtrl::GetWrapMode() {
     return SendMsg(2269, 0, 0);
 }
 
     return SendMsg(2269, 0, 0);
 }
 
+// Set the display mode of visual flags for wrapped lines.
+void wxStyledTextCtrl::SetWrapVisualFlags(int wrapVisualFlags) {
+    SendMsg(2460, wrapVisualFlags, 0);
+}
+
+// Retrive the display mode of visual flags for wrapped lines.
+int wxStyledTextCtrl::GetWrapVisualFlags() {
+    return SendMsg(2461, 0, 0);
+}
+
+// Set the location of visual flags for wrapped lines.
+void wxStyledTextCtrl::SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation) {
+    SendMsg(2462, wrapVisualFlagsLocation, 0);
+}
+
+// Retrive the location of visual flags for wrapped lines.
+int wxStyledTextCtrl::GetWrapVisualFlagsLocation() {
+    return SendMsg(2463, 0, 0);
+}
+
+// Set the start indent for wrapped lines.
+void wxStyledTextCtrl::SetWrapStartIndent(int indent) {
+    SendMsg(2464, indent, 0);
+}
+
+// Retrive the start indent for wrapped lines.
+int wxStyledTextCtrl::GetWrapStartIndent() {
+    return SendMsg(2465, 0, 0);
+}
+
 // Sets the degree of caching of layout information.
 void wxStyledTextCtrl::SetLayoutCache(int mode) {
     SendMsg(2272, mode, 0);
 // Sets the degree of caching of layout information.
 void wxStyledTextCtrl::SetLayoutCache(int mode) {
     SendMsg(2272, mode, 0);
@@ -2345,6 +2375,11 @@ int wxStyledTextCtrl::AutoCompGetCurrent() {
     return SendMsg(2445, 0, 0);
 }
 
     return SendMsg(2445, 0, 0);
 }
 
+// Enlarge the document to a particular size of text bytes.
+void wxStyledTextCtrl::Allocate(int bytes) {
+    SendMsg(2446, bytes, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
index 550607c831cef94f9fb89183ea1b539627c880c5..22cf8a17c1e3761d3cb4395010cd5813808eaaf3 100644 (file)
 %rename(STC_TIME_FOREVER)                   wxSTC_TIME_FOREVER;
 %rename(STC_WRAP_NONE)                      wxSTC_WRAP_NONE;
 %rename(STC_WRAP_WORD)                      wxSTC_WRAP_WORD;
 %rename(STC_TIME_FOREVER)                   wxSTC_TIME_FOREVER;
 %rename(STC_WRAP_NONE)                      wxSTC_WRAP_NONE;
 %rename(STC_WRAP_WORD)                      wxSTC_WRAP_WORD;
+%rename(STC_WRAPVISUALFLAG_NONE)            wxSTC_WRAPVISUALFLAG_NONE;
+%rename(STC_WRAPVISUALFLAG_END)             wxSTC_WRAPVISUALFLAG_END;
+%rename(STC_WRAPVISUALFLAG_START)           wxSTC_WRAPVISUALFLAG_START;
+%rename(STC_WRAPVISUALFLAGLOC_DEFAULT)      wxSTC_WRAPVISUALFLAGLOC_DEFAULT;
+%rename(STC_WRAPVISUALFLAGLOC_END_BY_TEXT)  wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT;
+%rename(STC_WRAPVISUALFLAGLOC_START_BY_TEXT)  wxSTC_WRAPVISUALFLAGLOC_START_BY_TEXT;
 %rename(STC_CACHE_NONE)                     wxSTC_CACHE_NONE;
 %rename(STC_CACHE_CARET)                    wxSTC_CACHE_CARET;
 %rename(STC_CACHE_PAGE)                     wxSTC_CACHE_PAGE;
 %rename(STC_CACHE_NONE)                     wxSTC_CACHE_NONE;
 %rename(STC_CACHE_CARET)                    wxSTC_CACHE_CARET;
 %rename(STC_CACHE_PAGE)                     wxSTC_CACHE_PAGE;
 %rename(STC_LEX_FORTH)                      wxSTC_LEX_FORTH;
 %rename(STC_LEX_ERLANG)                     wxSTC_LEX_ERLANG;
 %rename(STC_LEX_OCTAVE)                     wxSTC_LEX_OCTAVE;
 %rename(STC_LEX_FORTH)                      wxSTC_LEX_FORTH;
 %rename(STC_LEX_ERLANG)                     wxSTC_LEX_ERLANG;
 %rename(STC_LEX_OCTAVE)                     wxSTC_LEX_OCTAVE;
+%rename(STC_LEX_MSSQL)                      wxSTC_LEX_MSSQL;
+%rename(STC_LEX_VERILOG)                    wxSTC_LEX_VERILOG;
+%rename(STC_LEX_KIX)                        wxSTC_LEX_KIX;
+%rename(STC_LEX_GUI4CLI)                    wxSTC_LEX_GUI4CLI;
+%rename(STC_LEX_SPECMAN)                    wxSTC_LEX_SPECMAN;
+%rename(STC_LEX_AU3)                        wxSTC_LEX_AU3;
+%rename(STC_LEX_APDL)                       wxSTC_LEX_APDL;
+%rename(STC_LEX_BASH)                       wxSTC_LEX_BASH;
 %rename(STC_LEX_AUTOMATIC)                  wxSTC_LEX_AUTOMATIC;
 %rename(STC_P_DEFAULT)                      wxSTC_P_DEFAULT;
 %rename(STC_P_COMMENTLINE)                  wxSTC_P_COMMENTLINE;
 %rename(STC_LEX_AUTOMATIC)                  wxSTC_LEX_AUTOMATIC;
 %rename(STC_P_DEFAULT)                      wxSTC_P_DEFAULT;
 %rename(STC_P_COMMENTLINE)                  wxSTC_P_COMMENTLINE;
 %rename(STC_HP_DEFNAME)                     wxSTC_HP_DEFNAME;
 %rename(STC_HP_OPERATOR)                    wxSTC_HP_OPERATOR;
 %rename(STC_HP_IDENTIFIER)                  wxSTC_HP_IDENTIFIER;
 %rename(STC_HP_DEFNAME)                     wxSTC_HP_DEFNAME;
 %rename(STC_HP_OPERATOR)                    wxSTC_HP_OPERATOR;
 %rename(STC_HP_IDENTIFIER)                  wxSTC_HP_IDENTIFIER;
+%rename(STC_HPHP_COMPLEX_VARIABLE)          wxSTC_HPHP_COMPLEX_VARIABLE;
 %rename(STC_HPA_START)                      wxSTC_HPA_START;
 %rename(STC_HPA_DEFAULT)                    wxSTC_HPA_DEFAULT;
 %rename(STC_HPA_COMMENTLINE)                wxSTC_HPA_COMMENTLINE;
 %rename(STC_HPA_START)                      wxSTC_HPA_START;
 %rename(STC_HPA_DEFAULT)                    wxSTC_HPA_DEFAULT;
 %rename(STC_HPA_COMMENTLINE)                wxSTC_HPA_COMMENTLINE;
 %rename(STC_B_KEYWORD2)                     wxSTC_B_KEYWORD2;
 %rename(STC_B_KEYWORD3)                     wxSTC_B_KEYWORD3;
 %rename(STC_B_KEYWORD4)                     wxSTC_B_KEYWORD4;
 %rename(STC_B_KEYWORD2)                     wxSTC_B_KEYWORD2;
 %rename(STC_B_KEYWORD3)                     wxSTC_B_KEYWORD3;
 %rename(STC_B_KEYWORD4)                     wxSTC_B_KEYWORD4;
+%rename(STC_B_CONSTANT)                     wxSTC_B_CONSTANT;
+%rename(STC_B_ASM)                          wxSTC_B_ASM;
 %rename(STC_PROPS_DEFAULT)                  wxSTC_PROPS_DEFAULT;
 %rename(STC_PROPS_COMMENT)                  wxSTC_PROPS_COMMENT;
 %rename(STC_PROPS_SECTION)                  wxSTC_PROPS_SECTION;
 %rename(STC_PROPS_DEFAULT)                  wxSTC_PROPS_DEFAULT;
 %rename(STC_PROPS_COMMENT)                  wxSTC_PROPS_COMMENT;
 %rename(STC_PROPS_SECTION)                  wxSTC_PROPS_SECTION;
 %rename(STC_ERR_IFC)                        wxSTC_ERR_IFC;
 %rename(STC_ERR_IFORT)                      wxSTC_ERR_IFORT;
 %rename(STC_ERR_ABSF)                       wxSTC_ERR_ABSF;
 %rename(STC_ERR_IFC)                        wxSTC_ERR_IFC;
 %rename(STC_ERR_IFORT)                      wxSTC_ERR_IFORT;
 %rename(STC_ERR_ABSF)                       wxSTC_ERR_ABSF;
+%rename(STC_ERR_TIDY)                       wxSTC_ERR_TIDY;
 %rename(STC_BAT_DEFAULT)                    wxSTC_BAT_DEFAULT;
 %rename(STC_BAT_COMMENT)                    wxSTC_BAT_COMMENT;
 %rename(STC_BAT_WORD)                       wxSTC_BAT_WORD;
 %rename(STC_BAT_DEFAULT)                    wxSTC_BAT_DEFAULT;
 %rename(STC_BAT_COMMENT)                    wxSTC_BAT_COMMENT;
 %rename(STC_BAT_WORD)                       wxSTC_BAT_WORD;
 %rename(STC_NSIS_IFDEFINEDEF)               wxSTC_NSIS_IFDEFINEDEF;
 %rename(STC_NSIS_MACRODEF)                  wxSTC_NSIS_MACRODEF;
 %rename(STC_NSIS_STRINGVAR)                 wxSTC_NSIS_STRINGVAR;
 %rename(STC_NSIS_IFDEFINEDEF)               wxSTC_NSIS_IFDEFINEDEF;
 %rename(STC_NSIS_MACRODEF)                  wxSTC_NSIS_MACRODEF;
 %rename(STC_NSIS_STRINGVAR)                 wxSTC_NSIS_STRINGVAR;
+%rename(STC_NSIS_NUMBER)                    wxSTC_NSIS_NUMBER;
 %rename(STC_MMIXAL_LEADWS)                  wxSTC_MMIXAL_LEADWS;
 %rename(STC_MMIXAL_COMMENT)                 wxSTC_MMIXAL_COMMENT;
 %rename(STC_MMIXAL_LABEL)                   wxSTC_MMIXAL_LABEL;
 %rename(STC_MMIXAL_LEADWS)                  wxSTC_MMIXAL_LEADWS;
 %rename(STC_MMIXAL_COMMENT)                 wxSTC_MMIXAL_COMMENT;
 %rename(STC_MMIXAL_LABEL)                   wxSTC_MMIXAL_LABEL;
 %rename(STC_ERLANG_SEPARATOR)               wxSTC_ERLANG_SEPARATOR;
 %rename(STC_ERLANG_NODE_NAME)               wxSTC_ERLANG_NODE_NAME;
 %rename(STC_ERLANG_UNKNOWN)                 wxSTC_ERLANG_UNKNOWN;
 %rename(STC_ERLANG_SEPARATOR)               wxSTC_ERLANG_SEPARATOR;
 %rename(STC_ERLANG_NODE_NAME)               wxSTC_ERLANG_NODE_NAME;
 %rename(STC_ERLANG_UNKNOWN)                 wxSTC_ERLANG_UNKNOWN;
+%rename(STC_MSSQL_DEFAULT)                  wxSTC_MSSQL_DEFAULT;
+%rename(STC_MSSQL_COMMENT)                  wxSTC_MSSQL_COMMENT;
+%rename(STC_MSSQL_LINE_COMMENT)             wxSTC_MSSQL_LINE_COMMENT;
+%rename(STC_MSSQL_NUMBER)                   wxSTC_MSSQL_NUMBER;
+%rename(STC_MSSQL_STRING)                   wxSTC_MSSQL_STRING;
+%rename(STC_MSSQL_OPERATOR)                 wxSTC_MSSQL_OPERATOR;
+%rename(STC_MSSQL_IDENTIFIER)               wxSTC_MSSQL_IDENTIFIER;
+%rename(STC_MSSQL_VARIABLE)                 wxSTC_MSSQL_VARIABLE;
+%rename(STC_MSSQL_COLUMN_NAME)              wxSTC_MSSQL_COLUMN_NAME;
+%rename(STC_MSSQL_STATEMENT)                wxSTC_MSSQL_STATEMENT;
+%rename(STC_MSSQL_DATATYPE)                 wxSTC_MSSQL_DATATYPE;
+%rename(STC_MSSQL_SYSTABLE)                 wxSTC_MSSQL_SYSTABLE;
+%rename(STC_MSSQL_GLOBAL_VARIABLE)          wxSTC_MSSQL_GLOBAL_VARIABLE;
+%rename(STC_MSSQL_FUNCTION)                 wxSTC_MSSQL_FUNCTION;
+%rename(STC_MSSQL_STORED_PROCEDURE)         wxSTC_MSSQL_STORED_PROCEDURE;
+%rename(STC_MSSQL_DEFAULT_PREF_DATATYPE)    wxSTC_MSSQL_DEFAULT_PREF_DATATYPE;
+%rename(STC_MSSQL_COLUMN_NAME_2)            wxSTC_MSSQL_COLUMN_NAME_2;
+%rename(STC_V_DEFAULT)                      wxSTC_V_DEFAULT;
+%rename(STC_V_COMMENT)                      wxSTC_V_COMMENT;
+%rename(STC_V_COMMENTLINE)                  wxSTC_V_COMMENTLINE;
+%rename(STC_V_COMMENTLINEBANG)              wxSTC_V_COMMENTLINEBANG;
+%rename(STC_V_NUMBER)                       wxSTC_V_NUMBER;
+%rename(STC_V_WORD)                         wxSTC_V_WORD;
+%rename(STC_V_STRING)                       wxSTC_V_STRING;
+%rename(STC_V_WORD2)                        wxSTC_V_WORD2;
+%rename(STC_V_WORD3)                        wxSTC_V_WORD3;
+%rename(STC_V_PREPROCESSOR)                 wxSTC_V_PREPROCESSOR;
+%rename(STC_V_OPERATOR)                     wxSTC_V_OPERATOR;
+%rename(STC_V_IDENTIFIER)                   wxSTC_V_IDENTIFIER;
+%rename(STC_V_STRINGEOL)                    wxSTC_V_STRINGEOL;
+%rename(STC_V_USER)                         wxSTC_V_USER;
+%rename(STC_KIX_DEFAULT)                    wxSTC_KIX_DEFAULT;
+%rename(STC_KIX_COMMENT)                    wxSTC_KIX_COMMENT;
+%rename(STC_KIX_STRING1)                    wxSTC_KIX_STRING1;
+%rename(STC_KIX_STRING2)                    wxSTC_KIX_STRING2;
+%rename(STC_KIX_NUMBER)                     wxSTC_KIX_NUMBER;
+%rename(STC_KIX_VAR)                        wxSTC_KIX_VAR;
+%rename(STC_KIX_MACRO)                      wxSTC_KIX_MACRO;
+%rename(STC_KIX_KEYWORD)                    wxSTC_KIX_KEYWORD;
+%rename(STC_KIX_FUNCTIONS)                  wxSTC_KIX_FUNCTIONS;
+%rename(STC_KIX_OPERATOR)                   wxSTC_KIX_OPERATOR;
+%rename(STC_KIX_IDENTIFIER)                 wxSTC_KIX_IDENTIFIER;
+%rename(STC_GC_DEFAULT)                     wxSTC_GC_DEFAULT;
+%rename(STC_GC_COMMENTLINE)                 wxSTC_GC_COMMENTLINE;
+%rename(STC_GC_COMMENTBLOCK)                wxSTC_GC_COMMENTBLOCK;
+%rename(STC_GC_GLOBAL)                      wxSTC_GC_GLOBAL;
+%rename(STC_GC_EVENT)                       wxSTC_GC_EVENT;
+%rename(STC_GC_ATTRIBUTE)                   wxSTC_GC_ATTRIBUTE;
+%rename(STC_GC_CONTROL)                     wxSTC_GC_CONTROL;
+%rename(STC_GC_COMMAND)                     wxSTC_GC_COMMAND;
+%rename(STC_GC_STRING)                      wxSTC_GC_STRING;
+%rename(STC_GC_OPERATOR)                    wxSTC_GC_OPERATOR;
+%rename(STC_SN_DEFAULT)                     wxSTC_SN_DEFAULT;
+%rename(STC_SN_CODE)                        wxSTC_SN_CODE;
+%rename(STC_SN_COMMENTLINE)                 wxSTC_SN_COMMENTLINE;
+%rename(STC_SN_COMMENTLINEBANG)             wxSTC_SN_COMMENTLINEBANG;
+%rename(STC_SN_NUMBER)                      wxSTC_SN_NUMBER;
+%rename(STC_SN_WORD)                        wxSTC_SN_WORD;
+%rename(STC_SN_STRING)                      wxSTC_SN_STRING;
+%rename(STC_SN_WORD2)                       wxSTC_SN_WORD2;
+%rename(STC_SN_WORD3)                       wxSTC_SN_WORD3;
+%rename(STC_SN_PREPROCESSOR)                wxSTC_SN_PREPROCESSOR;
+%rename(STC_SN_OPERATOR)                    wxSTC_SN_OPERATOR;
+%rename(STC_SN_IDENTIFIER)                  wxSTC_SN_IDENTIFIER;
+%rename(STC_SN_STRINGEOL)                   wxSTC_SN_STRINGEOL;
+%rename(STC_SN_REGEXTAG)                    wxSTC_SN_REGEXTAG;
+%rename(STC_SN_SIGNAL)                      wxSTC_SN_SIGNAL;
+%rename(STC_SN_USER)                        wxSTC_SN_USER;
+%rename(STC_AU3_DEFAULT)                    wxSTC_AU3_DEFAULT;
+%rename(STC_AU3_COMMENT)                    wxSTC_AU3_COMMENT;
+%rename(STC_AU3_COMMENTBLOCK)               wxSTC_AU3_COMMENTBLOCK;
+%rename(STC_AU3_NUMBER)                     wxSTC_AU3_NUMBER;
+%rename(STC_AU3_FUNCTION)                   wxSTC_AU3_FUNCTION;
+%rename(STC_AU3_KEYWORD)                    wxSTC_AU3_KEYWORD;
+%rename(STC_AU3_MACRO)                      wxSTC_AU3_MACRO;
+%rename(STC_AU3_STRING)                     wxSTC_AU3_STRING;
+%rename(STC_AU3_OPERATOR)                   wxSTC_AU3_OPERATOR;
+%rename(STC_AU3_VARIABLE)                   wxSTC_AU3_VARIABLE;
+%rename(STC_AU3_SENT)                       wxSTC_AU3_SENT;
+%rename(STC_AU3_PREPROCESSOR)               wxSTC_AU3_PREPROCESSOR;
+%rename(STC_APDL_DEFAULT)                   wxSTC_APDL_DEFAULT;
+%rename(STC_APDL_COMMENT)                   wxSTC_APDL_COMMENT;
+%rename(STC_APDL_COMMENTBLOCK)              wxSTC_APDL_COMMENTBLOCK;
+%rename(STC_APDL_NUMBER)                    wxSTC_APDL_NUMBER;
+%rename(STC_APDL_STRING)                    wxSTC_APDL_STRING;
+%rename(STC_APDL_WORD)                      wxSTC_APDL_WORD;
+%rename(STC_APDL_COMMAND)                   wxSTC_APDL_COMMAND;
+%rename(STC_APDL_PROCESSOR)                 wxSTC_APDL_PROCESSOR;
+%rename(STC_APDL_FUNCTION)                  wxSTC_APDL_FUNCTION;
+%rename(STC_SH_DEFAULT)                     wxSTC_SH_DEFAULT;
+%rename(STC_SH_ERROR)                       wxSTC_SH_ERROR;
+%rename(STC_SH_COMMENTLINE)                 wxSTC_SH_COMMENTLINE;
+%rename(STC_SH_NUMBER)                      wxSTC_SH_NUMBER;
+%rename(STC_SH_WORD)                        wxSTC_SH_WORD;
+%rename(STC_SH_STRING)                      wxSTC_SH_STRING;
+%rename(STC_SH_CHARACTER)                   wxSTC_SH_CHARACTER;
+%rename(STC_SH_OPERATOR)                    wxSTC_SH_OPERATOR;
+%rename(STC_SH_IDENTIFIER)                  wxSTC_SH_IDENTIFIER;
+%rename(STC_SH_SCALAR)                      wxSTC_SH_SCALAR;
+%rename(STC_SH_PARAM)                       wxSTC_SH_PARAM;
+%rename(STC_SH_BACKTICKS)                   wxSTC_SH_BACKTICKS;
+%rename(STC_SH_HERE_DELIM)                  wxSTC_SH_HERE_DELIM;
+%rename(STC_SH_HERE_Q)                      wxSTC_SH_HERE_Q;
 %rename(STC_CMD_REDO)                       wxSTC_CMD_REDO;
 %rename(STC_CMD_SELECTALL)                  wxSTC_CMD_SELECTALL;
 %rename(STC_CMD_UNDO)                       wxSTC_CMD_UNDO;
 %rename(STC_CMD_REDO)                       wxSTC_CMD_REDO;
 %rename(STC_CMD_SELECTALL)                  wxSTC_CMD_SELECTALL;
 %rename(STC_CMD_UNDO)                       wxSTC_CMD_UNDO;