From 2fffff0d5d691f314829b0b3c8ecd59707afdb38 Mon Sep 17 00:00:00 2001 From: Neil Date: Sat, 6 Sep 2014 09:27:08 +1000 Subject: Support the q-quote operator as SCE_SQL_QOPERATOR. From Michael Staszewski. --- doc/ScintillaHistory.html | 4 ++++ include/SciLexer.h | 1 + include/Scintilla.iface | 1 + lexers/LexSQL.cxx | 32 +++++++++++++++++++++++++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) 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 @@ danselmi Mat Berchtold + Michael Staszewski

@@ -481,6 +482,9 @@ Feature #1071.

  • + SQL lexer supports the q-quote operator as SCE_SQL_QOPERATOR(24). +
  • +
  • VHDL lexer supports block comments. Bug #1527.
  • 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); -- cgit v1.2.3