aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/ScintillaHistory.html4
-rw-r--r--include/SciLexer.h1
-rw-r--r--include/Scintilla.iface1
-rw-r--r--lexers/LexSQL.cxx32
4 files changed, 37 insertions, 1 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index b14e6458c..b2fa52fb2 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -458,6 +458,7 @@
</tr><tr>
<td>danselmi</td>
<td>Mat Berchtold</td>
+ <td>Michael Staszewski</td>
</tr>
</table>
<p>
@@ -481,6 +482,9 @@
<a href="http://sourceforge.net/p/scintilla/feature-requests/1071/">Feature #1071.</a>
</li>
<li>
+ SQL lexer supports the q-quote operator as SCE_SQL_QOPERATOR(24).
+ </li>
+ <li>
VHDL lexer supports block comments.
<a href="http://sourceforge.net/p/scintilla/bugs/1527/">Bug #1527</a>.
</li>
diff --git a/include/SciLexer.h b/include/SciLexer.h
index acb9eacc3..dc75a98b6 100644
--- a/include/SciLexer.h
+++ b/include/SciLexer.h
@@ -1117,6 +1117,7 @@
#define SCE_SQL_USER3 21
#define SCE_SQL_USER4 22
#define SCE_SQL_QUOTEDIDENTIFIER 23
+#define SCE_SQL_QOPERATOR 24
#define SCE_ST_DEFAULT 0
#define SCE_ST_STRING 1
#define SCE_ST_NUMBER 2
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index a30ed897f..134078786 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -3827,6 +3827,7 @@ val SCE_SQL_USER2=20
val SCE_SQL_USER3=21
val SCE_SQL_USER4=22
val SCE_SQL_QUOTEDIDENTIFIER=23
+val SCE_SQL_QOPERATOR=24
# Lexical states for SCLEX_SMALLTALK
lex Smalltalk=SCLEX_SMALLTALK SCE_ST_
val SCE_ST_DEFAULT=0
diff --git a/lexers/LexSQL.cxx b/lexers/LexSQL.cxx
index fa22f8e63..b9f15ea1a 100644
--- a/lexers/LexSQL.cxx
+++ b/lexers/LexSQL.cxx
@@ -444,6 +444,8 @@ void SCI_METHOD LexerSQL::Lex(unsigned int startPos, int length, int initStyle,
StyleContext sc(startPos, length, initStyle, styler);
int styleBeforeDCKeyword = SCE_SQL_DEFAULT;
int offset = 0;
+ char qOperator = 0x00;
+
for (; sc.More(); sc.Forward(), offset++) {
// Determine if the current state should terminate.
switch (sc.state) {
@@ -556,11 +558,39 @@ void SCI_METHOD LexerSQL::Lex(unsigned int startPos, int length, int initStyle,
}
}
break;
+ case SCE_SQL_QOPERATOR:
+ if (qOperator == 0x00) {
+ qOperator = sc.ch;
+ } else {
+ char qComplement = 0x00;
+
+ if (qOperator == '<') {
+ qComplement = '>';
+ } else if (qOperator == '(') {
+ qComplement = ')';
+ } else if (qOperator == '{') {
+ qComplement = '}';
+ } else if (qOperator == '[') {
+ qComplement = ']';
+ } else {
+ qComplement = qOperator;
+ }
+
+ if (sc.Match(qComplement, '\'')) {
+ sc.Forward();
+ sc.ForwardSetState(SCE_SQL_DEFAULT);
+ qOperator = 0x00;
+ }
+ }
+ break;
}
// Determine if a new state should be entered.
if (sc.state == SCE_SQL_DEFAULT) {
- if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
+ if (sc.Match('q', '\'') || sc.Match('Q', '\'')) {
+ sc.SetState(SCE_SQL_QOPERATOR);
+ sc.Forward();
+ } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
sc.SetState(SCE_SQL_NUMBER);
} else if (IsAWordStart(sc.ch)) {
sc.SetState(SCE_SQL_IDENTIFIER);