OSDN Git Service

Commit DialogBox compile Okay
[tortoisegit/TortoiseGitJp.git] / ext / scintilla / src / LexKix.cxx
1 // Scintilla source code edit control\r
2 /** @file LexKix.cxx\r
3  ** Lexer for KIX-Scripts.\r
4  **/\r
5 // Copyright 2004 by Manfred Becker <manfred@becker-trdf.de>\r
6 // The License.txt file describes the conditions under which this software may be distributed.\r
7 \r
8 #include <stdlib.h>\r
9 #include <string.h>\r
10 #include <ctype.h>\r
11 #include <stdio.h>\r
12 #include <stdarg.h>\r
13 \r
14 #include "Platform.h"\r
15 \r
16 #include "PropSet.h"\r
17 #include "Accessor.h"\r
18 #include "StyleContext.h"\r
19 #include "KeyWords.h"\r
20 #include "Scintilla.h"\r
21 #include "SciLexer.h"\r
22 \r
23 #ifdef SCI_NAMESPACE\r
24 using namespace Scintilla;\r
25 #endif\r
26 \r
27 // Extended to accept accented characters\r
28 static inline bool IsAWordChar(int ch) {\r
29         return ch >= 0x80 || isalnum(ch) || ch == '_';\r
30 }\r
31 \r
32 static inline bool IsOperator(const int ch) {\r
33         return (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '&' || ch == '|' || ch == '<' || ch == '>' || ch == '=');\r
34 }\r
35 \r
36 static void ColouriseKixDoc(unsigned int startPos, int length, int initStyle,\r
37                            WordList *keywordlists[], Accessor &styler) {\r
38 \r
39         WordList &keywords = *keywordlists[0];\r
40         WordList &keywords2 = *keywordlists[1];\r
41         WordList &keywords3 = *keywordlists[2];\r
42 //      WordList &keywords4 = *keywordlists[3];\r
43 \r
44         styler.StartAt(startPos);\r
45 \r
46         StyleContext sc(startPos, length, initStyle, styler);\r
47 \r
48         for (; sc.More(); sc.Forward()) {\r
49 \r
50                 if (sc.state == SCE_KIX_COMMENT) {\r
51                         if (sc.atLineEnd) {\r
52                                 sc.SetState(SCE_KIX_DEFAULT);\r
53                         }\r
54                 } else if (sc.state == SCE_KIX_STRING1) {\r
55                         // This is a doubles quotes string\r
56                         if (sc.ch == '\"') {\r
57                                 sc.ForwardSetState(SCE_KIX_DEFAULT);\r
58                         }\r
59                 } else if (sc.state == SCE_KIX_STRING2) {\r
60                         // This is a single quote string\r
61                         if (sc.ch == '\'') {\r
62                                 sc.ForwardSetState(SCE_KIX_DEFAULT);\r
63                         }\r
64                 } else if (sc.state == SCE_KIX_NUMBER) {\r
65                         if (!IsADigit(sc.ch)) {\r
66                                 sc.SetState(SCE_KIX_DEFAULT);\r
67                         }\r
68                 } else if (sc.state == SCE_KIX_VAR) {\r
69                         if (!IsAWordChar(sc.ch)) {\r
70                                 sc.SetState(SCE_KIX_DEFAULT);\r
71                         }\r
72                 } else if (sc.state == SCE_KIX_MACRO) {\r
73                         if (!IsAWordChar(sc.ch) && !IsADigit(sc.ch)) {\r
74                                 char s[100];\r
75                                 sc.GetCurrentLowered(s, sizeof(s));\r
76 \r
77                                 if (!keywords3.InList(&s[1])) {\r
78                                         sc.ChangeState(SCE_KIX_DEFAULT);\r
79                                 }\r
80                                 sc.SetState(SCE_KIX_DEFAULT);\r
81                         }\r
82                 } else if (sc.state == SCE_KIX_OPERATOR) {\r
83                         if (!IsOperator(sc.ch)) {\r
84                                 sc.SetState(SCE_KIX_DEFAULT);\r
85                         }\r
86                 } else if (sc.state == SCE_KIX_IDENTIFIER) {\r
87                         if (!IsAWordChar(sc.ch)) {\r
88                                 char s[100];\r
89                                 sc.GetCurrentLowered(s, sizeof(s));\r
90 \r
91                                 if (keywords.InList(s)) {\r
92                                         sc.ChangeState(SCE_KIX_KEYWORD);\r
93                                 } else if (keywords2.InList(s)) {\r
94                                         sc.ChangeState(SCE_KIX_FUNCTIONS);\r
95                                 }\r
96                                 sc.SetState(SCE_KIX_DEFAULT);\r
97                         }\r
98                 }\r
99 \r
100                 // Determine if a new state should be entered.\r
101                 if (sc.state == SCE_KIX_DEFAULT) {\r
102                         if (sc.ch == ';') {\r
103                                 sc.SetState(SCE_KIX_COMMENT);\r
104                         } else if (sc.ch == '\"') {\r
105                                 sc.SetState(SCE_KIX_STRING1);\r
106                         } else if (sc.ch == '\'') {\r
107                                 sc.SetState(SCE_KIX_STRING2);\r
108                         } else if (sc.ch == '$') {\r
109                                 sc.SetState(SCE_KIX_VAR);\r
110                         } else if (sc.ch == '@') {\r
111                                 sc.SetState(SCE_KIX_MACRO);\r
112                         } else if (IsADigit(sc.ch) || ((sc.ch == '.' || sc.ch == '&') && IsADigit(sc.chNext))) {\r
113                                 sc.SetState(SCE_KIX_NUMBER);\r
114                         } else if (IsOperator(sc.ch)) {\r
115                                 sc.SetState(SCE_KIX_OPERATOR);\r
116                         } else if (IsAWordChar(sc.ch)) {\r
117                                 sc.SetState(SCE_KIX_IDENTIFIER);\r
118                         }\r
119                 }\r
120         }\r
121         sc.Complete();\r
122 }\r
123 \r
124 \r
125 LexerModule lmKix(SCLEX_KIX, ColouriseKixDoc, "kix");\r
126 \r