OSDN Git Service

Commit DialogBox compile Okay
[tortoisegit/TortoiseGitJp.git] / ext / scintilla / src / LexAVE.cxx
1 // SciTE - Scintilla based Text Editor\r
2 /** @file LexAVE.cxx\r
3  ** Lexer for Avenue.\r
4  **\r
5   ** Written by Alexey Yutkin <yutkin@geol.msu.ru>.\r
6  **/\r
7 // Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\r
8 // The License.txt file describes the conditions under which this software may be distributed.\r
9 \r
10 #include <stdlib.h>\r
11 #include <string.h>\r
12 #include <ctype.h>\r
13 #include <stdarg.h>\r
14 #include <stdio.h>\r
15 \r
16 #include "Platform.h"\r
17 \r
18 #include "PropSet.h"\r
19 #include "Accessor.h"\r
20 #include "StyleContext.h"\r
21 #include "KeyWords.h"\r
22 #include "Scintilla.h"\r
23 #include "SciLexer.h"\r
24 \r
25 #ifdef SCI_NAMESPACE\r
26 using namespace Scintilla;\r
27 #endif\r
28 \r
29 \r
30 static inline bool IsAWordChar(const int ch) {\r
31         return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\r
32 }\r
33 static inline bool IsEnumChar(const int ch) {\r
34         return (ch < 0x80) && (isalnum(ch)|| ch == '_');\r
35 }\r
36 static inline bool IsANumberChar(const int ch) {\r
37         return (ch < 0x80) && (isalnum(ch) || ch == '.' );\r
38 }\r
39 \r
40 inline bool IsAWordStart(const int ch) {\r
41         return (ch < 0x80) && (isalnum(ch) || ch == '_');\r
42 }\r
43 \r
44 inline bool isAveOperator(char ch) {\r
45         if (isalnum(ch))\r
46                 return false;\r
47         // '.' left out as it is used to make up numbers\r
48         if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\r
49                 ch == '(' || ch == ')' || ch == '=' ||\r
50                 ch == '{' || ch == '}' ||\r
51                 ch == '[' || ch == ']' || ch == ';' ||\r
52                 ch == '<' || ch == '>' || ch == ',' ||\r
53                 ch == '.'  )\r
54                 return true;\r
55         return false;\r
56 }\r
57 \r
58 static void ColouriseAveDoc(\r
59         unsigned int startPos,\r
60         int length,\r
61         int initStyle,\r
62         WordList *keywordlists[],\r
63         Accessor &styler) {\r
64 \r
65         WordList &keywords = *keywordlists[0];\r
66         WordList &keywords2 = *keywordlists[1];\r
67         WordList &keywords3 = *keywordlists[2];\r
68         WordList &keywords4 = *keywordlists[3];\r
69         WordList &keywords5 = *keywordlists[4];\r
70         WordList &keywords6 = *keywordlists[5];\r
71 \r
72         // Do not leak onto next line\r
73         if (initStyle == SCE_AVE_STRINGEOL) {\r
74                 initStyle = SCE_AVE_DEFAULT;\r
75         }\r
76 \r
77         StyleContext sc(startPos, length, initStyle, styler);\r
78 \r
79         for (; sc.More(); sc.Forward()) {\r
80                 if (sc.atLineEnd) {\r
81                         // Update the line state, so it can be seen by next line\r
82                         int currentLine = styler.GetLine(sc.currentPos);\r
83                         styler.SetLineState(currentLine, 0);\r
84                 }\r
85                 if (sc.atLineStart && (sc.state == SCE_AVE_STRING)) {\r
86                         // Prevent SCE_AVE_STRINGEOL from leaking back to previous line\r
87                         sc.SetState(SCE_AVE_STRING);\r
88                 }\r
89 \r
90 \r
91                 // Determine if the current state should terminate.\r
92                 if (sc.state == SCE_AVE_OPERATOR) {\r
93                         sc.SetState(SCE_AVE_DEFAULT);\r
94                 } else if (sc.state == SCE_AVE_NUMBER) {\r
95                         if (!IsANumberChar(sc.ch)) {\r
96                                 sc.SetState(SCE_AVE_DEFAULT);\r
97                         }\r
98                 } else if (sc.state == SCE_AVE_ENUM) {\r
99                         if (!IsEnumChar(sc.ch)) {\r
100                                 sc.SetState(SCE_AVE_DEFAULT);\r
101                         }\r
102                 } else if (sc.state == SCE_AVE_IDENTIFIER) {\r
103                         if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {\r
104                                 char s[100];\r
105                                 //sc.GetCurrent(s, sizeof(s));\r
106                                 sc.GetCurrentLowered(s, sizeof(s));\r
107                                 if (keywords.InList(s)) {\r
108                                         sc.ChangeState(SCE_AVE_WORD);\r
109                                 } else if (keywords2.InList(s)) {\r
110                                         sc.ChangeState(SCE_AVE_WORD2);\r
111                                 } else if (keywords3.InList(s)) {\r
112                                         sc.ChangeState(SCE_AVE_WORD3);\r
113                                 } else if (keywords4.InList(s)) {\r
114                                         sc.ChangeState(SCE_AVE_WORD4);\r
115                                 } else if (keywords5.InList(s)) {\r
116                                         sc.ChangeState(SCE_AVE_WORD5);\r
117                                 } else if (keywords6.InList(s)) {\r
118                                         sc.ChangeState(SCE_AVE_WORD6);\r
119                                 }\r
120                                 sc.SetState(SCE_AVE_DEFAULT);\r
121                         }\r
122                 } else if (sc.state == SCE_AVE_COMMENT) {\r
123                         if (sc.atLineEnd) {\r
124                                 sc.SetState(SCE_AVE_DEFAULT);\r
125                         }\r
126                 } else if (sc.state == SCE_AVE_STRING) {\r
127                          if (sc.ch == '\"') {\r
128                                 sc.ForwardSetState(SCE_AVE_DEFAULT);\r
129                         } else if (sc.atLineEnd) {\r
130                                 sc.ChangeState(SCE_AVE_STRINGEOL);\r
131                                 sc.ForwardSetState(SCE_AVE_DEFAULT);\r
132                         }\r
133                 }\r
134 \r
135                 // Determine if a new state should be entered.\r
136                 if (sc.state == SCE_AVE_DEFAULT) {\r
137                         if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\r
138                                 sc.SetState(SCE_AVE_NUMBER);\r
139                         } else if (IsAWordStart(sc.ch)) {\r
140                                 sc.SetState(SCE_AVE_IDENTIFIER);\r
141                         } else if (sc.Match('\"')) {\r
142                                 sc.SetState(SCE_AVE_STRING);\r
143                         } else if (sc.Match('\'')) {\r
144                                 sc.SetState(SCE_AVE_COMMENT);\r
145                                 sc.Forward();\r
146                         } else if (isAveOperator(static_cast<char>(sc.ch))) {\r
147                                 sc.SetState(SCE_AVE_OPERATOR);\r
148                         } else if (sc.Match('#')) {\r
149                                 sc.SetState(SCE_AVE_ENUM);\r
150                                 sc.Forward();\r
151                         }\r
152                 }\r
153         }\r
154         sc.Complete();\r
155 }\r
156 \r
157 static void FoldAveDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],\r
158                        Accessor &styler) {\r
159         unsigned int lengthDoc = startPos + length;\r
160         int visibleChars = 0;\r
161         int lineCurrent = styler.GetLine(startPos);\r
162         int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\r
163         int levelCurrent = levelPrev;\r
164         char chNext = static_cast<char>(tolower(styler[startPos]));\r
165         bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;\r
166         int styleNext = styler.StyleAt(startPos);\r
167         char s[10];\r
168 \r
169         for (unsigned int i = startPos; i < lengthDoc; i++) {\r
170                 char ch = static_cast<char>(tolower(chNext));\r
171                 chNext = static_cast<char>(tolower(styler.SafeGetCharAt(i + 1)));\r
172                 int style = styleNext;\r
173                 styleNext = styler.StyleAt(i + 1);\r
174                 bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');\r
175                 if (style == SCE_AVE_WORD) {\r
176                         if (ch == 't' || ch == 'f' || ch == 'w' || ch == 'e') {\r
177                                 for (unsigned int j = 0; j < 6; j++) {\r
178                                         if (!iswordchar(styler[i + j])) {\r
179                                                 break;\r
180                                         }\r
181                                         s[j] = static_cast<char>(tolower(styler[i + j]));\r
182                                         s[j + 1] = '\0';\r
183                                 }\r
184 \r
185                                 if ((strcmp(s, "then") == 0) || (strcmp(s, "for") == 0) || (strcmp(s, "while") == 0)) {\r
186                                         levelCurrent++;\r
187                                 }\r
188                                 if ((strcmp(s, "end") == 0) || (strcmp(s, "elseif") == 0)) {\r
189                                         // Normally "elseif" and "then" will be on the same line and will cancel\r
190                                         // each other out.  // As implemented, this does not support fold.at.else.\r
191                                         levelCurrent--;\r
192                                 }\r
193                         }\r
194                 } else if (style == SCE_AVE_OPERATOR) {\r
195                         if (ch == '{' || ch == '(') {\r
196                                 levelCurrent++;\r
197                         } else if (ch == '}' || ch == ')') {\r
198                                 levelCurrent--;\r
199                         }\r
200                 }\r
201 \r
202                 if (atEOL) {\r
203                         int lev = levelPrev;\r
204                         if (visibleChars == 0 && foldCompact) {\r
205                                 lev |= SC_FOLDLEVELWHITEFLAG;\r
206                         }\r
207                         if ((levelCurrent > levelPrev) && (visibleChars > 0)) {\r
208                                 lev |= SC_FOLDLEVELHEADERFLAG;\r
209                         }\r
210                         if (lev != styler.LevelAt(lineCurrent)) {\r
211                                 styler.SetLevel(lineCurrent, lev);\r
212                         }\r
213                         lineCurrent++;\r
214                         levelPrev = levelCurrent;\r
215                         visibleChars = 0;\r
216                 }\r
217                 if (!isspacechar(ch)) {\r
218                         visibleChars++;\r
219                 }\r
220         }\r
221         // Fill in the real level of the next line, keeping the current flags as they will be filled in later\r
222 \r
223         int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\r
224         styler.SetLevel(lineCurrent, levelPrev | flagsNext);\r
225 }\r
226 \r
227 LexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, "ave", FoldAveDoc);\r
228 \r