OSDN Git Service

Commit DialogBox compile Okay
[tortoisegit/TortoiseGitJp.git] / ext / scintilla / src / LexAsm.cxx
1 // Scintilla source code edit control\r
2 /** @file LexAsm.cxx\r
3  ** Lexer for Assembler, just for the MASM syntax\r
4  ** Written by The Black Horus\r
5  ** Enhancements and NASM stuff by Kein-Hong Man, 2003-10\r
6  ** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring\r
7  **/\r
8 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\r
9 // The License.txt file describes the conditions under which this software may be distributed.\r
10 \r
11 #include <stdlib.h>\r
12 #include <string.h>\r
13 #include <ctype.h>\r
14 #include <stdio.h>\r
15 #include <stdarg.h>\r
16 \r
17 #include "Platform.h"\r
18 \r
19 #include "PropSet.h"\r
20 #include "Accessor.h"\r
21 #include "StyleContext.h"\r
22 #include "KeyWords.h"\r
23 #include "Scintilla.h"\r
24 #include "SciLexer.h"\r
25 \r
26 #ifdef SCI_NAMESPACE\r
27 using namespace Scintilla;\r
28 #endif\r
29 \r
30 static inline bool IsAWordChar(const int ch) {\r
31         return (ch < 0x80) && (isalnum(ch) || ch == '.' ||\r
32                 ch == '_' || ch == '?');\r
33 }\r
34 \r
35 static inline bool IsAWordStart(const int ch) {\r
36         return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' ||\r
37                 ch == '%' || ch == '@' || ch == '$' || ch == '?');\r
38 }\r
39 \r
40 static inline bool IsAsmOperator(const int ch) {\r
41         if ((ch < 0x80) && (isalnum(ch)))\r
42                 return false;\r
43         // '.' left out as it is used to make up numbers\r
44         if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\r
45                 ch == '(' || ch == ')' || ch == '=' || ch == '^' ||\r
46                 ch == '[' || ch == ']' || ch == '<' || ch == '&' ||\r
47                 ch == '>' || ch == ',' || ch == '|' || ch == '~' ||\r
48                 ch == '%' || ch == ':')\r
49                 return true;\r
50         return false;\r
51 }\r
52 \r
53 static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\r
54                             Accessor &styler) {\r
55 \r
56         WordList &cpuInstruction = *keywordlists[0];\r
57         WordList &mathInstruction = *keywordlists[1];\r
58         WordList &registers = *keywordlists[2];\r
59         WordList &directive = *keywordlists[3];\r
60         WordList &directiveOperand = *keywordlists[4];\r
61         WordList &extInstruction = *keywordlists[5];\r
62 \r
63         // Do not leak onto next line\r
64         if (initStyle == SCE_ASM_STRINGEOL)\r
65                 initStyle = SCE_ASM_DEFAULT;\r
66 \r
67         StyleContext sc(startPos, length, initStyle, styler);\r
68 \r
69         for (; sc.More(); sc.Forward())\r
70         {\r
71 \r
72                 // Prevent SCE_ASM_STRINGEOL from leaking back to previous line\r
73                 if (sc.atLineStart && (sc.state == SCE_ASM_STRING)) {\r
74                         sc.SetState(SCE_ASM_STRING);\r
75                 } else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) {\r
76                         sc.SetState(SCE_ASM_CHARACTER);\r
77                 }\r
78 \r
79                 // Handle line continuation generically.\r
80                 if (sc.ch == '\\') {\r
81                         if (sc.chNext == '\n' || sc.chNext == '\r') {\r
82                                 sc.Forward();\r
83                                 if (sc.ch == '\r' && sc.chNext == '\n') {\r
84                                         sc.Forward();\r
85                                 }\r
86                                 continue;\r
87                         }\r
88                 }\r
89 \r
90                 // Determine if the current state should terminate.\r
91                 if (sc.state == SCE_ASM_OPERATOR) {\r
92                         if (!IsAsmOperator(sc.ch)) {\r
93                             sc.SetState(SCE_ASM_DEFAULT);\r
94                         }\r
95                 }else if (sc.state == SCE_ASM_NUMBER) {\r
96                         if (!IsAWordChar(sc.ch)) {\r
97                                 sc.SetState(SCE_ASM_DEFAULT);\r
98                         }\r
99                 } else if (sc.state == SCE_ASM_IDENTIFIER) {\r
100                         if (!IsAWordChar(sc.ch) ) {\r
101                                 char s[100];\r
102                                 sc.GetCurrentLowered(s, sizeof(s));\r
103 \r
104                                 if (cpuInstruction.InList(s)) {\r
105                                         sc.ChangeState(SCE_ASM_CPUINSTRUCTION);\r
106                                 } else if (mathInstruction.InList(s)) {\r
107                                         sc.ChangeState(SCE_ASM_MATHINSTRUCTION);\r
108                                 } else if (registers.InList(s)) {\r
109                                         sc.ChangeState(SCE_ASM_REGISTER);\r
110                                 }  else if (directive.InList(s)) {\r
111                                         sc.ChangeState(SCE_ASM_DIRECTIVE);\r
112                                 } else if (directiveOperand.InList(s)) {\r
113                                         sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND);\r
114                                 } else if (extInstruction.InList(s)) {\r
115                                         sc.ChangeState(SCE_ASM_EXTINSTRUCTION);\r
116                                 }\r
117                                 sc.SetState(SCE_ASM_DEFAULT);\r
118                         }\r
119                 }\r
120                 else if (sc.state == SCE_ASM_COMMENT ) {\r
121                         if (sc.atLineEnd) {\r
122                                 sc.SetState(SCE_ASM_DEFAULT);\r
123                         }\r
124                 } else if (sc.state == SCE_ASM_STRING) {\r
125                         if (sc.ch == '\\') {\r
126                                 if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {\r
127                                         sc.Forward();\r
128                                 }\r
129                         } else if (sc.ch == '\"') {\r
130                                 sc.ForwardSetState(SCE_ASM_DEFAULT);\r
131                         } else if (sc.atLineEnd) {\r
132                                 sc.ChangeState(SCE_ASM_STRINGEOL);\r
133                                 sc.ForwardSetState(SCE_ASM_DEFAULT);\r
134                         }\r
135                 } else if (sc.state == SCE_ASM_CHARACTER) {\r
136                         if (sc.ch == '\\') {\r
137                                 if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {\r
138                                         sc.Forward();\r
139                                 }\r
140                         } else if (sc.ch == '\'') {\r
141                                 sc.ForwardSetState(SCE_ASM_DEFAULT);\r
142                         } else if (sc.atLineEnd) {\r
143                                 sc.ChangeState(SCE_ASM_STRINGEOL);\r
144                                 sc.ForwardSetState(SCE_ASM_DEFAULT);\r
145                         }\r
146                 }\r
147 \r
148                 // Determine if a new state should be entered.\r
149                 if (sc.state == SCE_ASM_DEFAULT) {\r
150                         if (sc.ch == ';'){\r
151                                 sc.SetState(SCE_ASM_COMMENT);\r
152                         } else if (isascii(sc.ch) && (isdigit(sc.ch) || (sc.ch == '.' && isascii(sc.chNext) && isdigit(sc.chNext)))) {\r
153                                 sc.SetState(SCE_ASM_NUMBER);\r
154                         } else if (IsAWordStart(sc.ch)) {\r
155                                 sc.SetState(SCE_ASM_IDENTIFIER);\r
156                         } else if (sc.ch == '\"') {\r
157                                 sc.SetState(SCE_ASM_STRING);\r
158                         } else if (sc.ch == '\'') {\r
159                                 sc.SetState(SCE_ASM_CHARACTER);\r
160                         } else if (IsAsmOperator(sc.ch)) {\r
161                                 sc.SetState(SCE_ASM_OPERATOR);\r
162                         }\r
163                 }\r
164 \r
165         }\r
166         sc.Complete();\r
167 }\r
168 \r
169 static const char * const asmWordListDesc[] = {\r
170         "CPU instructions",\r
171         "FPU instructions",\r
172         "Registers",\r
173         "Directives",\r
174         "Directive operands",\r
175         "Extended instructions",\r
176         0\r
177 };\r
178 \r
179 LexerModule lmAsm(SCLEX_ASM, ColouriseAsmDoc, "asm", 0, asmWordListDesc);\r
180 \r