diff options
author | nyamatongwe <devnull@localhost> | 2010-07-13 21:31:10 +1000 |
---|---|---|
committer | nyamatongwe <devnull@localhost> | 2010-07-13 21:31:10 +1000 |
commit | c6f21af4f42c480d20729ce0d285cee6e94ffcbb (patch) | |
tree | 728b10068a0dda0a55e156bee2113d0752718c79 | |
parent | 253d170b5b6d2625b6f7edb0aa1a57907909add2 (diff) | |
download | scintilla-mirror-c6f21af4f42c480d20729ce0d285cee6e94ffcbb.tar.gz |
Changed files for new lexer design.
-rw-r--r-- | lexlib/Accessor.h | 86 | ||||
-rw-r--r-- | lexlib/CharacterSet.h | 100 | ||||
-rw-r--r-- | lexlib/PropSetSimple.h | 4 | ||||
-rw-r--r-- | lexlib/StyleContext.cxx | 9 | ||||
-rw-r--r-- | lexlib/StyleContext.h | 42 |
5 files changed, 139 insertions, 102 deletions
diff --git a/lexlib/Accessor.h b/lexlib/Accessor.h index d9db9c7bf..2f28c1acd 100644 --- a/lexlib/Accessor.h +++ b/lexlib/Accessor.h @@ -1,79 +1,35 @@ // Scintilla source code edit control /** @file Accessor.h - ** Rapid easy access to contents of a Scintilla. + ** Interfaces between Scintilla and lexers. **/ -// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org> +// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org> // The License.txt file describes the conditions under which this software may be distributed. +#ifndef ACCESSOR_H +#define ACCESSOR_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8}; class Accessor; +class WordList; +class PropSetSimple; typedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len); -/** - * Interface to data in a Scintilla. - */ -class Accessor { -protected: - enum {extremePosition=0x7FFFFFFF}; - /** @a bufferSize is a trade off between time taken to copy the characters - * and retrieval overhead. - * @a slopSize positions the buffer before the desired position - * in case there is some backtracking. */ - enum {bufferSize=4000, slopSize=bufferSize/8}; - char buf[bufferSize+1]; - int startPos; - int endPos; - int codePage; - - virtual bool InternalIsLeadByte(char ch)=0; - virtual void Fill(int position)=0; - +class Accessor : public LexAccessor { public: - Accessor() : startPos(extremePosition), endPos(0), codePage(0) {} - virtual ~Accessor() {} - char operator[](int position) { - if (position < startPos || position >= endPos) { - Fill(position); - } - return buf[position - startPos]; - } - /** Safe version of operator[], returning a defined value for invalid position. */ - char SafeGetCharAt(int position, char chDefault=' ') { - if (position < startPos || position >= endPos) { - Fill(position); - if (position < startPos || position >= endPos) { - // Position is outside range of document - return chDefault; - } - } - return buf[position - startPos]; - } - bool IsLeadByte(char ch) { - return codePage && InternalIsLeadByte(ch); - } - void SetCodePage(int codePage_) { codePage = codePage_; } + PropSetSimple *pprops; + Accessor(IDocument *pAccess_, PropSetSimple *pprops_); + int GetPropertyInt(const char *, int defaultValue=0); + int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0); +}; - virtual bool Match(int pos, const char *s)=0; - virtual char StyleAt(int position)=0; - virtual int GetLine(int position)=0; - virtual int LineStart(int line)=0; - virtual int LevelAt(int line)=0; - virtual int Length()=0; - virtual void Flush()=0; - virtual int GetLineState(int line)=0; - virtual int SetLineState(int line, int state)=0; - virtual int GetPropertyInt(const char *key, int defaultValue=0)=0; - virtual char *GetProperties()=0; +#ifdef SCI_NAMESPACE +} +#endif - // Style setting - virtual void StartAt(unsigned int start, char chMask=31)=0; - virtual void SetFlags(char chFlags_, char chWhile_)=0; - virtual unsigned int GetStartSegment()=0; - virtual void StartSegment(unsigned int pos)=0; - virtual void ColourTo(unsigned int pos, int chAttr)=0; - virtual void SetLevel(int line, int level)=0; - virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0; - virtual void IndicatorFill(int start, int end, int indicator, int value)=0; -}; +#endif diff --git a/lexlib/CharacterSet.h b/lexlib/CharacterSet.h index 9b8869635..18cb0aa93 100644 --- a/lexlib/CharacterSet.h +++ b/lexlib/CharacterSet.h @@ -5,6 +5,13 @@ // Copyright 2007 by Neil Hodgson <neilh@scintilla.org> // The License.txt file describes the conditions under which this software may be distributed. +#ifndef CHARACTERSET_H +#define CHARACTERSET_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + class CharacterSet { int size; bool valueAfter; @@ -39,21 +46,104 @@ public: size = 0; } void Add(int val) { - PLATFORM_ASSERT(val >= 0); - PLATFORM_ASSERT(val < size); + assert(val >= 0); + assert(val < size); bset[val] = true; } void AddString(const char *CharacterSet) { for (const char *cp=CharacterSet; *cp; cp++) { int val = static_cast<unsigned char>(*cp); - PLATFORM_ASSERT(val >= 0); - PLATFORM_ASSERT(val < size); + assert(val >= 0); + assert(val < size); bset[val] = true; } } bool Contains(int val) const { - PLATFORM_ASSERT(val >= 0); + assert(val >= 0); if (val < 0) return false; return (val < size) ? bset[val] : valueAfter; } }; + +// Functions for classifying characters + +inline bool IsASpace(int ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +inline bool IsASpaceOrTab(int ch) { + return (ch == ' ') || (ch == '\t'); +} + +inline bool IsADigit(int ch) { + return (ch >= '0') && (ch <= '9'); +} + +inline bool IsADigit(int ch, int base) { + if (base <= 10) { + return (ch >= '0') && (ch < '0' + base); + } else { + return ((ch >= '0') && (ch <= '9')) || + ((ch >= 'A') && (ch < 'A' + base - 10)) || + ((ch >= 'a') && (ch < 'a' + base - 10)); + } +} + +inline bool IsASCII(int ch) { + return ch < 0x80; +} + +inline bool IsAlphaNumeric(int ch) { + return + ((ch >= '0') && (ch <= '9')) || + ((ch >= 'a') && (ch <= 'z')) || + ((ch >= 'A') && (ch <= 'Z')); +} + +/** + * Check if a character is a space. + * This is ASCII specific but is safe with chars >= 0x80. + */ +inline bool isspacechar(int ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +inline bool iswordchar(int ch) { + return IsASCII(ch) && (IsAlphaNumeric(ch) || ch == '.' || ch == '_'); +} + +inline bool iswordstart(int ch) { + return IsASCII(ch) && (IsAlphaNumeric(ch) || ch == '_'); +} + +inline bool isoperator(int ch) { + if (IsASCII(ch) && IsAlphaNumeric(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || + ch == '(' || ch == ')' || ch == '-' || ch == '+' || + ch == '=' || ch == '|' || ch == '{' || ch == '}' || + ch == '[' || ch == ']' || ch == ':' || ch == ';' || + ch == '<' || ch == '>' || ch == ',' || ch == '/' || + ch == '?' || ch == '!' || ch == '.' || ch == '~') + return true; + return false; +} + +// Simple case functions for ASCII. + +inline char MakeUpperCase(char ch) { + if (ch < 'a' || ch > 'z') + return ch; + else + return static_cast<char>(ch - 'a' + 'A'); +} + +int CompareCaseInsensitive(const char *a, const char *b); +int CompareNCaseInsensitive(const char *a, const char *b, size_t len); + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/lexlib/PropSetSimple.h b/lexlib/PropSetSimple.h index 1674cfb9e..b79873720 100644 --- a/lexlib/PropSetSimple.h +++ b/lexlib/PropSetSimple.h @@ -12,7 +12,7 @@ namespace Scintilla { #endif -class PropSetSimple : public PropertyGet { +class PropSetSimple { void *impl; void Set(const char *keyVal); public: @@ -22,7 +22,7 @@ public: void SetMultiple(const char *); const char *Get(const char *key) const; char *Expanded(const char *key) const; - char *ToString() const; + int GetExpanded(const char *key, char *result) const; int GetInt(const char *key, int defaultValue=0) const; }; diff --git a/lexlib/StyleContext.cxx b/lexlib/StyleContext.cxx index 4a1f71622..cf59fdd24 100644 --- a/lexlib/StyleContext.cxx +++ b/lexlib/StyleContext.cxx @@ -9,10 +9,11 @@ #include <string.h> #include <ctype.h> #include <stdio.h> +#include <assert.h> -#include "Platform.h" +#include "ILexer.h" -#include "PropSet.h" +#include "LexAccessor.h" #include "Accessor.h" #include "StyleContext.h" @@ -22,7 +23,7 @@ using namespace Scintilla; static void getRange(unsigned int start, unsigned int end, - Accessor &styler, + LexAccessor &styler, char *s, unsigned int len) { unsigned int i = 0; @@ -39,7 +40,7 @@ void StyleContext::GetCurrent(char *s, unsigned int len) { static void getRangeLowered(unsigned int start, unsigned int end, - Accessor &styler, + LexAccessor &styler, char *s, unsigned int len) { unsigned int i = 0; diff --git a/lexlib/StyleContext.h b/lexlib/StyleContext.h index 4e175bc29..8b1345432 100644 --- a/lexlib/StyleContext.h +++ b/lexlib/StyleContext.h @@ -5,16 +5,26 @@ // Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org> // This file is in the public domain. +#ifndef STYLECONTEXT_H +#define STYLECONTEXT_H + #ifdef SCI_NAMESPACE namespace Scintilla { #endif +static inline int MakeLowerCase(int ch) { + if (ch < 'A' || ch > 'Z') + return ch; + else + return ch - 'A' + 'a'; +} + // All languages handled so far can treat all characters >= 0x80 as one class // which just continues the current token or starts an identifier if in default. // DBCS treated specially as the second character can be < 0x80 and hence // syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 class StyleContext { - Accessor &styler; + LexAccessor &styler; unsigned int endPos; StyleContext &operator=(const StyleContext &); void GetNextChar(unsigned int pos) { @@ -41,7 +51,7 @@ public: int chNext; StyleContext(unsigned int startPos, unsigned int length, - int initStyle, Accessor &styler_, char chMask=31) : + int initStyle, LexAccessor &styler_, char chMask=31) : styler(styler_), endPos(startPos + length), currentPos(startPos), @@ -131,15 +141,15 @@ public: return true; } bool MatchIgnoreCase(const char *s) { - if (tolower(ch) != static_cast<unsigned char>(*s)) + if (MakeLowerCase(ch) != static_cast<unsigned char>(*s)) return false; s++; - if (tolower(chNext) != static_cast<unsigned char>(*s)) + if (MakeLowerCase(chNext) != static_cast<unsigned char>(*s)) return false; s++; for (int n=2; *s; n++) { if (static_cast<unsigned char>(*s) != - tolower(static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+n)))) + MakeLowerCase(static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+n)))) return false; s++; } @@ -154,24 +164,4 @@ public: } #endif -inline bool IsASpace(unsigned int ch) { - return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); -} - -inline bool IsASpaceOrTab(unsigned int ch) { - return (ch == ' ') || (ch == '\t'); -} - -inline bool IsADigit(unsigned int ch) { - return (ch >= '0') && (ch <= '9'); -} - -inline bool IsADigit(unsigned int ch, unsigned int base) { - if (base <= 10) { - return (ch >= '0') && (ch < '0' + base); - } else { - return ((ch >= '0') && (ch <= '9')) || - ((ch >= 'A') && (ch < 'A' + base - 10)) || - ((ch >= 'a') && (ch < 'a' + base - 10)); - } -} +#endif |