OSDN Git Service

Commit DialogBox compile Okay
[tortoisegit/TortoiseGitJp.git] / ext / scintilla / src / LexPLM.cxx
1 // Copyright (c) 1990-2007, Scientific Toolworks, Inc.\r
2 // Author: Jason Haslam\r
3 // The License.txt file describes the conditions under which this software may be distributed.\r
4 \r
5 #include <stdlib.h>\r
6 #include <string.h>\r
7 #include <ctype.h>\r
8 #include <stdio.h>\r
9 #include <stdarg.h>\r
10 \r
11 #include "Platform.h"\r
12 \r
13 #include "PropSet.h"\r
14 #include "Accessor.h"\r
15 #include "KeyWords.h"\r
16 #include "Scintilla.h"\r
17 #include "SciLexer.h"\r
18 #include "StyleContext.h"\r
19 \r
20 #ifdef SCI_NAMESPACE\r
21 using namespace Scintilla;\r
22 #endif\r
23 \r
24 static void GetRange(unsigned int start,\r
25                      unsigned int end,\r
26                      Accessor &styler,\r
27                      char *s,\r
28                      unsigned int len) {\r
29         unsigned int i = 0;\r
30         while ((i < end - start + 1) && (i < len-1)) {\r
31                 s[i] = static_cast<char>(tolower(styler[start + i]));\r
32                 i++;\r
33         }\r
34         s[i] = '\0';\r
35 }\r
36 \r
37 static void ColourisePlmDoc(unsigned int startPos,\r
38                             int length,\r
39                             int initStyle,\r
40                             WordList *keywordlists[],\r
41                             Accessor &styler)\r
42 {\r
43         unsigned int endPos = startPos + length;\r
44         int state = initStyle;\r
45 \r
46         styler.StartAt(startPos);\r
47         styler.StartSegment(startPos);\r
48 \r
49         for (unsigned int i = startPos; i < endPos; i++) {\r
50                 char ch = styler.SafeGetCharAt(i);\r
51                 char chNext = styler.SafeGetCharAt(i + 1);\r
52 \r
53                 if (state == SCE_PLM_DEFAULT) {\r
54                         if (ch == '/' && chNext == '*') {\r
55                                 styler.ColourTo(i - 1, state);\r
56                                 state = SCE_PLM_COMMENT;\r
57                         } else if (ch == '\'') {\r
58                                 styler.ColourTo(i - 1, state);\r
59                                 state = SCE_PLM_STRING;\r
60                         } else if (isdigit(ch)) {\r
61                                 styler.ColourTo(i - 1, state);\r
62                                 state = SCE_PLM_NUMBER;\r
63                         } else if (isalpha(ch)) {\r
64                                 styler.ColourTo(i - 1, state);\r
65                                 state = SCE_PLM_IDENTIFIER;\r
66                         } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||\r
67                                    ch == '=' || ch == '<' || ch == '>' || ch == ':') {\r
68                                 styler.ColourTo(i - 1, state);\r
69                                 state = SCE_PLM_OPERATOR;\r
70                         } else if (ch == '$') {\r
71                                 styler.ColourTo(i - 1, state);\r
72                                 state = SCE_PLM_CONTROL;\r
73                         }\r
74                 } else if (state == SCE_PLM_COMMENT) {\r
75                         if (ch == '*' && chNext == '/') {\r
76                                 i++;\r
77                                 styler.ColourTo(i, state);\r
78                                 state = SCE_PLM_DEFAULT;\r
79                         }\r
80                 } else if (state == SCE_PLM_STRING) {\r
81                         if (ch == '\'') {\r
82                                 if (chNext == '\'') {\r
83                                         i++;\r
84                                 } else {\r
85                                         styler.ColourTo(i, state);\r
86                                         state = SCE_PLM_DEFAULT;\r
87                                 }\r
88                         }\r
89                 } else if (state == SCE_PLM_NUMBER) {\r
90                         if (!isdigit(ch) && !isalpha(ch) && ch != '$') {\r
91                                 i--;\r
92                                 styler.ColourTo(i, state);\r
93                                 state = SCE_PLM_DEFAULT;\r
94                         }\r
95                 } else if (state == SCE_PLM_IDENTIFIER) {\r
96                         if (!isdigit(ch) && !isalpha(ch) && ch != '$') {\r
97                                 // Get the entire identifier.\r
98                                 char word[1024];\r
99                                 int segmentStart = styler.GetStartSegment();\r
100                                 GetRange(segmentStart, i - 1, styler, word, sizeof(word));\r
101 \r
102                                 i--;\r
103                                 if (keywordlists[0]->InList(word))\r
104                                         styler.ColourTo(i, SCE_PLM_KEYWORD);\r
105                                 else\r
106                                         styler.ColourTo(i, state);\r
107                                 state = SCE_PLM_DEFAULT;\r
108                         }\r
109                 } else if (state == SCE_PLM_OPERATOR) {\r
110                         if (ch != '=' && ch != '>') {\r
111                                 i--;\r
112                                 styler.ColourTo(i, state);\r
113                                 state = SCE_PLM_DEFAULT;\r
114                         }\r
115                 } else if (state == SCE_PLM_CONTROL) {\r
116                         if (ch == '\r' || ch == '\n') {\r
117                                 styler.ColourTo(i - 1, state);\r
118                                 state = SCE_PLM_DEFAULT;\r
119                         }\r
120                 }\r
121         }\r
122         styler.ColourTo(endPos - 1, state);\r
123 }\r
124 \r
125 static void FoldPlmDoc(unsigned int startPos,\r
126                        int length,\r
127                        int initStyle,\r
128                        WordList *[],\r
129                        Accessor &styler)\r
130 {\r
131         bool foldComment = styler.GetPropertyInt("fold.comment") != 0;\r
132         bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;\r
133         unsigned int endPos = startPos + length;\r
134         int visibleChars = 0;\r
135         int lineCurrent = styler.GetLine(startPos);\r
136         int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\r
137         int levelCurrent = levelPrev;\r
138         char chNext = styler[startPos];\r
139         int styleNext = styler.StyleAt(startPos);\r
140         int style = initStyle;\r
141         int startKeyword = 0;\r
142 \r
143         for (unsigned int i = startPos; i < endPos; i++) {\r
144                 char ch = chNext;\r
145                 chNext = styler.SafeGetCharAt(i + 1);\r
146                 int stylePrev = style;\r
147                 style = styleNext;\r
148                 styleNext = styler.StyleAt(i + 1);\r
149                 bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');\r
150 \r
151                 if (stylePrev != SCE_PLM_KEYWORD && style == SCE_PLM_KEYWORD)\r
152                         startKeyword = i;\r
153 \r
154                 if (style == SCE_PLM_KEYWORD && styleNext != SCE_PLM_KEYWORD) {\r
155                         char word[1024];\r
156                         GetRange(startKeyword, i, styler, word, sizeof(word));\r
157 \r
158                         if (strcmp(word, "procedure") == 0 || strcmp(word, "do") == 0)\r
159                                 levelCurrent++;\r
160                         else if (strcmp(word, "end") == 0)\r
161                                 levelCurrent--;\r
162                 }\r
163 \r
164                 if (foldComment) {\r
165                         if (stylePrev != SCE_PLM_COMMENT && style == SCE_PLM_COMMENT)\r
166                                 levelCurrent++;\r
167                         else if (stylePrev == SCE_PLM_COMMENT && style != SCE_PLM_COMMENT)\r
168                                 levelCurrent--;\r
169                 }\r
170 \r
171                 if (atEOL) {\r
172                         int lev = levelPrev;\r
173                         if (visibleChars == 0 && foldCompact)\r
174                                 lev |= SC_FOLDLEVELWHITEFLAG;\r
175                         if ((levelCurrent > levelPrev) && (visibleChars > 0))\r
176                                 lev |= SC_FOLDLEVELHEADERFLAG;\r
177                         if (lev != styler.LevelAt(lineCurrent)) {\r
178                                 styler.SetLevel(lineCurrent, lev);\r
179                         }\r
180                         lineCurrent++;\r
181                         levelPrev = levelCurrent;\r
182                         visibleChars = 0;\r
183                 }\r
184 \r
185                 if (!isspacechar(ch))\r
186                         visibleChars++;\r
187         }\r
188 \r
189         int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\r
190         styler.SetLevel(lineCurrent, levelPrev | flagsNext);\r
191 }\r
192 \r
193 static const char *const plmWordListDesc[] = {\r
194         "Keywords",\r
195         0\r
196 };\r
197 \r
198 LexerModule lmPLM(SCLEX_PLM, ColourisePlmDoc, "PL/M", FoldPlmDoc, plmWordListDesc);\r