]>
git.saurik.com Git - wxWidgets.git/blob - src/stc/scintilla/src/LexMatlab.cxx
f75d15c7ab99379b7185898a8a9f13afe7a94b72
1 // Scintilla source code edit control
2 /** @file LexMatlab.cxx
4 ** Written by José Fonseca
6 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
7 // The License.txt file describes the conditions under which this software may be distributed.
19 #include "StyleContext.h"
21 #include "Scintilla.h"
24 static bool IsMatlabComment(Accessor
&styler
, int pos
, int len
) {
25 return len
> 0 && (styler
[pos
] == '%' || styler
[pos
] == '!') ;
28 static inline bool IsAWordChar(const int ch
) {
29 return (ch
< 0x80) && (isalnum(ch
) || ch
== '_');
32 static inline bool IsAWordStart(const int ch
) {
33 return (ch
< 0x80) && (isalnum(ch
) || ch
== '_');
36 static void ColouriseMatlabDoc(unsigned int startPos
, int length
, int initStyle
,
37 WordList
*keywordlists
[], Accessor
&styler
) {
39 WordList
&keywords
= *keywordlists
[0];
41 styler
.StartAt(startPos
);
43 bool transpose
= false;
45 StyleContext
sc(startPos
, length
, initStyle
, styler
);
47 for (; sc
.More(); sc
.Forward()) {
49 if (sc
.state
== SCE_MATLAB_OPERATOR
) {
50 if (sc
.chPrev
== '.') {
51 if (sc
.ch
== '*' || sc
.ch
== '/' || sc
.ch
== '\\' || sc
.ch
== '^') {
52 sc
.ForwardSetState(SCE_MATLAB_DEFAULT
);
54 } else if (sc
.ch
== '\'') {
55 sc
.ForwardSetState(SCE_MATLAB_DEFAULT
);
58 sc
.SetState(SCE_MATLAB_DEFAULT
);
61 sc
.SetState(SCE_MATLAB_DEFAULT
);
63 } else if (sc
.state
== SCE_MATLAB_KEYWORD
) {
64 if (!isalnum(sc
.ch
) && sc
.ch
!= '_') {
66 sc
.GetCurrentLowered(s
, sizeof(s
));
67 if (keywords
.InList(s
)) {
68 sc
.SetState(SCE_MATLAB_DEFAULT
);
71 sc
.ChangeState(SCE_MATLAB_IDENTIFIER
);
72 sc
.SetState(SCE_MATLAB_DEFAULT
);
76 } else if (sc
.state
== SCE_MATLAB_NUMBER
) {
77 if (!isdigit(sc
.ch
) && sc
.ch
!= '.'
78 && !(sc
.ch
== 'e' || sc
.ch
== 'E')
79 && !((sc
.ch
== '+' || sc
.ch
== '-') && (sc
.chPrev
== 'e' || sc
.chPrev
== 'E'))) {
80 sc
.SetState(SCE_MATLAB_DEFAULT
);
83 } else if (sc
.state
== SCE_MATLAB_STRING
) {
84 // Matlab doubles quotes to preserve them, so just end this string
85 // state now as a following quote will start again
87 sc
.ForwardSetState(SCE_MATLAB_DEFAULT
);
89 } else if (sc
.state
== SCE_MATLAB_COMMENT
|| sc
.state
== SCE_MATLAB_COMMAND
) {
91 sc
.SetState(SCE_MATLAB_DEFAULT
);
96 if (sc
.state
== SCE_MATLAB_DEFAULT
) {
98 sc
.SetState(SCE_MATLAB_COMMENT
);
99 } else if (sc
.ch
== '!') {
100 sc
.SetState(SCE_MATLAB_COMMAND
);
101 } else if (sc
.ch
== '\'') {
103 sc
.SetState(SCE_MATLAB_OPERATOR
);
105 sc
.SetState(SCE_MATLAB_STRING
);
107 } else if (isdigit(sc
.ch
) || (sc
.ch
== '.' && isdigit(sc
.chNext
))) {
108 sc
.SetState(SCE_MATLAB_NUMBER
);
109 } else if (isalpha(sc
.ch
)) {
110 sc
.SetState(SCE_MATLAB_KEYWORD
);
111 } else if (isoperator(static_cast<char>(sc
.ch
)) || sc
.ch
== '@' || sc
.ch
== '\\') {
112 if (sc
.ch
== ')' || sc
.ch
== ']') {
117 sc
.SetState(SCE_MATLAB_OPERATOR
);
126 static void FoldMatlabDoc(unsigned int startPos
, int length
, int,
127 WordList
*[], Accessor
&styler
) {
128 int endPos
= startPos
+ length
;
130 // Backtrack to previous line in case need to fix its fold status
131 int lineCurrent
= styler
.GetLine(startPos
);
133 if (lineCurrent
> 0) {
135 startPos
= styler
.LineStart(lineCurrent
);
139 int indentCurrent
= styler
.IndentAmount(lineCurrent
, &spaceFlags
, IsMatlabComment
);
140 char chNext
= styler
[startPos
];
141 for (int i
= startPos
; i
< endPos
; i
++) {
143 chNext
= styler
.SafeGetCharAt(i
+ 1);
145 if ((ch
== '\r' && chNext
!= '\n') || (ch
== '\n') || (i
== endPos
)) {
146 int lev
= indentCurrent
;
147 int indentNext
= styler
.IndentAmount(lineCurrent
+ 1, &spaceFlags
, IsMatlabComment
);
148 if (!(indentCurrent
& SC_FOLDLEVELWHITEFLAG
)) {
149 // Only non whitespace lines can be headers
150 if ((indentCurrent
& SC_FOLDLEVELNUMBERMASK
) < (indentNext
& SC_FOLDLEVELNUMBERMASK
)) {
151 lev
|= SC_FOLDLEVELHEADERFLAG
;
152 } else if (indentNext
& SC_FOLDLEVELWHITEFLAG
) {
153 // Line after is blank so check the next - maybe should continue further?
155 int indentNext2
= styler
.IndentAmount(lineCurrent
+ 2, &spaceFlags2
, IsMatlabComment
);
156 if ((indentCurrent
& SC_FOLDLEVELNUMBERMASK
) < (indentNext2
& SC_FOLDLEVELNUMBERMASK
)) {
157 lev
|= SC_FOLDLEVELHEADERFLAG
;
161 indentCurrent
= indentNext
;
162 styler
.SetLevel(lineCurrent
, lev
);
168 LexerModule
lmMatlab(SCLEX_MATLAB
, ColouriseMatlabDoc
, "matlab", FoldMatlabDoc
);