diff options
| author | nyamatongwe <unknown> | 2003-10-21 11:22:32 +0000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2003-10-21 11:22:32 +0000 | 
| commit | 576c735733318a3d330e28b8eec62d5a170fd654 (patch) | |
| tree | 34046035290e659ce73e7c2ae4dfce42cf9c64c4 | |
| parent | 40cb1566b65b3ee6b403ad6f442e2f617403cde7 (diff) | |
| download | scintilla-mirror-576c735733318a3d330e28b8eec62d5a170fd654.tar.gz | |
Updated lexers from Hans Hagen.
| -rw-r--r-- | src/LexMetapost.cxx | 352 | 
1 files changed, 168 insertions, 184 deletions
| diff --git a/src/LexMetapost.cxx b/src/LexMetapost.cxx index c158f7362..b7d482c0f 100644 --- a/src/LexMetapost.cxx +++ b/src/LexMetapost.cxx @@ -2,7 +2,7 @@  // File: LexMetapost.cxx - general context conformant metapost coloring scheme  // Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com -// Version: August 18, 2003 +// Version: September 28, 2003  // Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org>  // The License.txt file describes the conditions under which this software may be distributed. @@ -23,6 +23,7 @@  #include "KeyWords.h"  #include "Scintilla.h"  #include "SciLexer.h" +#include "StyleContext.h"  // val SCE_METAPOST_DEFAULT = 0  // val SCE_METAPOST_SPECIAL = 1 @@ -57,24 +58,24 @@ static inline bool endOfLine(Accessor &styler, unsigned int i) {        (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ;  } -static inline bool isMETAPOSTcomment(char ch, char pc) { +static inline bool isMETAPOSTcomment(int ch) {  	return -      (ch == '%') && (pc != '\\') ; +      (ch == '%') ;  } -static inline bool isMETAPOSTone(char ch) { +static inline bool isMETAPOSTone(int ch) {  	return        (ch == '[') || (ch == ']') || (ch == '(') || (ch == ')') ||        (ch == ':') || (ch == '=') || (ch == '<') || (ch == '>') || -      (ch == '{') || (ch == '}') || (ch == '\'') ; // || (ch == '\"') ; +      (ch == '{') || (ch == '}') || (ch == '\'') || (ch == '\"') ;  } -static inline bool isMETAPOSTtwo(char ch) { +static inline bool isMETAPOSTtwo(int ch) {  	return        (ch == ';') || (ch == '$') || (ch == '@') || (ch == '#');  } -static inline bool isMETAPOSTthree(char ch) { +static inline bool isMETAPOSTthree(int ch) {  	return        (ch == '.') || (ch == '-') || (ch == '+') || (ch == '/') ||        (ch == '*') || (ch == ',') || (ch == '|') || (ch == '`') || @@ -82,189 +83,46 @@ static inline bool isMETAPOSTthree(char ch) {        (ch == '%') ;  } -static inline bool isMETAPOSTidentifier(char ch) { +static inline bool isMETAPOSTidentifier(int ch) {  	return        ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||        (ch == '_') ;  } -static inline bool isMETAPOSTnumber(char ch) { +static inline bool isMETAPOSTnumber(int ch) {  	return        (ch >= '0') && (ch <= '9') ;  } -static inline bool isMETAPOSTstring(char ch) { +static inline bool isMETAPOSTstring(int ch) {  	return        (ch == '\"') ;  } - -// Coloring functions: - -bool ColourMETAPOSTRange( -    unsigned int metapostMode, -    bool texMode, -    char *key, -    unsigned int endPos, -    WordList *keywordlists[], -	int currentInterface,  -    Accessor &styler) { - -	// 0  no keyword highlighting  -	// 1  metapost keyword hightlighting -	// 2+ metafun keyword hightlighting - -	int extraInterface = 0 ;  - -	if (currentInterface != 0) {   -		extraInterface = currentInterface ;  -	}  -		 -	WordList &keywords  = *keywordlists[0] ; -	WordList &keywords2 = *keywordlists[extraInterface-1] ; - -    switch (metapostMode) { -        case 0 : // comment mode -            styler.ColourTo(endPos, SCE_METAPOST_DEFAULT) ; -            break ; -        case 1 : // special characters mode -            if (! texMode) -                { styler.ColourTo(endPos, SCE_METAPOST_SPECIAL) ; } -            else -                { styler.ColourTo(endPos, SCE_METAPOST_DEFAULT) ; } -            break ; -        case 2 : // (kind of) group mode -            if (! texMode) -                { styler.ColourTo(endPos, SCE_METAPOST_GROUP) ; } -            else -                { styler.ColourTo(endPos, SCE_METAPOST_DEFAULT) ; } -            break ; -        case 3 : // (more or less) symbol mode -            if (! texMode) -                { styler.ColourTo(endPos, SCE_METAPOST_SYMBOL) ; } -            else -                { styler.ColourTo(endPos, SCE_METAPOST_DEFAULT) ; } -            break ; -        case 4 : // command and/or keyword mode -			if (currentInterface == 0) { -                styler.ColourTo(endPos, SCE_METAPOST_TEXT) ; -        	} else if (texMode) { -                if (0 == strcmp(key,"etex")) { -                    styler.ColourTo(endPos, SCE_METAPOST_COMMAND) ; -                    return false ; -                } else { -                    styler.ColourTo(endPos, SCE_METAPOST_DEFAULT) ; -                } -            } else if ((0 == strcmp(key,"btex")) || (0 == strcmp(key,"verbatimtex"))) { -                styler.ColourTo(endPos, SCE_METAPOST_COMMAND) ; -                return true ; -            } else if (keywords && keywords.InList(key)) { -                styler.ColourTo(endPos, SCE_METAPOST_COMMAND) ; -            } else if (keywords2 && keywords2.InList(key)) { -                styler.ColourTo(endPos, SCE_METAPOST_EXTRA) ; -            } else { -                styler.ColourTo(endPos, SCE_METAPOST_TEXT) ; -            } -            break ; -        case 5 : // text mode -            if (! texMode) -                { styler.ColourTo(endPos, SCE_METAPOST_TEXT) ; } -            else -                { styler.ColourTo(endPos, SCE_METAPOST_DEFAULT) ; } -            break ; -        case 6 : // string mode -            styler.ColourTo(endPos, SCE_METAPOST_DEFAULT) ; -            break ; -    } -    return texMode ; +static inline bool isMETAPOSTcolon(int ch) { +	return +		(ch == ':') ;  } -static void ColouriseMETAPOSTLine( -    char *lineBuffer, -    unsigned int lengthLine, -    unsigned int startPos, -    WordList *keywordlists[], -	int currentInterface,  -    Accessor &styler) { - -    char ch = ' ' ; -    char pc; -    unsigned int offset = 0 ; -    unsigned int mode = 5 ; -    unsigned int k = 0 ; -    char key[1024] ; // length check in calling routine -    unsigned int start = startPos-1 ; - -    bool comment = (styler.GetPropertyInt("lexer.metapost.comment.process", 0) == 0) ; -    bool tex     = false ;  - -    // we may safely assume that pc is either on the same line or a \n \r token -    // we use a cheap append to key method, ugly, but fast and ok - -    while (offset < lengthLine) { - -        pc = ch ; -        ch = lineBuffer[offset] ; - -        if (!tex && (mode == 6)) { -            if (isMETAPOSTstring(ch)) { -                // we've run into the end of the string -                tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; -                mode = 5 ; -            } else { -                // we're still in the string, comment is valid -            } -        } else if ((comment) && ((mode == 0) || (isMETAPOSTcomment(ch,pc)))) { -            tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; -            mode = 0 ; -        } else if (isMETAPOSTstring(ch)) { -            if (mode != 6) { tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; } -            mode = 6 ; -        } else if (isMETAPOSTone(ch)) { -            if (mode != 1) { tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; } -            mode = 1 ; -        } else if (isMETAPOSTtwo(ch)) { -            if (mode != 2) { tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; } -            mode = 2 ; -        } else if (isMETAPOSTthree(ch)) { -            if (mode != 3) { tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; } -            mode = 3 ; -        } else if (isMETAPOSTidentifier(ch)) { -            if (mode != 4) { tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; } -            mode = 4 ; key[k] = ch ; ++k ; key[k] = '\0' ; -        } else if (isMETAPOSTnumber(ch)) { -            // rather redundant since for the moment we don't handle numbers -            if (mode != 5) { tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; } -            mode = 5 ; -        } else { -            if (mode != 5) { tex = ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; k = 0 ; } -            mode = 5 ; -        } - -        ++offset ; -        ++start ; - -    } - -    ColourMETAPOSTRange(mode,tex,key,start,keywordlists,currentInterface,styler) ; - +static inline bool isMETAPOSTequal(int ch) { +	return +		(ch == '=') ;  }  static int CheckMETAPOSTInterface(      unsigned int startPos,      int length, -    Accessor &styler) { +    Accessor &styler, +	int defaultInterface) {      char lineBuffer[1024] ;  	unsigned int linePos = 0 ; -    int defaultInterface = styler.GetPropertyInt("lexer.metapost.interface.default", 1) ; -  	// some day we can make something lexer.metapost.mapping=(none,0)(metapost,1)(mp,1)(metafun,2)...      if (styler.SafeGetCharAt(0) == '%') {          for (unsigned int i = 0; i < startPos + length; i++) { -            lineBuffer[linePos++] = styler[i]; +            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;              if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {                  lineBuffer[linePos] = '\0';  				if (strstr(lineBuffer, "interface=none")) { @@ -286,43 +144,169 @@ static int CheckMETAPOSTInterface(      return defaultInterface ;  } -// Main handler: -// -// The lexer works on a per line basis. I'm not familiar with the internals of scintilla, but -// since the lexer does not look back or forward beyond the current view, some optimization can -// be accomplished by providing just the viewport. The following code is more or less copied -// from the LexOthers.cxx file. -  static void ColouriseMETAPOSTDoc(      unsigned int startPos,      int length, -    int /*initStyle*/, +    int,      WordList *keywordlists[],      Accessor &styler) {  	styler.StartAt(startPos) ;  	styler.StartSegment(startPos) ; -	int currentInterface = CheckMETAPOSTInterface(startPos,length,styler) ; +	bool processComment   = styler.GetPropertyInt("lexer.metapost.comment.process",   0) == 1 ; +    int  defaultInterface = styler.GetPropertyInt("lexer.metapost.interface.default", 1) ; -	char lineBuffer[1024] ; -	unsigned int linePos = 0 ; +	int currentInterface = CheckMETAPOSTInterface(startPos,length,styler,defaultInterface) ; -    for (unsigned int i = startPos; i < startPos + length; i++) { -		lineBuffer[linePos++] = styler[i] ; -		if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { -			// End of line (or of line buffer) met, colourise it -			lineBuffer[linePos] = '\0' ; -			ColouriseMETAPOSTLine(lineBuffer, linePos, i-linePos+1, keywordlists, currentInterface, styler) ; -			linePos = 0 ; -		} +	// 0  no keyword highlighting +	// 1  metapost keyword hightlighting +	// 2+ metafun keyword hightlighting + +	int extraInterface = 0 ; + +	if (currentInterface != 0) { +		extraInterface = currentInterface ;  	} -	if (linePos > 0) { -        // Last line does not have ending characters -		ColouriseMETAPOSTLine(lineBuffer, linePos, startPos+length-linePos, keywordlists, currentInterface, styler) ; +	WordList &keywords  = *keywordlists[0] ; +	WordList &keywords2 = *keywordlists[extraInterface-1] ; + +	StyleContext sc(startPos, length, SCE_METAPOST_TEXT, styler) ; + +	char key[100] ; + +    bool inTeX     = false ; +	bool inComment = false ; +	bool inString  = false ; +	bool inClause  = false ; + +	bool going = sc.More() ; // needed because of a fuzzy end of file state + +	for (; going; sc.Forward()) { + +		if (! sc.More()) { going = false ; } // we need to go one behind the end of text + +		if (inClause) { +			sc.SetState(SCE_METAPOST_TEXT) ; +			inClause = false ; +		} + +		if (inComment) { +			if (sc.atLineEnd) { +				sc.SetState(SCE_METAPOST_TEXT) ; +				inTeX = false ; +				inComment = false ; +				inClause = false ; +				inString = false ; // not correct but we want to stimulate one-lines +			} +		} else if (inString) { +			if (isMETAPOSTstring(sc.ch)) { +				sc.SetState(SCE_METAPOST_SPECIAL) ; +				sc.ForwardSetState(SCE_METAPOST_TEXT) ; +				inString = false ; +			} else if (sc.atLineEnd) { +				sc.SetState(SCE_METAPOST_TEXT) ; +				inTeX = false ; +				inComment = false ; +				inClause = false ; +				inString = false ; // not correct but we want to stimulate one-lines +			} +		} else { +			if ((! isMETAPOSTidentifier(sc.ch)) && (sc.LengthCurrent() > 0)) { +				if (sc.state == SCE_METAPOST_COMMAND) { +					sc.GetCurrent(key, sizeof(key)) ; +					if ((strcmp(key,"btex") == 0) || (strcmp(key,"verbatimtex") == 0)) { +    					sc.ChangeState(SCE_METAPOST_GROUP) ; +						inTeX = true ; +					} else if (inTeX) { +						if (strcmp(key,"etex") == 0) { +	    					sc.ChangeState(SCE_METAPOST_GROUP) ; +							inTeX = false ; +						} else { +	    					sc.ChangeState(SCE_METAPOST_TEXT) ; +						} +					} else { +						if (keywords && keywords.InList(key)) { +    						sc.ChangeState(SCE_METAPOST_COMMAND) ; +						} else if (keywords2 && keywords2.InList(key)) { +							sc.ChangeState(SCE_METAPOST_EXTRA) ; +						} else { +							sc.ChangeState(SCE_METAPOST_TEXT) ; +						} +					} +				} +			} +			if (isMETAPOSTcomment(sc.ch)) { +				if (! inTeX) { +					sc.SetState(SCE_METAPOST_SYMBOL) ; +					sc.ForwardSetState(SCE_METAPOST_DEFAULT) ; +					inComment = ! processComment ; +				} else { +					sc.SetState(SCE_METAPOST_TEXT) ; +				} +			} else if (isMETAPOSTstring(sc.ch)) { +				if (! inTeX) { +					sc.SetState(SCE_METAPOST_SPECIAL) ; +					if (! isMETAPOSTstring(sc.chNext)) { +						sc.ForwardSetState(SCE_METAPOST_TEXT) ; +					} +					inString = true ; +				} else { +					sc.SetState(SCE_METAPOST_TEXT) ; +				} +			} else if (isMETAPOSTcolon(sc.ch)) { +				if (! inTeX) { +					if (! isMETAPOSTequal(sc.chNext)) { +						sc.SetState(SCE_METAPOST_COMMAND) ; +						inClause = true ; +					} else { +						sc.SetState(SCE_METAPOST_SPECIAL) ; +					} +				} else { +					sc.SetState(SCE_METAPOST_TEXT) ; +				} +			} else if (isMETAPOSTone(sc.ch)) { +				if (! inTeX) { +					sc.SetState(SCE_METAPOST_SPECIAL) ; +				} else { +					sc.SetState(SCE_METAPOST_TEXT) ; +				} +			} else if (isMETAPOSTtwo(sc.ch)) { +				if (! inTeX) { +					sc.SetState(SCE_METAPOST_GROUP) ; +				} else { +					sc.SetState(SCE_METAPOST_TEXT) ; +				} +			} else if (isMETAPOSTthree(sc.ch)) { +				if (! inTeX) { +					sc.SetState(SCE_METAPOST_SYMBOL) ; +				} else { +					sc.SetState(SCE_METAPOST_TEXT) ; +				} +			} else if (isMETAPOSTidentifier(sc.ch)) { +				if (sc.state != SCE_METAPOST_COMMAND) { +					sc.SetState(SCE_METAPOST_TEXT) ; +					sc.ChangeState(SCE_METAPOST_COMMAND) ; +				} +			} else if (isMETAPOSTnumber(sc.ch)) { +				// rather redundant since for the moment we don't handle numbers +				sc.SetState(SCE_METAPOST_TEXT) ; +			} else if (sc.atLineEnd) { +				sc.SetState(SCE_METAPOST_TEXT) ; +				inTeX = false ; +				inComment = false ; +				inClause = false ; +				inString = false ; +			} else { +				sc.SetState(SCE_METAPOST_TEXT) ; +			} +		} +  	} +	sc.Complete(); +  }  // Hooks info the system: | 
