Compare commits
1 Commits
scintilla-
...
wxPython-2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c6440f0a90 |
@@ -1,20 +0,0 @@
|
|||||||
License for Scintilla and SciTE
|
|
||||||
|
|
||||||
Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation.
|
|
||||||
|
|
||||||
NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
|
||||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY
|
|
||||||
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
|
|
||||||
OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
This directory contains copies of the scintilla/src and
|
|
||||||
scintilla/include directories from the Scintilla/SCiTE source
|
|
||||||
distribution. All other code needed to implement Scintilla on top of
|
|
||||||
wxWindows is located in the directory above this one.
|
|
||||||
|
|
||||||
The current version of the Scintilla code is 1.58
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Accessor.h
|
|
||||||
** Rapid easy access to contents of a Scintilla.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8};
|
|
||||||
|
|
||||||
class Accessor;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
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_; }
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
};
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file KeyWords.h
|
|
||||||
** Colourise for particular languages.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A LexerModule is responsible for lexing and folding a particular language.
|
|
||||||
* The class maintains a list of LexerModules which can be searched to find a
|
|
||||||
* module appropriate to a particular language.
|
|
||||||
*/
|
|
||||||
class LexerModule {
|
|
||||||
protected:
|
|
||||||
const LexerModule *next;
|
|
||||||
int language;
|
|
||||||
LexerFunction fnLexer;
|
|
||||||
LexerFunction fnFolder;
|
|
||||||
const char * const * wordListDescriptions;
|
|
||||||
|
|
||||||
static const LexerModule *base;
|
|
||||||
static int nextLanguage;
|
|
||||||
|
|
||||||
public:
|
|
||||||
const char *languageName;
|
|
||||||
LexerModule(int language_, LexerFunction fnLexer_,
|
|
||||||
const char *languageName_=0, LexerFunction fnFolder_=0,
|
|
||||||
const char * const wordListDescriptions_[] = NULL);
|
|
||||||
int GetLanguage() const { return language; }
|
|
||||||
|
|
||||||
// -1 is returned if no WordList information is available
|
|
||||||
int GetNumWordLists() const;
|
|
||||||
const char *GetWordListDescription(int index) const;
|
|
||||||
|
|
||||||
virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const;
|
|
||||||
virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const;
|
|
||||||
static const LexerModule *Find(int language);
|
|
||||||
static const LexerModule *Find(const char *languageName);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a character is a space.
|
|
||||||
* This is ASCII specific but is safe with chars >= 0x80.
|
|
||||||
*/
|
|
||||||
inline bool isspacechar(unsigned char ch) {
|
|
||||||
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool iswordchar(char ch) {
|
|
||||||
return isascii(ch) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool iswordstart(char ch) {
|
|
||||||
return isascii(ch) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool isoperator(char ch) {
|
|
||||||
if (isascii(ch) && isalnum(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;
|
|
||||||
}
|
|
||||||
@@ -1,514 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Platform.h
|
|
||||||
** Interface to platform facilities. Also includes some basic utilities.
|
|
||||||
** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef PLATFORM_H
|
|
||||||
#define PLATFORM_H
|
|
||||||
|
|
||||||
// PLAT_GTK = GTK+ on Linux or Win32
|
|
||||||
// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32
|
|
||||||
// PLAT_WIN = Win32 API on Win32 OS
|
|
||||||
// PLAT_WX is wxWindows on any supported platform
|
|
||||||
|
|
||||||
#define PLAT_GTK 0
|
|
||||||
#define PLAT_GTK_WIN32 0
|
|
||||||
#define PLAT_WIN 0
|
|
||||||
#define PLAT_WX 0
|
|
||||||
#define PLAT_FOX 0
|
|
||||||
|
|
||||||
#if defined(FOX)
|
|
||||||
#undef PLAT_FOX
|
|
||||||
#define PLAT_FOX 1
|
|
||||||
|
|
||||||
#elif defined(__WX__)
|
|
||||||
#undef PLAT_WX
|
|
||||||
#define PLAT_WX 1
|
|
||||||
|
|
||||||
#elif defined(GTK)
|
|
||||||
#undef PLAT_GTK
|
|
||||||
#define PLAT_GTK 1
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#undef PLAT_GTK_WIN32
|
|
||||||
#define PLAT_GTK_WIN32 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
#undef PLAT_WIN
|
|
||||||
#define PLAT_WIN 1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if PLAT_WX
|
|
||||||
#include <wx/object.h> // For the global memory operators, if needed.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Underlying the implementation of the platform classes are platform specific types.
|
|
||||||
// Sometimes these need to be passed around by client code so they are defined here
|
|
||||||
|
|
||||||
typedef void *FontID;
|
|
||||||
typedef void *SurfaceID;
|
|
||||||
typedef void *WindowID;
|
|
||||||
typedef void *MenuID;
|
|
||||||
typedef void *TickerID;
|
|
||||||
typedef void *Function;
|
|
||||||
typedef void *IdlerID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A geometric point class.
|
|
||||||
* Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably.
|
|
||||||
*/
|
|
||||||
class Point {
|
|
||||||
public:
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
|
|
||||||
Point(int x_=0, int y_=0) : x(x_), y(y_) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Other automatically defined methods (assignment, copy constructor, destructor) are fine
|
|
||||||
|
|
||||||
static Point FromLong(long lpoint);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A geometric rectangle class.
|
|
||||||
* PRectangle is exactly the same as the Win32 RECT so can be used interchangeably.
|
|
||||||
* PRectangles contain their top and left sides, but not their right and bottom sides.
|
|
||||||
*/
|
|
||||||
class PRectangle {
|
|
||||||
public:
|
|
||||||
int left;
|
|
||||||
int top;
|
|
||||||
int right;
|
|
||||||
int bottom;
|
|
||||||
|
|
||||||
PRectangle(int left_=0, int top_=0, int right_=0, int bottom_ = 0) :
|
|
||||||
left(left_), top(top_), right(right_), bottom(bottom_) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Other automatically defined methods (assignment, copy constructor, destructor) are fine
|
|
||||||
|
|
||||||
bool operator==(PRectangle &rc) {
|
|
||||||
return (rc.left == left) && (rc.right == right) &&
|
|
||||||
(rc.top == top) && (rc.bottom == bottom);
|
|
||||||
}
|
|
||||||
bool Contains(Point pt) {
|
|
||||||
return (pt.x >= left) && (pt.x <= right) &&
|
|
||||||
(pt.y >= top) && (pt.y <= bottom);
|
|
||||||
}
|
|
||||||
bool Contains(PRectangle rc) {
|
|
||||||
return (rc.left >= left) && (rc.right <= right) &&
|
|
||||||
(rc.top >= top) && (rc.bottom <= bottom);
|
|
||||||
}
|
|
||||||
bool Intersects(PRectangle other) {
|
|
||||||
return (right > other.left) && (left < other.right) &&
|
|
||||||
(bottom > other.top) && (top < other.bottom);
|
|
||||||
}
|
|
||||||
void Move(int xDelta, int yDelta) {
|
|
||||||
left += xDelta;
|
|
||||||
top += yDelta;
|
|
||||||
right += xDelta;
|
|
||||||
bottom += yDelta;
|
|
||||||
}
|
|
||||||
int Width() { return right - left; }
|
|
||||||
int Height() { return bottom - top; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In some circumstances, including Win32 in paletted mode and GTK+, each colour
|
|
||||||
* must be allocated before use. The desired colours are held in the ColourDesired class,
|
|
||||||
* and after allocation the allocation entry is stored in the ColourAllocated class. In other
|
|
||||||
* circumstances, such as Win32 in true colour mode, the allocation process just copies
|
|
||||||
* the RGB values from the desired to the allocated class.
|
|
||||||
* As each desired colour requires allocation before it can be used, the ColourPair class
|
|
||||||
* holds both a ColourDesired and a ColourAllocated
|
|
||||||
* The Palette class is responsible for managing the palette of colours which contains a
|
|
||||||
* list of ColourPair objects and performs the allocation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds a desired RGB colour.
|
|
||||||
*/
|
|
||||||
class ColourDesired {
|
|
||||||
long co;
|
|
||||||
public:
|
|
||||||
ColourDesired(long lcol=0) {
|
|
||||||
co = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
ColourDesired(unsigned int red, unsigned int green, unsigned int blue) {
|
|
||||||
Set(red, green, blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const ColourDesired &other) const {
|
|
||||||
return co == other.co;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(long lcol) {
|
|
||||||
co = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(unsigned int red, unsigned int green, unsigned int blue) {
|
|
||||||
co = red | (green << 8) | (blue << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned int ValueOfHex(const char ch) {
|
|
||||||
if (ch >= '0' && ch <= '9')
|
|
||||||
return ch - '0';
|
|
||||||
else if (ch >= 'A' && ch <= 'F')
|
|
||||||
return ch - 'A' + 10;
|
|
||||||
else if (ch >= 'a' && ch <= 'f')
|
|
||||||
return ch - 'a' + 10;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(const char *val) {
|
|
||||||
if (*val == '#') {
|
|
||||||
val++;
|
|
||||||
}
|
|
||||||
unsigned int r = ValueOfHex(val[0]) * 16 + ValueOfHex(val[1]);
|
|
||||||
unsigned int g = ValueOfHex(val[2]) * 16 + ValueOfHex(val[3]);
|
|
||||||
unsigned int b = ValueOfHex(val[4]) * 16 + ValueOfHex(val[5]);
|
|
||||||
Set(r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsLong() const {
|
|
||||||
return co;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetRed() {
|
|
||||||
return co & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetGreen() {
|
|
||||||
return (co >> 8) & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetBlue() {
|
|
||||||
return (co >> 16) & 0xff;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds an allocated RGB colour which may be an approximation to the desired colour.
|
|
||||||
*/
|
|
||||||
class ColourAllocated {
|
|
||||||
long coAllocated;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
ColourAllocated(long lcol=0) {
|
|
||||||
coAllocated = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(long lcol) {
|
|
||||||
coAllocated = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsLong() const {
|
|
||||||
return coAllocated;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Colour pairs hold a desired colour and an allocated colour.
|
|
||||||
*/
|
|
||||||
struct ColourPair {
|
|
||||||
ColourDesired desired;
|
|
||||||
ColourAllocated allocated;
|
|
||||||
|
|
||||||
ColourPair(ColourDesired desired_=ColourDesired(0,0,0)) {
|
|
||||||
desired = desired_;
|
|
||||||
allocated.Set(desired.AsLong());
|
|
||||||
}
|
|
||||||
void Copy() {
|
|
||||||
allocated.Set(desired.AsLong());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class Window; // Forward declaration for Palette
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Colour palette management.
|
|
||||||
*/
|
|
||||||
class Palette {
|
|
||||||
int used;
|
|
||||||
enum {numEntries = 100};
|
|
||||||
ColourPair entries[numEntries];
|
|
||||||
#if PLAT_GTK
|
|
||||||
void *allocatedPalette; // GdkColor *
|
|
||||||
int allocatedLen;
|
|
||||||
#endif
|
|
||||||
public:
|
|
||||||
#if PLAT_WIN
|
|
||||||
void *hpal;
|
|
||||||
#endif
|
|
||||||
bool allowRealization;
|
|
||||||
|
|
||||||
Palette();
|
|
||||||
~Palette();
|
|
||||||
|
|
||||||
void Release();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method either adds a colour to the list of wanted colours (want==true)
|
|
||||||
* or retrieves the allocated colour back to the ColourPair.
|
|
||||||
* This is one method to make it easier to keep the code for wanting and retrieving in sync.
|
|
||||||
*/
|
|
||||||
void WantFind(ColourPair &cp, bool want);
|
|
||||||
|
|
||||||
void Allocate(Window &w);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Font management.
|
|
||||||
*/
|
|
||||||
class Font {
|
|
||||||
protected:
|
|
||||||
FontID id;
|
|
||||||
#if PLAT_WX
|
|
||||||
int ascent;
|
|
||||||
#endif
|
|
||||||
// Private so Font objects can not be copied
|
|
||||||
Font(const Font &) {}
|
|
||||||
Font &operator=(const Font &) { id=0; return *this; }
|
|
||||||
public:
|
|
||||||
Font();
|
|
||||||
virtual ~Font();
|
|
||||||
|
|
||||||
virtual void Create(const char *faceName, int characterSet, int size, bool bold, bool italic);
|
|
||||||
virtual void Release();
|
|
||||||
|
|
||||||
FontID GetID() { return id; }
|
|
||||||
// Alias another font - caller guarantees not to Release
|
|
||||||
void SetID(FontID id_) { id = id_; }
|
|
||||||
friend class Surface;
|
|
||||||
friend class SurfaceImpl;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A surface abstracts a place to draw.
|
|
||||||
*/
|
|
||||||
class Surface {
|
|
||||||
private:
|
|
||||||
// Private so Surface objects can not be copied
|
|
||||||
Surface(const Surface &) {}
|
|
||||||
Surface &operator=(const Surface &) { return *this; }
|
|
||||||
public:
|
|
||||||
Surface() {};
|
|
||||||
virtual ~Surface() {};
|
|
||||||
static Surface *Allocate();
|
|
||||||
|
|
||||||
virtual void Init(WindowID wid)=0;
|
|
||||||
virtual void Init(SurfaceID sid, WindowID wid)=0;
|
|
||||||
virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0;
|
|
||||||
|
|
||||||
virtual void Release()=0;
|
|
||||||
virtual bool Initialised()=0;
|
|
||||||
virtual void PenColour(ColourAllocated fore)=0;
|
|
||||||
virtual int LogPixelsY()=0;
|
|
||||||
virtual int DeviceHeightFont(int points)=0;
|
|
||||||
virtual void MoveTo(int x_, int y_)=0;
|
|
||||||
virtual void LineTo(int x_, int y_)=0;
|
|
||||||
virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void FillRectangle(PRectangle rc, ColourAllocated back)=0;
|
|
||||||
virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0;
|
|
||||||
virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0;
|
|
||||||
|
|
||||||
virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore)=0;
|
|
||||||
virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions)=0;
|
|
||||||
virtual int WidthText(Font &font_, const char *s, int len)=0;
|
|
||||||
virtual int WidthChar(Font &font_, char ch)=0;
|
|
||||||
virtual int Ascent(Font &font_)=0;
|
|
||||||
virtual int Descent(Font &font_)=0;
|
|
||||||
virtual int InternalLeading(Font &font_)=0;
|
|
||||||
virtual int ExternalLeading(Font &font_)=0;
|
|
||||||
virtual int Height(Font &font_)=0;
|
|
||||||
virtual int AverageCharWidth(Font &font_)=0;
|
|
||||||
|
|
||||||
virtual int SetPalette(Palette *pal, bool inBackGround)=0;
|
|
||||||
virtual void SetClip(PRectangle rc)=0;
|
|
||||||
virtual void FlushCachedState()=0;
|
|
||||||
|
|
||||||
virtual void SetUnicodeMode(bool unicodeMode_)=0;
|
|
||||||
virtual void SetDBCSMode(int codePage)=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple callback action passing one piece of untyped user data.
|
|
||||||
*/
|
|
||||||
typedef void (*CallBackAction)(void*);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class to hide the details of window manipulation.
|
|
||||||
* Does not own the window which will normally have a longer life than this object.
|
|
||||||
*/
|
|
||||||
class Window {
|
|
||||||
protected:
|
|
||||||
WindowID id;
|
|
||||||
public:
|
|
||||||
Window() : id(0), cursorLast(cursorInvalid) {}
|
|
||||||
Window(const Window &source) : id(source.id), cursorLast(cursorInvalid) {}
|
|
||||||
virtual ~Window();
|
|
||||||
Window &operator=(WindowID id_) {
|
|
||||||
id = id_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
WindowID GetID() const { return id; }
|
|
||||||
bool Created() const { return id != 0; }
|
|
||||||
void Destroy();
|
|
||||||
bool HasFocus();
|
|
||||||
PRectangle GetPosition();
|
|
||||||
void SetPosition(PRectangle rc);
|
|
||||||
void SetPositionRelative(PRectangle rc, Window relativeTo);
|
|
||||||
PRectangle GetClientPosition();
|
|
||||||
void Show(bool show=true);
|
|
||||||
void InvalidateAll();
|
|
||||||
void InvalidateRectangle(PRectangle rc);
|
|
||||||
virtual void SetFont(Font &font);
|
|
||||||
enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand };
|
|
||||||
void SetCursor(Cursor curs);
|
|
||||||
void SetTitle(const char *s);
|
|
||||||
private:
|
|
||||||
Cursor cursorLast;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Listbox management.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ListBox : public Window {
|
|
||||||
public:
|
|
||||||
ListBox();
|
|
||||||
virtual ~ListBox();
|
|
||||||
static ListBox *Allocate();
|
|
||||||
|
|
||||||
virtual void SetFont(Font &font)=0;
|
|
||||||
virtual void Create(Window &parent, int ctrlID, int lineHeight_, bool unicodeMode_)=0;
|
|
||||||
virtual void SetAverageCharWidth(int width)=0;
|
|
||||||
virtual void SetVisibleRows(int rows)=0;
|
|
||||||
virtual PRectangle GetDesiredRect()=0;
|
|
||||||
virtual int CaretFromEdge()=0;
|
|
||||||
virtual void Clear()=0;
|
|
||||||
virtual void Append(char *s, int type = -1)=0;
|
|
||||||
virtual int Length()=0;
|
|
||||||
virtual void Select(int n)=0;
|
|
||||||
virtual int GetSelection()=0;
|
|
||||||
virtual int Find(const char *prefix)=0;
|
|
||||||
virtual void GetValue(int n, char *value, int len)=0;
|
|
||||||
virtual void RegisterImage(int type, const char *xpm_data)=0;
|
|
||||||
virtual void ClearRegisteredImages()=0;
|
|
||||||
virtual void SetDoubleClickAction(CallBackAction, void *)=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Menu management.
|
|
||||||
*/
|
|
||||||
class Menu {
|
|
||||||
MenuID id;
|
|
||||||
public:
|
|
||||||
Menu();
|
|
||||||
MenuID GetID() { return id; }
|
|
||||||
void CreatePopUp();
|
|
||||||
void Destroy();
|
|
||||||
void Show(Point pt, Window &w);
|
|
||||||
};
|
|
||||||
|
|
||||||
class ElapsedTime {
|
|
||||||
long bigBit;
|
|
||||||
long littleBit;
|
|
||||||
public:
|
|
||||||
ElapsedTime();
|
|
||||||
double Duration(bool reset=false);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dynamic Library (DLL/SO/...) loading
|
|
||||||
*/
|
|
||||||
class DynamicLibrary {
|
|
||||||
public:
|
|
||||||
virtual ~DynamicLibrary() {};
|
|
||||||
|
|
||||||
/// @return Pointer to function "name", or NULL on failure.
|
|
||||||
virtual Function FindFunction(const char *name) = 0;
|
|
||||||
|
|
||||||
/// @return true if the library was loaded successfully.
|
|
||||||
virtual bool IsValid() = 0;
|
|
||||||
|
|
||||||
/// @return An instance of a DynamicLibrary subclass with "modulePath" loaded.
|
|
||||||
static DynamicLibrary *Load(const char *modulePath);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Platform class used to retrieve system wide parameters such as double click speed
|
|
||||||
* and chrome colour. Not a creatable object, more of a module with several functions.
|
|
||||||
*/
|
|
||||||
class Platform {
|
|
||||||
// Private so Platform objects can not be copied
|
|
||||||
Platform(const Platform &) {}
|
|
||||||
Platform &operator=(const Platform &) { return *this; }
|
|
||||||
public:
|
|
||||||
// Should be private because no new Platforms are ever created
|
|
||||||
// but gcc warns about this
|
|
||||||
Platform() {}
|
|
||||||
~Platform() {}
|
|
||||||
static ColourDesired Chrome();
|
|
||||||
static ColourDesired ChromeHighlight();
|
|
||||||
static const char *DefaultFont();
|
|
||||||
static int DefaultFontSize();
|
|
||||||
static unsigned int DoubleClickTime();
|
|
||||||
static bool MouseButtonBounce();
|
|
||||||
static void DebugDisplay(const char *s);
|
|
||||||
static bool IsKeyDown(int key);
|
|
||||||
static long SendScintilla(
|
|
||||||
WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0);
|
|
||||||
static long SendScintillaPointer(
|
|
||||||
WindowID w, unsigned int msg, unsigned long wParam=0, void *lParam=0);
|
|
||||||
static bool IsDBCSLeadByte(int codePage, char ch);
|
|
||||||
static int DBCSCharLength(int codePage, const char *s);
|
|
||||||
static int DBCSCharMaxLength();
|
|
||||||
|
|
||||||
// These are utility functions not really tied to a platform
|
|
||||||
static int Minimum(int a, int b);
|
|
||||||
static int Maximum(int a, int b);
|
|
||||||
// Next three assume 16 bit shorts and 32 bit longs
|
|
||||||
static long LongFromTwoShorts(short a,short b) {
|
|
||||||
return (a) | ((b) << 16);
|
|
||||||
}
|
|
||||||
static short HighShortFromLong(long x) {
|
|
||||||
return static_cast<short>(x >> 16);
|
|
||||||
}
|
|
||||||
static short LowShortFromLong(long x) {
|
|
||||||
return static_cast<short>(x & 0xffff);
|
|
||||||
}
|
|
||||||
static void DebugPrintf(const char *format, ...);
|
|
||||||
static bool ShowAssertionPopUps(bool assertionPopUps_);
|
|
||||||
static void Assert(const char *c, const char *file, int line);
|
|
||||||
static int Clamp(int val, int minVal, int maxVal);
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef NDEBUG
|
|
||||||
#define PLATFORM_ASSERT(c) ((void)0)
|
|
||||||
#else
|
|
||||||
#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Shut up annoying Visual C++ warnings:
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable: 4244 4309 4514 4710)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file PropSet.h
|
|
||||||
** A Java style properties file module.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef PROPSET_H
|
|
||||||
#define PROPSET_H
|
|
||||||
#include "SString.h"
|
|
||||||
|
|
||||||
bool EqualCaseInsensitive(const char *a, const char *b);
|
|
||||||
|
|
||||||
bool isprefix(const char *target, const char *prefix);
|
|
||||||
|
|
||||||
struct Property {
|
|
||||||
unsigned int hash;
|
|
||||||
char *key;
|
|
||||||
char *val;
|
|
||||||
Property *next;
|
|
||||||
Property() : hash(0), key(0), val(0), next(0) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class PropSet {
|
|
||||||
protected:
|
|
||||||
enum { hashRoots=31 };
|
|
||||||
Property *props[hashRoots];
|
|
||||||
Property *enumnext;
|
|
||||||
int enumhash;
|
|
||||||
static unsigned int HashString(const char *s, size_t len) {
|
|
||||||
unsigned int ret = 0;
|
|
||||||
while (len--) {
|
|
||||||
ret <<= 4;
|
|
||||||
ret ^= *s;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
static bool IncludesVar(const char *value, const char *key);
|
|
||||||
public:
|
|
||||||
PropSet *superPS;
|
|
||||||
PropSet();
|
|
||||||
~PropSet();
|
|
||||||
void Set(const char *key, const char *val, int lenKey=-1, int lenVal=-1);
|
|
||||||
void Set(const char *keyVal);
|
|
||||||
void SetMultiple(const char *s);
|
|
||||||
SString Get(const char *key);
|
|
||||||
SString GetExpanded(const char *key);
|
|
||||||
SString Expand(const char *withVars, int maxExpands=100);
|
|
||||||
int GetInt(const char *key, int defaultValue=0);
|
|
||||||
SString GetWild(const char *keybase, const char *filename);
|
|
||||||
SString GetNewExpand(const char *keybase, const char *filename="");
|
|
||||||
void Clear();
|
|
||||||
char *ToString(); // Caller must delete[] the return value
|
|
||||||
bool GetFirst(char **key, char **val);
|
|
||||||
bool GetNext(char **key, char **val);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class WordList {
|
|
||||||
public:
|
|
||||||
// Each word contains at least one character - a empty word acts as sentinel at the end.
|
|
||||||
char **words;
|
|
||||||
char **wordsNoCase;
|
|
||||||
char *list;
|
|
||||||
int len;
|
|
||||||
bool onlyLineEnds; ///< Delimited by any white space or only line ends
|
|
||||||
bool sorted;
|
|
||||||
int starts[256];
|
|
||||||
WordList(bool onlyLineEnds_ = false) :
|
|
||||||
words(0), wordsNoCase(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), sorted(false) {}
|
|
||||||
~WordList() { Clear(); }
|
|
||||||
operator bool() { return len ? true : false; }
|
|
||||||
char *operator[](int ind) { return words[ind]; }
|
|
||||||
void Clear();
|
|
||||||
void Set(const char *s);
|
|
||||||
char *Allocate(int size);
|
|
||||||
void SetFromAllocated();
|
|
||||||
bool InList(const char *s);
|
|
||||||
const char *GetNearestWord(const char *wordStart, int searchLen = -1,
|
|
||||||
bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
|
|
||||||
char *GetNearestWords(const char *wordStart, int searchLen=-1,
|
|
||||||
bool ignoreCase=false, char otherSeparator='\0');
|
|
||||||
};
|
|
||||||
|
|
||||||
inline bool IsAlphabetic(unsigned int ch) {
|
|
||||||
return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,377 +0,0 @@
|
|||||||
// SciTE - Scintilla based Text Editor
|
|
||||||
/** @file SString.h
|
|
||||||
** A simple string class.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef SSTRING_H
|
|
||||||
#define SSTRING_H
|
|
||||||
|
|
||||||
// These functions are implemented because each platform calls them something different.
|
|
||||||
int CompareCaseInsensitive(const char *a, const char *b);
|
|
||||||
int CompareNCaseInsensitive(const char *a, const char *b, size_t len);
|
|
||||||
bool EqualCaseInsensitive(const char *a, const char *b);
|
|
||||||
|
|
||||||
// Define another string class.
|
|
||||||
// While it would be 'better' to use std::string, that doubles the executable size.
|
|
||||||
// An SString may contain embedded nul characters.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief A simple string class.
|
|
||||||
*
|
|
||||||
* Hold the length of the string for quick operations,
|
|
||||||
* can have a buffer bigger than the string to avoid too many memory allocations and copies.
|
|
||||||
* May have embedded zeroes as a result of @a substitute, but relies too heavily on C string
|
|
||||||
* functions to allow reliable manipulations of these strings, other than simple appends, etc.
|
|
||||||
**/
|
|
||||||
class SString {
|
|
||||||
public:
|
|
||||||
/** Type of string lengths (sizes) and positions (indexes). */
|
|
||||||
typedef size_t lenpos_t;
|
|
||||||
/** Out of bounds value indicating that the string argument should be measured. */
|
|
||||||
enum { measure_length=0xffffffffU};
|
|
||||||
|
|
||||||
private:
|
|
||||||
char *s; ///< The C string
|
|
||||||
lenpos_t sSize; ///< The size of the buffer, less 1: ie. the maximum size of the string
|
|
||||||
lenpos_t sLen; ///< The size of the string in s
|
|
||||||
lenpos_t sizeGrowth; ///< Minimum growth size when appending strings
|
|
||||||
enum { sizeGrowthDefault = 64 };
|
|
||||||
bool grow(lenpos_t lenNew) {
|
|
||||||
while (sizeGrowth * 6 < lenNew) {
|
|
||||||
sizeGrowth *= 2;
|
|
||||||
}
|
|
||||||
char *sNew = new char[lenNew + sizeGrowth + 1];
|
|
||||||
if (sNew) {
|
|
||||||
if (s) {
|
|
||||||
memcpy(sNew, s, sLen);
|
|
||||||
delete []s;
|
|
||||||
}
|
|
||||||
s = sNew;
|
|
||||||
s[sLen] = '\0';
|
|
||||||
sSize = lenNew + sizeGrowth;
|
|
||||||
}
|
|
||||||
return sNew != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SString &assign(const char *sOther, lenpos_t sSize_=measure_length) {
|
|
||||||
if (!sOther) {
|
|
||||||
sSize_ = 0;
|
|
||||||
} else if (sSize_ == measure_length) {
|
|
||||||
sSize_ = strlen(sOther);
|
|
||||||
}
|
|
||||||
if (sSize > 0 && sSize_ <= sSize) { // Does not allocate new buffer if the current is big enough
|
|
||||||
if (s && sSize_) {
|
|
||||||
memcpy(s, sOther, sSize_);
|
|
||||||
}
|
|
||||||
s[sSize_] = '\0';
|
|
||||||
sLen = sSize_;
|
|
||||||
} else {
|
|
||||||
delete []s;
|
|
||||||
s = StringAllocate(sOther, sSize_);
|
|
||||||
if (s) {
|
|
||||||
sSize = sSize_; // Allow buffer bigger than real string, thus providing space to grow
|
|
||||||
sLen = strlen(s);
|
|
||||||
} else {
|
|
||||||
sSize = sLen = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
SString() : s(0), sSize(0), sLen(0), sizeGrowth(sizeGrowthDefault) {
|
|
||||||
}
|
|
||||||
SString(const SString &source) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
s = StringAllocate(source.s);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
s = StringAllocate(s_);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
// note: expects the "last" argument to point one beyond the range end (a la STL iterators)
|
|
||||||
s = StringAllocate(s_ + first, last - first);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(int i) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
char number[32];
|
|
||||||
sprintf(number, "%0d", i);
|
|
||||||
s = StringAllocate(number);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(double d, int precision) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
char number[32];
|
|
||||||
sprintf(number, "%.*f", precision, d);
|
|
||||||
s = StringAllocate(number);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
~SString() {
|
|
||||||
delete []s;
|
|
||||||
s = 0;
|
|
||||||
sSize = 0;
|
|
||||||
sLen = 0;
|
|
||||||
}
|
|
||||||
void clear() {
|
|
||||||
if (s) {
|
|
||||||
*s = '\0';
|
|
||||||
}
|
|
||||||
sLen = 0;
|
|
||||||
}
|
|
||||||
/** Size of buffer. */
|
|
||||||
lenpos_t size() const {
|
|
||||||
if (s)
|
|
||||||
return sSize;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/** Size of string in buffer. */
|
|
||||||
lenpos_t length() const {
|
|
||||||
return sLen;
|
|
||||||
}
|
|
||||||
SString &operator=(const char *source) {
|
|
||||||
return assign(source);
|
|
||||||
}
|
|
||||||
SString &operator=(const SString &source) {
|
|
||||||
if (this != &source) {
|
|
||||||
assign(source.c_str());
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
bool operator==(const SString &sOther) const {
|
|
||||||
if ((s == 0) && (sOther.s == 0))
|
|
||||||
return true;
|
|
||||||
if ((s == 0) || (sOther.s == 0))
|
|
||||||
return false;
|
|
||||||
return strcmp(s, sOther.s) == 0;
|
|
||||||
}
|
|
||||||
bool operator!=(const SString &sOther) const {
|
|
||||||
return !operator==(sOther);
|
|
||||||
}
|
|
||||||
bool operator==(const char *sOther) const {
|
|
||||||
if ((s == 0) && (sOther == 0))
|
|
||||||
return true;
|
|
||||||
if ((s == 0) || (sOther == 0))
|
|
||||||
return false;
|
|
||||||
return strcmp(s, sOther) == 0;
|
|
||||||
}
|
|
||||||
bool operator!=(const char *sOther) const {
|
|
||||||
return !operator==(sOther);
|
|
||||||
}
|
|
||||||
bool contains(char ch) {
|
|
||||||
if (s && *s)
|
|
||||||
return strchr(s, ch) != 0;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
void setsizegrowth(lenpos_t sizeGrowth_) {
|
|
||||||
sizeGrowth = sizeGrowth_;
|
|
||||||
}
|
|
||||||
const char *c_str() const {
|
|
||||||
if (s)
|
|
||||||
return s;
|
|
||||||
else
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
/** Give ownership of buffer to caller which must use delete[] to free buffer. */
|
|
||||||
char *detach() {
|
|
||||||
char *sRet = s;
|
|
||||||
s = 0;
|
|
||||||
sSize = 0;
|
|
||||||
sLen = 0;
|
|
||||||
return sRet;
|
|
||||||
}
|
|
||||||
char operator[](lenpos_t i) const {
|
|
||||||
if (s && i < sSize) // Or < sLen? Depends on the use, both are OK
|
|
||||||
return s[i];
|
|
||||||
else
|
|
||||||
return '\0';
|
|
||||||
}
|
|
||||||
SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const {
|
|
||||||
if (subPos >= sLen) {
|
|
||||||
return SString(); // return a null string if start index is out of bounds
|
|
||||||
}
|
|
||||||
if ((subLen == measure_length) || (subPos + subLen > sLen)) {
|
|
||||||
subLen = sLen - subPos; // can't substr past end of source string
|
|
||||||
}
|
|
||||||
return SString(s, subPos, subPos + subLen);
|
|
||||||
}
|
|
||||||
SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length) {
|
|
||||||
if ((subLen == measure_length) || (subPos + subLen > sLen)) {
|
|
||||||
subLen = sLen - subPos; // don't apply past end of string
|
|
||||||
}
|
|
||||||
for (lenpos_t i = subPos; i < subPos + subLen; i++) {
|
|
||||||
if (s[i] < 'A' || s[i] > 'Z')
|
|
||||||
continue;
|
|
||||||
else
|
|
||||||
s[i] = static_cast<char>(s[i] - 'A' + 'a');
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0') {
|
|
||||||
if (!sOther) {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
if (sLenOther == measure_length) {
|
|
||||||
sLenOther = strlen(sOther);
|
|
||||||
}
|
|
||||||
int lenSep = 0;
|
|
||||||
if (sLen && sep) { // Only add a separator if not empty
|
|
||||||
lenSep = 1;
|
|
||||||
}
|
|
||||||
lenpos_t lenNew = sLen + sLenOther + lenSep;
|
|
||||||
// Conservative about growing the buffer: don't do it, unless really needed
|
|
||||||
if ((lenNew + 1 < sSize) || (grow(lenNew))) {
|
|
||||||
if (lenSep) {
|
|
||||||
s[sLen] = sep;
|
|
||||||
sLen++;
|
|
||||||
}
|
|
||||||
memcpy(&s[sLen], sOther, sLenOther);
|
|
||||||
sLen += sLenOther;
|
|
||||||
s[sLen] = '\0';
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
SString &operator+=(const char *sOther) {
|
|
||||||
return append(sOther, static_cast<lenpos_t>(measure_length));
|
|
||||||
}
|
|
||||||
SString &operator+=(const SString &sOther) {
|
|
||||||
return append(sOther.s, sOther.sLen);
|
|
||||||
}
|
|
||||||
SString &operator+=(char ch) {
|
|
||||||
return append(&ch, 1);
|
|
||||||
}
|
|
||||||
SString &appendwithseparator(const char *sOther, char sep) {
|
|
||||||
return append(sOther, strlen(sOther), sep);
|
|
||||||
}
|
|
||||||
SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length) {
|
|
||||||
if (!sOther) {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
if (sLenOther == measure_length) {
|
|
||||||
sLenOther = strlen(sOther);
|
|
||||||
}
|
|
||||||
lenpos_t lenNew = sLen + sLenOther;
|
|
||||||
// Conservative about growing the buffer: don't do it, unless really needed
|
|
||||||
if ((lenNew + 1 < sSize) || grow(lenNew)) {
|
|
||||||
lenpos_t moveChars = sLen - pos + 1;
|
|
||||||
for (lenpos_t i = moveChars; i > 0; i--) {
|
|
||||||
s[pos + sLenOther + i - 1] = s[pos + i - 1];
|
|
||||||
}
|
|
||||||
memcpy(s + pos, sOther, sLenOther);
|
|
||||||
sLen = lenNew;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/** Remove @a len characters from the @a pos position, included.
|
|
||||||
* Characters at pos + len and beyond replace characters at pos.
|
|
||||||
* If @a len is 0, or greater than the length of the string
|
|
||||||
* starting at @a pos, the string is just truncated at @a pos.
|
|
||||||
*/
|
|
||||||
void remove(lenpos_t pos, lenpos_t len) {
|
|
||||||
if (len < 1 || pos + len >= sLen) {
|
|
||||||
s[pos] = '\0';
|
|
||||||
sLen = pos;
|
|
||||||
} else {
|
|
||||||
for (lenpos_t i = pos; i < sLen - len + 1; i++) {
|
|
||||||
s[i] = s[i+len];
|
|
||||||
}
|
|
||||||
sLen -= len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SString &change(lenpos_t pos, char ch) {
|
|
||||||
if (pos >= sLen) { // character changed must be in string bounds
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
*(s + pos) = ch;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/** Read an integral numeric value from the string. */
|
|
||||||
int value() const {
|
|
||||||
if (s)
|
|
||||||
return atoi(s);
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int search(const char *sFind, lenpos_t start=0) const {
|
|
||||||
if (start < sLen) {
|
|
||||||
const char *sFound = strstr(s + start, sFind);
|
|
||||||
if (sFound) {
|
|
||||||
return sFound - s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
bool contains(const char *sFind) {
|
|
||||||
return search(sFind) >= 0;
|
|
||||||
}
|
|
||||||
int substitute(char chFind, char chReplace) {
|
|
||||||
int c = 0;
|
|
||||||
char *t = s;
|
|
||||||
while (t) {
|
|
||||||
t = strchr(t, chFind);
|
|
||||||
if (t) {
|
|
||||||
*t = chReplace;
|
|
||||||
t++;
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
int substitute(const char *sFind, const char *sReplace) {
|
|
||||||
int c = 0;
|
|
||||||
lenpos_t lenFind = strlen(sFind);
|
|
||||||
lenpos_t lenReplace = strlen(sReplace);
|
|
||||||
int posFound = search(sFind);
|
|
||||||
while (posFound >= 0) {
|
|
||||||
remove(posFound, lenFind);
|
|
||||||
insert(posFound, sReplace, lenReplace);
|
|
||||||
posFound = search(sFind, posFound + lenReplace);
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
int remove(const char *sFind) {
|
|
||||||
return substitute(sFind, "");
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Duplicate a C string.
|
|
||||||
* Allocate memory of the given size, or big enough to fit the string if length isn't given;
|
|
||||||
* then copy the given string in the allocated memory.
|
|
||||||
* @return the pointer to the new string
|
|
||||||
*/
|
|
||||||
static char *StringAllocate(
|
|
||||||
const char *s, ///< The string to duplicate
|
|
||||||
lenpos_t len=measure_length) ///< The length of memory to allocate. Optional.
|
|
||||||
{
|
|
||||||
if (s == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (len == measure_length) {
|
|
||||||
len = strlen(s);
|
|
||||||
}
|
|
||||||
char *sNew = new char[len + 1];
|
|
||||||
if (sNew) {
|
|
||||||
memcpy(sNew, s, len);
|
|
||||||
sNew[len] = '\0';
|
|
||||||
}
|
|
||||||
return sNew;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Duplicate a C string.
|
|
||||||
* Allocate memory of the given size, or big enough to fit the string if length isn't given;
|
|
||||||
* then copy the given string in the allocated memory.
|
|
||||||
* @return the pointer to the new string
|
|
||||||
*/
|
|
||||||
inline char *StringDup(
|
|
||||||
const char *s, ///< The string to duplicate
|
|
||||||
SString::lenpos_t len=SString::measure_length) ///< The length of memory to allocate. Optional.
|
|
||||||
{
|
|
||||||
return SString::StringAllocate(s, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,638 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file SciLexer.h
|
|
||||||
** Interface to the added lexer functions in the SciLexer version of the edit control.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
// Most of this file is automatically generated from the Scintilla.iface interface definition
|
|
||||||
// file which contains any comments about the definitions. HFacer.py does the generation.
|
|
||||||
|
|
||||||
#ifndef SCILEXER_H
|
|
||||||
#define SCILEXER_H
|
|
||||||
|
|
||||||
// SciLexer features - not in standard Scintilla
|
|
||||||
|
|
||||||
//++Autogenerated -- start of section automatically generated from Scintilla.iface
|
|
||||||
#define SCLEX_CONTAINER 0
|
|
||||||
#define SCLEX_NULL 1
|
|
||||||
#define SCLEX_PYTHON 2
|
|
||||||
#define SCLEX_CPP 3
|
|
||||||
#define SCLEX_HTML 4
|
|
||||||
#define SCLEX_XML 5
|
|
||||||
#define SCLEX_PERL 6
|
|
||||||
#define SCLEX_SQL 7
|
|
||||||
#define SCLEX_VB 8
|
|
||||||
#define SCLEX_PROPERTIES 9
|
|
||||||
#define SCLEX_ERRORLIST 10
|
|
||||||
#define SCLEX_MAKEFILE 11
|
|
||||||
#define SCLEX_BATCH 12
|
|
||||||
#define SCLEX_XCODE 13
|
|
||||||
#define SCLEX_LATEX 14
|
|
||||||
#define SCLEX_LUA 15
|
|
||||||
#define SCLEX_DIFF 16
|
|
||||||
#define SCLEX_CONF 17
|
|
||||||
#define SCLEX_PASCAL 18
|
|
||||||
#define SCLEX_AVE 19
|
|
||||||
#define SCLEX_ADA 20
|
|
||||||
#define SCLEX_LISP 21
|
|
||||||
#define SCLEX_RUBY 22
|
|
||||||
#define SCLEX_EIFFEL 23
|
|
||||||
#define SCLEX_EIFFELKW 24
|
|
||||||
#define SCLEX_TCL 25
|
|
||||||
#define SCLEX_NNCRONTAB 26
|
|
||||||
#define SCLEX_BULLANT 27
|
|
||||||
#define SCLEX_VBSCRIPT 28
|
|
||||||
#define SCLEX_ASP 29
|
|
||||||
#define SCLEX_PHP 30
|
|
||||||
#define SCLEX_BAAN 31
|
|
||||||
#define SCLEX_MATLAB 32
|
|
||||||
#define SCLEX_SCRIPTOL 33
|
|
||||||
#define SCLEX_ASM 34
|
|
||||||
#define SCLEX_CPPNOCASE 35
|
|
||||||
#define SCLEX_FORTRAN 36
|
|
||||||
#define SCLEX_F77 37
|
|
||||||
#define SCLEX_CSS 38
|
|
||||||
#define SCLEX_POV 39
|
|
||||||
#define SCLEX_LOUT 40
|
|
||||||
#define SCLEX_ESCRIPT 41
|
|
||||||
#define SCLEX_PS 42
|
|
||||||
#define SCLEX_NSIS 43
|
|
||||||
#define SCLEX_MMIXAL 44
|
|
||||||
#define SCLEX_CLW 45
|
|
||||||
#define SCLEX_CLWNOCASE 46
|
|
||||||
#define SCLEX_LOT 47
|
|
||||||
#define SCLEX_YAML 48
|
|
||||||
#define SCLEX_TEX 49
|
|
||||||
#define SCLEX_METAPOST 50
|
|
||||||
#define SCLEX_POWERBASIC 51
|
|
||||||
#define SCLEX_FORTH 52
|
|
||||||
#define SCLEX_ERLANG 53
|
|
||||||
#define SCLEX_OCTAVE 54
|
|
||||||
#define SCLEX_AUTOMATIC 1000
|
|
||||||
#define SCE_P_DEFAULT 0
|
|
||||||
#define SCE_P_COMMENTLINE 1
|
|
||||||
#define SCE_P_NUMBER 2
|
|
||||||
#define SCE_P_STRING 3
|
|
||||||
#define SCE_P_CHARACTER 4
|
|
||||||
#define SCE_P_WORD 5
|
|
||||||
#define SCE_P_TRIPLE 6
|
|
||||||
#define SCE_P_TRIPLEDOUBLE 7
|
|
||||||
#define SCE_P_CLASSNAME 8
|
|
||||||
#define SCE_P_DEFNAME 9
|
|
||||||
#define SCE_P_OPERATOR 10
|
|
||||||
#define SCE_P_IDENTIFIER 11
|
|
||||||
#define SCE_P_COMMENTBLOCK 12
|
|
||||||
#define SCE_P_STRINGEOL 13
|
|
||||||
#define SCE_C_DEFAULT 0
|
|
||||||
#define SCE_C_COMMENT 1
|
|
||||||
#define SCE_C_COMMENTLINE 2
|
|
||||||
#define SCE_C_COMMENTDOC 3
|
|
||||||
#define SCE_C_NUMBER 4
|
|
||||||
#define SCE_C_WORD 5
|
|
||||||
#define SCE_C_STRING 6
|
|
||||||
#define SCE_C_CHARACTER 7
|
|
||||||
#define SCE_C_UUID 8
|
|
||||||
#define SCE_C_PREPROCESSOR 9
|
|
||||||
#define SCE_C_OPERATOR 10
|
|
||||||
#define SCE_C_IDENTIFIER 11
|
|
||||||
#define SCE_C_STRINGEOL 12
|
|
||||||
#define SCE_C_VERBATIM 13
|
|
||||||
#define SCE_C_REGEX 14
|
|
||||||
#define SCE_C_COMMENTLINEDOC 15
|
|
||||||
#define SCE_C_WORD2 16
|
|
||||||
#define SCE_C_COMMENTDOCKEYWORD 17
|
|
||||||
#define SCE_C_COMMENTDOCKEYWORDERROR 18
|
|
||||||
#define SCE_C_GLOBALCLASS 19
|
|
||||||
#define SCE_H_DEFAULT 0
|
|
||||||
#define SCE_H_TAG 1
|
|
||||||
#define SCE_H_TAGUNKNOWN 2
|
|
||||||
#define SCE_H_ATTRIBUTE 3
|
|
||||||
#define SCE_H_ATTRIBUTEUNKNOWN 4
|
|
||||||
#define SCE_H_NUMBER 5
|
|
||||||
#define SCE_H_DOUBLESTRING 6
|
|
||||||
#define SCE_H_SINGLESTRING 7
|
|
||||||
#define SCE_H_OTHER 8
|
|
||||||
#define SCE_H_COMMENT 9
|
|
||||||
#define SCE_H_ENTITY 10
|
|
||||||
#define SCE_H_TAGEND 11
|
|
||||||
#define SCE_H_XMLSTART 12
|
|
||||||
#define SCE_H_XMLEND 13
|
|
||||||
#define SCE_H_SCRIPT 14
|
|
||||||
#define SCE_H_ASP 15
|
|
||||||
#define SCE_H_ASPAT 16
|
|
||||||
#define SCE_H_CDATA 17
|
|
||||||
#define SCE_H_QUESTION 18
|
|
||||||
#define SCE_H_VALUE 19
|
|
||||||
#define SCE_H_XCCOMMENT 20
|
|
||||||
#define SCE_H_SGML_DEFAULT 21
|
|
||||||
#define SCE_H_SGML_COMMAND 22
|
|
||||||
#define SCE_H_SGML_1ST_PARAM 23
|
|
||||||
#define SCE_H_SGML_DOUBLESTRING 24
|
|
||||||
#define SCE_H_SGML_SIMPLESTRING 25
|
|
||||||
#define SCE_H_SGML_ERROR 26
|
|
||||||
#define SCE_H_SGML_SPECIAL 27
|
|
||||||
#define SCE_H_SGML_ENTITY 28
|
|
||||||
#define SCE_H_SGML_COMMENT 29
|
|
||||||
#define SCE_H_SGML_1ST_PARAM_COMMENT 30
|
|
||||||
#define SCE_H_SGML_BLOCK_DEFAULT 31
|
|
||||||
#define SCE_HJ_START 40
|
|
||||||
#define SCE_HJ_DEFAULT 41
|
|
||||||
#define SCE_HJ_COMMENT 42
|
|
||||||
#define SCE_HJ_COMMENTLINE 43
|
|
||||||
#define SCE_HJ_COMMENTDOC 44
|
|
||||||
#define SCE_HJ_NUMBER 45
|
|
||||||
#define SCE_HJ_WORD 46
|
|
||||||
#define SCE_HJ_KEYWORD 47
|
|
||||||
#define SCE_HJ_DOUBLESTRING 48
|
|
||||||
#define SCE_HJ_SINGLESTRING 49
|
|
||||||
#define SCE_HJ_SYMBOLS 50
|
|
||||||
#define SCE_HJ_STRINGEOL 51
|
|
||||||
#define SCE_HJ_REGEX 52
|
|
||||||
#define SCE_HJA_START 55
|
|
||||||
#define SCE_HJA_DEFAULT 56
|
|
||||||
#define SCE_HJA_COMMENT 57
|
|
||||||
#define SCE_HJA_COMMENTLINE 58
|
|
||||||
#define SCE_HJA_COMMENTDOC 59
|
|
||||||
#define SCE_HJA_NUMBER 60
|
|
||||||
#define SCE_HJA_WORD 61
|
|
||||||
#define SCE_HJA_KEYWORD 62
|
|
||||||
#define SCE_HJA_DOUBLESTRING 63
|
|
||||||
#define SCE_HJA_SINGLESTRING 64
|
|
||||||
#define SCE_HJA_SYMBOLS 65
|
|
||||||
#define SCE_HJA_STRINGEOL 66
|
|
||||||
#define SCE_HJA_REGEX 67
|
|
||||||
#define SCE_HB_START 70
|
|
||||||
#define SCE_HB_DEFAULT 71
|
|
||||||
#define SCE_HB_COMMENTLINE 72
|
|
||||||
#define SCE_HB_NUMBER 73
|
|
||||||
#define SCE_HB_WORD 74
|
|
||||||
#define SCE_HB_STRING 75
|
|
||||||
#define SCE_HB_IDENTIFIER 76
|
|
||||||
#define SCE_HB_STRINGEOL 77
|
|
||||||
#define SCE_HBA_START 80
|
|
||||||
#define SCE_HBA_DEFAULT 81
|
|
||||||
#define SCE_HBA_COMMENTLINE 82
|
|
||||||
#define SCE_HBA_NUMBER 83
|
|
||||||
#define SCE_HBA_WORD 84
|
|
||||||
#define SCE_HBA_STRING 85
|
|
||||||
#define SCE_HBA_IDENTIFIER 86
|
|
||||||
#define SCE_HBA_STRINGEOL 87
|
|
||||||
#define SCE_HP_START 90
|
|
||||||
#define SCE_HP_DEFAULT 91
|
|
||||||
#define SCE_HP_COMMENTLINE 92
|
|
||||||
#define SCE_HP_NUMBER 93
|
|
||||||
#define SCE_HP_STRING 94
|
|
||||||
#define SCE_HP_CHARACTER 95
|
|
||||||
#define SCE_HP_WORD 96
|
|
||||||
#define SCE_HP_TRIPLE 97
|
|
||||||
#define SCE_HP_TRIPLEDOUBLE 98
|
|
||||||
#define SCE_HP_CLASSNAME 99
|
|
||||||
#define SCE_HP_DEFNAME 100
|
|
||||||
#define SCE_HP_OPERATOR 101
|
|
||||||
#define SCE_HP_IDENTIFIER 102
|
|
||||||
#define SCE_HPA_START 105
|
|
||||||
#define SCE_HPA_DEFAULT 106
|
|
||||||
#define SCE_HPA_COMMENTLINE 107
|
|
||||||
#define SCE_HPA_NUMBER 108
|
|
||||||
#define SCE_HPA_STRING 109
|
|
||||||
#define SCE_HPA_CHARACTER 110
|
|
||||||
#define SCE_HPA_WORD 111
|
|
||||||
#define SCE_HPA_TRIPLE 112
|
|
||||||
#define SCE_HPA_TRIPLEDOUBLE 113
|
|
||||||
#define SCE_HPA_CLASSNAME 114
|
|
||||||
#define SCE_HPA_DEFNAME 115
|
|
||||||
#define SCE_HPA_OPERATOR 116
|
|
||||||
#define SCE_HPA_IDENTIFIER 117
|
|
||||||
#define SCE_HPHP_DEFAULT 118
|
|
||||||
#define SCE_HPHP_HSTRING 119
|
|
||||||
#define SCE_HPHP_SIMPLESTRING 120
|
|
||||||
#define SCE_HPHP_WORD 121
|
|
||||||
#define SCE_HPHP_NUMBER 122
|
|
||||||
#define SCE_HPHP_VARIABLE 123
|
|
||||||
#define SCE_HPHP_COMMENT 124
|
|
||||||
#define SCE_HPHP_COMMENTLINE 125
|
|
||||||
#define SCE_HPHP_HSTRING_VARIABLE 126
|
|
||||||
#define SCE_HPHP_OPERATOR 127
|
|
||||||
#define SCE_PL_DEFAULT 0
|
|
||||||
#define SCE_PL_ERROR 1
|
|
||||||
#define SCE_PL_COMMENTLINE 2
|
|
||||||
#define SCE_PL_POD 3
|
|
||||||
#define SCE_PL_NUMBER 4
|
|
||||||
#define SCE_PL_WORD 5
|
|
||||||
#define SCE_PL_STRING 6
|
|
||||||
#define SCE_PL_CHARACTER 7
|
|
||||||
#define SCE_PL_PUNCTUATION 8
|
|
||||||
#define SCE_PL_PREPROCESSOR 9
|
|
||||||
#define SCE_PL_OPERATOR 10
|
|
||||||
#define SCE_PL_IDENTIFIER 11
|
|
||||||
#define SCE_PL_SCALAR 12
|
|
||||||
#define SCE_PL_ARRAY 13
|
|
||||||
#define SCE_PL_HASH 14
|
|
||||||
#define SCE_PL_SYMBOLTABLE 15
|
|
||||||
#define SCE_PL_REGEX 17
|
|
||||||
#define SCE_PL_REGSUBST 18
|
|
||||||
#define SCE_PL_LONGQUOTE 19
|
|
||||||
#define SCE_PL_BACKTICKS 20
|
|
||||||
#define SCE_PL_DATASECTION 21
|
|
||||||
#define SCE_PL_HERE_DELIM 22
|
|
||||||
#define SCE_PL_HERE_Q 23
|
|
||||||
#define SCE_PL_HERE_QQ 24
|
|
||||||
#define SCE_PL_HERE_QX 25
|
|
||||||
#define SCE_PL_STRING_Q 26
|
|
||||||
#define SCE_PL_STRING_QQ 27
|
|
||||||
#define SCE_PL_STRING_QX 28
|
|
||||||
#define SCE_PL_STRING_QR 29
|
|
||||||
#define SCE_PL_STRING_QW 30
|
|
||||||
#define SCE_B_DEFAULT 0
|
|
||||||
#define SCE_B_COMMENT 1
|
|
||||||
#define SCE_B_NUMBER 2
|
|
||||||
#define SCE_B_KEYWORD 3
|
|
||||||
#define SCE_B_STRING 4
|
|
||||||
#define SCE_B_PREPROCESSOR 5
|
|
||||||
#define SCE_B_OPERATOR 6
|
|
||||||
#define SCE_B_IDENTIFIER 7
|
|
||||||
#define SCE_B_DATE 8
|
|
||||||
#define SCE_B_STRINGEOL 9
|
|
||||||
#define SCE_B_KEYWORD2 10
|
|
||||||
#define SCE_B_KEYWORD3 11
|
|
||||||
#define SCE_B_KEYWORD4 12
|
|
||||||
#define SCE_PROPS_DEFAULT 0
|
|
||||||
#define SCE_PROPS_COMMENT 1
|
|
||||||
#define SCE_PROPS_SECTION 2
|
|
||||||
#define SCE_PROPS_ASSIGNMENT 3
|
|
||||||
#define SCE_PROPS_DEFVAL 4
|
|
||||||
#define SCE_L_DEFAULT 0
|
|
||||||
#define SCE_L_COMMAND 1
|
|
||||||
#define SCE_L_TAG 2
|
|
||||||
#define SCE_L_MATH 3
|
|
||||||
#define SCE_L_COMMENT 4
|
|
||||||
#define SCE_LUA_DEFAULT 0
|
|
||||||
#define SCE_LUA_COMMENT 1
|
|
||||||
#define SCE_LUA_COMMENTLINE 2
|
|
||||||
#define SCE_LUA_COMMENTDOC 3
|
|
||||||
#define SCE_LUA_NUMBER 4
|
|
||||||
#define SCE_LUA_WORD 5
|
|
||||||
#define SCE_LUA_STRING 6
|
|
||||||
#define SCE_LUA_CHARACTER 7
|
|
||||||
#define SCE_LUA_LITERALSTRING 8
|
|
||||||
#define SCE_LUA_PREPROCESSOR 9
|
|
||||||
#define SCE_LUA_OPERATOR 10
|
|
||||||
#define SCE_LUA_IDENTIFIER 11
|
|
||||||
#define SCE_LUA_STRINGEOL 12
|
|
||||||
#define SCE_LUA_WORD2 13
|
|
||||||
#define SCE_LUA_WORD3 14
|
|
||||||
#define SCE_LUA_WORD4 15
|
|
||||||
#define SCE_LUA_WORD5 16
|
|
||||||
#define SCE_LUA_WORD6 17
|
|
||||||
#define SCE_LUA_WORD7 18
|
|
||||||
#define SCE_LUA_WORD8 19
|
|
||||||
#define SCE_ERR_DEFAULT 0
|
|
||||||
#define SCE_ERR_PYTHON 1
|
|
||||||
#define SCE_ERR_GCC 2
|
|
||||||
#define SCE_ERR_MS 3
|
|
||||||
#define SCE_ERR_CMD 4
|
|
||||||
#define SCE_ERR_BORLAND 5
|
|
||||||
#define SCE_ERR_PERL 6
|
|
||||||
#define SCE_ERR_NET 7
|
|
||||||
#define SCE_ERR_LUA 8
|
|
||||||
#define SCE_ERR_CTAG 9
|
|
||||||
#define SCE_ERR_DIFF_CHANGED 10
|
|
||||||
#define SCE_ERR_DIFF_ADDITION 11
|
|
||||||
#define SCE_ERR_DIFF_DELETION 12
|
|
||||||
#define SCE_ERR_DIFF_MESSAGE 13
|
|
||||||
#define SCE_ERR_PHP 14
|
|
||||||
#define SCE_ERR_ELF 15
|
|
||||||
#define SCE_ERR_IFC 16
|
|
||||||
#define SCE_ERR_IFORT 17
|
|
||||||
#define SCE_ERR_ABSF 18
|
|
||||||
#define SCE_BAT_DEFAULT 0
|
|
||||||
#define SCE_BAT_COMMENT 1
|
|
||||||
#define SCE_BAT_WORD 2
|
|
||||||
#define SCE_BAT_LABEL 3
|
|
||||||
#define SCE_BAT_HIDE 4
|
|
||||||
#define SCE_BAT_COMMAND 5
|
|
||||||
#define SCE_BAT_IDENTIFIER 6
|
|
||||||
#define SCE_BAT_OPERATOR 7
|
|
||||||
#define SCE_MAKE_DEFAULT 0
|
|
||||||
#define SCE_MAKE_COMMENT 1
|
|
||||||
#define SCE_MAKE_PREPROCESSOR 2
|
|
||||||
#define SCE_MAKE_IDENTIFIER 3
|
|
||||||
#define SCE_MAKE_OPERATOR 4
|
|
||||||
#define SCE_MAKE_TARGET 5
|
|
||||||
#define SCE_MAKE_IDEOL 9
|
|
||||||
#define SCE_DIFF_DEFAULT 0
|
|
||||||
#define SCE_DIFF_COMMENT 1
|
|
||||||
#define SCE_DIFF_COMMAND 2
|
|
||||||
#define SCE_DIFF_HEADER 3
|
|
||||||
#define SCE_DIFF_POSITION 4
|
|
||||||
#define SCE_DIFF_DELETED 5
|
|
||||||
#define SCE_DIFF_ADDED 6
|
|
||||||
#define SCE_CONF_DEFAULT 0
|
|
||||||
#define SCE_CONF_COMMENT 1
|
|
||||||
#define SCE_CONF_NUMBER 2
|
|
||||||
#define SCE_CONF_IDENTIFIER 3
|
|
||||||
#define SCE_CONF_EXTENSION 4
|
|
||||||
#define SCE_CONF_PARAMETER 5
|
|
||||||
#define SCE_CONF_STRING 6
|
|
||||||
#define SCE_CONF_OPERATOR 7
|
|
||||||
#define SCE_CONF_IP 8
|
|
||||||
#define SCE_CONF_DIRECTIVE 9
|
|
||||||
#define SCE_AVE_DEFAULT 0
|
|
||||||
#define SCE_AVE_COMMENT 1
|
|
||||||
#define SCE_AVE_NUMBER 2
|
|
||||||
#define SCE_AVE_WORD 3
|
|
||||||
#define SCE_AVE_STRING 6
|
|
||||||
#define SCE_AVE_ENUM 7
|
|
||||||
#define SCE_AVE_STRINGEOL 8
|
|
||||||
#define SCE_AVE_IDENTIFIER 9
|
|
||||||
#define SCE_AVE_OPERATOR 10
|
|
||||||
#define SCE_AVE_WORD1 11
|
|
||||||
#define SCE_AVE_WORD2 12
|
|
||||||
#define SCE_AVE_WORD3 13
|
|
||||||
#define SCE_AVE_WORD4 14
|
|
||||||
#define SCE_AVE_WORD5 15
|
|
||||||
#define SCE_AVE_WORD6 16
|
|
||||||
#define SCE_ADA_DEFAULT 0
|
|
||||||
#define SCE_ADA_WORD 1
|
|
||||||
#define SCE_ADA_IDENTIFIER 2
|
|
||||||
#define SCE_ADA_NUMBER 3
|
|
||||||
#define SCE_ADA_DELIMITER 4
|
|
||||||
#define SCE_ADA_CHARACTER 5
|
|
||||||
#define SCE_ADA_CHARACTEREOL 6
|
|
||||||
#define SCE_ADA_STRING 7
|
|
||||||
#define SCE_ADA_STRINGEOL 8
|
|
||||||
#define SCE_ADA_LABEL 9
|
|
||||||
#define SCE_ADA_COMMENTLINE 10
|
|
||||||
#define SCE_ADA_ILLEGAL 11
|
|
||||||
#define SCE_BAAN_DEFAULT 0
|
|
||||||
#define SCE_BAAN_COMMENT 1
|
|
||||||
#define SCE_BAAN_COMMENTDOC 2
|
|
||||||
#define SCE_BAAN_NUMBER 3
|
|
||||||
#define SCE_BAAN_WORD 4
|
|
||||||
#define SCE_BAAN_STRING 5
|
|
||||||
#define SCE_BAAN_PREPROCESSOR 6
|
|
||||||
#define SCE_BAAN_OPERATOR 7
|
|
||||||
#define SCE_BAAN_IDENTIFIER 8
|
|
||||||
#define SCE_BAAN_STRINGEOL 9
|
|
||||||
#define SCE_BAAN_WORD2 10
|
|
||||||
#define SCE_LISP_DEFAULT 0
|
|
||||||
#define SCE_LISP_COMMENT 1
|
|
||||||
#define SCE_LISP_NUMBER 2
|
|
||||||
#define SCE_LISP_KEYWORD 3
|
|
||||||
#define SCE_LISP_STRING 6
|
|
||||||
#define SCE_LISP_STRINGEOL 8
|
|
||||||
#define SCE_LISP_IDENTIFIER 9
|
|
||||||
#define SCE_LISP_OPERATOR 10
|
|
||||||
#define SCE_EIFFEL_DEFAULT 0
|
|
||||||
#define SCE_EIFFEL_COMMENTLINE 1
|
|
||||||
#define SCE_EIFFEL_NUMBER 2
|
|
||||||
#define SCE_EIFFEL_WORD 3
|
|
||||||
#define SCE_EIFFEL_STRING 4
|
|
||||||
#define SCE_EIFFEL_CHARACTER 5
|
|
||||||
#define SCE_EIFFEL_OPERATOR 6
|
|
||||||
#define SCE_EIFFEL_IDENTIFIER 7
|
|
||||||
#define SCE_EIFFEL_STRINGEOL 8
|
|
||||||
#define SCE_NNCRONTAB_DEFAULT 0
|
|
||||||
#define SCE_NNCRONTAB_COMMENT 1
|
|
||||||
#define SCE_NNCRONTAB_TASK 2
|
|
||||||
#define SCE_NNCRONTAB_SECTION 3
|
|
||||||
#define SCE_NNCRONTAB_KEYWORD 4
|
|
||||||
#define SCE_NNCRONTAB_MODIFIER 5
|
|
||||||
#define SCE_NNCRONTAB_ASTERISK 6
|
|
||||||
#define SCE_NNCRONTAB_NUMBER 7
|
|
||||||
#define SCE_NNCRONTAB_STRING 8
|
|
||||||
#define SCE_NNCRONTAB_ENVIRONMENT 9
|
|
||||||
#define SCE_NNCRONTAB_IDENTIFIER 10
|
|
||||||
#define SCE_FORTH_DEFAULT 0
|
|
||||||
#define SCE_FORTH_COMMENT 1
|
|
||||||
#define SCE_FORTH_COMMENT_ML 2
|
|
||||||
#define SCE_FORTH_IDENTIFIER 3
|
|
||||||
#define SCE_FORTH_CONTROL 4
|
|
||||||
#define SCE_FORTH_KEYWORD 5
|
|
||||||
#define SCE_FORTH_DEFWORD 6
|
|
||||||
#define SCE_FORTH_PREWORD1 7
|
|
||||||
#define SCE_FORTH_PREWORD2 8
|
|
||||||
#define SCE_FORTH_NUMBER 9
|
|
||||||
#define SCE_FORTH_STRING 10
|
|
||||||
#define SCE_FORTH_LOCALE 11
|
|
||||||
#define SCE_MATLAB_DEFAULT 0
|
|
||||||
#define SCE_MATLAB_COMMENT 1
|
|
||||||
#define SCE_MATLAB_COMMAND 2
|
|
||||||
#define SCE_MATLAB_NUMBER 3
|
|
||||||
#define SCE_MATLAB_KEYWORD 4
|
|
||||||
#define SCE_MATLAB_STRING 5
|
|
||||||
#define SCE_MATLAB_OPERATOR 6
|
|
||||||
#define SCE_MATLAB_IDENTIFIER 7
|
|
||||||
#define SCE_MATLAB_DOUBLEQUOTESTRING 8
|
|
||||||
#define SCE_SCRIPTOL_DEFAULT 0
|
|
||||||
#define SCE_SCRIPTOL_WHITE 1
|
|
||||||
#define SCE_SCRIPTOL_COMMENTLINE 2
|
|
||||||
#define SCE_SCRIPTOL_PERSISTENT 3
|
|
||||||
#define SCE_SCRIPTOL_CSTYLE 4
|
|
||||||
#define SCE_SCRIPTOL_COMMENTBLOCK 5
|
|
||||||
#define SCE_SCRIPTOL_NUMBER 6
|
|
||||||
#define SCE_SCRIPTOL_STRING 7
|
|
||||||
#define SCE_SCRIPTOL_CHARACTER 8
|
|
||||||
#define SCE_SCRIPTOL_STRINGEOL 9
|
|
||||||
#define SCE_SCRIPTOL_KEYWORD 10
|
|
||||||
#define SCE_SCRIPTOL_OPERATOR 11
|
|
||||||
#define SCE_SCRIPTOL_IDENTIFIER 12
|
|
||||||
#define SCE_SCRIPTOL_TRIPLE 13
|
|
||||||
#define SCE_SCRIPTOL_CLASSNAME 14
|
|
||||||
#define SCE_SCRIPTOL_PREPROCESSOR 15
|
|
||||||
#define SCE_ASM_DEFAULT 0
|
|
||||||
#define SCE_ASM_COMMENT 1
|
|
||||||
#define SCE_ASM_NUMBER 2
|
|
||||||
#define SCE_ASM_STRING 3
|
|
||||||
#define SCE_ASM_OPERATOR 4
|
|
||||||
#define SCE_ASM_IDENTIFIER 5
|
|
||||||
#define SCE_ASM_CPUINSTRUCTION 6
|
|
||||||
#define SCE_ASM_MATHINSTRUCTION 7
|
|
||||||
#define SCE_ASM_REGISTER 8
|
|
||||||
#define SCE_ASM_DIRECTIVE 9
|
|
||||||
#define SCE_ASM_DIRECTIVEOPERAND 10
|
|
||||||
#define SCE_ASM_COMMENTBLOCK 11
|
|
||||||
#define SCE_ASM_CHARACTER 12
|
|
||||||
#define SCE_ASM_STRINGEOL 13
|
|
||||||
#define SCE_ASM_EXTINSTRUCTION 14
|
|
||||||
#define SCE_F_DEFAULT 0
|
|
||||||
#define SCE_F_COMMENT 1
|
|
||||||
#define SCE_F_NUMBER 2
|
|
||||||
#define SCE_F_STRING1 3
|
|
||||||
#define SCE_F_STRING2 4
|
|
||||||
#define SCE_F_STRINGEOL 5
|
|
||||||
#define SCE_F_OPERATOR 6
|
|
||||||
#define SCE_F_IDENTIFIER 7
|
|
||||||
#define SCE_F_WORD 8
|
|
||||||
#define SCE_F_WORD2 9
|
|
||||||
#define SCE_F_WORD3 10
|
|
||||||
#define SCE_F_PREPROCESSOR 11
|
|
||||||
#define SCE_F_OPERATOR2 12
|
|
||||||
#define SCE_F_LABEL 13
|
|
||||||
#define SCE_F_CONTINUATION 14
|
|
||||||
#define SCE_CSS_DEFAULT 0
|
|
||||||
#define SCE_CSS_TAG 1
|
|
||||||
#define SCE_CSS_CLASS 2
|
|
||||||
#define SCE_CSS_PSEUDOCLASS 3
|
|
||||||
#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4
|
|
||||||
#define SCE_CSS_OPERATOR 5
|
|
||||||
#define SCE_CSS_IDENTIFIER 6
|
|
||||||
#define SCE_CSS_UNKNOWN_IDENTIFIER 7
|
|
||||||
#define SCE_CSS_VALUE 8
|
|
||||||
#define SCE_CSS_COMMENT 9
|
|
||||||
#define SCE_CSS_ID 10
|
|
||||||
#define SCE_CSS_IMPORTANT 11
|
|
||||||
#define SCE_CSS_DIRECTIVE 12
|
|
||||||
#define SCE_CSS_DOUBLESTRING 13
|
|
||||||
#define SCE_CSS_SINGLESTRING 14
|
|
||||||
#define SCE_POV_DEFAULT 0
|
|
||||||
#define SCE_POV_COMMENT 1
|
|
||||||
#define SCE_POV_COMMENTLINE 2
|
|
||||||
#define SCE_POV_NUMBER 3
|
|
||||||
#define SCE_POV_OPERATOR 4
|
|
||||||
#define SCE_POV_IDENTIFIER 5
|
|
||||||
#define SCE_POV_STRING 6
|
|
||||||
#define SCE_POV_STRINGEOL 7
|
|
||||||
#define SCE_POV_DIRECTIVE 8
|
|
||||||
#define SCE_POV_BADDIRECTIVE 9
|
|
||||||
#define SCE_POV_WORD2 10
|
|
||||||
#define SCE_POV_WORD3 11
|
|
||||||
#define SCE_POV_WORD4 12
|
|
||||||
#define SCE_POV_WORD5 13
|
|
||||||
#define SCE_POV_WORD6 14
|
|
||||||
#define SCE_POV_WORD7 15
|
|
||||||
#define SCE_POV_WORD8 16
|
|
||||||
#define SCE_LOUT_DEFAULT 0
|
|
||||||
#define SCE_LOUT_COMMENT 1
|
|
||||||
#define SCE_LOUT_NUMBER 2
|
|
||||||
#define SCE_LOUT_WORD 3
|
|
||||||
#define SCE_LOUT_WORD2 4
|
|
||||||
#define SCE_LOUT_WORD3 5
|
|
||||||
#define SCE_LOUT_WORD4 6
|
|
||||||
#define SCE_LOUT_STRING 7
|
|
||||||
#define SCE_LOUT_OPERATOR 8
|
|
||||||
#define SCE_LOUT_IDENTIFIER 9
|
|
||||||
#define SCE_LOUT_STRINGEOL 10
|
|
||||||
#define SCE_ESCRIPT_DEFAULT 0
|
|
||||||
#define SCE_ESCRIPT_COMMENT 1
|
|
||||||
#define SCE_ESCRIPT_COMMENTLINE 2
|
|
||||||
#define SCE_ESCRIPT_COMMENTDOC 3
|
|
||||||
#define SCE_ESCRIPT_NUMBER 4
|
|
||||||
#define SCE_ESCRIPT_WORD 5
|
|
||||||
#define SCE_ESCRIPT_STRING 6
|
|
||||||
#define SCE_ESCRIPT_OPERATOR 7
|
|
||||||
#define SCE_ESCRIPT_IDENTIFIER 8
|
|
||||||
#define SCE_ESCRIPT_BRACE 9
|
|
||||||
#define SCE_ESCRIPT_WORD2 10
|
|
||||||
#define SCE_ESCRIPT_WORD3 11
|
|
||||||
#define SCE_PS_DEFAULT 0
|
|
||||||
#define SCE_PS_COMMENT 1
|
|
||||||
#define SCE_PS_DSC_COMMENT 2
|
|
||||||
#define SCE_PS_DSC_VALUE 3
|
|
||||||
#define SCE_PS_NUMBER 4
|
|
||||||
#define SCE_PS_NAME 5
|
|
||||||
#define SCE_PS_KEYWORD 6
|
|
||||||
#define SCE_PS_LITERAL 7
|
|
||||||
#define SCE_PS_IMMEVAL 8
|
|
||||||
#define SCE_PS_PAREN_ARRAY 9
|
|
||||||
#define SCE_PS_PAREN_DICT 10
|
|
||||||
#define SCE_PS_PAREN_PROC 11
|
|
||||||
#define SCE_PS_TEXT 12
|
|
||||||
#define SCE_PS_HEXSTRING 13
|
|
||||||
#define SCE_PS_BASE85STRING 14
|
|
||||||
#define SCE_PS_BADSTRINGCHAR 15
|
|
||||||
#define SCE_NSIS_DEFAULT 0
|
|
||||||
#define SCE_NSIS_COMMENT 1
|
|
||||||
#define SCE_NSIS_STRINGDQ 2
|
|
||||||
#define SCE_NSIS_STRINGLQ 3
|
|
||||||
#define SCE_NSIS_STRINGRQ 4
|
|
||||||
#define SCE_NSIS_FUNCTION 5
|
|
||||||
#define SCE_NSIS_VARIABLE 6
|
|
||||||
#define SCE_NSIS_LABEL 7
|
|
||||||
#define SCE_NSIS_USERDEFINED 8
|
|
||||||
#define SCE_NSIS_SECTIONDEF 9
|
|
||||||
#define SCE_NSIS_SUBSECTIONDEF 10
|
|
||||||
#define SCE_NSIS_IFDEFINEDEF 11
|
|
||||||
#define SCE_NSIS_MACRODEF 12
|
|
||||||
#define SCE_NSIS_STRINGVAR 13
|
|
||||||
#define SCE_MMIXAL_LEADWS 0
|
|
||||||
#define SCE_MMIXAL_COMMENT 1
|
|
||||||
#define SCE_MMIXAL_LABEL 2
|
|
||||||
#define SCE_MMIXAL_OPCODE 3
|
|
||||||
#define SCE_MMIXAL_OPCODE_PRE 4
|
|
||||||
#define SCE_MMIXAL_OPCODE_VALID 5
|
|
||||||
#define SCE_MMIXAL_OPCODE_UNKNOWN 6
|
|
||||||
#define SCE_MMIXAL_OPCODE_POST 7
|
|
||||||
#define SCE_MMIXAL_OPERANDS 8
|
|
||||||
#define SCE_MMIXAL_NUMBER 9
|
|
||||||
#define SCE_MMIXAL_REF 10
|
|
||||||
#define SCE_MMIXAL_CHAR 11
|
|
||||||
#define SCE_MMIXAL_STRING 12
|
|
||||||
#define SCE_MMIXAL_REGISTER 13
|
|
||||||
#define SCE_MMIXAL_HEX 14
|
|
||||||
#define SCE_MMIXAL_OPERATOR 15
|
|
||||||
#define SCE_MMIXAL_SYMBOL 16
|
|
||||||
#define SCE_MMIXAL_INCLUDE 17
|
|
||||||
#define SCE_CLW_DEFAULT 0
|
|
||||||
#define SCE_CLW_LABEL 1
|
|
||||||
#define SCE_CLW_COMMENT 2
|
|
||||||
#define SCE_CLW_STRING 3
|
|
||||||
#define SCE_CLW_USER_IDENTIFIER 4
|
|
||||||
#define SCE_CLW_INTEGER_CONSTANT 5
|
|
||||||
#define SCE_CLW_REAL_CONSTANT 6
|
|
||||||
#define SCE_CLW_PICTURE_STRING 7
|
|
||||||
#define SCE_CLW_KEYWORD 8
|
|
||||||
#define SCE_CLW_COMPILER_DIRECTIVE 9
|
|
||||||
#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 10
|
|
||||||
#define SCE_CLW_STRUCTURE_DATA_TYPE 11
|
|
||||||
#define SCE_CLW_ATTRIBUTE 12
|
|
||||||
#define SCE_CLW_STANDARD_EQUATE 13
|
|
||||||
#define SCE_CLW_ERROR 14
|
|
||||||
#define SCE_LOT_DEFAULT 0
|
|
||||||
#define SCE_LOT_HEADER 1
|
|
||||||
#define SCE_LOT_BREAK 2
|
|
||||||
#define SCE_LOT_SET 3
|
|
||||||
#define SCE_LOT_PASS 4
|
|
||||||
#define SCE_LOT_FAIL 5
|
|
||||||
#define SCE_LOT_ABORT 6
|
|
||||||
#define SCE_YAML_DEFAULT 0
|
|
||||||
#define SCE_YAML_COMMENT 1
|
|
||||||
#define SCE_YAML_IDENTIFIER 2
|
|
||||||
#define SCE_YAML_KEYWORD 3
|
|
||||||
#define SCE_YAML_NUMBER 4
|
|
||||||
#define SCE_YAML_REFERENCE 5
|
|
||||||
#define SCE_YAML_DOCUMENT 6
|
|
||||||
#define SCE_YAML_TEXT 7
|
|
||||||
#define SCE_YAML_ERROR 8
|
|
||||||
#define SCE_TEX_DEFAULT 0
|
|
||||||
#define SCE_TEX_SPECIAL 1
|
|
||||||
#define SCE_TEX_GROUP 2
|
|
||||||
#define SCE_TEX_SYMBOL 3
|
|
||||||
#define SCE_TEX_COMMAND 4
|
|
||||||
#define SCE_TEX_TEXT 5
|
|
||||||
#define SCE_METAPOST_DEFAULT 0
|
|
||||||
#define SCE_METAPOST_SPECIAL 1
|
|
||||||
#define SCE_METAPOST_GROUP 2
|
|
||||||
#define SCE_METAPOST_SYMBOL 3
|
|
||||||
#define SCE_METAPOST_COMMAND 4
|
|
||||||
#define SCE_METAPOST_TEXT 5
|
|
||||||
#define SCE_METAPOST_EXTRA 6
|
|
||||||
#define SCE_ERLANG_DEFAULT 0
|
|
||||||
#define SCE_ERLANG_COMMENT 1
|
|
||||||
#define SCE_ERLANG_VARIABLE 2
|
|
||||||
#define SCE_ERLANG_NUMBER 3
|
|
||||||
#define SCE_ERLANG_KEYWORD 4
|
|
||||||
#define SCE_ERLANG_STRING 5
|
|
||||||
#define SCE_ERLANG_OPERATOR 6
|
|
||||||
#define SCE_ERLANG_ATOM 7
|
|
||||||
#define SCE_ERLANG_FUNCTION_NAME 8
|
|
||||||
#define SCE_ERLANG_CHARACTER 9
|
|
||||||
#define SCE_ERLANG_MACRO 10
|
|
||||||
#define SCE_ERLANG_RECORD 11
|
|
||||||
#define SCE_ERLANG_SEPARATOR 12
|
|
||||||
#define SCE_ERLANG_NODE_NAME 13
|
|
||||||
#define SCE_ERLANG_UNKNOWN 31
|
|
||||||
//--Autogenerated -- end of section automatically generated from Scintilla.iface
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,722 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Scintilla.h
|
|
||||||
** Interface to the edit control.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
// Most of this file is automatically generated from the Scintilla.iface interface definition
|
|
||||||
// file which contains any comments about the definitions. HFacer.py does the generation.
|
|
||||||
|
|
||||||
#ifndef SCINTILLA_H
|
|
||||||
#define SCINTILLA_H
|
|
||||||
|
|
||||||
#if PLAT_WIN
|
|
||||||
// Return false on failure:
|
|
||||||
bool Scintilla_RegisterClasses(void *hInstance);
|
|
||||||
bool Scintilla_ReleaseResources();
|
|
||||||
#endif
|
|
||||||
int Scintilla_LinkLexers();
|
|
||||||
|
|
||||||
// Here should be placed typedefs for uptr_t, an unsigned integer type large enough to
|
|
||||||
// hold a pointer and sptr_t, a signed integer large enough to hold a pointer.
|
|
||||||
// May need to be changed for 64 bit platforms.
|
|
||||||
#if _MSC_VER >= 1300
|
|
||||||
#include <BaseTsd.h>
|
|
||||||
#endif
|
|
||||||
#ifdef MAXULONG_PTR
|
|
||||||
typedef ULONG_PTR uptr_t;
|
|
||||||
typedef LONG_PTR sptr_t;
|
|
||||||
#else
|
|
||||||
typedef unsigned long uptr_t;
|
|
||||||
typedef long sptr_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
|
|
||||||
//++Autogenerated -- start of section automatically generated from Scintilla.iface
|
|
||||||
#define INVALID_POSITION -1
|
|
||||||
#define SCI_START 2000
|
|
||||||
#define SCI_OPTIONAL_START 3000
|
|
||||||
#define SCI_LEXER_START 4000
|
|
||||||
#define SCI_ADDTEXT 2001
|
|
||||||
#define SCI_ADDSTYLEDTEXT 2002
|
|
||||||
#define SCI_INSERTTEXT 2003
|
|
||||||
#define SCI_CLEARALL 2004
|
|
||||||
#define SCI_CLEARDOCUMENTSTYLE 2005
|
|
||||||
#define SCI_GETLENGTH 2006
|
|
||||||
#define SCI_GETCHARAT 2007
|
|
||||||
#define SCI_GETCURRENTPOS 2008
|
|
||||||
#define SCI_GETANCHOR 2009
|
|
||||||
#define SCI_GETSTYLEAT 2010
|
|
||||||
#define SCI_REDO 2011
|
|
||||||
#define SCI_SETUNDOCOLLECTION 2012
|
|
||||||
#define SCI_SELECTALL 2013
|
|
||||||
#define SCI_SETSAVEPOINT 2014
|
|
||||||
#define SCI_GETSTYLEDTEXT 2015
|
|
||||||
#define SCI_CANREDO 2016
|
|
||||||
#define SCI_MARKERLINEFROMHANDLE 2017
|
|
||||||
#define SCI_MARKERDELETEHANDLE 2018
|
|
||||||
#define SCI_GETUNDOCOLLECTION 2019
|
|
||||||
#define SCWS_INVISIBLE 0
|
|
||||||
#define SCWS_VISIBLEALWAYS 1
|
|
||||||
#define SCWS_VISIBLEAFTERINDENT 2
|
|
||||||
#define SCI_GETVIEWWS 2020
|
|
||||||
#define SCI_SETVIEWWS 2021
|
|
||||||
#define SCI_POSITIONFROMPOINT 2022
|
|
||||||
#define SCI_POSITIONFROMPOINTCLOSE 2023
|
|
||||||
#define SCI_GOTOLINE 2024
|
|
||||||
#define SCI_GOTOPOS 2025
|
|
||||||
#define SCI_SETANCHOR 2026
|
|
||||||
#define SCI_GETCURLINE 2027
|
|
||||||
#define SCI_GETENDSTYLED 2028
|
|
||||||
#define SC_EOL_CRLF 0
|
|
||||||
#define SC_EOL_CR 1
|
|
||||||
#define SC_EOL_LF 2
|
|
||||||
#define SCI_CONVERTEOLS 2029
|
|
||||||
#define SCI_GETEOLMODE 2030
|
|
||||||
#define SCI_SETEOLMODE 2031
|
|
||||||
#define SCI_STARTSTYLING 2032
|
|
||||||
#define SCI_SETSTYLING 2033
|
|
||||||
#define SCI_GETBUFFEREDDRAW 2034
|
|
||||||
#define SCI_SETBUFFEREDDRAW 2035
|
|
||||||
#define SCI_SETTABWIDTH 2036
|
|
||||||
#define SCI_GETTABWIDTH 2121
|
|
||||||
#define SC_CP_UTF8 65001
|
|
||||||
#define SC_CP_DBCS 1
|
|
||||||
#define SCI_SETCODEPAGE 2037
|
|
||||||
#define SCI_SETUSEPALETTE 2039
|
|
||||||
#define MARKER_MAX 31
|
|
||||||
#define SC_MARK_CIRCLE 0
|
|
||||||
#define SC_MARK_ROUNDRECT 1
|
|
||||||
#define SC_MARK_ARROW 2
|
|
||||||
#define SC_MARK_SMALLRECT 3
|
|
||||||
#define SC_MARK_SHORTARROW 4
|
|
||||||
#define SC_MARK_EMPTY 5
|
|
||||||
#define SC_MARK_ARROWDOWN 6
|
|
||||||
#define SC_MARK_MINUS 7
|
|
||||||
#define SC_MARK_PLUS 8
|
|
||||||
#define SC_MARK_VLINE 9
|
|
||||||
#define SC_MARK_LCORNER 10
|
|
||||||
#define SC_MARK_TCORNER 11
|
|
||||||
#define SC_MARK_BOXPLUS 12
|
|
||||||
#define SC_MARK_BOXPLUSCONNECTED 13
|
|
||||||
#define SC_MARK_BOXMINUS 14
|
|
||||||
#define SC_MARK_BOXMINUSCONNECTED 15
|
|
||||||
#define SC_MARK_LCORNERCURVE 16
|
|
||||||
#define SC_MARK_TCORNERCURVE 17
|
|
||||||
#define SC_MARK_CIRCLEPLUS 18
|
|
||||||
#define SC_MARK_CIRCLEPLUSCONNECTED 19
|
|
||||||
#define SC_MARK_CIRCLEMINUS 20
|
|
||||||
#define SC_MARK_CIRCLEMINUSCONNECTED 21
|
|
||||||
#define SC_MARK_BACKGROUND 22
|
|
||||||
#define SC_MARK_DOTDOTDOT 23
|
|
||||||
#define SC_MARK_ARROWS 24
|
|
||||||
#define SC_MARK_PIXMAP 25
|
|
||||||
#define SC_MARK_CHARACTER 10000
|
|
||||||
#define SC_MARKNUM_FOLDEREND 25
|
|
||||||
#define SC_MARKNUM_FOLDEROPENMID 26
|
|
||||||
#define SC_MARKNUM_FOLDERMIDTAIL 27
|
|
||||||
#define SC_MARKNUM_FOLDERTAIL 28
|
|
||||||
#define SC_MARKNUM_FOLDERSUB 29
|
|
||||||
#define SC_MARKNUM_FOLDER 30
|
|
||||||
#define SC_MARKNUM_FOLDEROPEN 31
|
|
||||||
#define SC_MASK_FOLDERS 0xFE000000
|
|
||||||
#define SCI_MARKERDEFINE 2040
|
|
||||||
#define SCI_MARKERSETFORE 2041
|
|
||||||
#define SCI_MARKERSETBACK 2042
|
|
||||||
#define SCI_MARKERADD 2043
|
|
||||||
#define SCI_MARKERDELETE 2044
|
|
||||||
#define SCI_MARKERDELETEALL 2045
|
|
||||||
#define SCI_MARKERGET 2046
|
|
||||||
#define SCI_MARKERNEXT 2047
|
|
||||||
#define SCI_MARKERPREVIOUS 2048
|
|
||||||
#define SCI_MARKERDEFINEPIXMAP 2049
|
|
||||||
#define SC_MARGIN_SYMBOL 0
|
|
||||||
#define SC_MARGIN_NUMBER 1
|
|
||||||
#define SCI_SETMARGINTYPEN 2240
|
|
||||||
#define SCI_GETMARGINTYPEN 2241
|
|
||||||
#define SCI_SETMARGINWIDTHN 2242
|
|
||||||
#define SCI_GETMARGINWIDTHN 2243
|
|
||||||
#define SCI_SETMARGINMASKN 2244
|
|
||||||
#define SCI_GETMARGINMASKN 2245
|
|
||||||
#define SCI_SETMARGINSENSITIVEN 2246
|
|
||||||
#define SCI_GETMARGINSENSITIVEN 2247
|
|
||||||
#define STYLE_DEFAULT 32
|
|
||||||
#define STYLE_LINENUMBER 33
|
|
||||||
#define STYLE_BRACELIGHT 34
|
|
||||||
#define STYLE_BRACEBAD 35
|
|
||||||
#define STYLE_CONTROLCHAR 36
|
|
||||||
#define STYLE_INDENTGUIDE 37
|
|
||||||
#define STYLE_LASTPREDEFINED 39
|
|
||||||
#define STYLE_MAX 127
|
|
||||||
#define SC_CHARSET_ANSI 0
|
|
||||||
#define SC_CHARSET_DEFAULT 1
|
|
||||||
#define SC_CHARSET_BALTIC 186
|
|
||||||
#define SC_CHARSET_CHINESEBIG5 136
|
|
||||||
#define SC_CHARSET_EASTEUROPE 238
|
|
||||||
#define SC_CHARSET_GB2312 134
|
|
||||||
#define SC_CHARSET_GREEK 161
|
|
||||||
#define SC_CHARSET_HANGUL 129
|
|
||||||
#define SC_CHARSET_MAC 77
|
|
||||||
#define SC_CHARSET_OEM 255
|
|
||||||
#define SC_CHARSET_RUSSIAN 204
|
|
||||||
#define SC_CHARSET_SHIFTJIS 128
|
|
||||||
#define SC_CHARSET_SYMBOL 2
|
|
||||||
#define SC_CHARSET_TURKISH 162
|
|
||||||
#define SC_CHARSET_JOHAB 130
|
|
||||||
#define SC_CHARSET_HEBREW 177
|
|
||||||
#define SC_CHARSET_ARABIC 178
|
|
||||||
#define SC_CHARSET_VIETNAMESE 163
|
|
||||||
#define SC_CHARSET_THAI 222
|
|
||||||
#define SCI_STYLECLEARALL 2050
|
|
||||||
#define SCI_STYLESETFORE 2051
|
|
||||||
#define SCI_STYLESETBACK 2052
|
|
||||||
#define SCI_STYLESETBOLD 2053
|
|
||||||
#define SCI_STYLESETITALIC 2054
|
|
||||||
#define SCI_STYLESETSIZE 2055
|
|
||||||
#define SCI_STYLESETFONT 2056
|
|
||||||
#define SCI_STYLESETEOLFILLED 2057
|
|
||||||
#define SCI_STYLERESETDEFAULT 2058
|
|
||||||
#define SCI_STYLESETUNDERLINE 2059
|
|
||||||
#define SC_CASE_MIXED 0
|
|
||||||
#define SC_CASE_UPPER 1
|
|
||||||
#define SC_CASE_LOWER 2
|
|
||||||
#define SCI_STYLESETCASE 2060
|
|
||||||
#define SCI_STYLESETCHARACTERSET 2066
|
|
||||||
#define SCI_STYLESETHOTSPOT 2409
|
|
||||||
#define SCI_SETSELFORE 2067
|
|
||||||
#define SCI_SETSELBACK 2068
|
|
||||||
#define SCI_SETCARETFORE 2069
|
|
||||||
#define SCI_ASSIGNCMDKEY 2070
|
|
||||||
#define SCI_CLEARCMDKEY 2071
|
|
||||||
#define SCI_CLEARALLCMDKEYS 2072
|
|
||||||
#define SCI_SETSTYLINGEX 2073
|
|
||||||
#define SCI_STYLESETVISIBLE 2074
|
|
||||||
#define SCI_GETCARETPERIOD 2075
|
|
||||||
#define SCI_SETCARETPERIOD 2076
|
|
||||||
#define SCI_SETWORDCHARS 2077
|
|
||||||
#define SCI_BEGINUNDOACTION 2078
|
|
||||||
#define SCI_ENDUNDOACTION 2079
|
|
||||||
#define INDIC_MAX 7
|
|
||||||
#define INDIC_PLAIN 0
|
|
||||||
#define INDIC_SQUIGGLE 1
|
|
||||||
#define INDIC_TT 2
|
|
||||||
#define INDIC_DIAGONAL 3
|
|
||||||
#define INDIC_STRIKE 4
|
|
||||||
#define INDIC_HIDDEN 5
|
|
||||||
#define INDIC_BOX 6
|
|
||||||
#define INDIC0_MASK 0x20
|
|
||||||
#define INDIC1_MASK 0x40
|
|
||||||
#define INDIC2_MASK 0x80
|
|
||||||
#define INDICS_MASK 0xE0
|
|
||||||
#define SCI_INDICSETSTYLE 2080
|
|
||||||
#define SCI_INDICGETSTYLE 2081
|
|
||||||
#define SCI_INDICSETFORE 2082
|
|
||||||
#define SCI_INDICGETFORE 2083
|
|
||||||
#define SCI_SETWHITESPACEFORE 2084
|
|
||||||
#define SCI_SETWHITESPACEBACK 2085
|
|
||||||
#define SCI_SETSTYLEBITS 2090
|
|
||||||
#define SCI_GETSTYLEBITS 2091
|
|
||||||
#define SCI_SETLINESTATE 2092
|
|
||||||
#define SCI_GETLINESTATE 2093
|
|
||||||
#define SCI_GETMAXLINESTATE 2094
|
|
||||||
#define SCI_GETCARETLINEVISIBLE 2095
|
|
||||||
#define SCI_SETCARETLINEVISIBLE 2096
|
|
||||||
#define SCI_GETCARETLINEBACK 2097
|
|
||||||
#define SCI_SETCARETLINEBACK 2098
|
|
||||||
#define SCI_STYLESETCHANGEABLE 2099
|
|
||||||
#define SCI_AUTOCSHOW 2100
|
|
||||||
#define SCI_AUTOCCANCEL 2101
|
|
||||||
#define SCI_AUTOCACTIVE 2102
|
|
||||||
#define SCI_AUTOCPOSSTART 2103
|
|
||||||
#define SCI_AUTOCCOMPLETE 2104
|
|
||||||
#define SCI_AUTOCSTOPS 2105
|
|
||||||
#define SCI_AUTOCSETSEPARATOR 2106
|
|
||||||
#define SCI_AUTOCGETSEPARATOR 2107
|
|
||||||
#define SCI_AUTOCSELECT 2108
|
|
||||||
#define SCI_AUTOCSETCANCELATSTART 2110
|
|
||||||
#define SCI_AUTOCGETCANCELATSTART 2111
|
|
||||||
#define SCI_AUTOCSETFILLUPS 2112
|
|
||||||
#define SCI_AUTOCSETCHOOSESINGLE 2113
|
|
||||||
#define SCI_AUTOCGETCHOOSESINGLE 2114
|
|
||||||
#define SCI_AUTOCSETIGNORECASE 2115
|
|
||||||
#define SCI_AUTOCGETIGNORECASE 2116
|
|
||||||
#define SCI_USERLISTSHOW 2117
|
|
||||||
#define SCI_AUTOCSETAUTOHIDE 2118
|
|
||||||
#define SCI_AUTOCGETAUTOHIDE 2119
|
|
||||||
#define SCI_AUTOCSETDROPRESTOFWORD 2270
|
|
||||||
#define SCI_AUTOCGETDROPRESTOFWORD 2271
|
|
||||||
#define SCI_REGISTERIMAGE 2405
|
|
||||||
#define SCI_CLEARREGISTEREDIMAGES 2408
|
|
||||||
#define SCI_AUTOCGETTYPESEPARATOR 2285
|
|
||||||
#define SCI_AUTOCSETTYPESEPARATOR 2286
|
|
||||||
#define SCI_SETINDENT 2122
|
|
||||||
#define SCI_GETINDENT 2123
|
|
||||||
#define SCI_SETUSETABS 2124
|
|
||||||
#define SCI_GETUSETABS 2125
|
|
||||||
#define SCI_SETLINEINDENTATION 2126
|
|
||||||
#define SCI_GETLINEINDENTATION 2127
|
|
||||||
#define SCI_GETLINEINDENTPOSITION 2128
|
|
||||||
#define SCI_GETCOLUMN 2129
|
|
||||||
#define SCI_SETHSCROLLBAR 2130
|
|
||||||
#define SCI_GETHSCROLLBAR 2131
|
|
||||||
#define SCI_SETINDENTATIONGUIDES 2132
|
|
||||||
#define SCI_GETINDENTATIONGUIDES 2133
|
|
||||||
#define SCI_SETHIGHLIGHTGUIDE 2134
|
|
||||||
#define SCI_GETHIGHLIGHTGUIDE 2135
|
|
||||||
#define SCI_GETLINEENDPOSITION 2136
|
|
||||||
#define SCI_GETCODEPAGE 2137
|
|
||||||
#define SCI_GETCARETFORE 2138
|
|
||||||
#define SCI_GETUSEPALETTE 2139
|
|
||||||
#define SCI_GETREADONLY 2140
|
|
||||||
#define SCI_SETCURRENTPOS 2141
|
|
||||||
#define SCI_SETSELECTIONSTART 2142
|
|
||||||
#define SCI_GETSELECTIONSTART 2143
|
|
||||||
#define SCI_SETSELECTIONEND 2144
|
|
||||||
#define SCI_GETSELECTIONEND 2145
|
|
||||||
#define SCI_SETPRINTMAGNIFICATION 2146
|
|
||||||
#define SCI_GETPRINTMAGNIFICATION 2147
|
|
||||||
#define SC_PRINT_NORMAL 0
|
|
||||||
#define SC_PRINT_INVERTLIGHT 1
|
|
||||||
#define SC_PRINT_BLACKONWHITE 2
|
|
||||||
#define SC_PRINT_COLOURONWHITE 3
|
|
||||||
#define SC_PRINT_COLOURONWHITEDEFAULTBG 4
|
|
||||||
#define SCI_SETPRINTCOLOURMODE 2148
|
|
||||||
#define SCI_GETPRINTCOLOURMODE 2149
|
|
||||||
#define SCFIND_WHOLEWORD 2
|
|
||||||
#define SCFIND_MATCHCASE 4
|
|
||||||
#define SCFIND_WORDSTART 0x00100000
|
|
||||||
#define SCFIND_REGEXP 0x00200000
|
|
||||||
#define SCFIND_POSIX 0x00400000
|
|
||||||
#define SCI_FINDTEXT 2150
|
|
||||||
#define SCI_FORMATRANGE 2151
|
|
||||||
#define SCI_GETFIRSTVISIBLELINE 2152
|
|
||||||
#define SCI_GETLINE 2153
|
|
||||||
#define SCI_GETLINECOUNT 2154
|
|
||||||
#define SCI_SETMARGINLEFT 2155
|
|
||||||
#define SCI_GETMARGINLEFT 2156
|
|
||||||
#define SCI_SETMARGINRIGHT 2157
|
|
||||||
#define SCI_GETMARGINRIGHT 2158
|
|
||||||
#define SCI_GETMODIFY 2159
|
|
||||||
#define SCI_SETSEL 2160
|
|
||||||
#define SCI_GETSELTEXT 2161
|
|
||||||
#define SCI_GETTEXTRANGE 2162
|
|
||||||
#define SCI_HIDESELECTION 2163
|
|
||||||
#define SCI_POINTXFROMPOSITION 2164
|
|
||||||
#define SCI_POINTYFROMPOSITION 2165
|
|
||||||
#define SCI_LINEFROMPOSITION 2166
|
|
||||||
#define SCI_POSITIONFROMLINE 2167
|
|
||||||
#define SCI_LINESCROLL 2168
|
|
||||||
#define SCI_SCROLLCARET 2169
|
|
||||||
#define SCI_REPLACESEL 2170
|
|
||||||
#define SCI_SETREADONLY 2171
|
|
||||||
#define SCI_NULL 2172
|
|
||||||
#define SCI_CANPASTE 2173
|
|
||||||
#define SCI_CANUNDO 2174
|
|
||||||
#define SCI_EMPTYUNDOBUFFER 2175
|
|
||||||
#define SCI_UNDO 2176
|
|
||||||
#define SCI_CUT 2177
|
|
||||||
#define SCI_COPY 2178
|
|
||||||
#define SCI_PASTE 2179
|
|
||||||
#define SCI_CLEAR 2180
|
|
||||||
#define SCI_SETTEXT 2181
|
|
||||||
#define SCI_GETTEXT 2182
|
|
||||||
#define SCI_GETTEXTLENGTH 2183
|
|
||||||
#define SCI_GETDIRECTFUNCTION 2184
|
|
||||||
#define SCI_GETDIRECTPOINTER 2185
|
|
||||||
#define SCI_SETOVERTYPE 2186
|
|
||||||
#define SCI_GETOVERTYPE 2187
|
|
||||||
#define SCI_SETCARETWIDTH 2188
|
|
||||||
#define SCI_GETCARETWIDTH 2189
|
|
||||||
#define SCI_SETTARGETSTART 2190
|
|
||||||
#define SCI_GETTARGETSTART 2191
|
|
||||||
#define SCI_SETTARGETEND 2192
|
|
||||||
#define SCI_GETTARGETEND 2193
|
|
||||||
#define SCI_REPLACETARGET 2194
|
|
||||||
#define SCI_REPLACETARGETRE 2195
|
|
||||||
#define SCI_SEARCHINTARGET 2197
|
|
||||||
#define SCI_SETSEARCHFLAGS 2198
|
|
||||||
#define SCI_GETSEARCHFLAGS 2199
|
|
||||||
#define SCI_CALLTIPSHOW 2200
|
|
||||||
#define SCI_CALLTIPCANCEL 2201
|
|
||||||
#define SCI_CALLTIPACTIVE 2202
|
|
||||||
#define SCI_CALLTIPPOSSTART 2203
|
|
||||||
#define SCI_CALLTIPSETHLT 2204
|
|
||||||
#define SCI_CALLTIPSETBACK 2205
|
|
||||||
#define SCI_CALLTIPSETFORE 2206
|
|
||||||
#define SCI_CALLTIPSETFOREHLT 2207
|
|
||||||
#define SCI_VISIBLEFROMDOCLINE 2220
|
|
||||||
#define SCI_DOCLINEFROMVISIBLE 2221
|
|
||||||
#define SC_FOLDLEVELBASE 0x400
|
|
||||||
#define SC_FOLDLEVELWHITEFLAG 0x1000
|
|
||||||
#define SC_FOLDLEVELHEADERFLAG 0x2000
|
|
||||||
#define SC_FOLDLEVELBOXHEADERFLAG 0x4000
|
|
||||||
#define SC_FOLDLEVELBOXFOOTERFLAG 0x8000
|
|
||||||
#define SC_FOLDLEVELCONTRACTED 0x10000
|
|
||||||
#define SC_FOLDLEVELUNINDENT 0x20000
|
|
||||||
#define SC_FOLDLEVELNUMBERMASK 0x0FFF
|
|
||||||
#define SCI_SETFOLDLEVEL 2222
|
|
||||||
#define SCI_GETFOLDLEVEL 2223
|
|
||||||
#define SCI_GETLASTCHILD 2224
|
|
||||||
#define SCI_GETFOLDPARENT 2225
|
|
||||||
#define SCI_SHOWLINES 2226
|
|
||||||
#define SCI_HIDELINES 2227
|
|
||||||
#define SCI_GETLINEVISIBLE 2228
|
|
||||||
#define SCI_SETFOLDEXPANDED 2229
|
|
||||||
#define SCI_GETFOLDEXPANDED 2230
|
|
||||||
#define SCI_TOGGLEFOLD 2231
|
|
||||||
#define SCI_ENSUREVISIBLE 2232
|
|
||||||
#define SC_FOLDFLAG_LINEBEFORE_EXPANDED 0x0002
|
|
||||||
#define SC_FOLDFLAG_LINEBEFORE_CONTRACTED 0x0004
|
|
||||||
#define SC_FOLDFLAG_LINEAFTER_EXPANDED 0x0008
|
|
||||||
#define SC_FOLDFLAG_LINEAFTER_CONTRACTED 0x0010
|
|
||||||
#define SC_FOLDFLAG_LEVELNUMBERS 0x0040
|
|
||||||
#define SC_FOLDFLAG_BOX 0x0001
|
|
||||||
#define SCI_SETFOLDFLAGS 2233
|
|
||||||
#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234
|
|
||||||
#define SCI_SETTABINDENTS 2260
|
|
||||||
#define SCI_GETTABINDENTS 2261
|
|
||||||
#define SCI_SETBACKSPACEUNINDENTS 2262
|
|
||||||
#define SCI_GETBACKSPACEUNINDENTS 2263
|
|
||||||
#define SC_TIME_FOREVER 10000000
|
|
||||||
#define SCI_SETMOUSEDWELLTIME 2264
|
|
||||||
#define SCI_GETMOUSEDWELLTIME 2265
|
|
||||||
#define SCI_WORDSTARTPOSITION 2266
|
|
||||||
#define SCI_WORDENDPOSITION 2267
|
|
||||||
#define SC_WRAP_NONE 0
|
|
||||||
#define SC_WRAP_WORD 1
|
|
||||||
#define SCI_SETWRAPMODE 2268
|
|
||||||
#define SCI_GETWRAPMODE 2269
|
|
||||||
#define SC_CACHE_NONE 0
|
|
||||||
#define SC_CACHE_CARET 1
|
|
||||||
#define SC_CACHE_PAGE 2
|
|
||||||
#define SC_CACHE_DOCUMENT 3
|
|
||||||
#define SCI_SETLAYOUTCACHE 2272
|
|
||||||
#define SCI_GETLAYOUTCACHE 2273
|
|
||||||
#define SCI_SETSCROLLWIDTH 2274
|
|
||||||
#define SCI_GETSCROLLWIDTH 2275
|
|
||||||
#define SCI_TEXTWIDTH 2276
|
|
||||||
#define SCI_SETENDATLASTLINE 2277
|
|
||||||
#define SCI_GETENDATLASTLINE 2278
|
|
||||||
#define SCI_TEXTHEIGHT 2279
|
|
||||||
#define SCI_SETVSCROLLBAR 2280
|
|
||||||
#define SCI_GETVSCROLLBAR 2281
|
|
||||||
#define SCI_APPENDTEXT 2282
|
|
||||||
#define SCI_GETTWOPHASEDRAW 2283
|
|
||||||
#define SCI_SETTWOPHASEDRAW 2284
|
|
||||||
#define SCI_TARGETFROMSELECTION 2287
|
|
||||||
#define SCI_LINESJOIN 2288
|
|
||||||
#define SCI_LINESSPLIT 2289
|
|
||||||
#define SCI_SETFOLDMARGINCOLOUR 2290
|
|
||||||
#define SCI_SETFOLDMARGINHICOLOUR 2291
|
|
||||||
#define SCI_LINEDOWN 2300
|
|
||||||
#define SCI_LINEDOWNEXTEND 2301
|
|
||||||
#define SCI_LINEUP 2302
|
|
||||||
#define SCI_LINEUPEXTEND 2303
|
|
||||||
#define SCI_CHARLEFT 2304
|
|
||||||
#define SCI_CHARLEFTEXTEND 2305
|
|
||||||
#define SCI_CHARRIGHT 2306
|
|
||||||
#define SCI_CHARRIGHTEXTEND 2307
|
|
||||||
#define SCI_WORDLEFT 2308
|
|
||||||
#define SCI_WORDLEFTEXTEND 2309
|
|
||||||
#define SCI_WORDRIGHT 2310
|
|
||||||
#define SCI_WORDRIGHTEXTEND 2311
|
|
||||||
#define SCI_HOME 2312
|
|
||||||
#define SCI_HOMEEXTEND 2313
|
|
||||||
#define SCI_LINEEND 2314
|
|
||||||
#define SCI_LINEENDEXTEND 2315
|
|
||||||
#define SCI_DOCUMENTSTART 2316
|
|
||||||
#define SCI_DOCUMENTSTARTEXTEND 2317
|
|
||||||
#define SCI_DOCUMENTEND 2318
|
|
||||||
#define SCI_DOCUMENTENDEXTEND 2319
|
|
||||||
#define SCI_PAGEUP 2320
|
|
||||||
#define SCI_PAGEUPEXTEND 2321
|
|
||||||
#define SCI_PAGEDOWN 2322
|
|
||||||
#define SCI_PAGEDOWNEXTEND 2323
|
|
||||||
#define SCI_EDITTOGGLEOVERTYPE 2324
|
|
||||||
#define SCI_CANCEL 2325
|
|
||||||
#define SCI_DELETEBACK 2326
|
|
||||||
#define SCI_TAB 2327
|
|
||||||
#define SCI_BACKTAB 2328
|
|
||||||
#define SCI_NEWLINE 2329
|
|
||||||
#define SCI_FORMFEED 2330
|
|
||||||
#define SCI_VCHOME 2331
|
|
||||||
#define SCI_VCHOMEEXTEND 2332
|
|
||||||
#define SCI_ZOOMIN 2333
|
|
||||||
#define SCI_ZOOMOUT 2334
|
|
||||||
#define SCI_DELWORDLEFT 2335
|
|
||||||
#define SCI_DELWORDRIGHT 2336
|
|
||||||
#define SCI_LINECUT 2337
|
|
||||||
#define SCI_LINEDELETE 2338
|
|
||||||
#define SCI_LINETRANSPOSE 2339
|
|
||||||
#define SCI_LINEDUPLICATE 2404
|
|
||||||
#define SCI_LOWERCASE 2340
|
|
||||||
#define SCI_UPPERCASE 2341
|
|
||||||
#define SCI_LINESCROLLDOWN 2342
|
|
||||||
#define SCI_LINESCROLLUP 2343
|
|
||||||
#define SCI_DELETEBACKNOTLINE 2344
|
|
||||||
#define SCI_HOMEDISPLAY 2345
|
|
||||||
#define SCI_HOMEDISPLAYEXTEND 2346
|
|
||||||
#define SCI_LINEENDDISPLAY 2347
|
|
||||||
#define SCI_LINEENDDISPLAYEXTEND 2348
|
|
||||||
#define SCI_HOMEWRAP 2349
|
|
||||||
#define SCI_HOMEWRAPEXTEND 2450
|
|
||||||
#define SCI_LINEENDWRAP 2451
|
|
||||||
#define SCI_LINEENDWRAPEXTEND 2452
|
|
||||||
#define SCI_VCHOMEWRAP 2453
|
|
||||||
#define SCI_VCHOMEWRAPEXTEND 2454
|
|
||||||
#define SCI_LINECOPY 2455
|
|
||||||
#define SCI_MOVECARETINSIDEVIEW 2401
|
|
||||||
#define SCI_LINELENGTH 2350
|
|
||||||
#define SCI_BRACEHIGHLIGHT 2351
|
|
||||||
#define SCI_BRACEBADLIGHT 2352
|
|
||||||
#define SCI_BRACEMATCH 2353
|
|
||||||
#define SCI_GETVIEWEOL 2355
|
|
||||||
#define SCI_SETVIEWEOL 2356
|
|
||||||
#define SCI_GETDOCPOINTER 2357
|
|
||||||
#define SCI_SETDOCPOINTER 2358
|
|
||||||
#define SCI_SETMODEVENTMASK 2359
|
|
||||||
#define EDGE_NONE 0
|
|
||||||
#define EDGE_LINE 1
|
|
||||||
#define EDGE_BACKGROUND 2
|
|
||||||
#define SCI_GETEDGECOLUMN 2360
|
|
||||||
#define SCI_SETEDGECOLUMN 2361
|
|
||||||
#define SCI_GETEDGEMODE 2362
|
|
||||||
#define SCI_SETEDGEMODE 2363
|
|
||||||
#define SCI_GETEDGECOLOUR 2364
|
|
||||||
#define SCI_SETEDGECOLOUR 2365
|
|
||||||
#define SCI_SEARCHANCHOR 2366
|
|
||||||
#define SCI_SEARCHNEXT 2367
|
|
||||||
#define SCI_SEARCHPREV 2368
|
|
||||||
#define SCI_LINESONSCREEN 2370
|
|
||||||
#define SCI_USEPOPUP 2371
|
|
||||||
#define SCI_SELECTIONISRECTANGLE 2372
|
|
||||||
#define SCI_SETZOOM 2373
|
|
||||||
#define SCI_GETZOOM 2374
|
|
||||||
#define SCI_CREATEDOCUMENT 2375
|
|
||||||
#define SCI_ADDREFDOCUMENT 2376
|
|
||||||
#define SCI_RELEASEDOCUMENT 2377
|
|
||||||
#define SCI_GETMODEVENTMASK 2378
|
|
||||||
#define SCI_SETFOCUS 2380
|
|
||||||
#define SCI_GETFOCUS 2381
|
|
||||||
#define SCI_SETSTATUS 2382
|
|
||||||
#define SCI_GETSTATUS 2383
|
|
||||||
#define SCI_SETMOUSEDOWNCAPTURES 2384
|
|
||||||
#define SCI_GETMOUSEDOWNCAPTURES 2385
|
|
||||||
#define SC_CURSORNORMAL -1
|
|
||||||
#define SC_CURSORWAIT 4
|
|
||||||
#define SCI_SETCURSOR 2386
|
|
||||||
#define SCI_GETCURSOR 2387
|
|
||||||
#define SCI_SETCONTROLCHARSYMBOL 2388
|
|
||||||
#define SCI_GETCONTROLCHARSYMBOL 2389
|
|
||||||
#define SCI_WORDPARTLEFT 2390
|
|
||||||
#define SCI_WORDPARTLEFTEXTEND 2391
|
|
||||||
#define SCI_WORDPARTRIGHT 2392
|
|
||||||
#define SCI_WORDPARTRIGHTEXTEND 2393
|
|
||||||
#define VISIBLE_SLOP 0x01
|
|
||||||
#define VISIBLE_STRICT 0x04
|
|
||||||
#define SCI_SETVISIBLEPOLICY 2394
|
|
||||||
#define SCI_DELLINELEFT 2395
|
|
||||||
#define SCI_DELLINERIGHT 2396
|
|
||||||
#define SCI_SETXOFFSET 2397
|
|
||||||
#define SCI_GETXOFFSET 2398
|
|
||||||
#define SCI_CHOOSECARETX 2399
|
|
||||||
#define SCI_GRABFOCUS 2400
|
|
||||||
#define CARET_SLOP 0x01
|
|
||||||
#define CARET_STRICT 0x04
|
|
||||||
#define CARET_JUMPS 0x10
|
|
||||||
#define CARET_EVEN 0x08
|
|
||||||
#define SCI_SETXCARETPOLICY 2402
|
|
||||||
#define SCI_SETYCARETPOLICY 2403
|
|
||||||
#define SCI_SETPRINTWRAPMODE 2406
|
|
||||||
#define SCI_GETPRINTWRAPMODE 2407
|
|
||||||
#define SCI_SETHOTSPOTACTIVEFORE 2410
|
|
||||||
#define SCI_SETHOTSPOTACTIVEBACK 2411
|
|
||||||
#define SCI_SETHOTSPOTACTIVEUNDERLINE 2412
|
|
||||||
#define SCI_SETHOTSPOTSINGLELINE 2421
|
|
||||||
#define SCI_PARADOWN 2413
|
|
||||||
#define SCI_PARADOWNEXTEND 2414
|
|
||||||
#define SCI_PARAUP 2415
|
|
||||||
#define SCI_PARAUPEXTEND 2416
|
|
||||||
#define SCI_POSITIONBEFORE 2417
|
|
||||||
#define SCI_POSITIONAFTER 2418
|
|
||||||
#define SCI_COPYRANGE 2419
|
|
||||||
#define SCI_COPYTEXT 2420
|
|
||||||
#define SC_SEL_STREAM 0
|
|
||||||
#define SC_SEL_RECTANGLE 1
|
|
||||||
#define SC_SEL_LINES 2
|
|
||||||
#define SCI_SETSELECTIONMODE 2422
|
|
||||||
#define SCI_GETSELECTIONMODE 2423
|
|
||||||
#define SCI_GETLINESELSTARTPOSITION 2424
|
|
||||||
#define SCI_GETLINESELENDPOSITION 2425
|
|
||||||
#define SCI_LINEDOWNRECTEXTEND 2426
|
|
||||||
#define SCI_LINEUPRECTEXTEND 2427
|
|
||||||
#define SCI_CHARLEFTRECTEXTEND 2428
|
|
||||||
#define SCI_CHARRIGHTRECTEXTEND 2429
|
|
||||||
#define SCI_HOMERECTEXTEND 2430
|
|
||||||
#define SCI_VCHOMERECTEXTEND 2431
|
|
||||||
#define SCI_LINEENDRECTEXTEND 2432
|
|
||||||
#define SCI_PAGEUPRECTEXTEND 2433
|
|
||||||
#define SCI_PAGEDOWNRECTEXTEND 2434
|
|
||||||
#define SCI_STUTTEREDPAGEUP 2435
|
|
||||||
#define SCI_STUTTEREDPAGEUPEXTEND 2436
|
|
||||||
#define SCI_STUTTEREDPAGEDOWN 2437
|
|
||||||
#define SCI_STUTTEREDPAGEDOWNEXTEND 2438
|
|
||||||
#define SCI_WORDLEFTEND 2439
|
|
||||||
#define SCI_WORDLEFTENDEXTEND 2440
|
|
||||||
#define SCI_WORDRIGHTEND 2441
|
|
||||||
#define SCI_WORDRIGHTENDEXTEND 2442
|
|
||||||
#define SCI_SETWHITESPACECHARS 2443
|
|
||||||
#define SCI_SETCHARSDEFAULT 2444
|
|
||||||
#define SCI_AUTOCGETCURRENT 2445
|
|
||||||
#define SCI_STARTRECORD 3001
|
|
||||||
#define SCI_STOPRECORD 3002
|
|
||||||
#define SCI_SETLEXER 4001
|
|
||||||
#define SCI_GETLEXER 4002
|
|
||||||
#define SCI_COLOURISE 4003
|
|
||||||
#define SCI_SETPROPERTY 4004
|
|
||||||
#define KEYWORDSET_MAX 8
|
|
||||||
#define SCI_SETKEYWORDS 4005
|
|
||||||
#define SCI_SETLEXERLANGUAGE 4006
|
|
||||||
#define SCI_LOADLEXERLIBRARY 4007
|
|
||||||
#define SC_MOD_INSERTTEXT 0x1
|
|
||||||
#define SC_MOD_DELETETEXT 0x2
|
|
||||||
#define SC_MOD_CHANGESTYLE 0x4
|
|
||||||
#define SC_MOD_CHANGEFOLD 0x8
|
|
||||||
#define SC_PERFORMED_USER 0x10
|
|
||||||
#define SC_PERFORMED_UNDO 0x20
|
|
||||||
#define SC_PERFORMED_REDO 0x40
|
|
||||||
#define SC_LASTSTEPINUNDOREDO 0x100
|
|
||||||
#define SC_MOD_CHANGEMARKER 0x200
|
|
||||||
#define SC_MOD_BEFOREINSERT 0x400
|
|
||||||
#define SC_MOD_BEFOREDELETE 0x800
|
|
||||||
#define SC_MODEVENTMASKALL 0xF77
|
|
||||||
#define SCEN_CHANGE 768
|
|
||||||
#define SCEN_SETFOCUS 512
|
|
||||||
#define SCEN_KILLFOCUS 256
|
|
||||||
#define SCK_DOWN 300
|
|
||||||
#define SCK_UP 301
|
|
||||||
#define SCK_LEFT 302
|
|
||||||
#define SCK_RIGHT 303
|
|
||||||
#define SCK_HOME 304
|
|
||||||
#define SCK_END 305
|
|
||||||
#define SCK_PRIOR 306
|
|
||||||
#define SCK_NEXT 307
|
|
||||||
#define SCK_DELETE 308
|
|
||||||
#define SCK_INSERT 309
|
|
||||||
#define SCK_ESCAPE 7
|
|
||||||
#define SCK_BACK 8
|
|
||||||
#define SCK_TAB 9
|
|
||||||
#define SCK_RETURN 13
|
|
||||||
#define SCK_ADD 310
|
|
||||||
#define SCK_SUBTRACT 311
|
|
||||||
#define SCK_DIVIDE 312
|
|
||||||
#define SCMOD_SHIFT 1
|
|
||||||
#define SCMOD_CTRL 2
|
|
||||||
#define SCMOD_ALT 4
|
|
||||||
#define SCN_STYLENEEDED 2000
|
|
||||||
#define SCN_CHARADDED 2001
|
|
||||||
#define SCN_SAVEPOINTREACHED 2002
|
|
||||||
#define SCN_SAVEPOINTLEFT 2003
|
|
||||||
#define SCN_MODIFYATTEMPTRO 2004
|
|
||||||
#define SCN_KEY 2005
|
|
||||||
#define SCN_DOUBLECLICK 2006
|
|
||||||
#define SCN_UPDATEUI 2007
|
|
||||||
#define SCN_MODIFIED 2008
|
|
||||||
#define SCN_MACRORECORD 2009
|
|
||||||
#define SCN_MARGINCLICK 2010
|
|
||||||
#define SCN_NEEDSHOWN 2011
|
|
||||||
#define SCN_PAINTED 2013
|
|
||||||
#define SCN_USERLISTSELECTION 2014
|
|
||||||
#define SCN_URIDROPPED 2015
|
|
||||||
#define SCN_DWELLSTART 2016
|
|
||||||
#define SCN_DWELLEND 2017
|
|
||||||
#define SCN_ZOOM 2018
|
|
||||||
#define SCN_HOTSPOTCLICK 2019
|
|
||||||
#define SCN_HOTSPOTDOUBLECLICK 2020
|
|
||||||
#define SCN_CALLTIPCLICK 2021
|
|
||||||
//--Autogenerated -- end of section automatically generated from Scintilla.iface
|
|
||||||
|
|
||||||
// These structures are defined to be exactly the same shape as the Win32
|
|
||||||
// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs.
|
|
||||||
// So older code that treats Scintilla as a RichEdit will work.
|
|
||||||
|
|
||||||
struct CharacterRange {
|
|
||||||
long cpMin;
|
|
||||||
long cpMax;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TextRange {
|
|
||||||
struct CharacterRange chrg;
|
|
||||||
char *lpstrText;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TextToFind {
|
|
||||||
struct CharacterRange chrg;
|
|
||||||
char *lpstrText;
|
|
||||||
struct CharacterRange chrgText;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef PLATFORM_H
|
|
||||||
|
|
||||||
// This structure is used in printing and requires some of the graphics types
|
|
||||||
// from Platform.h. Not needed by most client code.
|
|
||||||
|
|
||||||
struct RangeToFormat {
|
|
||||||
SurfaceID hdc;
|
|
||||||
SurfaceID hdcTarget;
|
|
||||||
PRectangle rc;
|
|
||||||
PRectangle rcPage;
|
|
||||||
CharacterRange chrg;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct NotifyHeader {
|
|
||||||
// hwndFrom is really an environment specifc window handle or pointer
|
|
||||||
// but most clients of Scintilla.h do not have this type visible.
|
|
||||||
//WindowID hwndFrom;
|
|
||||||
void *hwndFrom;
|
|
||||||
unsigned int idFrom;
|
|
||||||
unsigned int code;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SCNotification {
|
|
||||||
struct NotifyHeader nmhdr;
|
|
||||||
int position; // SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND
|
|
||||||
int ch; // SCN_CHARADDED, SCN_KEY
|
|
||||||
int modifiers; // SCN_KEY
|
|
||||||
int modificationType; // SCN_MODIFIED
|
|
||||||
const char *text; // SCN_MODIFIED
|
|
||||||
int length; // SCN_MODIFIED
|
|
||||||
int linesAdded; // SCN_MODIFIED
|
|
||||||
int message; // SCN_MACRORECORD
|
|
||||||
uptr_t wParam; // SCN_MACRORECORD
|
|
||||||
sptr_t lParam; // SCN_MACRORECORD
|
|
||||||
int line; // SCN_MODIFIED
|
|
||||||
int foldLevelNow; // SCN_MODIFIED
|
|
||||||
int foldLevelPrev; // SCN_MODIFIED
|
|
||||||
int margin; // SCN_MARGINCLICK
|
|
||||||
int listType; // SCN_USERLISTSELECTION
|
|
||||||
int x; // SCN_DWELLSTART, SCN_DWELLEND
|
|
||||||
int y; // SCN_DWELLSTART, SCN_DWELLEND
|
|
||||||
};
|
|
||||||
|
|
||||||
// Deprecation section listing all API features that are deprecated and will
|
|
||||||
// will be removed completely in a future version.
|
|
||||||
// To enable these features define INCLUDE_DEPRECATED_FEATURES
|
|
||||||
|
|
||||||
#ifdef INCLUDE_DEPRECATED_FEATURES
|
|
||||||
|
|
||||||
#define SCI_SETCARETPOLICY 2369
|
|
||||||
#define CARET_CENTER 0x02
|
|
||||||
#define CARET_XEVEN 0x08
|
|
||||||
#define CARET_XJUMPS 0x10
|
|
||||||
|
|
||||||
#define SCN_POSCHANGED 2012
|
|
||||||
#define SCN_CHECKBRACE 2007
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,55 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ScintillaWidget.h
|
|
||||||
** Definition of Scintilla widget for GTK+.
|
|
||||||
** Only needed by GTK+ code but is harmless on other platforms.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef SCINTILLAWIDGET_H
|
|
||||||
#define SCINTILLAWIDGET_H
|
|
||||||
|
|
||||||
#if PLAT_GTK
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SCINTILLA(obj) GTK_CHECK_CAST (obj, scintilla_get_type (), ScintillaObject)
|
|
||||||
#define SCINTILLA_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, scintilla_get_type (), ScintillaClass)
|
|
||||||
#define IS_SCINTILLA(obj) GTK_CHECK_TYPE (obj, scintilla_get_type ())
|
|
||||||
|
|
||||||
typedef struct _ScintillaObject ScintillaObject;
|
|
||||||
typedef struct _ScintillaClass ScintillaClass;
|
|
||||||
|
|
||||||
struct _ScintillaObject {
|
|
||||||
GtkContainer cont;
|
|
||||||
void *pscin;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _ScintillaClass {
|
|
||||||
GtkContainerClass parent_class;
|
|
||||||
|
|
||||||
void (* command) (ScintillaObject *ttt);
|
|
||||||
void (* notify) (ScintillaObject *ttt);
|
|
||||||
};
|
|
||||||
|
|
||||||
guint scintilla_get_type (void);
|
|
||||||
GtkWidget* scintilla_new (void);
|
|
||||||
void scintilla_set_id (ScintillaObject *sci,int id);
|
|
||||||
sptr_t scintilla_send_message (ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
void scintilla_release_resources(void);
|
|
||||||
|
|
||||||
#if GTK_MAJOR_VERSION < 2
|
|
||||||
#define SCINTILLA_NOTIFY "notify"
|
|
||||||
#else
|
|
||||||
#define SCINTILLA_NOTIFY "sci-notify"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file WindowAccessor.h
|
|
||||||
** Implementation of BufferAccess and StylingAccess on a Scintilla
|
|
||||||
** rapid easy access to contents of a Scintilla.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class WindowAccessor : public Accessor {
|
|
||||||
// Private so WindowAccessor objects can not be copied
|
|
||||||
WindowAccessor(const WindowAccessor &source) : Accessor(), props(source.props) {}
|
|
||||||
WindowAccessor &operator=(const WindowAccessor &) { return *this; }
|
|
||||||
protected:
|
|
||||||
WindowID id;
|
|
||||||
PropSet &props;
|
|
||||||
int lenDoc;
|
|
||||||
|
|
||||||
char styleBuf[bufferSize];
|
|
||||||
int validLen;
|
|
||||||
char chFlags;
|
|
||||||
char chWhile;
|
|
||||||
unsigned int startSeg;
|
|
||||||
|
|
||||||
bool InternalIsLeadByte(char ch);
|
|
||||||
void Fill(int position);
|
|
||||||
public:
|
|
||||||
WindowAccessor(WindowID id_, PropSet &props_) :
|
|
||||||
Accessor(), id(id_), props(props_),
|
|
||||||
lenDoc(-1), validLen(0), chFlags(0), chWhile(0) {
|
|
||||||
}
|
|
||||||
~WindowAccessor();
|
|
||||||
bool Match(int pos, const char *s);
|
|
||||||
char StyleAt(int position);
|
|
||||||
int GetLine(int position);
|
|
||||||
int LineStart(int line);
|
|
||||||
int LevelAt(int line);
|
|
||||||
int Length();
|
|
||||||
void Flush();
|
|
||||||
int GetLineState(int line);
|
|
||||||
int SetLineState(int line, int state);
|
|
||||||
int GetPropertyInt(const char *key, int defaultValue=0) {
|
|
||||||
return props.GetInt(key, defaultValue);
|
|
||||||
}
|
|
||||||
char *GetProperties() {
|
|
||||||
return props.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartAt(unsigned int start, char chMask=31);
|
|
||||||
void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
|
|
||||||
unsigned int GetStartSegment() { return startSeg; }
|
|
||||||
void StartSegment(unsigned int pos);
|
|
||||||
void ColourTo(unsigned int pos, int chAttr);
|
|
||||||
void SetLevel(int line, int level);
|
|
||||||
int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0);
|
|
||||||
};
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file AutoComplete.cxx
|
|
||||||
** Defines the auto completion list box.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "AutoComplete.h"
|
|
||||||
|
|
||||||
AutoComplete::AutoComplete() :
|
|
||||||
active(false),
|
|
||||||
separator(' '),
|
|
||||||
typesep('?'),
|
|
||||||
ignoreCase(false),
|
|
||||||
chooseSingle(false),
|
|
||||||
lb(0),
|
|
||||||
posStart(0),
|
|
||||||
startLen(0),
|
|
||||||
cancelAtStartPos(true),
|
|
||||||
autoHide(true),
|
|
||||||
dropRestOfWord(false) {
|
|
||||||
lb = ListBox::Allocate();
|
|
||||||
stopChars[0] = '\0';
|
|
||||||
fillUpChars[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
AutoComplete::~AutoComplete() {
|
|
||||||
if (lb) {
|
|
||||||
lb->Destroy();
|
|
||||||
delete lb;
|
|
||||||
lb = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AutoComplete::Active() {
|
|
||||||
return active;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::Start(Window &parent, int ctrlID, int position,
|
|
||||||
int startLen_, int lineHeight, bool unicodeMode) {
|
|
||||||
if (active) {
|
|
||||||
Cancel();
|
|
||||||
}
|
|
||||||
lb->Create(parent, ctrlID, lineHeight, unicodeMode);
|
|
||||||
lb->Clear();
|
|
||||||
active = true;
|
|
||||||
startLen = startLen_;
|
|
||||||
posStart = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::SetStopChars(const char *stopChars_) {
|
|
||||||
strncpy(stopChars, stopChars_, sizeof(stopChars));
|
|
||||||
stopChars[sizeof(stopChars) - 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AutoComplete::IsStopChar(char ch) {
|
|
||||||
return ch && strchr(stopChars, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::SetFillUpChars(const char *fillUpChars_) {
|
|
||||||
strncpy(fillUpChars, fillUpChars_, sizeof(fillUpChars));
|
|
||||||
fillUpChars[sizeof(fillUpChars) - 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AutoComplete::IsFillUpChar(char ch) {
|
|
||||||
return ch && strchr(fillUpChars, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::SetSeparator(char separator_) {
|
|
||||||
separator = separator_;
|
|
||||||
}
|
|
||||||
|
|
||||||
char AutoComplete::GetSeparator() {
|
|
||||||
return separator;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::SetTypesep(char separator_) {
|
|
||||||
typesep = separator_;
|
|
||||||
}
|
|
||||||
|
|
||||||
char AutoComplete::GetTypesep() {
|
|
||||||
return typesep;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::SetList(const char *list) {
|
|
||||||
lb->Clear();
|
|
||||||
char *words = new char[strlen(list) + 1];
|
|
||||||
if (words) {
|
|
||||||
strcpy(words, list);
|
|
||||||
char *startword = words;
|
|
||||||
char *numword = NULL;
|
|
||||||
int i = 0;
|
|
||||||
for (; words && words[i]; i++) {
|
|
||||||
if (words[i] == separator) {
|
|
||||||
words[i] = '\0';
|
|
||||||
if (numword)
|
|
||||||
*numword = '\0';
|
|
||||||
lb->Append(startword, numword?atoi(numword + 1):-1);
|
|
||||||
startword = words + i + 1;
|
|
||||||
numword = NULL;
|
|
||||||
} else if (words[i] == typesep) {
|
|
||||||
numword = words + i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (startword) {
|
|
||||||
if (numword)
|
|
||||||
*numword = '\0';
|
|
||||||
lb->Append(startword, numword?atoi(numword + 1):-1);
|
|
||||||
}
|
|
||||||
delete []words;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::Show() {
|
|
||||||
lb->Show();
|
|
||||||
lb->Select(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::Cancel() {
|
|
||||||
if (lb->Created()) {
|
|
||||||
lb->Destroy();
|
|
||||||
active = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AutoComplete::Move(int delta) {
|
|
||||||
int count = lb->Length();
|
|
||||||
int current = lb->GetSelection();
|
|
||||||
current += delta;
|
|
||||||
if (current >= count)
|
|
||||||
current = count - 1;
|
|
||||||
if (current < 0)
|
|
||||||
current = 0;
|
|
||||||
lb->Select(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoComplete::Select(const char *word) {
|
|
||||||
size_t lenWord = strlen(word);
|
|
||||||
int location = -1;
|
|
||||||
const int maxItemLen=1000;
|
|
||||||
char item[maxItemLen];
|
|
||||||
int start = 0; // lower bound of the api array block to search
|
|
||||||
int end = lb->Length() - 1; // upper bound of the api array block to search
|
|
||||||
while ((start <= end) && (location == -1)) { // Binary searching loop
|
|
||||||
int pivot = (start + end) / 2;
|
|
||||||
lb->GetValue(pivot, item, maxItemLen);
|
|
||||||
int cond;
|
|
||||||
if (ignoreCase)
|
|
||||||
cond = CompareNCaseInsensitive(word, item, lenWord);
|
|
||||||
else
|
|
||||||
cond = strncmp(word, item, lenWord);
|
|
||||||
if (!cond) {
|
|
||||||
// Find first match
|
|
||||||
while (pivot > start) {
|
|
||||||
lb->GetValue(pivot-1, item, maxItemLen);
|
|
||||||
if (ignoreCase)
|
|
||||||
cond = CompareNCaseInsensitive(word, item, lenWord);
|
|
||||||
else
|
|
||||||
cond = strncmp(word, item, lenWord);
|
|
||||||
if (0 != cond)
|
|
||||||
break;
|
|
||||||
--pivot;
|
|
||||||
}
|
|
||||||
location = pivot;
|
|
||||||
} else if (cond < 0) {
|
|
||||||
end = pivot - 1;
|
|
||||||
} else if (cond > 0) {
|
|
||||||
start = pivot + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (location == -1 && autoHide)
|
|
||||||
Cancel();
|
|
||||||
else
|
|
||||||
lb->Select(location);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file AutoComplete.h
|
|
||||||
** Defines the auto completion list box.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef AUTOCOMPLETE_H
|
|
||||||
#define AUTOCOMPLETE_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class AutoComplete {
|
|
||||||
bool active;
|
|
||||||
char stopChars[256];
|
|
||||||
char fillUpChars[256];
|
|
||||||
char separator;
|
|
||||||
char typesep; // Type seperator
|
|
||||||
|
|
||||||
public:
|
|
||||||
bool ignoreCase;
|
|
||||||
bool chooseSingle;
|
|
||||||
ListBox *lb;
|
|
||||||
int posStart;
|
|
||||||
int startLen;
|
|
||||||
/// Should autocompletion be canceled if editor's currentPos <= startPos?
|
|
||||||
bool cancelAtStartPos;
|
|
||||||
bool autoHide;
|
|
||||||
bool dropRestOfWord;
|
|
||||||
|
|
||||||
AutoComplete();
|
|
||||||
~AutoComplete();
|
|
||||||
|
|
||||||
/// Is the auto completion list displayed?
|
|
||||||
bool Active();
|
|
||||||
|
|
||||||
/// Display the auto completion list positioned to be near a character position
|
|
||||||
void Start(Window &parent, int ctrlID, int position,
|
|
||||||
int startLen_, int lineHeight, bool unicodeMode);
|
|
||||||
|
|
||||||
/// The stop chars are characters which, when typed, cause the auto completion list to disappear
|
|
||||||
void SetStopChars(const char *stopChars_);
|
|
||||||
bool IsStopChar(char ch);
|
|
||||||
|
|
||||||
/// The fillup chars are characters which, when typed, fill up the selected word
|
|
||||||
void SetFillUpChars(const char *fillUpChars_);
|
|
||||||
bool IsFillUpChar(char ch);
|
|
||||||
|
|
||||||
/// The separator character is used when interpreting the list in SetList
|
|
||||||
void SetSeparator(char separator_);
|
|
||||||
char GetSeparator();
|
|
||||||
|
|
||||||
/// The typesep character is used for seperating the word from the type
|
|
||||||
void SetTypesep(char separator_);
|
|
||||||
char GetTypesep();
|
|
||||||
|
|
||||||
/// The list string contains a sequence of words separated by the separator character
|
|
||||||
void SetList(const char *list);
|
|
||||||
|
|
||||||
void Show();
|
|
||||||
void Cancel();
|
|
||||||
|
|
||||||
/// Move the current list element by delta, scrolling appropriately
|
|
||||||
void Move(int delta);
|
|
||||||
|
|
||||||
/// Select a list element that starts with word as the current element
|
|
||||||
void Select(const char *word);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,274 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file CallTip.cxx
|
|
||||||
** Code for displaying call tips.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "CallTip.h"
|
|
||||||
|
|
||||||
CallTip::CallTip() {
|
|
||||||
wCallTip = 0;
|
|
||||||
inCallTipMode = false;
|
|
||||||
posStartCallTip = 0;
|
|
||||||
val = 0;
|
|
||||||
xUp = -100;
|
|
||||||
xDown = -100;
|
|
||||||
lineHeight = 1;
|
|
||||||
startHighlight = 0;
|
|
||||||
endHighlight = 0;
|
|
||||||
|
|
||||||
colourBG.desired = ColourDesired(0xff, 0xff, 0xff);
|
|
||||||
colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80);
|
|
||||||
colourSel.desired = ColourDesired(0, 0, 0x80);
|
|
||||||
colourShade.desired = ColourDesired(0, 0, 0);
|
|
||||||
colourLight.desired = ColourDesired(0xc0, 0xc0, 0xc0);
|
|
||||||
}
|
|
||||||
|
|
||||||
CallTip::~CallTip() {
|
|
||||||
font.Release();
|
|
||||||
wCallTip.Destroy();
|
|
||||||
delete []val;
|
|
||||||
val = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int widthArrow = 14;
|
|
||||||
|
|
||||||
void CallTip::RefreshColourPalette(Palette &pal, bool want) {
|
|
||||||
pal.WantFind(colourBG, want);
|
|
||||||
pal.WantFind(colourUnSel, want);
|
|
||||||
pal.WantFind(colourSel, want);
|
|
||||||
pal.WantFind(colourShade, want);
|
|
||||||
pal.WantFind(colourLight, want);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsArrowCharacter(char ch) {
|
|
||||||
return (ch >= 0) && (ch <= '\002');
|
|
||||||
}
|
|
||||||
|
|
||||||
void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
|
|
||||||
int posStart, int posEnd, int ytext, PRectangle rcClient,
|
|
||||||
bool highlight, bool draw) {
|
|
||||||
s += posStart;
|
|
||||||
int len = posEnd - posStart;
|
|
||||||
int maxEnd = 0;
|
|
||||||
int ends[10];
|
|
||||||
for (int i=0;i<len;i++) {
|
|
||||||
if (IsArrowCharacter(s[i])) {
|
|
||||||
if (i > 0)
|
|
||||||
ends[maxEnd++] = i;
|
|
||||||
ends[maxEnd++] = i+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ends[maxEnd++] = len;
|
|
||||||
int startSeg = 0;
|
|
||||||
int xEnd;
|
|
||||||
for (int seg = 0; seg<maxEnd; seg++) {
|
|
||||||
int endSeg = ends[seg];
|
|
||||||
if (endSeg > startSeg) {
|
|
||||||
if (IsArrowCharacter(s[startSeg])) {
|
|
||||||
xEnd = x + widthArrow;
|
|
||||||
offsetMain = xEnd;
|
|
||||||
if (draw) {
|
|
||||||
const int halfWidth = widthArrow / 2 - 3;
|
|
||||||
const int centreX = x + widthArrow / 2 - 1;
|
|
||||||
const int centreY = (rcClient.top + rcClient.bottom) / 2;
|
|
||||||
rcClient.left = x;
|
|
||||||
rcClient.right = xEnd;
|
|
||||||
surface->FillRectangle(rcClient, colourBG.allocated);
|
|
||||||
PRectangle rcClientInner(rcClient.left+1, rcClient.top+1, rcClient.right-2, rcClient.bottom-1);
|
|
||||||
surface->FillRectangle(rcClientInner, colourUnSel.allocated);
|
|
||||||
|
|
||||||
if (s[startSeg] == '\001') {
|
|
||||||
// Up arrow
|
|
||||||
Point pts[] = {
|
|
||||||
Point(centreX - halfWidth, centreY + halfWidth / 2),
|
|
||||||
Point(centreX + halfWidth, centreY + halfWidth / 2),
|
|
||||||
Point(centreX, centreY - halfWidth + halfWidth / 2),
|
|
||||||
};
|
|
||||||
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
|
|
||||||
colourBG.allocated, colourBG.allocated);
|
|
||||||
} else {
|
|
||||||
// Down arrow
|
|
||||||
Point pts[] = {
|
|
||||||
Point(centreX - halfWidth, centreY - halfWidth / 2),
|
|
||||||
Point(centreX + halfWidth, centreY - halfWidth / 2),
|
|
||||||
Point(centreX, centreY + halfWidth - halfWidth / 2),
|
|
||||||
};
|
|
||||||
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
|
|
||||||
colourBG.allocated, colourBG.allocated);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (s[startSeg] == '\001') {
|
|
||||||
xUp = x+1;
|
|
||||||
} else {
|
|
||||||
xDown = x+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
xEnd = x + surface->WidthText(font, s+startSeg, endSeg - startSeg);
|
|
||||||
if (draw) {
|
|
||||||
rcClient.left = x;
|
|
||||||
rcClient.right = xEnd;
|
|
||||||
surface->DrawTextNoClip(rcClient, font, ytext,
|
|
||||||
s+startSeg, endSeg - startSeg,
|
|
||||||
highlight ? colourSel.allocated : colourUnSel.allocated,
|
|
||||||
colourBG.allocated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x = xEnd;
|
|
||||||
startSeg = endSeg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int CallTip::PaintContents(Surface *surfaceWindow, bool draw) {
|
|
||||||
PRectangle rcClientPos = wCallTip.GetClientPosition();
|
|
||||||
PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,
|
|
||||||
rcClientPos.bottom - rcClientPos.top);
|
|
||||||
PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1);
|
|
||||||
|
|
||||||
// To make a nice small call tip window, it is only sized to fit most normal characters without accents
|
|
||||||
int ascent = surfaceWindow->Ascent(font) - surfaceWindow->InternalLeading(font);
|
|
||||||
|
|
||||||
// For each line...
|
|
||||||
// Draw the definition in three parts: before highlight, highlighted, after highlight
|
|
||||||
int ytext = rcClient.top + ascent + 1;
|
|
||||||
rcClient.bottom = ytext + surfaceWindow->Descent(font) + 1;
|
|
||||||
char *chunkVal = val;
|
|
||||||
bool moreChunks = true;
|
|
||||||
int maxWidth = 0;
|
|
||||||
while (moreChunks) {
|
|
||||||
char *chunkEnd = strchr(chunkVal, '\n');
|
|
||||||
if (chunkEnd == NULL) {
|
|
||||||
chunkEnd = chunkVal + strlen(chunkVal);
|
|
||||||
moreChunks = false;
|
|
||||||
}
|
|
||||||
int chunkOffset = chunkVal - val;
|
|
||||||
int chunkLength = chunkEnd - chunkVal;
|
|
||||||
int chunkEndOffset = chunkOffset + chunkLength;
|
|
||||||
int thisStartHighlight = Platform::Maximum(startHighlight, chunkOffset);
|
|
||||||
thisStartHighlight = Platform::Minimum(thisStartHighlight, chunkEndOffset);
|
|
||||||
thisStartHighlight -= chunkOffset;
|
|
||||||
int thisEndHighlight = Platform::Maximum(endHighlight, chunkOffset);
|
|
||||||
thisEndHighlight = Platform::Minimum(thisEndHighlight, chunkEndOffset);
|
|
||||||
thisEndHighlight -= chunkOffset;
|
|
||||||
rcClient.top = ytext - ascent - 1;
|
|
||||||
|
|
||||||
int x = 5;
|
|
||||||
|
|
||||||
DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight,
|
|
||||||
ytext, rcClient, false, draw);
|
|
||||||
DrawChunk(surfaceWindow, x, chunkVal, thisStartHighlight, thisEndHighlight,
|
|
||||||
ytext, rcClient, true, draw);
|
|
||||||
DrawChunk(surfaceWindow, x, chunkVal, thisEndHighlight, chunkLength,
|
|
||||||
ytext, rcClient, false, draw);
|
|
||||||
|
|
||||||
chunkVal = chunkEnd + 1;
|
|
||||||
ytext += lineHeight;
|
|
||||||
rcClient.bottom += lineHeight;
|
|
||||||
maxWidth = Platform::Maximum(maxWidth, x);
|
|
||||||
}
|
|
||||||
return maxWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CallTip::PaintCT(Surface *surfaceWindow) {
|
|
||||||
if (!val)
|
|
||||||
return;
|
|
||||||
PRectangle rcClientPos = wCallTip.GetClientPosition();
|
|
||||||
PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,
|
|
||||||
rcClientPos.bottom - rcClientPos.top);
|
|
||||||
PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1);
|
|
||||||
|
|
||||||
surfaceWindow->FillRectangle(rcClient, colourBG.allocated);
|
|
||||||
|
|
||||||
offsetMain = 5;
|
|
||||||
PaintContents(surfaceWindow, true);
|
|
||||||
|
|
||||||
// Draw a raised border around the edges of the window
|
|
||||||
surfaceWindow->MoveTo(0, rcClientSize.bottom - 1);
|
|
||||||
surfaceWindow->PenColour(colourShade.allocated);
|
|
||||||
surfaceWindow->LineTo(rcClientSize.right - 1, rcClientSize.bottom - 1);
|
|
||||||
surfaceWindow->LineTo(rcClientSize.right - 1, 0);
|
|
||||||
surfaceWindow->PenColour(colourLight.allocated);
|
|
||||||
surfaceWindow->LineTo(0, 0);
|
|
||||||
surfaceWindow->LineTo(0, rcClientSize.bottom - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CallTip::MouseClick(Point pt) {
|
|
||||||
clickPlace = 0;
|
|
||||||
if (pt.y < lineHeight) {
|
|
||||||
if ((pt.x > xUp) && (pt.x < xUp + widthArrow - 2)) {
|
|
||||||
clickPlace = 1;
|
|
||||||
} else if ((pt.x > xDown) && (pt.x < xDown + widthArrow - 2)) {
|
|
||||||
clickPlace = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
|
|
||||||
const char *faceName, int size,
|
|
||||||
int codePage_, Window &wParent) {
|
|
||||||
clickPlace = 0;
|
|
||||||
if (val)
|
|
||||||
delete []val;
|
|
||||||
val = new char[strlen(defn) + 1];
|
|
||||||
if (!val)
|
|
||||||
return PRectangle();
|
|
||||||
strcpy(val, defn);
|
|
||||||
codePage = codePage_;
|
|
||||||
Surface *surfaceMeasure = Surface::Allocate();
|
|
||||||
if (!surfaceMeasure)
|
|
||||||
return PRectangle();
|
|
||||||
surfaceMeasure->Init(wParent.GetID());
|
|
||||||
surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage);
|
|
||||||
surfaceMeasure->SetDBCSMode(codePage);
|
|
||||||
startHighlight = 0;
|
|
||||||
endHighlight = 0;
|
|
||||||
inCallTipMode = true;
|
|
||||||
posStartCallTip = pos;
|
|
||||||
int deviceHeight = surfaceMeasure->DeviceHeightFont(size);
|
|
||||||
font.Create(faceName, SC_CHARSET_DEFAULT, deviceHeight, false, false);
|
|
||||||
// Look for multiple lines in the text
|
|
||||||
// Only support \n here - simply means container must avoid \r!
|
|
||||||
int numLines = 1;
|
|
||||||
const char *newline;
|
|
||||||
const char *look = val;
|
|
||||||
xUp = -100;
|
|
||||||
xDown = -100;
|
|
||||||
offsetMain = 5;
|
|
||||||
int width = PaintContents(surfaceMeasure, false) + 5;
|
|
||||||
while ((newline = strchr(look, '\n')) != NULL) {
|
|
||||||
look = newline + 1;
|
|
||||||
numLines++;
|
|
||||||
}
|
|
||||||
lineHeight = surfaceMeasure->Height(font);
|
|
||||||
// Extra line for border and an empty line at top and bottom
|
|
||||||
int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2;
|
|
||||||
delete surfaceMeasure;
|
|
||||||
return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CallTip::CallTipCancel() {
|
|
||||||
inCallTipMode = false;
|
|
||||||
if (wCallTip.Created()) {
|
|
||||||
wCallTip.Destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CallTip::SetHighlight(int start, int end) {
|
|
||||||
// Avoid flashing by checking something has really changed
|
|
||||||
if ((start != startHighlight) || (end != endHighlight)) {
|
|
||||||
startHighlight = start;
|
|
||||||
endHighlight = end;
|
|
||||||
if (wCallTip.Created()) {
|
|
||||||
wCallTip.InvalidateAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file CallTip.h
|
|
||||||
** Interface to the call tip control.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef CALLTIP_H
|
|
||||||
#define CALLTIP_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class CallTip {
|
|
||||||
int startHighlight;
|
|
||||||
int endHighlight;
|
|
||||||
char *val;
|
|
||||||
Font font;
|
|
||||||
int xUp;
|
|
||||||
int xDown;
|
|
||||||
int lineHeight;
|
|
||||||
int offsetMain;
|
|
||||||
// Private so CallTip objects can not be copied
|
|
||||||
CallTip(const CallTip &) {}
|
|
||||||
CallTip &operator=(const CallTip &) { return *this; }
|
|
||||||
void DrawChunk(Surface *surface, int &x, const char *s,
|
|
||||||
int posStart, int posEnd, int ytext, PRectangle rcClient,
|
|
||||||
bool highlight, bool draw);
|
|
||||||
int PaintContents(Surface *surfaceWindow, bool draw);
|
|
||||||
|
|
||||||
public:
|
|
||||||
Window wCallTip;
|
|
||||||
Window wDraw;
|
|
||||||
bool inCallTipMode;
|
|
||||||
int posStartCallTip;
|
|
||||||
ColourPair colourBG;
|
|
||||||
ColourPair colourUnSel;
|
|
||||||
ColourPair colourSel;
|
|
||||||
ColourPair colourShade;
|
|
||||||
ColourPair colourLight;
|
|
||||||
int codePage;
|
|
||||||
int clickPlace;
|
|
||||||
|
|
||||||
CallTip();
|
|
||||||
~CallTip();
|
|
||||||
|
|
||||||
/// Claim or accept palette entries for the colours required to paint a calltip.
|
|
||||||
void RefreshColourPalette(Palette &pal, bool want);
|
|
||||||
|
|
||||||
void PaintCT(Surface *surfaceWindow);
|
|
||||||
|
|
||||||
void MouseClick(Point pt);
|
|
||||||
|
|
||||||
/// Setup the calltip and return a rectangle of the area required.
|
|
||||||
PRectangle CallTipStart(int pos, Point pt, const char *defn,
|
|
||||||
const char *faceName, int size, int codePage_, Window &wParent);
|
|
||||||
|
|
||||||
void CallTipCancel();
|
|
||||||
|
|
||||||
/// Set a range of characters to be displayed in a highlight style.
|
|
||||||
/// Commonly used to highlight the current parameter.
|
|
||||||
void SetHighlight(int start, int end);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,248 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file CellBuffer.h
|
|
||||||
** Manages the text of the document.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef CELLBUFFER_H
|
|
||||||
#define CELLBUFFER_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This holds the marker identifier and the marker type to display.
|
|
||||||
* MarkerHandleNumbers are members of lists.
|
|
||||||
*/
|
|
||||||
struct MarkerHandleNumber {
|
|
||||||
int handle;
|
|
||||||
int number;
|
|
||||||
MarkerHandleNumber *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A marker handle set contains any number of MarkerHandleNumbers.
|
|
||||||
*/
|
|
||||||
class MarkerHandleSet {
|
|
||||||
MarkerHandleNumber *root;
|
|
||||||
|
|
||||||
public:
|
|
||||||
MarkerHandleSet();
|
|
||||||
~MarkerHandleSet();
|
|
||||||
int Length();
|
|
||||||
int NumberFromHandle(int handle);
|
|
||||||
int MarkValue(); ///< Bit set of marker numbers.
|
|
||||||
bool Contains(int handle);
|
|
||||||
bool InsertHandle(int handle, int markerNum);
|
|
||||||
void RemoveHandle(int handle);
|
|
||||||
void RemoveNumber(int markerNum);
|
|
||||||
void CombineWith(MarkerHandleSet *other);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Each line stores the starting position of the first character of the line in the cell buffer
|
|
||||||
* and potentially a marker handle set. Often a line will not have any attached markers.
|
|
||||||
*/
|
|
||||||
struct LineData {
|
|
||||||
int startPosition;
|
|
||||||
MarkerHandleSet *handleSet;
|
|
||||||
LineData() : startPosition(0), handleSet(0) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The line vector contains information about each of the lines in a cell buffer.
|
|
||||||
*/
|
|
||||||
class LineVector {
|
|
||||||
public:
|
|
||||||
int growSize;
|
|
||||||
int lines;
|
|
||||||
LineData *linesData;
|
|
||||||
int size;
|
|
||||||
int *levels;
|
|
||||||
int sizeLevels;
|
|
||||||
|
|
||||||
/// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.
|
|
||||||
int handleCurrent;
|
|
||||||
|
|
||||||
LineVector();
|
|
||||||
~LineVector();
|
|
||||||
void Init();
|
|
||||||
|
|
||||||
void Expand(int sizeNew);
|
|
||||||
void ExpandLevels(int sizeNew=-1);
|
|
||||||
void ClearLevels();
|
|
||||||
void InsertValue(int pos, int value);
|
|
||||||
void SetValue(int pos, int value);
|
|
||||||
void Remove(int pos);
|
|
||||||
int LineFromPosition(int pos);
|
|
||||||
|
|
||||||
int AddMark(int line, int marker);
|
|
||||||
void MergeMarkers(int pos);
|
|
||||||
void DeleteMark(int line, int markerNum);
|
|
||||||
void DeleteMarkFromHandle(int markerHandle);
|
|
||||||
int LineFromHandle(int markerHandle);
|
|
||||||
};
|
|
||||||
|
|
||||||
enum actionType { insertAction, removeAction, startAction };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Actions are used to store all the information required to perform one undo/redo step.
|
|
||||||
*/
|
|
||||||
class Action {
|
|
||||||
public:
|
|
||||||
actionType at;
|
|
||||||
int position;
|
|
||||||
char *data;
|
|
||||||
int lenData;
|
|
||||||
bool mayCoalesce;
|
|
||||||
|
|
||||||
Action();
|
|
||||||
~Action();
|
|
||||||
void Create(actionType at_, int position_=0, char *data_=0, int lenData_=0, bool mayCoalesce_=true);
|
|
||||||
void Destroy();
|
|
||||||
void Grab(Action *source);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class UndoHistory {
|
|
||||||
Action *actions;
|
|
||||||
int lenActions;
|
|
||||||
int maxAction;
|
|
||||||
int currentAction;
|
|
||||||
int undoSequenceDepth;
|
|
||||||
int savePoint;
|
|
||||||
|
|
||||||
void EnsureUndoRoom();
|
|
||||||
|
|
||||||
public:
|
|
||||||
UndoHistory();
|
|
||||||
~UndoHistory();
|
|
||||||
|
|
||||||
void AppendAction(actionType at, int position, char *data, int length);
|
|
||||||
|
|
||||||
void BeginUndoAction();
|
|
||||||
void EndUndoAction();
|
|
||||||
void DropUndoSequence();
|
|
||||||
void DeleteUndoHistory();
|
|
||||||
|
|
||||||
/// The save point is a marker in the undo stack where the container has stated that
|
|
||||||
/// the buffer was saved. Undo and redo can move over the save point.
|
|
||||||
void SetSavePoint();
|
|
||||||
bool IsSavePoint() const;
|
|
||||||
|
|
||||||
/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
|
|
||||||
/// called that many times. Similarly for redo.
|
|
||||||
bool CanUndo() const;
|
|
||||||
int StartUndo();
|
|
||||||
const Action &GetUndoStep() const;
|
|
||||||
void CompletedUndoStep();
|
|
||||||
bool CanRedo() const;
|
|
||||||
int StartRedo();
|
|
||||||
const Action &GetRedoStep() const;
|
|
||||||
void CompletedRedoStep();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holder for an expandable array of characters that supports undo and line markers.
|
|
||||||
* Based on article "Data Structures in a Bit-Mapped Text Editor"
|
|
||||||
* by Wilfred J. Hansen, Byte January 1987, page 183.
|
|
||||||
*/
|
|
||||||
class CellBuffer {
|
|
||||||
private:
|
|
||||||
char *body;
|
|
||||||
int size;
|
|
||||||
int length;
|
|
||||||
int part1len;
|
|
||||||
int gaplen;
|
|
||||||
char *part2body;
|
|
||||||
bool readOnly;
|
|
||||||
int growSize;
|
|
||||||
|
|
||||||
bool collectingUndo;
|
|
||||||
UndoHistory uh;
|
|
||||||
|
|
||||||
LineVector lv;
|
|
||||||
|
|
||||||
SVector lineStates;
|
|
||||||
|
|
||||||
void GapTo(int position);
|
|
||||||
void RoomFor(int insertionLength);
|
|
||||||
|
|
||||||
inline char ByteAt(int position);
|
|
||||||
void SetByteAt(int position, char ch);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
CellBuffer(int initialLength = 4000);
|
|
||||||
~CellBuffer();
|
|
||||||
|
|
||||||
/// Retrieving positions outside the range of the buffer works and returns 0
|
|
||||||
char CharAt(int position);
|
|
||||||
void GetCharRange(char *buffer, int position, int lengthRetrieve);
|
|
||||||
char StyleAt(int position);
|
|
||||||
|
|
||||||
int ByteLength();
|
|
||||||
int Length();
|
|
||||||
int Lines();
|
|
||||||
int LineStart(int line);
|
|
||||||
int LineFromPosition(int pos) { return lv.LineFromPosition(pos); }
|
|
||||||
const char *InsertString(int position, char *s, int insertLength);
|
|
||||||
void InsertCharStyle(int position, char ch, char style);
|
|
||||||
|
|
||||||
/// Setting styles for positions outside the range of the buffer is safe and has no effect.
|
|
||||||
/// @return true if the style of a character is changed.
|
|
||||||
bool SetStyleAt(int position, char style, char mask='\377');
|
|
||||||
bool SetStyleFor(int position, int length, char style, char mask);
|
|
||||||
|
|
||||||
const char *DeleteChars(int position, int deleteLength);
|
|
||||||
|
|
||||||
bool IsReadOnly();
|
|
||||||
void SetReadOnly(bool set);
|
|
||||||
|
|
||||||
/// The save point is a marker in the undo stack where the container has stated that
|
|
||||||
/// the buffer was saved. Undo and redo can move over the save point.
|
|
||||||
void SetSavePoint();
|
|
||||||
bool IsSavePoint();
|
|
||||||
|
|
||||||
/// Line marker functions
|
|
||||||
int AddMark(int line, int markerNum);
|
|
||||||
void DeleteMark(int line, int markerNum);
|
|
||||||
void DeleteMarkFromHandle(int markerHandle);
|
|
||||||
int GetMark(int line);
|
|
||||||
void DeleteAllMarks(int markerNum);
|
|
||||||
int LineFromHandle(int markerHandle);
|
|
||||||
|
|
||||||
/// Actions without undo
|
|
||||||
void BasicInsertString(int position, char *s, int insertLength);
|
|
||||||
void BasicDeleteChars(int position, int deleteLength);
|
|
||||||
|
|
||||||
bool SetUndoCollection(bool collectUndo);
|
|
||||||
bool IsCollectingUndo();
|
|
||||||
void BeginUndoAction();
|
|
||||||
void EndUndoAction();
|
|
||||||
void DeleteUndoHistory();
|
|
||||||
|
|
||||||
/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
|
|
||||||
/// called that many times. Similarly for redo.
|
|
||||||
bool CanUndo();
|
|
||||||
int StartUndo();
|
|
||||||
const Action &GetUndoStep() const;
|
|
||||||
void PerformUndoStep();
|
|
||||||
bool CanRedo();
|
|
||||||
int StartRedo();
|
|
||||||
const Action &GetRedoStep() const;
|
|
||||||
void PerformRedoStep();
|
|
||||||
|
|
||||||
int SetLineState(int line, int state);
|
|
||||||
int GetLineState(int line);
|
|
||||||
int GetMaxLineState();
|
|
||||||
|
|
||||||
int SetLevel(int line, int level);
|
|
||||||
int GetLevel(int line);
|
|
||||||
void ClearLevels();
|
|
||||||
};
|
|
||||||
|
|
||||||
#define CELL_SIZE 2
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,283 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ContractionState.cxx
|
|
||||||
** Manages visibility of lines for folding.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "ContractionState.h"
|
|
||||||
|
|
||||||
OneLine::OneLine() {
|
|
||||||
displayLine = 0;
|
|
||||||
//docLine = 0;
|
|
||||||
visible = true;
|
|
||||||
height = 1;
|
|
||||||
expanded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContractionState::ContractionState() {
|
|
||||||
lines = 0;
|
|
||||||
size = 0;
|
|
||||||
linesInDoc = 1;
|
|
||||||
linesInDisplay = 1;
|
|
||||||
valid = false;
|
|
||||||
docLines = 0;
|
|
||||||
sizeDocLines = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContractionState::~ContractionState() {
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ContractionState::MakeValid() const {
|
|
||||||
if (!valid) {
|
|
||||||
// Could be cleverer by keeping the index of the last still valid entry
|
|
||||||
// rather than invalidating all.
|
|
||||||
linesInDisplay = 0;
|
|
||||||
for (int lineInDoc=0; lineInDoc<linesInDoc; lineInDoc++) {
|
|
||||||
lines[lineInDoc].displayLine = linesInDisplay;
|
|
||||||
if (lines[lineInDoc].visible) {
|
|
||||||
linesInDisplay += lines[lineInDoc].height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sizeDocLines < linesInDisplay) {
|
|
||||||
delete []docLines;
|
|
||||||
int *docLinesNew = new int[linesInDisplay + growSize];
|
|
||||||
if (!docLinesNew) {
|
|
||||||
docLines = 0;
|
|
||||||
sizeDocLines = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
docLines = docLinesNew;
|
|
||||||
sizeDocLines = linesInDisplay + growSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
int lineInDisplay=0;
|
|
||||||
for (int line=0; line<linesInDoc; line++) {
|
|
||||||
if (lines[line].visible) {
|
|
||||||
for (int linePiece=0; linePiece<lines[line].height; linePiece++) {
|
|
||||||
docLines[lineInDisplay] = line;
|
|
||||||
lineInDisplay++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
valid = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ContractionState::Clear() {
|
|
||||||
delete []lines;
|
|
||||||
lines = 0;
|
|
||||||
size = 0;
|
|
||||||
linesInDoc = 1;
|
|
||||||
linesInDisplay = 1;
|
|
||||||
delete []docLines;
|
|
||||||
docLines = 0;
|
|
||||||
sizeDocLines = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ContractionState::LinesInDoc() const {
|
|
||||||
return linesInDoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ContractionState::LinesDisplayed() const {
|
|
||||||
if (size != 0) {
|
|
||||||
MakeValid();
|
|
||||||
}
|
|
||||||
return linesInDisplay;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ContractionState::DisplayFromDoc(int lineDoc) const {
|
|
||||||
if (size == 0) {
|
|
||||||
return lineDoc;
|
|
||||||
}
|
|
||||||
MakeValid();
|
|
||||||
if ((lineDoc >= 0) && (lineDoc < linesInDoc)) {
|
|
||||||
return lines[lineDoc].displayLine;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ContractionState::DocFromDisplay(int lineDisplay) const {
|
|
||||||
if (lineDisplay <= 0)
|
|
||||||
return 0;
|
|
||||||
if (lineDisplay >= linesInDisplay)
|
|
||||||
return linesInDoc;
|
|
||||||
if (size == 0)
|
|
||||||
return lineDisplay;
|
|
||||||
MakeValid();
|
|
||||||
if (docLines) { // Valid allocation
|
|
||||||
return docLines[lineDisplay];
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ContractionState::Grow(int sizeNew) {
|
|
||||||
OneLine *linesNew = new OneLine[sizeNew];
|
|
||||||
if (linesNew) {
|
|
||||||
int i = 0;
|
|
||||||
for (; i < size; i++) {
|
|
||||||
linesNew[i] = lines[i];
|
|
||||||
}
|
|
||||||
for (; i < sizeNew; i++) {
|
|
||||||
linesNew[i].displayLine = i;
|
|
||||||
}
|
|
||||||
delete []lines;
|
|
||||||
lines = linesNew;
|
|
||||||
size = sizeNew;
|
|
||||||
valid = false;
|
|
||||||
} else {
|
|
||||||
Platform::DebugPrintf("No memory available\n");
|
|
||||||
// TODO: Blow up
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ContractionState::InsertLines(int lineDoc, int lineCount) {
|
|
||||||
if (size == 0) {
|
|
||||||
linesInDoc += lineCount;
|
|
||||||
linesInDisplay += lineCount;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//Platform::DebugPrintf("InsertLine[%d] = %d\n", lineDoc);
|
|
||||||
if ((linesInDoc + lineCount + 2) >= size) {
|
|
||||||
Grow(linesInDoc + lineCount + growSize);
|
|
||||||
}
|
|
||||||
linesInDoc += lineCount;
|
|
||||||
for (int i = linesInDoc; i >= lineDoc + lineCount; i--) {
|
|
||||||
lines[i].visible = lines[i - lineCount].visible;
|
|
||||||
lines[i].height = lines[i - lineCount].height;
|
|
||||||
linesInDisplay += lines[i].height;
|
|
||||||
lines[i].expanded = lines[i - lineCount].expanded;
|
|
||||||
}
|
|
||||||
for (int d=0;d<lineCount;d++) {
|
|
||||||
lines[lineDoc+d].visible = true; // Should inherit visibility from context ?
|
|
||||||
lines[lineDoc+d].height = 1;
|
|
||||||
lines[lineDoc+d].expanded = true;
|
|
||||||
}
|
|
||||||
valid = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ContractionState::DeleteLines(int lineDoc, int lineCount) {
|
|
||||||
if (size == 0) {
|
|
||||||
linesInDoc -= lineCount;
|
|
||||||
linesInDisplay -= lineCount;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int deltaDisplayed = 0;
|
|
||||||
for (int d=0;d<lineCount;d++) {
|
|
||||||
if (lines[lineDoc+d].visible)
|
|
||||||
deltaDisplayed -= lines[lineDoc+d].height;
|
|
||||||
}
|
|
||||||
for (int i = lineDoc; i < linesInDoc-lineCount; i++) {
|
|
||||||
if (i != 0) // Line zero is always visible
|
|
||||||
lines[i].visible = lines[i + lineCount].visible;
|
|
||||||
lines[i].expanded = lines[i + lineCount].expanded;
|
|
||||||
lines[i].height = lines[i + lineCount].height;
|
|
||||||
}
|
|
||||||
linesInDoc -= lineCount;
|
|
||||||
linesInDisplay += deltaDisplayed;
|
|
||||||
valid = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ContractionState::GetVisible(int lineDoc) const {
|
|
||||||
if (size == 0)
|
|
||||||
return true;
|
|
||||||
if ((lineDoc >= 0) && (lineDoc < linesInDoc)) {
|
|
||||||
return lines[lineDoc].visible;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible) {
|
|
||||||
if (lineDocStart == 0)
|
|
||||||
lineDocStart++;
|
|
||||||
if (lineDocStart > lineDocEnd)
|
|
||||||
return false;
|
|
||||||
if (size == 0) {
|
|
||||||
Grow(linesInDoc + growSize);
|
|
||||||
}
|
|
||||||
// TODO: modify docLine members to mirror displayLine
|
|
||||||
int delta = 0;
|
|
||||||
// Change lineDocs
|
|
||||||
if ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < linesInDoc)) {
|
|
||||||
for (int line=lineDocStart; line <= lineDocEnd; line++) {
|
|
||||||
if (lines[line].visible != visible) {
|
|
||||||
delta += visible ? lines[line].height : -lines[line].height;
|
|
||||||
lines[line].visible = visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
linesInDisplay += delta;
|
|
||||||
valid = false;
|
|
||||||
return delta != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ContractionState::GetExpanded(int lineDoc) const {
|
|
||||||
if (size == 0)
|
|
||||||
return true;
|
|
||||||
if ((lineDoc >= 0) && (lineDoc < linesInDoc)) {
|
|
||||||
return lines[lineDoc].expanded;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ContractionState::SetExpanded(int lineDoc, bool expanded) {
|
|
||||||
if (size == 0) {
|
|
||||||
if (expanded) {
|
|
||||||
// If in completely expanded state then setting
|
|
||||||
// one line to expanded has no effect.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Grow(linesInDoc + growSize);
|
|
||||||
}
|
|
||||||
if ((lineDoc >= 0) && (lineDoc < linesInDoc)) {
|
|
||||||
if (lines[lineDoc].expanded != expanded) {
|
|
||||||
lines[lineDoc].expanded = expanded;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ContractionState::GetHeight(int lineDoc) const {
|
|
||||||
if (size == 0)
|
|
||||||
return 1;
|
|
||||||
if ((lineDoc >= 0) && (lineDoc < linesInDoc)) {
|
|
||||||
return lines[lineDoc].height;
|
|
||||||
} else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the number of display lines needed for this line.
|
|
||||||
// Return true if this is a change.
|
|
||||||
bool ContractionState::SetHeight(int lineDoc, int height) {
|
|
||||||
if (lineDoc > linesInDoc)
|
|
||||||
return false;
|
|
||||||
if (size == 0) {
|
|
||||||
if (height == 1) {
|
|
||||||
// If in completely expanded state then all lines
|
|
||||||
// assumed to have height of one so no effect here.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Grow(linesInDoc + growSize);
|
|
||||||
}
|
|
||||||
if (lines[lineDoc].height != height) {
|
|
||||||
lines[lineDoc].height = height;
|
|
||||||
valid = false;
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ContractionState::ShowAll() {
|
|
||||||
delete []lines;
|
|
||||||
lines = 0;
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ContractionState.h
|
|
||||||
** Manages visibility of lines for folding.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef CONTRACTIONSTATE_H
|
|
||||||
#define CONTRACTIONSTATE_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class OneLine {
|
|
||||||
public:
|
|
||||||
int displayLine; ///< Position within set of visible lines
|
|
||||||
//int docLine; ///< Inverse of @a displayLine
|
|
||||||
int height; ///< Number of display lines needed to show all of the line
|
|
||||||
bool visible;
|
|
||||||
bool expanded;
|
|
||||||
|
|
||||||
OneLine();
|
|
||||||
virtual ~OneLine() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class ContractionState {
|
|
||||||
void Grow(int sizeNew);
|
|
||||||
enum { growSize = 4000 };
|
|
||||||
int linesInDoc;
|
|
||||||
mutable int linesInDisplay;
|
|
||||||
mutable OneLine *lines;
|
|
||||||
int size;
|
|
||||||
mutable int *docLines;
|
|
||||||
mutable int sizeDocLines;
|
|
||||||
mutable bool valid;
|
|
||||||
void MakeValid() const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ContractionState();
|
|
||||||
virtual ~ContractionState();
|
|
||||||
|
|
||||||
void Clear();
|
|
||||||
|
|
||||||
int LinesInDoc() const;
|
|
||||||
int LinesDisplayed() const;
|
|
||||||
int DisplayFromDoc(int lineDoc) const;
|
|
||||||
int DocFromDisplay(int lineDisplay) const;
|
|
||||||
|
|
||||||
void InsertLines(int lineDoc, int lineCount);
|
|
||||||
void DeleteLines(int lineDoc, int lineCount);
|
|
||||||
|
|
||||||
bool GetVisible(int lineDoc) const;
|
|
||||||
bool SetVisible(int lineDocStart, int lineDocEnd, bool visible);
|
|
||||||
|
|
||||||
bool GetExpanded(int lineDoc) const;
|
|
||||||
bool SetExpanded(int lineDoc, bool expanded);
|
|
||||||
|
|
||||||
int GetHeight(int lineDoc) const;
|
|
||||||
bool SetHeight(int lineDoc, int height);
|
|
||||||
|
|
||||||
void ShowAll();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,297 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Document.h
|
|
||||||
** Text document that handles notifications, DBCS, styling, words and end of line.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef DOCUMENT_H
|
|
||||||
#define DOCUMENT_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A Position is a position within a document between two characters or at the beginning or end.
|
|
||||||
* Sometimes used as a character index where it identifies the character after the position.
|
|
||||||
*/
|
|
||||||
typedef int Position;
|
|
||||||
const Position invalidPosition = -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The range class represents a range of text in a document.
|
|
||||||
* The two values are not sorted as one end may be more significant than the other
|
|
||||||
* as is the case for the selection where the end position is the position of the caret.
|
|
||||||
* If either position is invalidPosition then the range is invalid and most operations will fail.
|
|
||||||
*/
|
|
||||||
class Range {
|
|
||||||
public:
|
|
||||||
Position start;
|
|
||||||
Position end;
|
|
||||||
|
|
||||||
Range(Position pos=0) :
|
|
||||||
start(pos), end(pos) {
|
|
||||||
};
|
|
||||||
Range(Position start_, Position end_) :
|
|
||||||
start(start_), end(end_) {
|
|
||||||
};
|
|
||||||
|
|
||||||
bool Valid() const {
|
|
||||||
return (start != invalidPosition) && (end != invalidPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is the position within the range?
|
|
||||||
bool Contains(Position pos) const {
|
|
||||||
if (start < end) {
|
|
||||||
return (pos >= start && pos <= end);
|
|
||||||
} else {
|
|
||||||
return (pos <= start && pos >= end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is the character after pos within the range?
|
|
||||||
bool ContainsCharacter(Position pos) const {
|
|
||||||
if (start < end) {
|
|
||||||
return (pos >= start && pos < end);
|
|
||||||
} else {
|
|
||||||
return (pos < start && pos >= end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Contains(Range other) const {
|
|
||||||
return Contains(other.start) && Contains(other.end);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Overlaps(Range other) const {
|
|
||||||
return
|
|
||||||
Contains(other.start) ||
|
|
||||||
Contains(other.end) ||
|
|
||||||
other.Contains(start) ||
|
|
||||||
other.Contains(end);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class DocWatcher;
|
|
||||||
class DocModification;
|
|
||||||
class RESearch;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class Document {
|
|
||||||
|
|
||||||
public:
|
|
||||||
/** Used to pair watcher pointer with user data. */
|
|
||||||
class WatcherWithUserData {
|
|
||||||
public:
|
|
||||||
DocWatcher *watcher;
|
|
||||||
void *userData;
|
|
||||||
WatcherWithUserData() {
|
|
||||||
watcher = 0;
|
|
||||||
userData = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
|
|
||||||
|
|
||||||
private:
|
|
||||||
int refCount;
|
|
||||||
CellBuffer cb;
|
|
||||||
charClassification charClass[256];
|
|
||||||
char stylingMask;
|
|
||||||
int endStyled;
|
|
||||||
int styleClock;
|
|
||||||
int enteredCount;
|
|
||||||
int enteredReadOnlyCount;
|
|
||||||
|
|
||||||
WatcherWithUserData *watchers;
|
|
||||||
int lenWatchers;
|
|
||||||
|
|
||||||
bool matchesValid;
|
|
||||||
RESearch *pre;
|
|
||||||
char *substituted;
|
|
||||||
|
|
||||||
public:
|
|
||||||
int stylingBits;
|
|
||||||
int stylingBitsMask;
|
|
||||||
|
|
||||||
int eolMode;
|
|
||||||
/// Can also be SC_CP_UTF8 to enable UTF-8 mode
|
|
||||||
int dbcsCodePage;
|
|
||||||
int tabInChars;
|
|
||||||
int indentInChars;
|
|
||||||
bool useTabs;
|
|
||||||
bool tabIndents;
|
|
||||||
bool backspaceUnindents;
|
|
||||||
|
|
||||||
Document();
|
|
||||||
virtual ~Document();
|
|
||||||
|
|
||||||
int AddRef();
|
|
||||||
int Release();
|
|
||||||
|
|
||||||
int LineFromPosition(int pos);
|
|
||||||
int ClampPositionIntoDocument(int pos);
|
|
||||||
bool IsCrLf(int pos);
|
|
||||||
int LenChar(int pos);
|
|
||||||
int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
|
|
||||||
|
|
||||||
// Gateways to modifying document
|
|
||||||
bool DeleteChars(int pos, int len);
|
|
||||||
bool InsertStyledString(int position, char *s, int insertLength);
|
|
||||||
int Undo();
|
|
||||||
int Redo();
|
|
||||||
bool CanUndo() { return cb.CanUndo(); }
|
|
||||||
bool CanRedo() { return cb.CanRedo(); }
|
|
||||||
void DeleteUndoHistory() { cb.DeleteUndoHistory(); }
|
|
||||||
bool SetUndoCollection(bool collectUndo) {
|
|
||||||
return cb.SetUndoCollection(collectUndo);
|
|
||||||
}
|
|
||||||
bool IsCollectingUndo() { return cb.IsCollectingUndo(); }
|
|
||||||
void BeginUndoAction() { cb.BeginUndoAction(); }
|
|
||||||
void EndUndoAction() { cb.EndUndoAction(); }
|
|
||||||
void SetSavePoint();
|
|
||||||
bool IsSavePoint() { return cb.IsSavePoint(); }
|
|
||||||
|
|
||||||
int GetLineIndentation(int line);
|
|
||||||
void SetLineIndentation(int line, int indent);
|
|
||||||
int GetLineIndentPosition(int line);
|
|
||||||
int GetColumn(int position);
|
|
||||||
int FindColumn(int line, int column);
|
|
||||||
void Indent(bool forwards, int lineBottom, int lineTop);
|
|
||||||
void ConvertLineEnds(int eolModeSet);
|
|
||||||
void SetReadOnly(bool set) { cb.SetReadOnly(set); }
|
|
||||||
bool IsReadOnly() { return cb.IsReadOnly(); }
|
|
||||||
|
|
||||||
bool InsertChar(int pos, char ch);
|
|
||||||
bool InsertString(int position, const char *s);
|
|
||||||
bool InsertString(int position, const char *s, size_t insertLength);
|
|
||||||
void ChangeChar(int pos, char ch);
|
|
||||||
void DelChar(int pos);
|
|
||||||
void DelCharBack(int pos);
|
|
||||||
|
|
||||||
char CharAt(int position) { return cb.CharAt(position); }
|
|
||||||
void GetCharRange(char *buffer, int position, int lengthRetrieve) {
|
|
||||||
cb.GetCharRange(buffer, position, lengthRetrieve);
|
|
||||||
}
|
|
||||||
char StyleAt(int position) { return cb.StyleAt(position); }
|
|
||||||
int GetMark(int line) { return cb.GetMark(line); }
|
|
||||||
int AddMark(int line, int markerNum);
|
|
||||||
void DeleteMark(int line, int markerNum);
|
|
||||||
void DeleteMarkFromHandle(int markerHandle);
|
|
||||||
void DeleteAllMarks(int markerNum);
|
|
||||||
int LineFromHandle(int markerHandle) { return cb.LineFromHandle(markerHandle); }
|
|
||||||
int LineStart(int line);
|
|
||||||
int LineEnd(int line);
|
|
||||||
int LineEndPosition(int position);
|
|
||||||
int VCHomePosition(int position);
|
|
||||||
|
|
||||||
int SetLevel(int line, int level);
|
|
||||||
int GetLevel(int line) { return cb.GetLevel(line); }
|
|
||||||
void ClearLevels() { cb.ClearLevels(); }
|
|
||||||
int GetLastChild(int lineParent, int level=-1);
|
|
||||||
int GetFoldParent(int line);
|
|
||||||
|
|
||||||
void Indent(bool forwards);
|
|
||||||
int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false);
|
|
||||||
int NextWordStart(int pos, int delta);
|
|
||||||
int NextWordEnd(int pos, int delta);
|
|
||||||
int Length() { return cb.Length(); }
|
|
||||||
long FindText(int minPos, int maxPos, const char *s,
|
|
||||||
bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
|
|
||||||
long FindText(int iMessage, unsigned long wParam, long lParam);
|
|
||||||
const char *SubstituteByPosition(const char *text, int *length);
|
|
||||||
int LinesTotal();
|
|
||||||
|
|
||||||
void ChangeCase(Range r, bool makeUpperCase);
|
|
||||||
|
|
||||||
void SetDefaultCharClasses();
|
|
||||||
void SetCharClasses(unsigned char *chars, charClassification newCharClass);
|
|
||||||
void SetStylingBits(int bits);
|
|
||||||
void StartStyling(int position, char mask);
|
|
||||||
bool SetStyleFor(int length, char style);
|
|
||||||
bool SetStyles(int length, char *styles);
|
|
||||||
int GetEndStyled() { return endStyled; }
|
|
||||||
bool EnsureStyledTo(int pos);
|
|
||||||
int GetStyleClock() { return styleClock; }
|
|
||||||
|
|
||||||
int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
|
|
||||||
int GetLineState(int line) { return cb.GetLineState(line); }
|
|
||||||
int GetMaxLineState() { return cb.GetMaxLineState(); }
|
|
||||||
|
|
||||||
bool AddWatcher(DocWatcher *watcher, void *userData);
|
|
||||||
bool RemoveWatcher(DocWatcher *watcher, void *userData);
|
|
||||||
const WatcherWithUserData *GetWatchers() const { return watchers; }
|
|
||||||
int GetLenWatchers() const { return lenWatchers; }
|
|
||||||
|
|
||||||
bool IsWordPartSeparator(char ch);
|
|
||||||
int WordPartLeft(int pos);
|
|
||||||
int WordPartRight(int pos);
|
|
||||||
int ExtendStyleRange(int pos, int delta, bool singleLine = false);
|
|
||||||
int ParaUp(int pos);
|
|
||||||
int ParaDown(int pos);
|
|
||||||
|
|
||||||
private:
|
|
||||||
charClassification WordCharClass(unsigned char ch);
|
|
||||||
bool IsWordStartAt(int pos);
|
|
||||||
bool IsWordEndAt(int pos);
|
|
||||||
bool IsWordAt(int start, int end);
|
|
||||||
void ModifiedAt(int pos);
|
|
||||||
|
|
||||||
void NotifyModifyAttempt();
|
|
||||||
void NotifySavePoint(bool atSavePoint);
|
|
||||||
void NotifyModified(DocModification mh);
|
|
||||||
|
|
||||||
int IndentSize() { return indentInChars ? indentInChars : tabInChars; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To optimise processing of document modifications by DocWatchers, a hint is passed indicating the
|
|
||||||
* scope of the change.
|
|
||||||
* If the DocWatcher is a document view then this can be used to optimise screen updating.
|
|
||||||
*/
|
|
||||||
class DocModification {
|
|
||||||
public:
|
|
||||||
int modificationType;
|
|
||||||
int position;
|
|
||||||
int length;
|
|
||||||
int linesAdded; /**< Negative if lines deleted. */
|
|
||||||
const char *text; /**< Only valid for changes to text, not for changes to style. */
|
|
||||||
int line;
|
|
||||||
int foldLevelNow;
|
|
||||||
int foldLevelPrev;
|
|
||||||
|
|
||||||
DocModification(int modificationType_, int position_=0, int length_=0,
|
|
||||||
int linesAdded_=0, const char *text_=0) :
|
|
||||||
modificationType(modificationType_),
|
|
||||||
position(position_),
|
|
||||||
length(length_),
|
|
||||||
linesAdded(linesAdded_),
|
|
||||||
text(text_),
|
|
||||||
line(0),
|
|
||||||
foldLevelNow(0),
|
|
||||||
foldLevelPrev(0) {}
|
|
||||||
|
|
||||||
DocModification(int modificationType_, const Action &act, int linesAdded_=0) :
|
|
||||||
modificationType(modificationType_),
|
|
||||||
position(act.position / 2),
|
|
||||||
length(act.lenData),
|
|
||||||
linesAdded(linesAdded_),
|
|
||||||
text(act.data),
|
|
||||||
line(0),
|
|
||||||
foldLevelNow(0),
|
|
||||||
foldLevelPrev(0) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A class that wants to receive notifications from a Document must be derived from DocWatcher
|
|
||||||
* and implement the notification methods. It can then be added to the watcher list with AddWatcher.
|
|
||||||
*/
|
|
||||||
class DocWatcher {
|
|
||||||
public:
|
|
||||||
virtual ~DocWatcher() {}
|
|
||||||
|
|
||||||
virtual void NotifyModifyAttempt(Document *doc, void *userData) = 0;
|
|
||||||
virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0;
|
|
||||||
virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0;
|
|
||||||
virtual void NotifyDeleted(Document *doc, void *userData) = 0;
|
|
||||||
virtual void NotifyStyleNeeded(Document *doc, void *userData, int endPos) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file DocumentAccessor.cxx
|
|
||||||
** Rapid easy access to contents of a Scintilla.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "SVector.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "DocumentAccessor.h"
|
|
||||||
#include "CellBuffer.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "Document.h"
|
|
||||||
|
|
||||||
DocumentAccessor::~DocumentAccessor() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DocumentAccessor::InternalIsLeadByte(char ch) {
|
|
||||||
if (SC_CP_UTF8 == codePage)
|
|
||||||
// For lexing, all characters >= 0x80 are treated the
|
|
||||||
// same so none is considered a lead byte.
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return Platform::IsDBCSLeadByte(codePage, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DocumentAccessor::Fill(int position) {
|
|
||||||
if (lenDoc == -1)
|
|
||||||
lenDoc = pdoc->Length();
|
|
||||||
startPos = position - slopSize;
|
|
||||||
if (startPos + bufferSize > lenDoc)
|
|
||||||
startPos = lenDoc - bufferSize;
|
|
||||||
if (startPos < 0)
|
|
||||||
startPos = 0;
|
|
||||||
endPos = startPos + bufferSize;
|
|
||||||
if (endPos > lenDoc)
|
|
||||||
endPos = lenDoc;
|
|
||||||
|
|
||||||
pdoc->GetCharRange(buf, startPos, endPos-startPos);
|
|
||||||
buf[endPos-startPos] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DocumentAccessor::Match(int pos, const char *s) {
|
|
||||||
for (int i=0; *s; i++) {
|
|
||||||
if (*s != SafeGetCharAt(pos+i))
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
char DocumentAccessor::StyleAt(int position) {
|
|
||||||
return pdoc->StyleAt(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DocumentAccessor::GetLine(int position) {
|
|
||||||
return pdoc->LineFromPosition(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DocumentAccessor::LineStart(int line) {
|
|
||||||
return pdoc->LineStart(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DocumentAccessor::LevelAt(int line) {
|
|
||||||
return pdoc->GetLevel(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DocumentAccessor::Length() {
|
|
||||||
if (lenDoc == -1)
|
|
||||||
lenDoc = pdoc->Length();
|
|
||||||
return lenDoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DocumentAccessor::GetLineState(int line) {
|
|
||||||
return pdoc->GetLineState(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DocumentAccessor::SetLineState(int line, int state) {
|
|
||||||
return pdoc->SetLineState(line, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DocumentAccessor::StartAt(unsigned int start, char chMask) {
|
|
||||||
pdoc->StartStyling(start, chMask);
|
|
||||||
startPosStyling = start;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DocumentAccessor::StartSegment(unsigned int pos) {
|
|
||||||
startSeg = pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DocumentAccessor::ColourTo(unsigned int pos, int chAttr) {
|
|
||||||
// Only perform styling if non empty range
|
|
||||||
if (pos != startSeg - 1) {
|
|
||||||
if (pos < startSeg) {
|
|
||||||
Platform::DebugPrintf("Bad colour positions %d - %d\n", startSeg, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (validLen + (pos - startSeg + 1) >= bufferSize)
|
|
||||||
Flush();
|
|
||||||
if (validLen + (pos - startSeg + 1) >= bufferSize) {
|
|
||||||
// Too big for buffer so send directly
|
|
||||||
pdoc->SetStyleFor(pos - startSeg + 1, static_cast<char>(chAttr));
|
|
||||||
} else {
|
|
||||||
if (chAttr != chWhile)
|
|
||||||
chFlags = 0;
|
|
||||||
chAttr |= chFlags;
|
|
||||||
for (unsigned int i = startSeg; i <= pos; i++) {
|
|
||||||
PLATFORM_ASSERT((startPosStyling + validLen) < Length());
|
|
||||||
styleBuf[validLen++] = static_cast<char>(chAttr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
startSeg = pos+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DocumentAccessor::SetLevel(int line, int level) {
|
|
||||||
pdoc->SetLevel(line, level);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DocumentAccessor::Flush() {
|
|
||||||
startPos = extremePosition;
|
|
||||||
lenDoc = -1;
|
|
||||||
if (validLen > 0) {
|
|
||||||
pdoc->SetStyles(validLen, styleBuf);
|
|
||||||
startPosStyling += validLen;
|
|
||||||
validLen = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
|
|
||||||
int end = Length();
|
|
||||||
int spaceFlags = 0;
|
|
||||||
|
|
||||||
// Determines the indentation level of the current line and also checks for consistent
|
|
||||||
// indentation compared to the previous line.
|
|
||||||
// Indentation is judged consistent when the indentation whitespace of each line lines
|
|
||||||
// the same or the indentation of one line is a prefix of the other.
|
|
||||||
|
|
||||||
int pos = LineStart(line);
|
|
||||||
char ch = (*this)[pos];
|
|
||||||
int indent = 0;
|
|
||||||
bool inPrevPrefix = line > 0;
|
|
||||||
int posPrev = inPrevPrefix ? LineStart(line-1) : 0;
|
|
||||||
while ((ch == ' ' || ch == '\t') && (pos < end)) {
|
|
||||||
if (inPrevPrefix) {
|
|
||||||
char chPrev = (*this)[posPrev++];
|
|
||||||
if (chPrev == ' ' || chPrev == '\t') {
|
|
||||||
if (chPrev != ch)
|
|
||||||
spaceFlags |= wsInconsistent;
|
|
||||||
} else {
|
|
||||||
inPrevPrefix = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ch == ' ') {
|
|
||||||
spaceFlags |= wsSpace;
|
|
||||||
indent++;
|
|
||||||
} else { // Tab
|
|
||||||
spaceFlags |= wsTab;
|
|
||||||
if (spaceFlags & wsSpace)
|
|
||||||
spaceFlags |= wsSpaceTab;
|
|
||||||
indent = (indent / 8 + 1) * 8;
|
|
||||||
}
|
|
||||||
ch = (*this)[++pos];
|
|
||||||
}
|
|
||||||
|
|
||||||
*flags = spaceFlags;
|
|
||||||
indent += SC_FOLDLEVELBASE;
|
|
||||||
// if completely empty line or the start of a comment...
|
|
||||||
if ((ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') ||
|
|
||||||
(pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
|
|
||||||
return indent | SC_FOLDLEVELWHITEFLAG;
|
|
||||||
else
|
|
||||||
return indent;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file DocumentAccessor.h
|
|
||||||
** Implementation of BufferAccess and StylingAccess on a Scintilla
|
|
||||||
** rapid easy access to contents of a Scintilla.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
class Document;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class DocumentAccessor : public Accessor {
|
|
||||||
// Private so DocumentAccessor objects can not be copied
|
|
||||||
DocumentAccessor(const DocumentAccessor &source) : Accessor(), props(source.props) {}
|
|
||||||
DocumentAccessor &operator=(const DocumentAccessor &) { return *this; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Document *pdoc;
|
|
||||||
PropSet &props;
|
|
||||||
WindowID id;
|
|
||||||
int lenDoc;
|
|
||||||
|
|
||||||
char styleBuf[bufferSize];
|
|
||||||
int validLen;
|
|
||||||
char chFlags;
|
|
||||||
char chWhile;
|
|
||||||
unsigned int startSeg;
|
|
||||||
int startPosStyling;
|
|
||||||
|
|
||||||
bool InternalIsLeadByte(char ch);
|
|
||||||
void Fill(int position);
|
|
||||||
|
|
||||||
public:
|
|
||||||
DocumentAccessor(Document *pdoc_, PropSet &props_, WindowID id_=0) :
|
|
||||||
Accessor(), pdoc(pdoc_), props(props_), id(id_),
|
|
||||||
lenDoc(-1), validLen(0), chFlags(0), chWhile(0),
|
|
||||||
startSeg(0), startPosStyling(0) {
|
|
||||||
}
|
|
||||||
~DocumentAccessor();
|
|
||||||
bool Match(int pos, const char *s);
|
|
||||||
char StyleAt(int position);
|
|
||||||
int GetLine(int position);
|
|
||||||
int LineStart(int line);
|
|
||||||
int LevelAt(int line);
|
|
||||||
int Length();
|
|
||||||
void Flush();
|
|
||||||
int GetLineState(int line);
|
|
||||||
int SetLineState(int line, int state);
|
|
||||||
int GetPropertyInt(const char *key, int defaultValue=0) {
|
|
||||||
return props.GetInt(key, defaultValue);
|
|
||||||
}
|
|
||||||
char *GetProperties() {
|
|
||||||
return props.ToString();
|
|
||||||
}
|
|
||||||
WindowID GetWindow() { return id; }
|
|
||||||
|
|
||||||
void StartAt(unsigned int start, char chMask=31);
|
|
||||||
void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
|
|
||||||
unsigned int GetStartSegment() { return startSeg; }
|
|
||||||
void StartSegment(unsigned int pos);
|
|
||||||
void ColourTo(unsigned int pos, int chAttr);
|
|
||||||
void SetLevel(int line, int level);
|
|
||||||
int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0);
|
|
||||||
};
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,551 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Editor.h
|
|
||||||
** Defines the main editor class.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef EDITOR_H
|
|
||||||
#define EDITOR_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class Caret {
|
|
||||||
public:
|
|
||||||
bool active;
|
|
||||||
bool on;
|
|
||||||
int period;
|
|
||||||
|
|
||||||
Caret();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class Timer {
|
|
||||||
public:
|
|
||||||
bool ticking;
|
|
||||||
int ticksToWait;
|
|
||||||
enum {tickSize = 100};
|
|
||||||
TickerID tickerID;
|
|
||||||
|
|
||||||
Timer();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class Idler {
|
|
||||||
public:
|
|
||||||
bool state;
|
|
||||||
IdlerID idlerID;
|
|
||||||
|
|
||||||
Idler();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class LineLayout {
|
|
||||||
private:
|
|
||||||
friend class LineLayoutCache;
|
|
||||||
int *lineStarts;
|
|
||||||
int lenLineStarts;
|
|
||||||
/// Drawing is only performed for @a maxLineLength characters on each line.
|
|
||||||
int lineNumber;
|
|
||||||
bool inCache;
|
|
||||||
public:
|
|
||||||
enum { wrapWidthInfinite = 0x7ffffff };
|
|
||||||
int maxLineLength;
|
|
||||||
int numCharsInLine;
|
|
||||||
enum validLevel { llInvalid, llCheckTextAndStyle, llPositions, llLines } validity;
|
|
||||||
int xHighlightGuide;
|
|
||||||
bool highlightColumn;
|
|
||||||
int selStart;
|
|
||||||
int selEnd;
|
|
||||||
bool containsCaret;
|
|
||||||
int edgeColumn;
|
|
||||||
char *chars;
|
|
||||||
char *styles;
|
|
||||||
char *indicators;
|
|
||||||
int *positions;
|
|
||||||
char bracePreviousStyles[2];
|
|
||||||
|
|
||||||
// Hotspot support
|
|
||||||
int hsStart;
|
|
||||||
int hsEnd;
|
|
||||||
|
|
||||||
// Wrapped line support
|
|
||||||
int widthLine;
|
|
||||||
int lines;
|
|
||||||
|
|
||||||
LineLayout(int maxLineLength_);
|
|
||||||
virtual ~LineLayout();
|
|
||||||
void Resize(int maxLineLength_);
|
|
||||||
void Free();
|
|
||||||
void Invalidate(validLevel validity_);
|
|
||||||
int LineStart(int line) {
|
|
||||||
if (line <= 0) {
|
|
||||||
return 0;
|
|
||||||
} else if ((line >= lines) || !lineStarts) {
|
|
||||||
return numCharsInLine;
|
|
||||||
} else {
|
|
||||||
return lineStarts[line];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void SetLineStart(int line, int start);
|
|
||||||
void SetBracesHighlight(Range rangeLine, Position braces[],
|
|
||||||
char bracesMatchStyle, int xHighlight);
|
|
||||||
void RestoreBracesHighlight(Range rangeLine, Position braces[]);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class LineLayoutCache {
|
|
||||||
int level;
|
|
||||||
int length;
|
|
||||||
int size;
|
|
||||||
LineLayout **cache;
|
|
||||||
bool allInvalidated;
|
|
||||||
int styleClock;
|
|
||||||
void Allocate(int length_);
|
|
||||||
void AllocateForLevel(int linesOnScreen, int linesInDoc);
|
|
||||||
public:
|
|
||||||
LineLayoutCache();
|
|
||||||
virtual ~LineLayoutCache();
|
|
||||||
void Deallocate();
|
|
||||||
enum {
|
|
||||||
llcNone=SC_CACHE_NONE,
|
|
||||||
llcCaret=SC_CACHE_CARET,
|
|
||||||
llcPage=SC_CACHE_PAGE,
|
|
||||||
llcDocument=SC_CACHE_DOCUMENT
|
|
||||||
};
|
|
||||||
void Invalidate(LineLayout::validLevel validity_);
|
|
||||||
void SetLevel(int level_);
|
|
||||||
int GetLevel() { return level; }
|
|
||||||
LineLayout *Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_,
|
|
||||||
int linesOnScreen, int linesInDoc);
|
|
||||||
void Dispose(LineLayout *ll);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hold a piece of text selected for copying or dragging.
|
|
||||||
* The text is expected to hold a terminating '\0'.
|
|
||||||
*/
|
|
||||||
class SelectionText {
|
|
||||||
public:
|
|
||||||
char *s;
|
|
||||||
int len;
|
|
||||||
bool rectangular;
|
|
||||||
SelectionText() : s(0), len(0), rectangular(false) {}
|
|
||||||
~SelectionText() {
|
|
||||||
Set(0, 0);
|
|
||||||
}
|
|
||||||
void Set(char *s_, int len_, bool rectangular_=false) {
|
|
||||||
delete []s;
|
|
||||||
s = s_;
|
|
||||||
if (s)
|
|
||||||
len = len_;
|
|
||||||
else
|
|
||||||
len = 0;
|
|
||||||
rectangular = rectangular_;
|
|
||||||
}
|
|
||||||
void Copy(const char *s_, int len_, bool rectangular_=false) {
|
|
||||||
delete []s;
|
|
||||||
s = new char[len_];
|
|
||||||
if (s) {
|
|
||||||
len = len_;
|
|
||||||
for (int i = 0; i < len_; i++) {
|
|
||||||
s[i] = s_[i];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
rectangular = rectangular_;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class Editor : public DocWatcher {
|
|
||||||
// Private so Editor objects can not be copied
|
|
||||||
Editor(const Editor &) : DocWatcher() {}
|
|
||||||
Editor &operator=(const Editor &) { return *this; }
|
|
||||||
|
|
||||||
protected: // ScintillaBase subclass needs access to much of Editor
|
|
||||||
|
|
||||||
/** On GTK+, Scintilla is a container widget holding two scroll bars
|
|
||||||
* whereas on Windows there is just one window with both scroll bars turned on. */
|
|
||||||
Window wMain; ///< The Scintilla parent window
|
|
||||||
|
|
||||||
/** Style resources may be expensive to allocate so are cached between uses.
|
|
||||||
* When a style attribute is changed, this cache is flushed. */
|
|
||||||
bool stylesValid;
|
|
||||||
ViewStyle vs;
|
|
||||||
Palette palette;
|
|
||||||
|
|
||||||
int printMagnification;
|
|
||||||
int printColourMode;
|
|
||||||
int printWrapState;
|
|
||||||
int cursorMode;
|
|
||||||
int controlCharSymbol;
|
|
||||||
|
|
||||||
bool hasFocus;
|
|
||||||
bool hideSelection;
|
|
||||||
bool inOverstrike;
|
|
||||||
int errorStatus;
|
|
||||||
bool mouseDownCaptures;
|
|
||||||
|
|
||||||
/** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to
|
|
||||||
* the screen. This avoids flashing but is about 30% slower. */
|
|
||||||
bool bufferedDraw;
|
|
||||||
/** In twoPhaseDraw mode, drawing is performed in two phases, first the background
|
|
||||||
* and then the foreground. This avoids chopping off characters that overlap the next run. */
|
|
||||||
bool twoPhaseDraw;
|
|
||||||
|
|
||||||
int xOffset; ///< Horizontal scrolled amount in pixels
|
|
||||||
int xCaretMargin; ///< Ensure this many pixels visible on both sides of caret
|
|
||||||
bool horizontalScrollBarVisible;
|
|
||||||
int scrollWidth;
|
|
||||||
bool verticalScrollBarVisible;
|
|
||||||
bool endAtLastLine;
|
|
||||||
|
|
||||||
Surface *pixmapLine;
|
|
||||||
Surface *pixmapSelMargin;
|
|
||||||
Surface *pixmapSelPattern;
|
|
||||||
Surface *pixmapIndentGuide;
|
|
||||||
Surface *pixmapIndentGuideHighlight;
|
|
||||||
|
|
||||||
LineLayoutCache llc;
|
|
||||||
|
|
||||||
KeyMap kmap;
|
|
||||||
|
|
||||||
Caret caret;
|
|
||||||
Timer timer;
|
|
||||||
Timer autoScrollTimer;
|
|
||||||
enum { autoScrollDelay = 200 };
|
|
||||||
|
|
||||||
Idler idler;
|
|
||||||
|
|
||||||
Point lastClick;
|
|
||||||
unsigned int lastClickTime;
|
|
||||||
int dwellDelay;
|
|
||||||
int ticksToDwell;
|
|
||||||
bool dwelling;
|
|
||||||
enum { selChar, selWord, selLine } selectionType;
|
|
||||||
Point ptMouseLast;
|
|
||||||
bool inDragDrop;
|
|
||||||
bool dropWentOutside;
|
|
||||||
int posDrag;
|
|
||||||
int posDrop;
|
|
||||||
int lastXChosen;
|
|
||||||
int lineAnchor;
|
|
||||||
int originalAnchorPos;
|
|
||||||
int currentPos;
|
|
||||||
int anchor;
|
|
||||||
int targetStart;
|
|
||||||
int targetEnd;
|
|
||||||
int searchFlags;
|
|
||||||
int topLine;
|
|
||||||
int posTopLine;
|
|
||||||
|
|
||||||
bool needUpdateUI;
|
|
||||||
Position braces[2];
|
|
||||||
int bracesMatchStyle;
|
|
||||||
int highlightGuideColumn;
|
|
||||||
|
|
||||||
int theEdge;
|
|
||||||
|
|
||||||
enum { notPainting, painting, paintAbandoned } paintState;
|
|
||||||
PRectangle rcPaint;
|
|
||||||
bool paintingAllText;
|
|
||||||
|
|
||||||
int modEventMask;
|
|
||||||
|
|
||||||
SelectionText drag;
|
|
||||||
enum selTypes { noSel, selStream, selRectangle, selLines };
|
|
||||||
selTypes selType;
|
|
||||||
bool moveExtendsSelection;
|
|
||||||
int xStartSelect; ///< x position of start of rectangular selection
|
|
||||||
int xEndSelect; ///< x position of end of rectangular selection
|
|
||||||
bool primarySelection;
|
|
||||||
|
|
||||||
int caretXPolicy;
|
|
||||||
int caretXSlop; ///< Ensure this many pixels visible on both sides of caret
|
|
||||||
|
|
||||||
int caretYPolicy;
|
|
||||||
int caretYSlop; ///< Ensure this many lines visible on both sides of caret
|
|
||||||
|
|
||||||
int visiblePolicy;
|
|
||||||
int visibleSlop;
|
|
||||||
|
|
||||||
int searchAnchor;
|
|
||||||
|
|
||||||
bool recordingMacro;
|
|
||||||
|
|
||||||
int foldFlags;
|
|
||||||
ContractionState cs;
|
|
||||||
|
|
||||||
// Hotspot support
|
|
||||||
int hsStart;
|
|
||||||
int hsEnd;
|
|
||||||
|
|
||||||
// Wrapping support
|
|
||||||
enum { eWrapNone, eWrapWord } wrapState;
|
|
||||||
bool backgroundWrapEnabled;
|
|
||||||
int wrapWidth;
|
|
||||||
int docLineLastWrapped;
|
|
||||||
int docLastLineToWrap;
|
|
||||||
|
|
||||||
Document *pdoc;
|
|
||||||
|
|
||||||
Editor();
|
|
||||||
virtual ~Editor();
|
|
||||||
virtual void Initialise() = 0;
|
|
||||||
virtual void Finalise();
|
|
||||||
|
|
||||||
void InvalidateStyleData();
|
|
||||||
void InvalidateStyleRedraw();
|
|
||||||
virtual void RefreshColourPalette(Palette &pal, bool want);
|
|
||||||
void RefreshStyleData();
|
|
||||||
void DropGraphics();
|
|
||||||
|
|
||||||
virtual PRectangle GetClientRectangle();
|
|
||||||
PRectangle GetTextRectangle();
|
|
||||||
|
|
||||||
int LinesOnScreen();
|
|
||||||
int LinesToScroll();
|
|
||||||
int MaxScrollPos();
|
|
||||||
Point LocationFromPosition(int pos);
|
|
||||||
int XFromPosition(int pos);
|
|
||||||
int PositionFromLocation(Point pt);
|
|
||||||
int PositionFromLocationClose(Point pt);
|
|
||||||
int PositionFromLineX(int line, int x);
|
|
||||||
int LineFromLocation(Point pt);
|
|
||||||
void SetTopLine(int topLineNew);
|
|
||||||
|
|
||||||
bool AbandonPaint();
|
|
||||||
void RedrawRect(PRectangle rc);
|
|
||||||
void Redraw();
|
|
||||||
void RedrawSelMargin();
|
|
||||||
PRectangle RectangleFromRange(int start, int end);
|
|
||||||
void InvalidateRange(int start, int end);
|
|
||||||
|
|
||||||
int CurrentPosition();
|
|
||||||
bool SelectionEmpty();
|
|
||||||
int SelectionStart();
|
|
||||||
int SelectionEnd();
|
|
||||||
void InvalidateSelection(int currentPos_, int anchor_);
|
|
||||||
void SetSelection(int currentPos_, int anchor_);
|
|
||||||
void SetSelection(int currentPos_);
|
|
||||||
void SetEmptySelection(int currentPos_);
|
|
||||||
bool RangeContainsProtected(int start, int end) const;
|
|
||||||
bool SelectionContainsProtected();
|
|
||||||
int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
|
|
||||||
int MovePositionTo(int newPos, selTypes sel=noSel, bool ensureVisible=true);
|
|
||||||
int MovePositionSoVisible(int pos, int moveDir);
|
|
||||||
void SetLastXChosen();
|
|
||||||
|
|
||||||
void ScrollTo(int line, bool moveThumb=true);
|
|
||||||
virtual void ScrollText(int linesToMove);
|
|
||||||
void HorizontalScrollTo(int xPos);
|
|
||||||
void MoveCaretInsideView(bool ensureVisible=true);
|
|
||||||
int DisplayFromPosition(int pos);
|
|
||||||
void EnsureCaretVisible(bool useMargin=true, bool vert=true, bool horiz=true);
|
|
||||||
void ShowCaretAtCurrentPosition();
|
|
||||||
void DropCaret();
|
|
||||||
void InvalidateCaret();
|
|
||||||
|
|
||||||
void NeedWrapping(int docLineStartWrapping = 0, int docLineEndWrapping = 0x7ffffff);
|
|
||||||
bool WrapLines(bool fullWrap, int priorityWrapLineStart);
|
|
||||||
void LinesJoin();
|
|
||||||
void LinesSplit(int pixelWidth);
|
|
||||||
|
|
||||||
int SubstituteMarkerIfEmpty(int markerCheck, int markerDefault);
|
|
||||||
void PaintSelMargin(Surface *surface, PRectangle &rc);
|
|
||||||
LineLayout *RetrieveLineLayout(int lineNumber);
|
|
||||||
void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll,
|
|
||||||
int width=LineLayout::wrapWidthInfinite);
|
|
||||||
ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll);
|
|
||||||
void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
|
|
||||||
void DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
|
|
||||||
int line, int lineEnd, int xStart, int subLine, int subLineStart,
|
|
||||||
bool overrideBackground, ColourAllocated background);
|
|
||||||
void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
|
|
||||||
PRectangle rcLine, LineLayout *ll, int subLine=0);
|
|
||||||
void RefreshPixMaps(Surface *surfaceWindow);
|
|
||||||
void Paint(Surface *surfaceWindow, PRectangle rcArea);
|
|
||||||
long FormatRange(bool draw, RangeToFormat *pfr);
|
|
||||||
int TextWidth(int style, const char *text);
|
|
||||||
|
|
||||||
virtual void SetVerticalScrollPos() = 0;
|
|
||||||
virtual void SetHorizontalScrollPos() = 0;
|
|
||||||
virtual bool ModifyScrollBars(int nMax, int nPage) = 0;
|
|
||||||
virtual void ReconfigureScrollBars();
|
|
||||||
void SetScrollBars();
|
|
||||||
void ChangeSize();
|
|
||||||
|
|
||||||
void AddChar(char ch);
|
|
||||||
virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false);
|
|
||||||
void ClearSelection();
|
|
||||||
void ClearAll();
|
|
||||||
void ClearDocumentStyle();
|
|
||||||
void Cut();
|
|
||||||
void PasteRectangular(int pos, const char *ptr, int len);
|
|
||||||
virtual void Copy() = 0;
|
|
||||||
virtual bool CanPaste();
|
|
||||||
virtual void Paste() = 0;
|
|
||||||
void Clear();
|
|
||||||
void SelectAll();
|
|
||||||
void Undo();
|
|
||||||
void Redo();
|
|
||||||
void DelChar();
|
|
||||||
void DelCharBack(bool allowLineStartDeletion);
|
|
||||||
virtual void ClaimSelection() = 0;
|
|
||||||
|
|
||||||
virtual void NotifyChange() = 0;
|
|
||||||
virtual void NotifyFocus(bool focus);
|
|
||||||
virtual int GetCtrlID() { return ctrlID; }
|
|
||||||
virtual void NotifyParent(SCNotification scn) = 0;
|
|
||||||
virtual void NotifyStyleToNeeded(int endStyleNeeded);
|
|
||||||
void NotifyChar(int ch);
|
|
||||||
void NotifyMove(int position);
|
|
||||||
void NotifySavePoint(bool isSavePoint);
|
|
||||||
void NotifyModifyAttempt();
|
|
||||||
virtual void NotifyDoubleClick(Point pt, bool shift);
|
|
||||||
void NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt);
|
|
||||||
void NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt);
|
|
||||||
void NotifyUpdateUI();
|
|
||||||
void NotifyPainted();
|
|
||||||
bool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt);
|
|
||||||
void NotifyNeedShown(int pos, int len);
|
|
||||||
void NotifyDwelling(Point pt, bool state);
|
|
||||||
void NotifyZoom();
|
|
||||||
|
|
||||||
void NotifyModifyAttempt(Document *document, void *userData);
|
|
||||||
void NotifySavePoint(Document *document, void *userData, bool atSavePoint);
|
|
||||||
void CheckModificationForWrap(DocModification mh);
|
|
||||||
void NotifyModified(Document *document, DocModification mh, void *userData);
|
|
||||||
void NotifyDeleted(Document *document, void *userData);
|
|
||||||
void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
|
|
||||||
void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
|
|
||||||
void PageMove(int direction, selTypes sel=noSel, bool stuttered = false);
|
|
||||||
void ChangeCaseOfSelection(bool makeUpperCase);
|
|
||||||
void LineTranspose();
|
|
||||||
void LineDuplicate();
|
|
||||||
virtual void CancelModes();
|
|
||||||
void NewLine();
|
|
||||||
void CursorUpOrDown(int direction, selTypes sel=noSel);
|
|
||||||
int StartEndDisplayLine(int pos, bool start);
|
|
||||||
virtual int KeyCommand(unsigned int iMessage);
|
|
||||||
virtual int KeyDefault(int /* key */, int /*modifiers*/);
|
|
||||||
int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0);
|
|
||||||
|
|
||||||
int GetWhitespaceVisible();
|
|
||||||
void SetWhitespaceVisible(int view);
|
|
||||||
|
|
||||||
void Indent(bool forwards);
|
|
||||||
|
|
||||||
long FindText(uptr_t wParam, sptr_t lParam);
|
|
||||||
void SearchAnchor();
|
|
||||||
long SearchText(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
long SearchInTarget(const char *text, int length);
|
|
||||||
void GoToLine(int lineNo);
|
|
||||||
|
|
||||||
virtual void CopyToClipboard(const SelectionText &selectedText) = 0;
|
|
||||||
char *CopyRange(int start, int end);
|
|
||||||
void CopySelectionFromRange(SelectionText *ss, int start, int end);
|
|
||||||
void CopySelectionRange(SelectionText *ss);
|
|
||||||
void CopyRangeToClipboard(int start, int end);
|
|
||||||
void CopyText(int length, const char *text);
|
|
||||||
void SetDragPosition(int newPos);
|
|
||||||
virtual void DisplayCursor(Window::Cursor c);
|
|
||||||
virtual void StartDrag();
|
|
||||||
void DropAt(int position, const char *value, bool moving, bool rectangular);
|
|
||||||
/** PositionInSelection returns 0 if position in selection, -1 if position before selection, and 1 if after.
|
|
||||||
* Before means either before any line of selection or before selection on its line, with a similar meaning to after. */
|
|
||||||
int PositionInSelection(int pos);
|
|
||||||
bool PointInSelection(Point pt);
|
|
||||||
bool PointInSelMargin(Point pt);
|
|
||||||
void LineSelection(int lineCurrent_, int lineAnchor_);
|
|
||||||
void DwellEnd(bool mouseMoved);
|
|
||||||
virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
|
|
||||||
void ButtonMove(Point pt);
|
|
||||||
void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
|
|
||||||
|
|
||||||
void Tick();
|
|
||||||
bool Idle();
|
|
||||||
virtual void SetTicking(bool on) = 0;
|
|
||||||
virtual bool SetIdle(bool) { return false; }
|
|
||||||
virtual void SetMouseCapture(bool on) = 0;
|
|
||||||
virtual bool HaveMouseCapture() = 0;
|
|
||||||
void SetFocusState(bool focusState);
|
|
||||||
|
|
||||||
void CheckForChangeOutsidePaint(Range r);
|
|
||||||
int BraceMatch(int position, int maxReStyle);
|
|
||||||
void SetBraceHighlight(Position pos0, Position pos1, int matchStyle);
|
|
||||||
|
|
||||||
void SetDocPointer(Document *document);
|
|
||||||
|
|
||||||
void Expand(int &line, bool doExpand);
|
|
||||||
void ToggleContraction(int line);
|
|
||||||
void EnsureLineVisible(int lineDoc, bool enforcePolicy);
|
|
||||||
int ReplaceTarget(bool replacePatterns, const char *text, int length=-1);
|
|
||||||
|
|
||||||
bool PositionIsHotspot(int position);
|
|
||||||
bool PointIsHotspot(Point pt);
|
|
||||||
void SetHotSpotRange(Point *pt);
|
|
||||||
void GetHotSpotRange(int& hsStart, int& hsEnd);
|
|
||||||
|
|
||||||
int CodePage() const;
|
|
||||||
|
|
||||||
virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Public so the COM thunks can access it.
|
|
||||||
bool IsUnicodeMode() const;
|
|
||||||
// Public so scintilla_send_message can use it.
|
|
||||||
virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
// Public so scintilla_set_id can use it.
|
|
||||||
int ctrlID;
|
|
||||||
friend class AutoSurface;
|
|
||||||
friend class SelectionLineIterator;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A smart pointer class to ensure Surfaces are set up and deleted correctly.
|
|
||||||
*/
|
|
||||||
class AutoSurface {
|
|
||||||
private:
|
|
||||||
Surface *surf;
|
|
||||||
public:
|
|
||||||
AutoSurface(Editor *ed) : surf(0) {
|
|
||||||
if (ed->wMain.GetID()) {
|
|
||||||
surf = Surface::Allocate();
|
|
||||||
if (surf) {
|
|
||||||
surf->Init(ed->wMain.GetID());
|
|
||||||
surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
|
|
||||||
surf->SetDBCSMode(ed->CodePage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AutoSurface(SurfaceID sid, Editor *ed) : surf(0) {
|
|
||||||
if (ed->wMain.GetID()) {
|
|
||||||
surf = Surface::Allocate();
|
|
||||||
if (surf) {
|
|
||||||
surf->Init(sid, ed->wMain.GetID());
|
|
||||||
surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
|
|
||||||
surf->SetDBCSMode(ed->CodePage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
~AutoSurface() {
|
|
||||||
delete surf;
|
|
||||||
}
|
|
||||||
Surface *operator->() const {
|
|
||||||
return surf;
|
|
||||||
}
|
|
||||||
operator Surface *() const {
|
|
||||||
return surf;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,257 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ExternalLexer.cxx
|
|
||||||
** Support external lexers in DLLs.
|
|
||||||
**/
|
|
||||||
// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson.
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "SciLexer.h"
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "DocumentAccessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "ExternalLexer.h"
|
|
||||||
|
|
||||||
LexerManager *LexerManager::theInstance = NULL;
|
|
||||||
|
|
||||||
//------------------------------------------
|
|
||||||
//
|
|
||||||
// ExternalLexerModule
|
|
||||||
//
|
|
||||||
//------------------------------------------
|
|
||||||
|
|
||||||
char **WordListsToStrings(WordList *val[]) {
|
|
||||||
int dim = 0;
|
|
||||||
while (val[dim])
|
|
||||||
dim++;
|
|
||||||
char **wls = new char * [dim + 1];
|
|
||||||
for (int i = 0;i < dim;i++) {
|
|
||||||
SString words;
|
|
||||||
words = "";
|
|
||||||
for (int n = 0; n < val[i]->len; n++) {
|
|
||||||
words += val[i]->words[n];
|
|
||||||
if (n != val[i]->len - 1)
|
|
||||||
words += " ";
|
|
||||||
}
|
|
||||||
wls[i] = new char[words.length() + 1];
|
|
||||||
strcpy(wls[i], words.c_str());
|
|
||||||
}
|
|
||||||
wls[dim] = 0;
|
|
||||||
return wls;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeleteWLStrings(char *strs[]) {
|
|
||||||
int dim = 0;
|
|
||||||
while (strs[dim]) {
|
|
||||||
delete strs[dim];
|
|
||||||
dim++;
|
|
||||||
}
|
|
||||||
delete [] strs;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExternalLexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const {
|
|
||||||
if (!fneLexer)
|
|
||||||
return ;
|
|
||||||
|
|
||||||
char **kwds = WordListsToStrings(keywordlists);
|
|
||||||
char *ps = styler.GetProperties();
|
|
||||||
|
|
||||||
// The accessor passed in is always a DocumentAccessor so this cast and the subsequent
|
|
||||||
// access will work. Can not use the stricter dynamic_cast as that requires RTTI.
|
|
||||||
DocumentAccessor &da = static_cast<DocumentAccessor &>(styler);
|
|
||||||
WindowID wID = da.GetWindow();
|
|
||||||
|
|
||||||
fneLexer(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps);
|
|
||||||
|
|
||||||
delete ps;
|
|
||||||
DeleteWLStrings(kwds);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExternalLexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const {
|
|
||||||
if (!fneFolder)
|
|
||||||
return ;
|
|
||||||
|
|
||||||
char **kwds = WordListsToStrings(keywordlists);
|
|
||||||
char *ps = styler.GetProperties();
|
|
||||||
|
|
||||||
// The accessor passed in is always a DocumentAccessor so this cast and the subsequent
|
|
||||||
// access will work. Can not use the stricter dynamic_cast as that requires RTTI.
|
|
||||||
DocumentAccessor &da = static_cast<DocumentAccessor &>(styler);
|
|
||||||
WindowID wID = da.GetWindow();
|
|
||||||
|
|
||||||
fneFolder(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps);
|
|
||||||
|
|
||||||
delete ps;
|
|
||||||
DeleteWLStrings(kwds);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExternalLexerModule::SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index) {
|
|
||||||
fneLexer = fLexer;
|
|
||||||
fneFolder = fFolder;
|
|
||||||
externalLanguage = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------
|
|
||||||
//
|
|
||||||
// LexerLibrary
|
|
||||||
//
|
|
||||||
//------------------------------------------
|
|
||||||
|
|
||||||
LexerLibrary::LexerLibrary(const char* ModuleName) {
|
|
||||||
// Initialise some members...
|
|
||||||
first = NULL;
|
|
||||||
last = NULL;
|
|
||||||
|
|
||||||
// Load the DLL
|
|
||||||
lib = DynamicLibrary::Load(ModuleName);
|
|
||||||
if (lib->IsValid()) {
|
|
||||||
m_sModuleName = ModuleName;
|
|
||||||
//Cannot use reinterpret_cast because: ANSI C++ forbids casting between pointers to functions and objects
|
|
||||||
GetLexerCountFn GetLexerCount = (GetLexerCountFn)lib->FindFunction("GetLexerCount");
|
|
||||||
|
|
||||||
if (GetLexerCount) {
|
|
||||||
ExternalLexerModule *lex;
|
|
||||||
LexerMinder *lm;
|
|
||||||
|
|
||||||
// Find functions in the DLL
|
|
||||||
GetLexerNameFn GetLexerName = (GetLexerNameFn)lib->FindFunction("GetLexerName");
|
|
||||||
ExtLexerFunction Lexer = (ExtLexerFunction)lib->FindFunction("Lex");
|
|
||||||
ExtFoldFunction Folder = (ExtFoldFunction)lib->FindFunction("Fold");
|
|
||||||
|
|
||||||
// Assign a buffer for the lexer name.
|
|
||||||
char lexname[100];
|
|
||||||
strcpy(lexname, "");
|
|
||||||
|
|
||||||
int nl = GetLexerCount();
|
|
||||||
|
|
||||||
for (int i = 0; i < nl; i++) {
|
|
||||||
GetLexerName(i, lexname, 100);
|
|
||||||
lex = new ExternalLexerModule(SCLEX_AUTOMATIC, NULL, lexname, NULL);
|
|
||||||
|
|
||||||
// Create a LexerMinder so we don't leak the ExternalLexerModule...
|
|
||||||
lm = new LexerMinder;
|
|
||||||
lm->self = lex;
|
|
||||||
lm->next = NULL;
|
|
||||||
if (first != NULL) {
|
|
||||||
last->next = lm;
|
|
||||||
last = lm;
|
|
||||||
} else {
|
|
||||||
first = lm;
|
|
||||||
last = lm;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The external lexer needs to know how to call into its DLL to
|
|
||||||
// do its lexing and folding, we tell it here. Folder may be null.
|
|
||||||
lex->SetExternal(Lexer, Folder, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerLibrary::~LexerLibrary() {
|
|
||||||
Release();
|
|
||||||
delete lib;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LexerLibrary::Release() {
|
|
||||||
//TODO maintain a list of lexers created, and delete them!
|
|
||||||
LexerMinder *lm;
|
|
||||||
LexerMinder *next;
|
|
||||||
lm = first;
|
|
||||||
while (NULL != lm) {
|
|
||||||
next = lm->next;
|
|
||||||
delete lm->self;
|
|
||||||
delete lm;
|
|
||||||
lm = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
first = NULL;
|
|
||||||
last = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------
|
|
||||||
//
|
|
||||||
// LexerManager
|
|
||||||
//
|
|
||||||
//------------------------------------------
|
|
||||||
|
|
||||||
/// Return the single LexerManager instance...
|
|
||||||
LexerManager *LexerManager::GetInstance() {
|
|
||||||
if(!theInstance)
|
|
||||||
theInstance = new LexerManager;
|
|
||||||
return theInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Delete any LexerManager instance...
|
|
||||||
void LexerManager::DeleteInstance()
|
|
||||||
{
|
|
||||||
if(theInstance) {
|
|
||||||
delete theInstance;
|
|
||||||
theInstance = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// protected constructor - this is a singleton...
|
|
||||||
LexerManager::LexerManager() {
|
|
||||||
first = NULL;
|
|
||||||
last = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerManager::~LexerManager() {
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void LexerManager::Load(const char* path)
|
|
||||||
{
|
|
||||||
LoadLexerLibrary(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LexerManager::LoadLexerLibrary(const char* module)
|
|
||||||
{
|
|
||||||
LexerLibrary *lib = new LexerLibrary(module);
|
|
||||||
if (NULL != first) {
|
|
||||||
last->next = lib;
|
|
||||||
last = lib;
|
|
||||||
} else {
|
|
||||||
first = lib;
|
|
||||||
last = lib;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void LexerManager::Clear()
|
|
||||||
{
|
|
||||||
if (NULL != first) {
|
|
||||||
LexerLibrary *cur = first;
|
|
||||||
LexerLibrary *next;
|
|
||||||
while (cur) {
|
|
||||||
next = cur->next;
|
|
||||||
delete cur;
|
|
||||||
cur = next;
|
|
||||||
}
|
|
||||||
first = NULL;
|
|
||||||
last = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------
|
|
||||||
//
|
|
||||||
// LexerManager
|
|
||||||
//
|
|
||||||
//------------------------------------------
|
|
||||||
|
|
||||||
LMMinder::~LMMinder()
|
|
||||||
{
|
|
||||||
LexerManager::DeleteInstance();
|
|
||||||
}
|
|
||||||
|
|
||||||
LMMinder minder;
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ExternalLexer.h
|
|
||||||
** Support external lexers in DLLs.
|
|
||||||
**/
|
|
||||||
// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson.
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef EXTERNALLEXER_H
|
|
||||||
#define EXTERNALLEXER_H
|
|
||||||
|
|
||||||
#if PLAT_WIN
|
|
||||||
#define EXT_LEXER_DECL __stdcall
|
|
||||||
#else
|
|
||||||
#define EXT_LEXER_DECL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// External Lexer function definitions...
|
|
||||||
typedef void (EXT_LEXER_DECL *ExtLexerFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle,
|
|
||||||
char *words[], WindowID window, char *props);
|
|
||||||
typedef void (EXT_LEXER_DECL *ExtFoldFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle,
|
|
||||||
char *words[], WindowID window, char *props);
|
|
||||||
typedef void* (EXT_LEXER_DECL *GetLexerFunction)(unsigned int Index);
|
|
||||||
typedef int (EXT_LEXER_DECL *GetLexerCountFn)();
|
|
||||||
typedef void (EXT_LEXER_DECL *GetLexerNameFn)(unsigned int Index, char *name, int buflength);
|
|
||||||
|
|
||||||
//class DynamicLibrary;
|
|
||||||
|
|
||||||
/// Sub-class of LexerModule to use an external lexer.
|
|
||||||
class ExternalLexerModule : protected LexerModule {
|
|
||||||
protected:
|
|
||||||
ExtLexerFunction fneLexer;
|
|
||||||
ExtFoldFunction fneFolder;
|
|
||||||
int externalLanguage;
|
|
||||||
char name[100];
|
|
||||||
public:
|
|
||||||
ExternalLexerModule(int language_, LexerFunction fnLexer_,
|
|
||||||
const char *languageName_=0, LexerFunction fnFolder_=0) : LexerModule(language_, fnLexer_, 0, fnFolder_){
|
|
||||||
strncpy(name, languageName_, sizeof(name));
|
|
||||||
languageName = name;
|
|
||||||
};
|
|
||||||
virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const;
|
|
||||||
virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const;
|
|
||||||
virtual void SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index);
|
|
||||||
};
|
|
||||||
|
|
||||||
/// LexerMinder points to an ExternalLexerModule - so we don't leak them.
|
|
||||||
class LexerMinder {
|
|
||||||
public:
|
|
||||||
ExternalLexerModule *self;
|
|
||||||
LexerMinder *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// LexerLibrary exists for every External Lexer DLL, contains LexerMinders.
|
|
||||||
class LexerLibrary {
|
|
||||||
DynamicLibrary *lib;
|
|
||||||
LexerMinder *first;
|
|
||||||
LexerMinder *last;
|
|
||||||
|
|
||||||
public:
|
|
||||||
LexerLibrary(const char* ModuleName);
|
|
||||||
~LexerLibrary();
|
|
||||||
void Release();
|
|
||||||
|
|
||||||
LexerLibrary *next;
|
|
||||||
SString m_sModuleName;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// LexerManager manages external lexers, contains LexerLibrarys.
|
|
||||||
class LexerManager {
|
|
||||||
public:
|
|
||||||
~LexerManager();
|
|
||||||
|
|
||||||
static LexerManager *GetInstance();
|
|
||||||
static void DeleteInstance();
|
|
||||||
|
|
||||||
void Load(const char* path);
|
|
||||||
void Clear();
|
|
||||||
|
|
||||||
private:
|
|
||||||
LexerManager();
|
|
||||||
static LexerManager *theInstance;
|
|
||||||
|
|
||||||
void LoadLexerLibrary(const char* module);
|
|
||||||
LexerLibrary *first;
|
|
||||||
LexerLibrary *last;
|
|
||||||
};
|
|
||||||
|
|
||||||
class LMMinder {
|
|
||||||
public:
|
|
||||||
~LMMinder();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Indicator.cxx
|
|
||||||
** Defines the style of indicators which are text decorations such as underlining.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "Indicator.h"
|
|
||||||
|
|
||||||
void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) {
|
|
||||||
surface->PenColour(fore.allocated);
|
|
||||||
int ymid = (rc.bottom + rc.top) / 2;
|
|
||||||
if (style == INDIC_SQUIGGLE) {
|
|
||||||
surface->MoveTo(rc.left, rc.top);
|
|
||||||
int x = rc.left + 2;
|
|
||||||
int y = 2;
|
|
||||||
while (x < rc.right) {
|
|
||||||
surface->LineTo(x, rc.top + y);
|
|
||||||
x += 2;
|
|
||||||
y = 2 - y;
|
|
||||||
}
|
|
||||||
surface->LineTo(rc.right, rc.top + y); // Finish the line
|
|
||||||
} else if (style == INDIC_TT) {
|
|
||||||
surface->MoveTo(rc.left, ymid);
|
|
||||||
int x = rc.left + 5;
|
|
||||||
while (x < rc.right) {
|
|
||||||
surface->LineTo(x, ymid);
|
|
||||||
surface->MoveTo(x-3, ymid);
|
|
||||||
surface->LineTo(x-3, ymid+2);
|
|
||||||
x++;
|
|
||||||
surface->MoveTo(x, ymid);
|
|
||||||
x += 5;
|
|
||||||
}
|
|
||||||
surface->LineTo(rc.right, ymid); // Finish the line
|
|
||||||
if (x - 3 <= rc.right) {
|
|
||||||
surface->MoveTo(x-3, ymid);
|
|
||||||
surface->LineTo(x-3, ymid+2);
|
|
||||||
}
|
|
||||||
} else if (style == INDIC_DIAGONAL) {
|
|
||||||
int x = rc.left;
|
|
||||||
while (x < rc.right) {
|
|
||||||
surface->MoveTo(x, rc.top+2);
|
|
||||||
int endX = x+3;
|
|
||||||
int endY = rc.top - 1;
|
|
||||||
if (endX > rc.right) {
|
|
||||||
endY += endX - rc.right;
|
|
||||||
endX = rc.right;
|
|
||||||
}
|
|
||||||
surface->LineTo(endX, endY);
|
|
||||||
x += 4;
|
|
||||||
}
|
|
||||||
} else if (style == INDIC_STRIKE) {
|
|
||||||
surface->MoveTo(rc.left, rc.top - 4);
|
|
||||||
surface->LineTo(rc.right, rc.top - 4);
|
|
||||||
} else if (style == INDIC_HIDDEN) {
|
|
||||||
// Draw nothing
|
|
||||||
} else if (style == INDIC_BOX) {
|
|
||||||
surface->MoveTo(rc.left, ymid+1);
|
|
||||||
surface->LineTo(rc.right, ymid+1);
|
|
||||||
surface->LineTo(rc.right, rcLine.top+1);
|
|
||||||
surface->LineTo(rc.left, rcLine.top+1);
|
|
||||||
surface->LineTo(rc.left, ymid+1);
|
|
||||||
} else { // Either INDIC_PLAIN or unknown
|
|
||||||
surface->MoveTo(rc.left, ymid);
|
|
||||||
surface->LineTo(rc.right, ymid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Indicator.h
|
|
||||||
** Defines the style of indicators which are text decorations such as underlining.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef INDICATOR_H
|
|
||||||
#define INDICATOR_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class Indicator {
|
|
||||||
public:
|
|
||||||
int style;
|
|
||||||
ColourPair fore;
|
|
||||||
Indicator() : style(INDIC_PLAIN), fore(ColourDesired(0,0,0)) {
|
|
||||||
}
|
|
||||||
void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file KeyMap.cxx
|
|
||||||
** Defines a mapping between keystrokes and commands.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Scintilla.h"
|
|
||||||
|
|
||||||
#include "KeyMap.h"
|
|
||||||
|
|
||||||
KeyMap::KeyMap() : kmap(0), len(0), alloc(0) {
|
|
||||||
for (int i = 0; MapDefault[i].key; i++) {
|
|
||||||
AssignCmdKey(MapDefault[i].key,
|
|
||||||
MapDefault[i].modifiers,
|
|
||||||
MapDefault[i].msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KeyMap::~KeyMap() {
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void KeyMap::Clear() {
|
|
||||||
delete []kmap;
|
|
||||||
kmap = 0;
|
|
||||||
len = 0;
|
|
||||||
alloc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {
|
|
||||||
if ((len+1) >= alloc) {
|
|
||||||
KeyToCommand *ktcNew = new KeyToCommand[alloc + 5];
|
|
||||||
if (!ktcNew)
|
|
||||||
return;
|
|
||||||
for (int k = 0; k < len; k++)
|
|
||||||
ktcNew[k] = kmap[k];
|
|
||||||
alloc += 5;
|
|
||||||
delete []kmap;
|
|
||||||
kmap = ktcNew;
|
|
||||||
}
|
|
||||||
for (int keyIndex = 0; keyIndex < len; keyIndex++) {
|
|
||||||
if ((key == kmap[keyIndex].key) && (modifiers == kmap[keyIndex].modifiers)) {
|
|
||||||
kmap[keyIndex].msg = msg;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
kmap[len].key = key;
|
|
||||||
kmap[len].modifiers = modifiers;
|
|
||||||
kmap[len].msg = msg;
|
|
||||||
len++;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int KeyMap::Find(int key, int modifiers) {
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) {
|
|
||||||
return kmap[i].msg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const KeyToCommand KeyMap::MapDefault[] = {
|
|
||||||
{SCK_DOWN, SCI_NORM, SCI_LINEDOWN},
|
|
||||||
{SCK_DOWN, SCI_SHIFT, SCI_LINEDOWNEXTEND},
|
|
||||||
{SCK_DOWN, SCI_CTRL, SCI_LINESCROLLDOWN},
|
|
||||||
{SCK_DOWN, SCI_ASHIFT, SCI_LINEDOWNRECTEXTEND},
|
|
||||||
{SCK_UP, SCI_NORM, SCI_LINEUP},
|
|
||||||
{SCK_UP, SCI_SHIFT, SCI_LINEUPEXTEND},
|
|
||||||
{SCK_UP, SCI_CTRL, SCI_LINESCROLLUP},
|
|
||||||
{SCK_UP, SCI_ASHIFT, SCI_LINEUPRECTEXTEND},
|
|
||||||
{'[', SCI_CTRL, SCI_PARAUP},
|
|
||||||
{'[', SCI_CSHIFT, SCI_PARAUPEXTEND},
|
|
||||||
{']', SCI_CTRL, SCI_PARADOWN},
|
|
||||||
{']', SCI_CSHIFT, SCI_PARADOWNEXTEND},
|
|
||||||
{SCK_LEFT, SCI_NORM, SCI_CHARLEFT},
|
|
||||||
{SCK_LEFT, SCI_SHIFT, SCI_CHARLEFTEXTEND},
|
|
||||||
{SCK_LEFT, SCI_CTRL, SCI_WORDLEFT},
|
|
||||||
{SCK_LEFT, SCI_CSHIFT, SCI_WORDLEFTEXTEND},
|
|
||||||
{SCK_LEFT, SCI_ASHIFT, SCI_CHARLEFTRECTEXTEND},
|
|
||||||
{SCK_RIGHT, SCI_NORM, SCI_CHARRIGHT},
|
|
||||||
{SCK_RIGHT, SCI_SHIFT, SCI_CHARRIGHTEXTEND},
|
|
||||||
{SCK_RIGHT, SCI_CTRL, SCI_WORDRIGHT},
|
|
||||||
{SCK_RIGHT, SCI_CSHIFT, SCI_WORDRIGHTEXTEND},
|
|
||||||
{SCK_RIGHT, SCI_ASHIFT, SCI_CHARRIGHTRECTEXTEND},
|
|
||||||
{'/', SCI_CTRL, SCI_WORDPARTLEFT},
|
|
||||||
{'/', SCI_CSHIFT, SCI_WORDPARTLEFTEXTEND},
|
|
||||||
{'\\', SCI_CTRL, SCI_WORDPARTRIGHT},
|
|
||||||
{'\\', SCI_CSHIFT, SCI_WORDPARTRIGHTEXTEND},
|
|
||||||
{SCK_HOME, SCI_NORM, SCI_VCHOME},
|
|
||||||
{SCK_HOME, SCI_SHIFT, SCI_VCHOMEEXTEND},
|
|
||||||
{SCK_HOME, SCI_CTRL, SCI_DOCUMENTSTART},
|
|
||||||
{SCK_HOME, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND},
|
|
||||||
{SCK_HOME, SCI_ALT, SCI_HOMEDISPLAY},
|
|
||||||
// {SCK_HOME, SCI_ASHIFT, SCI_HOMEDISPLAYEXTEND},
|
|
||||||
{SCK_HOME, SCI_ASHIFT, SCI_VCHOMERECTEXTEND},
|
|
||||||
{SCK_END, SCI_NORM, SCI_LINEEND},
|
|
||||||
{SCK_END, SCI_SHIFT, SCI_LINEENDEXTEND},
|
|
||||||
{SCK_END, SCI_CTRL, SCI_DOCUMENTEND},
|
|
||||||
{SCK_END, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND},
|
|
||||||
{SCK_END, SCI_ALT, SCI_LINEENDDISPLAY},
|
|
||||||
// {SCK_END, SCI_ASHIFT, SCI_LINEENDDISPLAYEXTEND},
|
|
||||||
{SCK_END, SCI_ASHIFT, SCI_LINEENDRECTEXTEND},
|
|
||||||
{SCK_PRIOR, SCI_NORM, SCI_PAGEUP},
|
|
||||||
{SCK_PRIOR, SCI_SHIFT, SCI_PAGEUPEXTEND},
|
|
||||||
{SCK_PRIOR, SCI_ASHIFT, SCI_PAGEUPRECTEXTEND},
|
|
||||||
{SCK_NEXT, SCI_NORM, SCI_PAGEDOWN},
|
|
||||||
{SCK_NEXT, SCI_SHIFT, SCI_PAGEDOWNEXTEND},
|
|
||||||
{SCK_NEXT, SCI_ASHIFT, SCI_PAGEDOWNRECTEXTEND},
|
|
||||||
{SCK_DELETE, SCI_NORM, SCI_CLEAR},
|
|
||||||
{SCK_DELETE, SCI_SHIFT, SCI_CUT},
|
|
||||||
{SCK_DELETE, SCI_CTRL, SCI_DELWORDRIGHT},
|
|
||||||
{SCK_DELETE, SCI_CSHIFT, SCI_DELLINERIGHT},
|
|
||||||
{SCK_INSERT, SCI_NORM, SCI_EDITTOGGLEOVERTYPE},
|
|
||||||
{SCK_INSERT, SCI_SHIFT, SCI_PASTE},
|
|
||||||
{SCK_INSERT, SCI_CTRL, SCI_COPY},
|
|
||||||
{SCK_ESCAPE, SCI_NORM, SCI_CANCEL},
|
|
||||||
{SCK_BACK, SCI_NORM, SCI_DELETEBACK},
|
|
||||||
{SCK_BACK, SCI_SHIFT, SCI_DELETEBACK},
|
|
||||||
{SCK_BACK, SCI_CTRL, SCI_DELWORDLEFT},
|
|
||||||
{SCK_BACK, SCI_ALT, SCI_UNDO},
|
|
||||||
{SCK_BACK, SCI_CSHIFT, SCI_DELLINELEFT},
|
|
||||||
{'Z', SCI_CTRL, SCI_UNDO},
|
|
||||||
{'Y', SCI_CTRL, SCI_REDO},
|
|
||||||
{'X', SCI_CTRL, SCI_CUT},
|
|
||||||
{'C', SCI_CTRL, SCI_COPY},
|
|
||||||
{'V', SCI_CTRL, SCI_PASTE},
|
|
||||||
{'A', SCI_CTRL, SCI_SELECTALL},
|
|
||||||
{SCK_TAB, SCI_NORM, SCI_TAB},
|
|
||||||
{SCK_TAB, SCI_SHIFT, SCI_BACKTAB},
|
|
||||||
{SCK_RETURN, SCI_NORM, SCI_NEWLINE},
|
|
||||||
{SCK_RETURN, SCI_SHIFT, SCI_NEWLINE},
|
|
||||||
{SCK_ADD, SCI_CTRL, SCI_ZOOMIN},
|
|
||||||
{SCK_SUBTRACT, SCI_CTRL, SCI_ZOOMOUT},
|
|
||||||
{SCK_DIVIDE, SCI_CTRL, SCI_SETZOOM},
|
|
||||||
//'L', SCI_CTRL, SCI_FORMFEED,
|
|
||||||
{'L', SCI_CTRL, SCI_LINECUT},
|
|
||||||
{'L', SCI_CSHIFT, SCI_LINEDELETE},
|
|
||||||
{'T', SCI_CSHIFT, SCI_LINECOPY},
|
|
||||||
{'T', SCI_CTRL, SCI_LINETRANSPOSE},
|
|
||||||
{'D', SCI_CTRL, SCI_LINEDUPLICATE},
|
|
||||||
{'U', SCI_CTRL, SCI_LOWERCASE},
|
|
||||||
{'U', SCI_CSHIFT, SCI_UPPERCASE},
|
|
||||||
{0,0,0},
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file KeyMap.h
|
|
||||||
** Defines a mapping between keystrokes and commands.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef KEYTOCOMMAND_H
|
|
||||||
#define KEYTOCOMMAND_H
|
|
||||||
|
|
||||||
#define SCI_NORM 0
|
|
||||||
#define SCI_SHIFT SCMOD_SHIFT
|
|
||||||
#define SCI_CTRL SCMOD_CTRL
|
|
||||||
#define SCI_ALT SCMOD_ALT
|
|
||||||
#define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT)
|
|
||||||
#define SCI_ASHIFT (SCI_ALT | SCI_SHIFT)
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class KeyToCommand {
|
|
||||||
public:
|
|
||||||
int key;
|
|
||||||
int modifiers;
|
|
||||||
unsigned int msg;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class KeyMap {
|
|
||||||
KeyToCommand *kmap;
|
|
||||||
int len;
|
|
||||||
int alloc;
|
|
||||||
static const KeyToCommand MapDefault[];
|
|
||||||
|
|
||||||
public:
|
|
||||||
KeyMap();
|
|
||||||
~KeyMap();
|
|
||||||
void Clear();
|
|
||||||
void AssignCmdKey(int key, int modifiers, unsigned int msg);
|
|
||||||
unsigned int Find(int key, int modifiers); // 0 returned on failure
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,189 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file KeyWords.cxx
|
|
||||||
** Colourise for particular languages.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
const LexerModule *LexerModule::base = 0;
|
|
||||||
int LexerModule::nextLanguage = SCLEX_AUTOMATIC+1;
|
|
||||||
|
|
||||||
LexerModule::LexerModule(int language_, LexerFunction fnLexer_,
|
|
||||||
const char *languageName_, LexerFunction fnFolder_,
|
|
||||||
const char * const wordListDescriptions_[]) :
|
|
||||||
language(language_),
|
|
||||||
fnLexer(fnLexer_),
|
|
||||||
fnFolder(fnFolder_),
|
|
||||||
wordListDescriptions(wordListDescriptions_),
|
|
||||||
languageName(languageName_) {
|
|
||||||
next = base;
|
|
||||||
base = this;
|
|
||||||
if (language == SCLEX_AUTOMATIC) {
|
|
||||||
language = nextLanguage;
|
|
||||||
nextLanguage++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int LexerModule::GetNumWordLists() const {
|
|
||||||
if (wordListDescriptions == NULL) {
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
int numWordLists = 0;
|
|
||||||
|
|
||||||
while (wordListDescriptions[numWordLists]) {
|
|
||||||
++numWordLists;
|
|
||||||
}
|
|
||||||
|
|
||||||
return numWordLists;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char * LexerModule::GetWordListDescription(int index) const {
|
|
||||||
static const char *emptyStr = "";
|
|
||||||
|
|
||||||
PLATFORM_ASSERT(index < GetNumWordLists());
|
|
||||||
if (index >= GetNumWordLists()) {
|
|
||||||
return emptyStr;
|
|
||||||
} else {
|
|
||||||
return wordListDescriptions[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const LexerModule *LexerModule::Find(int language) {
|
|
||||||
const LexerModule *lm = base;
|
|
||||||
while (lm) {
|
|
||||||
if (lm->language == language) {
|
|
||||||
return lm;
|
|
||||||
}
|
|
||||||
lm = lm->next;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const LexerModule *LexerModule::Find(const char *languageName) {
|
|
||||||
if (languageName) {
|
|
||||||
const LexerModule *lm = base;
|
|
||||||
while (lm) {
|
|
||||||
if (lm->languageName && 0 == strcmp(lm->languageName, languageName)) {
|
|
||||||
return lm;
|
|
||||||
}
|
|
||||||
lm = lm->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const {
|
|
||||||
if (fnLexer)
|
|
||||||
fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const {
|
|
||||||
if (fnFolder) {
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
// Move back one line in case deletion wrecked current line fold state
|
|
||||||
if (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
int newStartPos = styler.LineStart(lineCurrent);
|
|
||||||
lengthDoc += startPos - newStartPos;
|
|
||||||
startPos = newStartPos;
|
|
||||||
initStyle = 0;
|
|
||||||
if (startPos > 0) {
|
|
||||||
initStyle = styler.StyleAt(startPos - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alternative historical name for Scintilla_LinkLexers
|
|
||||||
int wxForceScintillaLexers(void) {
|
|
||||||
return Scintilla_LinkLexers();
|
|
||||||
}
|
|
||||||
|
|
||||||
// To add or remove a lexer, add or remove its file and run LexGen.py.
|
|
||||||
|
|
||||||
// Force a reference to all of the Scintilla lexers so that the linker will
|
|
||||||
// not remove the code of the lexers.
|
|
||||||
int Scintilla_LinkLexers() {
|
|
||||||
static int forcer = 0;
|
|
||||||
|
|
||||||
// Shorten the code that declares a lexer and ensures it is linked in by calling a method.
|
|
||||||
#define LINK_LEXER(lexer) extern LexerModule lexer; forcer += lexer.GetLanguage();
|
|
||||||
|
|
||||||
//++Autogenerated -- run src/LexGen.py to regenerate
|
|
||||||
//**\(\tLINK_LEXER(\*);\n\)
|
|
||||||
LINK_LEXER(lmAda);
|
|
||||||
LINK_LEXER(lmAsm);
|
|
||||||
LINK_LEXER(lmAVE);
|
|
||||||
LINK_LEXER(lmBaan);
|
|
||||||
LINK_LEXER(lmBullant);
|
|
||||||
LINK_LEXER(lmClw);
|
|
||||||
LINK_LEXER(lmClwNoCase);
|
|
||||||
LINK_LEXER(lmConf);
|
|
||||||
LINK_LEXER(lmCPP);
|
|
||||||
LINK_LEXER(lmCPPNoCase);
|
|
||||||
LINK_LEXER(lmTCL);
|
|
||||||
LINK_LEXER(lmNncrontab);
|
|
||||||
LINK_LEXER(lmCss);
|
|
||||||
LINK_LEXER(lmEiffel);
|
|
||||||
LINK_LEXER(lmEiffelkw);
|
|
||||||
LINK_LEXER(lmErlang);
|
|
||||||
LINK_LEXER(lmESCRIPT);
|
|
||||||
LINK_LEXER(lmForth);
|
|
||||||
LINK_LEXER(lmFortran);
|
|
||||||
LINK_LEXER(lmF77);
|
|
||||||
LINK_LEXER(lmHTML);
|
|
||||||
LINK_LEXER(lmXML);
|
|
||||||
LINK_LEXER(lmASP);
|
|
||||||
LINK_LEXER(lmPHP);
|
|
||||||
LINK_LEXER(lmLISP);
|
|
||||||
LINK_LEXER(lmLout);
|
|
||||||
LINK_LEXER(lmLua);
|
|
||||||
LINK_LEXER(lmMatlab);
|
|
||||||
LINK_LEXER(lmOctave);
|
|
||||||
LINK_LEXER(lmMETAPOST);
|
|
||||||
LINK_LEXER(lmMMIXAL);
|
|
||||||
LINK_LEXER(lmLot);
|
|
||||||
LINK_LEXER(lmNsis);
|
|
||||||
LINK_LEXER(lmBatch);
|
|
||||||
LINK_LEXER(lmDiff);
|
|
||||||
LINK_LEXER(lmProps);
|
|
||||||
LINK_LEXER(lmMake);
|
|
||||||
LINK_LEXER(lmErrorList);
|
|
||||||
LINK_LEXER(lmLatex);
|
|
||||||
LINK_LEXER(lmNull);
|
|
||||||
LINK_LEXER(lmPascal);
|
|
||||||
LINK_LEXER(lmPB);
|
|
||||||
LINK_LEXER(lmPerl);
|
|
||||||
LINK_LEXER(lmPOV);
|
|
||||||
LINK_LEXER(lmPS);
|
|
||||||
LINK_LEXER(lmPython);
|
|
||||||
LINK_LEXER(lmRuby);
|
|
||||||
LINK_LEXER(lmScriptol);
|
|
||||||
LINK_LEXER(lmSQL);
|
|
||||||
LINK_LEXER(lmTeX);
|
|
||||||
LINK_LEXER(lmVB);
|
|
||||||
LINK_LEXER(lmVBScript);
|
|
||||||
LINK_LEXER(lmYAML);
|
|
||||||
|
|
||||||
//--Autogenerated -- end of automatically generated section
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
@@ -1,224 +0,0 @@
|
|||||||
// SciTE - Scintilla based Text Editor
|
|
||||||
/** @file LexAVE.cxx
|
|
||||||
** Lexer for Avenue.
|
|
||||||
**
|
|
||||||
** Written by Alexey Yutkin <yutkin@geol.msu.ru>.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
static inline bool IsEnumChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch)|| ch == '_');
|
|
||||||
}
|
|
||||||
static inline bool IsANumberChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool isAveOperator(char ch) {
|
|
||||||
if (isalnum(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 == '.' )
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseAveDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
WordList &keywords4 = *keywordlists[3];
|
|
||||||
WordList &keywords5 = *keywordlists[4];
|
|
||||||
WordList &keywords6 = *keywordlists[5];
|
|
||||||
|
|
||||||
// Do not leak onto next line
|
|
||||||
if (initStyle == SCE_AVE_STRINGEOL) {
|
|
||||||
initStyle = SCE_AVE_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
// Update the line state, so it can be seen by next line
|
|
||||||
int currentLine = styler.GetLine(sc.currentPos);
|
|
||||||
styler.SetLineState(currentLine, 0);
|
|
||||||
}
|
|
||||||
if (sc.atLineStart && (sc.state == SCE_AVE_STRING)) {
|
|
||||||
// Prevent SCE_AVE_STRINGEOL from leaking back to previous line
|
|
||||||
sc.SetState(SCE_AVE_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_AVE_OPERATOR) {
|
|
||||||
sc.SetState(SCE_AVE_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_AVE_NUMBER) {
|
|
||||||
if (!IsANumberChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_AVE_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_AVE_ENUM) {
|
|
||||||
if (!IsEnumChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_AVE_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_AVE_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
|
|
||||||
char s[100];
|
|
||||||
//sc.GetCurrent(s, sizeof(s));
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_AVE_WORD);
|
|
||||||
} else if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_AVE_WORD2);
|
|
||||||
} else if (keywords3.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_AVE_WORD3);
|
|
||||||
} else if (keywords4.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_AVE_WORD4);
|
|
||||||
} else if (keywords5.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_AVE_WORD5);
|
|
||||||
} else if (keywords6.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_AVE_WORD6);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_AVE_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_AVE_COMMENT) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_AVE_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_AVE_STRING) {
|
|
||||||
if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_AVE_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_AVE_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_AVE_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_AVE_DEFAULT) {
|
|
||||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_AVE_NUMBER);
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_AVE_IDENTIFIER);
|
|
||||||
} else if (sc.Match('\"')) {
|
|
||||||
sc.SetState(SCE_AVE_STRING);
|
|
||||||
} else if (sc.Match('\'')) {
|
|
||||||
sc.SetState(SCE_AVE_COMMENT);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (isAveOperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_AVE_OPERATOR);
|
|
||||||
} else if (sc.Match('#')) {
|
|
||||||
sc.SetState(SCE_AVE_ENUM);
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldAveDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = static_cast<char>(tolower(styler[startPos]));
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
char s[10];
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = static_cast<char>(tolower(chNext));
|
|
||||||
chNext = static_cast<char>(tolower(styler.SafeGetCharAt(i + 1)));
|
|
||||||
int style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (style == SCE_AVE_WORD) {
|
|
||||||
if (ch == 't' || ch == 'f' || ch == 'w' || ch == 'e') {
|
|
||||||
for (unsigned int j = 0; j < 6; j++) {
|
|
||||||
if (!iswordchar(styler[i + j])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s[j] = static_cast<char>(tolower(styler[i + j]));
|
|
||||||
s[j + 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((strcmp(s, "then") == 0) || (strcmp(s, "for") == 0) || (strcmp(s, "while") == 0)) {
|
|
||||||
levelCurrent++;
|
|
||||||
}
|
|
||||||
if ((strcmp(s, "end") == 0)) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (style == SCE_AVE_OPERATOR) {
|
|
||||||
if (ch == '{' || ch == '(') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == '}' || ch == ')') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact) {
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
}
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch)) {
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, "ave", FoldAveDoc);
|
|
||||||
|
|
||||||
@@ -1,520 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexAda.cxx
|
|
||||||
** Lexer for Ada 95
|
|
||||||
**/
|
|
||||||
// Copyright 2002 by Sergey Koshcheyev <sergey.k@seznam.cz>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
#include "SString.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Interface
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void ColouriseDocument(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler);
|
|
||||||
|
|
||||||
static const char * const adaWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmAda(SCLEX_ADA, ColouriseDocument, "ada", NULL, adaWordListDesc);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Implementation
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Functions that have apostropheStartsAttribute as a parameter set it according to whether
|
|
||||||
// an apostrophe encountered after processing the current token will start an attribute or
|
|
||||||
// a character literal.
|
|
||||||
static void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute);
|
|
||||||
static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute);
|
|
||||||
static void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL);
|
|
||||||
static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute);
|
|
||||||
static void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute);
|
|
||||||
static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute);
|
|
||||||
static void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute);
|
|
||||||
static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute);
|
|
||||||
static void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute);
|
|
||||||
|
|
||||||
static inline bool IsDelimiterCharacter(int ch);
|
|
||||||
static inline bool IsNumberStartCharacter(int ch);
|
|
||||||
static inline bool IsNumberCharacter(int ch);
|
|
||||||
static inline bool IsSeparatorOrDelimiterCharacter(int ch);
|
|
||||||
static bool IsValidIdentifier(const SString& identifier);
|
|
||||||
static bool IsValidNumber(const SString& number);
|
|
||||||
static inline bool IsWordStartCharacter(int ch);
|
|
||||||
static inline bool IsWordCharacter(int ch);
|
|
||||||
|
|
||||||
static void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute) {
|
|
||||||
apostropheStartsAttribute = true;
|
|
||||||
|
|
||||||
sc.SetState(SCE_ADA_CHARACTER);
|
|
||||||
|
|
||||||
// Skip the apostrophe and one more character (so that '' is shown as non-terminated and '''
|
|
||||||
// is handled correctly)
|
|
||||||
sc.Forward();
|
|
||||||
sc.Forward();
|
|
||||||
|
|
||||||
ColouriseContext(sc, '\'', SCE_ADA_CHARACTEREOL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL) {
|
|
||||||
while (!sc.atLineEnd && !sc.Match(chEnd)) {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sc.atLineEnd) {
|
|
||||||
sc.ForwardSetState(SCE_ADA_DEFAULT);
|
|
||||||
} else {
|
|
||||||
sc.ChangeState(stateEOL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseComment(StyleContext& sc, bool& /*apostropheStartsAttribute*/) {
|
|
||||||
// Apostrophe meaning is not changed, but the parameter is present for uniformity
|
|
||||||
|
|
||||||
sc.SetState(SCE_ADA_COMMENTLINE);
|
|
||||||
|
|
||||||
while (!sc.atLineEnd) {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) {
|
|
||||||
apostropheStartsAttribute = sc.Match (')');
|
|
||||||
sc.SetState(SCE_ADA_DELIMITER);
|
|
||||||
sc.ForwardSetState(SCE_ADA_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) {
|
|
||||||
apostropheStartsAttribute = false;
|
|
||||||
|
|
||||||
sc.SetState(SCE_ADA_LABEL);
|
|
||||||
|
|
||||||
// Skip "<<"
|
|
||||||
sc.Forward();
|
|
||||||
sc.Forward();
|
|
||||||
|
|
||||||
SString identifier;
|
|
||||||
|
|
||||||
while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) {
|
|
||||||
identifier += static_cast<char>(tolower(sc.ch));
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip ">>"
|
|
||||||
if (sc.Match('>', '>')) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.Forward();
|
|
||||||
} else {
|
|
||||||
sc.ChangeState(SCE_ADA_ILLEGAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the name is an invalid identifier or a keyword, then make it invalid label
|
|
||||||
if (!IsValidIdentifier(identifier) || keywords.InList(identifier.c_str())) {
|
|
||||||
sc.ChangeState(SCE_ADA_ILLEGAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sc.SetState(SCE_ADA_DEFAULT);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) {
|
|
||||||
apostropheStartsAttribute = true;
|
|
||||||
|
|
||||||
SString number;
|
|
||||||
sc.SetState(SCE_ADA_NUMBER);
|
|
||||||
|
|
||||||
// Get all characters up to a delimiter or a separator, including points, but excluding
|
|
||||||
// double points (ranges).
|
|
||||||
while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) {
|
|
||||||
number += static_cast<char>(sc.ch);
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special case: exponent with sign
|
|
||||||
if ((sc.chPrev == 'e' || sc.chPrev == 'E') &&
|
|
||||||
(sc.ch == '+' || sc.ch == '-')) {
|
|
||||||
number += static_cast<char>(sc.ch);
|
|
||||||
sc.Forward ();
|
|
||||||
|
|
||||||
while (!IsSeparatorOrDelimiterCharacter(sc.ch)) {
|
|
||||||
number += static_cast<char>(sc.ch);
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!IsValidNumber(number)) {
|
|
||||||
sc.ChangeState(SCE_ADA_ILLEGAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sc.SetState(SCE_ADA_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute) {
|
|
||||||
apostropheStartsAttribute = true;
|
|
||||||
|
|
||||||
sc.SetState(SCE_ADA_STRING);
|
|
||||||
sc.Forward();
|
|
||||||
|
|
||||||
ColouriseContext(sc, '"', SCE_ADA_STRINGEOL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseWhiteSpace(StyleContext& sc, bool& /*apostropheStartsAttribute*/) {
|
|
||||||
// Apostrophe meaning is not changed, but the parameter is present for uniformity
|
|
||||||
sc.SetState(SCE_ADA_DEFAULT);
|
|
||||||
sc.ForwardSetState(SCE_ADA_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) {
|
|
||||||
apostropheStartsAttribute = true;
|
|
||||||
sc.SetState(SCE_ADA_IDENTIFIER);
|
|
||||||
|
|
||||||
SString word;
|
|
||||||
|
|
||||||
while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) {
|
|
||||||
word += static_cast<char>(tolower(sc.ch));
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!IsValidIdentifier(word)) {
|
|
||||||
sc.ChangeState(SCE_ADA_ILLEGAL);
|
|
||||||
|
|
||||||
} else if (keywords.InList(word.c_str())) {
|
|
||||||
sc.ChangeState(SCE_ADA_WORD);
|
|
||||||
|
|
||||||
if (word != "all") {
|
|
||||||
apostropheStartsAttribute = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sc.SetState(SCE_ADA_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// ColouriseDocument
|
|
||||||
//
|
|
||||||
|
|
||||||
static void ColouriseDocument(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0;
|
|
||||||
|
|
||||||
while (sc.More()) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
// Go to the next line
|
|
||||||
sc.Forward();
|
|
||||||
lineCurrent++;
|
|
||||||
|
|
||||||
// Remember the line state for future incremental lexing
|
|
||||||
styler.SetLineState(lineCurrent, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Don't continue any styles on the next line
|
|
||||||
sc.SetState(SCE_ADA_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Comments
|
|
||||||
if (sc.Match('-', '-')) {
|
|
||||||
ColouriseComment(sc, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Strings
|
|
||||||
} else if (sc.Match('"')) {
|
|
||||||
ColouriseString(sc, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Characters
|
|
||||||
} else if (sc.Match('\'') && !apostropheStartsAttribute) {
|
|
||||||
ColouriseCharacter(sc, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Labels
|
|
||||||
} else if (sc.Match('<', '<')) {
|
|
||||||
ColouriseLabel(sc, keywords, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Whitespace
|
|
||||||
} else if (isspace(sc.ch)) {
|
|
||||||
ColouriseWhiteSpace(sc, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Delimiters
|
|
||||||
} else if (IsDelimiterCharacter(sc.ch)) {
|
|
||||||
ColouriseDelimiter(sc, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Numbers
|
|
||||||
} else if (isdigit(sc.ch) || sc.ch == '#') {
|
|
||||||
ColouriseNumber(sc, apostropheStartsAttribute);
|
|
||||||
|
|
||||||
// Keywords or identifiers
|
|
||||||
} else {
|
|
||||||
ColouriseWord(sc, keywords, apostropheStartsAttribute);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsDelimiterCharacter(int ch) {
|
|
||||||
switch (ch) {
|
|
||||||
case '&':
|
|
||||||
case '\'':
|
|
||||||
case '(':
|
|
||||||
case ')':
|
|
||||||
case '*':
|
|
||||||
case '+':
|
|
||||||
case ',':
|
|
||||||
case '-':
|
|
||||||
case '.':
|
|
||||||
case '/':
|
|
||||||
case ':':
|
|
||||||
case ';':
|
|
||||||
case '<':
|
|
||||||
case '=':
|
|
||||||
case '>':
|
|
||||||
case '|':
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsNumberCharacter(int ch) {
|
|
||||||
return IsNumberStartCharacter(ch) ||
|
|
||||||
ch == '_' ||
|
|
||||||
ch == '.' ||
|
|
||||||
ch == '#' ||
|
|
||||||
(ch >= 'a' && ch <= 'f') ||
|
|
||||||
(ch >= 'A' && ch <= 'F');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsNumberStartCharacter(int ch) {
|
|
||||||
return isdigit(ch) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsSeparatorOrDelimiterCharacter(int ch) {
|
|
||||||
return isspace(ch) || IsDelimiterCharacter(ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsValidIdentifier(const SString& identifier) {
|
|
||||||
// First character can't be '_', so initialize the flag to true
|
|
||||||
bool lastWasUnderscore = true;
|
|
||||||
|
|
||||||
size_t length = identifier.length();
|
|
||||||
|
|
||||||
// Zero-length identifiers are not valid (these can occur inside labels)
|
|
||||||
if (length == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for valid character at the start
|
|
||||||
if (!IsWordStartCharacter(identifier[0])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for only valid characters and no double underscores
|
|
||||||
for (size_t i = 0; i < length; i++) {
|
|
||||||
if (!IsWordCharacter(identifier[i]) ||
|
|
||||||
(identifier[i] == '_' && lastWasUnderscore)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
lastWasUnderscore = identifier[i] == '_';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for underscore at the end
|
|
||||||
if (lastWasUnderscore == true) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// All checks passed
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsValidNumber(const SString& number) {
|
|
||||||
int hashPos = number.search("#");
|
|
||||||
bool seenDot = false;
|
|
||||||
|
|
||||||
size_t i = 0;
|
|
||||||
size_t length = number.length();
|
|
||||||
|
|
||||||
if (length == 0)
|
|
||||||
return false; // Just in case
|
|
||||||
|
|
||||||
// Decimal number
|
|
||||||
if (hashPos == -1) {
|
|
||||||
bool canBeSpecial = false;
|
|
||||||
|
|
||||||
for (; i < length; i++) {
|
|
||||||
if (number[i] == '_') {
|
|
||||||
if (!canBeSpecial) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
canBeSpecial = false;
|
|
||||||
} else if (number[i] == '.') {
|
|
||||||
if (!canBeSpecial || seenDot) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
canBeSpecial = false;
|
|
||||||
seenDot = true;
|
|
||||||
} else if (isdigit(number[i])) {
|
|
||||||
canBeSpecial = true;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!canBeSpecial)
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
// Based number
|
|
||||||
bool canBeSpecial = false;
|
|
||||||
int base = 0;
|
|
||||||
|
|
||||||
// Parse base
|
|
||||||
for (; i < length; i++) {
|
|
||||||
int ch = number[i];
|
|
||||||
if (ch == '_') {
|
|
||||||
if (!canBeSpecial)
|
|
||||||
return false;
|
|
||||||
canBeSpecial = false;
|
|
||||||
} else if (isdigit (ch)) {
|
|
||||||
base = base * 10 + (ch - '0');
|
|
||||||
if (base > 16)
|
|
||||||
return false;
|
|
||||||
canBeSpecial = true;
|
|
||||||
} else if (ch == '#' && canBeSpecial) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (base < 2)
|
|
||||||
return false;
|
|
||||||
if (i == length)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
i++; // Skip over '#'
|
|
||||||
|
|
||||||
// Parse number
|
|
||||||
canBeSpecial = false;
|
|
||||||
|
|
||||||
for (; i < length; i++) {
|
|
||||||
int ch = tolower(number[i]);
|
|
||||||
|
|
||||||
if (ch == '_') {
|
|
||||||
if (!canBeSpecial) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
canBeSpecial = false;
|
|
||||||
|
|
||||||
} else if (ch == '.') {
|
|
||||||
if (!canBeSpecial || seenDot) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
canBeSpecial = false;
|
|
||||||
seenDot = true;
|
|
||||||
|
|
||||||
} else if (isdigit (ch)) {
|
|
||||||
if (ch - '0' >= base) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
canBeSpecial = true;
|
|
||||||
|
|
||||||
} else if (ch >= 'a' && ch <= 'f') {
|
|
||||||
if (ch - 'a' + 10 >= base) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
canBeSpecial = true;
|
|
||||||
|
|
||||||
} else if (ch == '#' && canBeSpecial) {
|
|
||||||
break;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == length) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exponent (optional)
|
|
||||||
if (i < length) {
|
|
||||||
if (number[i] != 'e' && number[i] != 'E')
|
|
||||||
return false;
|
|
||||||
|
|
||||||
i++; // Move past 'E'
|
|
||||||
|
|
||||||
if (i == length) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (number[i] == '+')
|
|
||||||
i++;
|
|
||||||
else if (number[i] == '-') {
|
|
||||||
if (seenDot) {
|
|
||||||
i++;
|
|
||||||
} else {
|
|
||||||
return false; // Integer literals should not have negative exponents
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == length) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool canBeSpecial = false;
|
|
||||||
|
|
||||||
for (; i < length; i++) {
|
|
||||||
if (number[i] == '_') {
|
|
||||||
if (!canBeSpecial) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
canBeSpecial = false;
|
|
||||||
} else if (isdigit(number[i])) {
|
|
||||||
canBeSpecial = true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!canBeSpecial)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if i == length, number was parsed successfully.
|
|
||||||
return i == length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsWordCharacter(int ch) {
|
|
||||||
return IsWordStartCharacter(ch) || isdigit(ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsWordStartCharacter(int ch) {
|
|
||||||
return isalpha(ch) || ch == '_';
|
|
||||||
}
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexAsm.cxx
|
|
||||||
** Lexer for Assembler, just for the MASM syntax
|
|
||||||
** Written by The Black Horus
|
|
||||||
** Enhancements and NASM stuff by Kein-Hong Man, 2003-10
|
|
||||||
** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' ||
|
|
||||||
ch == '_' || ch == '?');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' ||
|
|
||||||
ch == '%' || ch == '@' || ch == '$' || ch == '?');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAsmOperator(char ch) {
|
|
||||||
if (isalnum(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 == ':')
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &cpuInstruction = *keywordlists[0];
|
|
||||||
WordList &mathInstruction = *keywordlists[1];
|
|
||||||
WordList ®isters = *keywordlists[2];
|
|
||||||
WordList &directive = *keywordlists[3];
|
|
||||||
WordList &directiveOperand = *keywordlists[4];
|
|
||||||
WordList &extInstruction = *keywordlists[5];
|
|
||||||
|
|
||||||
// Do not leak onto next line
|
|
||||||
if (initStyle == SCE_ASM_STRINGEOL)
|
|
||||||
initStyle = SCE_ASM_DEFAULT;
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward())
|
|
||||||
{
|
|
||||||
|
|
||||||
// Prevent SCE_ASM_STRINGEOL from leaking back to previous line
|
|
||||||
if (sc.atLineStart && (sc.state == SCE_ASM_STRING)) {
|
|
||||||
sc.SetState(SCE_ASM_STRING);
|
|
||||||
} else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) {
|
|
||||||
sc.SetState(SCE_ASM_CHARACTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle line continuation generically.
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\n' || sc.chNext == '\r') {
|
|
||||||
sc.Forward();
|
|
||||||
if (sc.ch == '\r' && sc.chNext == '\n') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_ASM_OPERATOR) {
|
|
||||||
if (!IsAsmOperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_ASM_DEFAULT);
|
|
||||||
}
|
|
||||||
}else if (sc.state == SCE_ASM_NUMBER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_ASM_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ASM_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch) ) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
|
|
||||||
if (cpuInstruction.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ASM_CPUINSTRUCTION);
|
|
||||||
} else if (mathInstruction.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ASM_MATHINSTRUCTION);
|
|
||||||
} else if (registers.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ASM_REGISTER);
|
|
||||||
} else if (directive.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ASM_DIRECTIVE);
|
|
||||||
} else if (directiveOperand.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND);
|
|
||||||
} else if (extInstruction.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ASM_EXTINSTRUCTION);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_ASM_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (sc.state == SCE_ASM_COMMENT ) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_ASM_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ASM_STRING) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_ASM_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_ASM_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_ASM_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ASM_CHARACTER) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.ForwardSetState(SCE_ASM_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_ASM_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_ASM_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_ASM_DEFAULT) {
|
|
||||||
if (sc.ch == ';'){
|
|
||||||
sc.SetState(SCE_ASM_COMMENT);
|
|
||||||
} else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_ASM_NUMBER);
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_ASM_IDENTIFIER);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_ASM_STRING);
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.SetState(SCE_ASM_CHARACTER);
|
|
||||||
} else if (IsAsmOperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_ASM_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const asmWordListDesc[] = {
|
|
||||||
"CPU instructions",
|
|
||||||
"FPU instructions",
|
|
||||||
"Registers",
|
|
||||||
"Directives",
|
|
||||||
"Directive operands",
|
|
||||||
"Extended instructions",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmAsm(SCLEX_ASM, ColouriseAsmDoc, "asm", 0, asmWordListDesc);
|
|
||||||
|
|
||||||
@@ -1,189 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexBaan.cxx
|
|
||||||
** Lexer for Baan.
|
|
||||||
** Based heavily on LexCPP.cxx
|
|
||||||
**/
|
|
||||||
// Copyright 2001- by Vamsi Potluru <vamsi@who.net> & Praveen Ambekar <ambekarpraveen@yahoo.com>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '$' || ch == ':');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseBaanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0;
|
|
||||||
|
|
||||||
if (initStyle == SCE_BAAN_STRINGEOL) // Does not leak onto next line
|
|
||||||
initStyle = SCE_BAAN_DEFAULT;
|
|
||||||
|
|
||||||
int visibleChars = 0;
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.state == SCE_BAAN_OPERATOR) {
|
|
||||||
sc.SetState(SCE_BAAN_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_BAAN_NUMBER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_BAAN_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_BAAN_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_BAAN_WORD);
|
|
||||||
} else if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_BAAN_WORD2);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_BAAN_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_BAAN_PREPROCESSOR) {
|
|
||||||
if (stylingWithinPreprocessor) {
|
|
||||||
if (IsASpace(sc.ch)) {
|
|
||||||
sc.SetState(SCE_BAAN_DEFAULT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (sc.atLineEnd && (sc.chNext != '^')) {
|
|
||||||
sc.SetState(SCE_BAAN_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_BAAN_COMMENT) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_BAAN_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_BAAN_COMMENTDOC) {
|
|
||||||
if (sc.MatchIgnoreCase("enddllusage")) {
|
|
||||||
for (unsigned int i = 0; i < 10; i++){
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
sc.ForwardSetState(SCE_BAAN_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_BAAN_STRING) {
|
|
||||||
if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_BAAN_DEFAULT);
|
|
||||||
} else if ((sc.atLineEnd) && (sc.chNext != '^')) {
|
|
||||||
sc.ChangeState(SCE_BAAN_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_BAAN_DEFAULT) {
|
|
||||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_BAAN_NUMBER);
|
|
||||||
} else if (sc.MatchIgnoreCase("dllusage")){
|
|
||||||
sc.SetState(SCE_BAAN_COMMENTDOC);
|
|
||||||
do {
|
|
||||||
sc.Forward();
|
|
||||||
} while ((!sc.atLineEnd) && sc.More());
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_BAAN_IDENTIFIER);
|
|
||||||
} else if (sc.Match('|')){
|
|
||||||
sc.SetState(SCE_BAAN_COMMENT);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_BAAN_STRING);
|
|
||||||
} else if (sc.ch == '#' && visibleChars == 0) {
|
|
||||||
// Preprocessor commands are alone on their line
|
|
||||||
sc.SetState(SCE_BAAN_PREPROCESSOR);
|
|
||||||
// Skip whitespace between # and preprocessor word
|
|
||||||
do {
|
|
||||||
sc.Forward();
|
|
||||||
} while (IsASpace(sc.ch) && sc.More());
|
|
||||||
} else if (isoperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_BAAN_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
// Reset states to begining of colourise so no surprises
|
|
||||||
// if different sets of lines lexed.
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!IsASpace(sc.ch)) {
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldBaanDoc(unsigned int startPos, int length, int initStyle, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style = initStyle;
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (foldComment &&
|
|
||||||
(style == SCE_BAAN_COMMENT || style == SCE_BAAN_COMMENTDOC)) {
|
|
||||||
if (style != stylePrev) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if ((style != styleNext) && !atEOL) {
|
|
||||||
// Comments don't end at end of line and the next character may be unstyled.
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (style == SCE_BAAN_OPERATOR) {
|
|
||||||
if (ch == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerModule lmBaan(SCLEX_BAAN, ColouriseBaanDoc, "baan", FoldBaanDoc);
|
|
||||||
@@ -1,225 +0,0 @@
|
|||||||
// SciTE - Scintilla based Text Editor
|
|
||||||
// LexBullant.cxx - lexer for Bullant
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
|
|
||||||
static int classifyWordBullant(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
|
|
||||||
char s[100];
|
|
||||||
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
|
|
||||||
s[i] = static_cast<char>(tolower(styler[start + i]));
|
|
||||||
s[i + 1] = '\0';
|
|
||||||
}
|
|
||||||
int lev= 0;
|
|
||||||
char chAttr = SCE_C_IDENTIFIER;
|
|
||||||
if (isdigit(s[0]) || (s[0] == '.')){
|
|
||||||
chAttr = SCE_C_NUMBER;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
chAttr = SCE_C_WORD;
|
|
||||||
if (strcmp(s, "end") == 0)
|
|
||||||
lev = -1;
|
|
||||||
else if (strcmp(s, "method") == 0 ||
|
|
||||||
strcmp(s, "case") == 0 ||
|
|
||||||
strcmp(s, "class") == 0 ||
|
|
||||||
strcmp(s, "debug") == 0 ||
|
|
||||||
strcmp(s, "test") == 0 ||
|
|
||||||
strcmp(s, "if") == 0 ||
|
|
||||||
strcmp(s, "lock") == 0 ||
|
|
||||||
strcmp(s, "transaction") == 0 ||
|
|
||||||
strcmp(s, "trap") == 0 ||
|
|
||||||
strcmp(s, "until") == 0 ||
|
|
||||||
strcmp(s, "while") == 0)
|
|
||||||
lev = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styler.ColourTo(end, chAttr);
|
|
||||||
return lev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseBullantDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
bool fold = styler.GetPropertyInt("fold") != 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
|
|
||||||
int state = initStyle;
|
|
||||||
if (state == SCE_C_STRINGEOL) // Does not leak onto next line
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
char chPrev = ' ';
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
int endFoundThisLine = 0;
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
|
|
||||||
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
|
|
||||||
// Avoid triggering two times on Dos/Win
|
|
||||||
// End of line
|
|
||||||
endFoundThisLine = 0;
|
|
||||||
if (state == SCE_C_STRINGEOL) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
if (fold) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
}
|
|
||||||
visibleChars = 0;
|
|
||||||
|
|
||||||
/* int indentBlock = GetLineIndentation(lineCurrent);
|
|
||||||
if (blockChange==1){
|
|
||||||
lineCurrent++;
|
|
||||||
int pos=SetLineIndentation(lineCurrent, indentBlock + indentSize);
|
|
||||||
} else if (blockChange==-1) {
|
|
||||||
indentBlock -= indentSize;
|
|
||||||
if (indentBlock < 0)
|
|
||||||
indentBlock = 0;
|
|
||||||
SetLineIndentation(lineCurrent, indentBlock);
|
|
||||||
lineCurrent++;
|
|
||||||
}
|
|
||||||
blockChange=0;
|
|
||||||
*/ }
|
|
||||||
if (!isspace(ch))
|
|
||||||
visibleChars++;
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
chPrev = ' ';
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_C_DEFAULT) {
|
|
||||||
if (iswordstart(ch)) {
|
|
||||||
styler.ColourTo(i-1, state);
|
|
||||||
state = SCE_C_IDENTIFIER;
|
|
||||||
} else if (ch == '@' && chNext == 'o') {
|
|
||||||
if ((styler.SafeGetCharAt(i+2) =='f') && (styler.SafeGetCharAt(i+3) == 'f')) {
|
|
||||||
styler.ColourTo(i-1, state);
|
|
||||||
state = SCE_C_COMMENT;
|
|
||||||
}
|
|
||||||
} else if (ch == '#') {
|
|
||||||
styler.ColourTo(i-1, state);
|
|
||||||
state = SCE_C_COMMENTLINE;
|
|
||||||
} else if (ch == '\"') {
|
|
||||||
styler.ColourTo(i-1, state);
|
|
||||||
state = SCE_C_STRING;
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
styler.ColourTo(i-1, state);
|
|
||||||
state = SCE_C_CHARACTER;
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
styler.ColourTo(i-1, state);
|
|
||||||
styler.ColourTo(i, SCE_C_OPERATOR);
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_IDENTIFIER) {
|
|
||||||
if (!iswordchar(ch)) {
|
|
||||||
int levelChange = classifyWordBullant(styler.GetStartSegment(), i - 1, keywords, styler);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
if (ch == '#') {
|
|
||||||
state = SCE_C_COMMENTLINE;
|
|
||||||
} else if (ch == '\"') {
|
|
||||||
state = SCE_C_STRING;
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
state = SCE_C_CHARACTER;
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
styler.ColourTo(i, SCE_C_OPERATOR);
|
|
||||||
}
|
|
||||||
if (endFoundThisLine == 0)
|
|
||||||
levelCurrent+=levelChange;
|
|
||||||
if (levelChange == -1)
|
|
||||||
endFoundThisLine=1;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_COMMENT) {
|
|
||||||
if (ch == '@' && chNext == 'o') {
|
|
||||||
if (styler.SafeGetCharAt(i+2) == 'n') {
|
|
||||||
styler.ColourTo(i+2, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
i+=2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_COMMENTLINE) {
|
|
||||||
if (ch == '\r' || ch == '\n') {
|
|
||||||
endFoundThisLine = 0;
|
|
||||||
styler.ColourTo(i-1, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_STRING) {
|
|
||||||
if (ch == '\\') {
|
|
||||||
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (ch == '\"') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
} else if (chNext == '\r' || chNext == '\n') {
|
|
||||||
endFoundThisLine = 0;
|
|
||||||
styler.ColourTo(i-1, SCE_C_STRINGEOL);
|
|
||||||
state = SCE_C_STRINGEOL;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_CHARACTER) {
|
|
||||||
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
|
|
||||||
endFoundThisLine = 0;
|
|
||||||
styler.ColourTo(i-1, SCE_C_STRINGEOL);
|
|
||||||
state = SCE_C_STRINGEOL;
|
|
||||||
} else if (ch == '\\') {
|
|
||||||
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
chPrev = ch;
|
|
||||||
}
|
|
||||||
styler.ColourTo(lengthDoc - 1, state);
|
|
||||||
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
if (fold) {
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
//styler.SetLevel(lineCurrent, levelCurrent | flagsNext);
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const bullantWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmBullant(SCLEX_BULLANT, ColouriseBullantDoc, "bullant", 0, bullantWordListDesc);
|
|
||||||
@@ -1,441 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexClw.cxx
|
|
||||||
** Lexer for Clarion.
|
|
||||||
**/
|
|
||||||
// Copyright 2003 by Ron Schofield <ron@schofieldcomputer.com>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static char MakeUpperCase(char ch) {
|
|
||||||
if (ch < 'a' || ch > 'z')
|
|
||||||
return ch;
|
|
||||||
else
|
|
||||||
return static_cast<char>(ch - 'a' + 'A');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void MakeUpperCaseString(char *s) {
|
|
||||||
while (*s) {
|
|
||||||
*s = MakeUpperCase(*s);
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is a label start character
|
|
||||||
inline bool IsALabelStart(const int iChar) {
|
|
||||||
return(isalpha(iChar) || iChar == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is a label character
|
|
||||||
inline bool IsALabelCharacter(const int iChar) {
|
|
||||||
return(isalnum(iChar) || iChar == '_' || iChar == ':');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is the character is a ! and the the next character is not a !
|
|
||||||
inline bool IsACommentStart(StyleContext &scDoc) {
|
|
||||||
return(scDoc.ch == '!' && scDoc.chNext != '!');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is the character a Clarion hex character (ABCDEF)
|
|
||||||
inline bool IsAHexCharacter(const int iChar, bool bCaseSensitive) {
|
|
||||||
// Case insensitive.
|
|
||||||
if (!bCaseSensitive) {
|
|
||||||
if (strchr("ABCDEFabcdef", iChar) != NULL) {
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Case sensitive
|
|
||||||
else {
|
|
||||||
if (strchr("ABCDEF", iChar) != NULL) {
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is the character a Clarion base character (B=Binary, O=Octal, H=Hex)
|
|
||||||
inline bool IsANumericBaseCharacter(const int iChar, bool bCaseSensitive) {
|
|
||||||
// Case insensitive.
|
|
||||||
if (!bCaseSensitive) {
|
|
||||||
// If character is a numeric base character
|
|
||||||
if (strchr("BOHboh", iChar) != NULL) {
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Case sensitive
|
|
||||||
else {
|
|
||||||
// If character is a numeric base character
|
|
||||||
if (strchr("BOH", iChar) != NULL) {
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the correct numeric constant state
|
|
||||||
inline bool SetNumericConstantState(StyleContext &scDoc) {
|
|
||||||
int iPoints = 0; // Point counter
|
|
||||||
char cNumericString[100]; // Numeric string buffer
|
|
||||||
|
|
||||||
// Buffer the current numberic string
|
|
||||||
scDoc.GetCurrent(cNumericString, sizeof(cNumericString));
|
|
||||||
// Loop through the string until end of string (NULL termination)
|
|
||||||
for (int iIndex = 0; cNumericString[iIndex] != '\0'; iIndex++) {
|
|
||||||
// Depending on the character
|
|
||||||
switch (cNumericString[iIndex]) {
|
|
||||||
// Is a . (point)
|
|
||||||
case '.' :
|
|
||||||
// Increment point counter
|
|
||||||
iPoints++;
|
|
||||||
break;
|
|
||||||
default :
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If points found (can be more than one for improper formatted number
|
|
||||||
if (iPoints > 0) {
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
// Else no points found
|
|
||||||
else {
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clarion Language Colouring Procedure
|
|
||||||
static void ColouriseClwDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler, bool bCaseSensitive) {
|
|
||||||
|
|
||||||
int iParenthesesLevel=0; // Parenthese Level
|
|
||||||
|
|
||||||
WordList &wlClarionKeywords = *wlKeywords[0]; // Clarion Keywords
|
|
||||||
WordList &wlCompilerDirectives = *wlKeywords[1]; // Compiler Directives
|
|
||||||
WordList &wlBuiltInProcsFuncs = *wlKeywords[2]; // Builtin Procedures and Functions
|
|
||||||
WordList &wlStructsDataTypes = *wlKeywords[3]; // Structures and Data Types
|
|
||||||
WordList &wlAttributes = *wlKeywords[4]; // Procedure Attributes
|
|
||||||
WordList &wlStandardEquates = *wlKeywords[5]; // Standard Equates
|
|
||||||
WordList &wlReservedWords = *wlKeywords[6]; // Clarion Reserved Keywords
|
|
||||||
|
|
||||||
StyleContext scDoc(uiStartPos, iLength, iInitStyle, accStyler);
|
|
||||||
|
|
||||||
// lex source code
|
|
||||||
for (; scDoc.More(); scDoc.Forward())
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
//
|
|
||||||
|
|
||||||
// Label State Handling
|
|
||||||
if (scDoc.state == SCE_CLW_LABEL) {
|
|
||||||
// If the character is not a valid label
|
|
||||||
if (!IsALabelCharacter(scDoc.ch)) {
|
|
||||||
// If the character is a . (dot syntax)
|
|
||||||
if (scDoc.ch == '.') {
|
|
||||||
// Uncolour the . (dot) to default state, move forward one character,
|
|
||||||
// and change back to the label state.
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
scDoc.Forward();
|
|
||||||
scDoc.SetState(SCE_CLW_LABEL);
|
|
||||||
}
|
|
||||||
// Else terminate the label state
|
|
||||||
else {
|
|
||||||
char cLabel[100]; // Label buffer
|
|
||||||
// Buffer the current label string
|
|
||||||
scDoc.GetCurrent(cLabel,sizeof(cLabel));
|
|
||||||
// If case insensitive, convert string to UPPERCASE to match passed keywords.
|
|
||||||
if (!bCaseSensitive) {
|
|
||||||
MakeUpperCaseString(cLabel);
|
|
||||||
}
|
|
||||||
// If label string is in the Clarion reserved keyword list
|
|
||||||
if (wlReservedWords.InList(cLabel)){
|
|
||||||
// change to error state
|
|
||||||
scDoc.ChangeState(SCE_CLW_ERROR);
|
|
||||||
}
|
|
||||||
// Else if label string is in the compiler directive keyword list
|
|
||||||
else if (wlCompilerDirectives.InList(cLabel)) {
|
|
||||||
// change the state to compiler directive state
|
|
||||||
scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
|
|
||||||
}
|
|
||||||
// Terminate the label state and set to default state
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Keyword State Handling
|
|
||||||
else if (scDoc.state == SCE_CLW_KEYWORD) {
|
|
||||||
// If character is : (colon)
|
|
||||||
if (scDoc.ch == ':') {
|
|
||||||
char cEquate[100]; // Equate buffer
|
|
||||||
// Move forward to include : (colon) in buffer
|
|
||||||
scDoc.Forward();
|
|
||||||
// Buffer the equate string
|
|
||||||
scDoc.GetCurrent(cEquate,sizeof(cEquate));
|
|
||||||
// If case insensitive, convert string to UPPERCASE to match passed keywords.
|
|
||||||
if (!bCaseSensitive) {
|
|
||||||
MakeUpperCaseString(cEquate);
|
|
||||||
}
|
|
||||||
// If statement string is in the equate list
|
|
||||||
if (wlStandardEquates.InList(cEquate)) {
|
|
||||||
// Change to equate state
|
|
||||||
scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If the character is not a valid label character
|
|
||||||
else if (!IsALabelCharacter(scDoc.ch)) {
|
|
||||||
char cStatement[100]; // Statement buffer
|
|
||||||
// Buffer the statement string
|
|
||||||
scDoc.GetCurrent(cStatement,sizeof(cStatement));
|
|
||||||
// If case insensitive, convert string to UPPERCASE to match passed keywords.
|
|
||||||
if (!bCaseSensitive) {
|
|
||||||
MakeUpperCaseString(cStatement);
|
|
||||||
}
|
|
||||||
// If statement string is in the Clarion keyword list
|
|
||||||
if (wlClarionKeywords.InList(cStatement)) {
|
|
||||||
// Set to the Clarion keyword state
|
|
||||||
scDoc.ChangeState(SCE_CLW_KEYWORD);
|
|
||||||
}
|
|
||||||
// Else if statement string is in the compiler directive keyword list
|
|
||||||
else if (wlCompilerDirectives.InList(cStatement)) {
|
|
||||||
// Set to the compiler directive state
|
|
||||||
scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
|
|
||||||
}
|
|
||||||
// Else if statement string is in the builtin procedures and functions keyword list
|
|
||||||
else if (wlBuiltInProcsFuncs.InList(cStatement)) {
|
|
||||||
// Set to the builtin procedures and functions state
|
|
||||||
scDoc.ChangeState(SCE_CLW_BUILTIN_PROCEDURES_FUNCTION);
|
|
||||||
}
|
|
||||||
// Else if statement string is in the tructures and data types keyword list
|
|
||||||
else if (wlStructsDataTypes.InList(cStatement)) {
|
|
||||||
// Set to the structures and data types state
|
|
||||||
scDoc.ChangeState(SCE_CLW_STRUCTURE_DATA_TYPE);
|
|
||||||
}
|
|
||||||
// Else if statement string is in the procedure attribute keyword list
|
|
||||||
else if (wlAttributes.InList(cStatement)) {
|
|
||||||
// Set to the procedure attribute state
|
|
||||||
scDoc.ChangeState(SCE_CLW_ATTRIBUTE);
|
|
||||||
}
|
|
||||||
// Else if statement string is in the standard equate keyword list
|
|
||||||
else if (wlStandardEquates.InList(cStatement)) {
|
|
||||||
// Set to the standard equate state
|
|
||||||
scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);
|
|
||||||
}
|
|
||||||
// Terminate the keyword state and set to default state
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// String State Handling
|
|
||||||
else if (scDoc.state == SCE_CLW_STRING) {
|
|
||||||
// If the character is an ' (single quote)
|
|
||||||
if (scDoc.ch == '\'') {
|
|
||||||
// Set the state to default and move forward colouring
|
|
||||||
// the ' (single quote) as default state
|
|
||||||
// terminating the string state
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
scDoc.Forward();
|
|
||||||
}
|
|
||||||
// If the next character is an ' (single quote)
|
|
||||||
if (scDoc.chNext == '\'') {
|
|
||||||
// Move forward one character and set to default state
|
|
||||||
// colouring the next ' (single quote) as default state
|
|
||||||
// terminating the string state
|
|
||||||
scDoc.ForwardSetState(SCE_CLW_DEFAULT);
|
|
||||||
scDoc.Forward();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Picture String State Handling
|
|
||||||
else if (scDoc.state == SCE_CLW_PICTURE_STRING) {
|
|
||||||
// If the character is an ( (open parenthese)
|
|
||||||
if (scDoc.ch == '(') {
|
|
||||||
// Increment the parenthese level
|
|
||||||
iParenthesesLevel++;
|
|
||||||
}
|
|
||||||
// Else if the character is a ) (close parenthese)
|
|
||||||
else if (scDoc.ch == ')') {
|
|
||||||
// If the parenthese level is set to zero
|
|
||||||
// parentheses matched
|
|
||||||
if (!iParenthesesLevel) {
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
// Else parenthese level is greater than zero
|
|
||||||
// still looking for matching parentheses
|
|
||||||
else {
|
|
||||||
// Decrement the parenthese level
|
|
||||||
iParenthesesLevel--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Standard Equate State Handling
|
|
||||||
else if (scDoc.state == SCE_CLW_STANDARD_EQUATE) {
|
|
||||||
if (!isalnum(scDoc.ch)) {
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Integer Constant State Handling
|
|
||||||
else if (scDoc.state == SCE_CLW_INTEGER_CONSTANT) {
|
|
||||||
// If the character is not a digit (0-9)
|
|
||||||
// or character is not a hexidecimal character (A-F)
|
|
||||||
// or character is not a . (point)
|
|
||||||
// or character is not a numberic base character (B,O,H)
|
|
||||||
if (!(isdigit(scDoc.ch)
|
|
||||||
|| IsAHexCharacter(scDoc.ch, bCaseSensitive)
|
|
||||||
|| scDoc.ch == '.'
|
|
||||||
|| IsANumericBaseCharacter(scDoc.ch, bCaseSensitive))) {
|
|
||||||
// If the number was a real
|
|
||||||
if (SetNumericConstantState(scDoc)) {
|
|
||||||
// Colour the matched string to the real constant state
|
|
||||||
scDoc.ChangeState(SCE_CLW_REAL_CONSTANT);
|
|
||||||
}
|
|
||||||
// Else the number was an integer
|
|
||||||
else {
|
|
||||||
// Colour the matched string to an integer constant state
|
|
||||||
scDoc.ChangeState(SCE_CLW_INTEGER_CONSTANT);
|
|
||||||
}
|
|
||||||
// Terminate the integer constant state and set to default state
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
//
|
|
||||||
|
|
||||||
// Beginning of Line Handling
|
|
||||||
if (scDoc.atLineStart) {
|
|
||||||
// If column 1 character is a label start character
|
|
||||||
if (IsALabelStart(scDoc.ch)) {
|
|
||||||
// Set the state to label
|
|
||||||
scDoc.SetState(SCE_CLW_LABEL);
|
|
||||||
}
|
|
||||||
// else if character is a space or tab
|
|
||||||
else if (IsASpace(scDoc.ch)){
|
|
||||||
// Set to default state
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
// else if the start of a comment or is an * (asterisk)
|
|
||||||
else if (IsACommentStart(scDoc) || scDoc.ch == '*' ) {
|
|
||||||
// then set the state to comment.
|
|
||||||
scDoc.SetState(SCE_CLW_COMMENT);
|
|
||||||
}
|
|
||||||
// else the character is a ? (question mark)
|
|
||||||
else if (scDoc.ch == '?') {
|
|
||||||
// Change to the compiler directive state, move forward,
|
|
||||||
// colouring the ? (question mark), change back to default state.
|
|
||||||
scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
|
|
||||||
scDoc.Forward();
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
// else an invalid character in column 1
|
|
||||||
else {
|
|
||||||
// Set to error state
|
|
||||||
scDoc.SetState(SCE_CLW_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// End of Line Handling
|
|
||||||
else if (scDoc.atLineEnd) {
|
|
||||||
// Reset to the default state at the end of each line.
|
|
||||||
scDoc.SetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
// Default Handling
|
|
||||||
else {
|
|
||||||
// If in default state
|
|
||||||
if (scDoc.state == SCE_CLW_DEFAULT) {
|
|
||||||
// If is a letter could be a possible statement
|
|
||||||
if (isalpha(scDoc.ch)) {
|
|
||||||
// Set the state to Clarion Keyword and verify later
|
|
||||||
scDoc.SetState(SCE_CLW_KEYWORD);
|
|
||||||
}
|
|
||||||
// else is a number
|
|
||||||
else if (isdigit(scDoc.ch)) {
|
|
||||||
// Set the state to Integer Constant and verify later
|
|
||||||
scDoc.SetState(SCE_CLW_INTEGER_CONSTANT);
|
|
||||||
}
|
|
||||||
// else if the start of a comment or a | (line continuation)
|
|
||||||
else if (IsACommentStart(scDoc) || scDoc.ch == '|') {
|
|
||||||
// then set the state to comment.
|
|
||||||
scDoc.SetState(SCE_CLW_COMMENT);
|
|
||||||
}
|
|
||||||
// else if the character is a ' (single quote)
|
|
||||||
else if (scDoc.ch == '\'') {
|
|
||||||
// If the character is also a ' (single quote)
|
|
||||||
// Embedded Apostrophe
|
|
||||||
if (scDoc.chNext == '\'') {
|
|
||||||
// Move forward colouring it as default state
|
|
||||||
scDoc.ForwardSetState(SCE_CLW_DEFAULT);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// move to the next character and then set the state to comment.
|
|
||||||
scDoc.ForwardSetState(SCE_CLW_STRING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// else the character is an @ (apersand)
|
|
||||||
else if (scDoc.ch == '@') {
|
|
||||||
// Case insensitive.
|
|
||||||
if (!bCaseSensitive) {
|
|
||||||
// If character is a valid picture token character
|
|
||||||
if (strchr("DEKNPSTdeknpst", scDoc.chNext) != NULL) {
|
|
||||||
// Set to the picture string state
|
|
||||||
scDoc.SetState(SCE_CLW_PICTURE_STRING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Case sensitive
|
|
||||||
else {
|
|
||||||
// If character is a valid picture token character
|
|
||||||
if (strchr("DEKNPST", scDoc.chNext) != NULL) {
|
|
||||||
// Set the picture string state
|
|
||||||
scDoc.SetState(SCE_CLW_PICTURE_STRING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// lexing complete
|
|
||||||
scDoc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clarion Language Case Sensitive Colouring Procedure
|
|
||||||
static void ColouriseClwDocSensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
|
|
||||||
ColouriseClwDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clarion Language Case Insensitive Colouring Procedure
|
|
||||||
static void ColouriseClwDocInsensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
|
|
||||||
ColouriseClwDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clarion Language Folding Procedure
|
|
||||||
#ifdef FOLDING_IMPLEMENTED
|
|
||||||
static void FoldClwDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Word List Descriptions
|
|
||||||
static const char * const rgWordListDescriptions[] = {
|
|
||||||
"Clarion Keywords",
|
|
||||||
"Compiler Directives",
|
|
||||||
"Built-in Procedures and Functions",
|
|
||||||
"Structure and Data Types",
|
|
||||||
"Attributes",
|
|
||||||
"Standard Equates",
|
|
||||||
"Reserved Words",
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Case Sensitive Clarion Language Lexer
|
|
||||||
LexerModule lmClw(SCLEX_CLW, ColouriseClwDocSensitive, "clw", NULL, rgWordListDescriptions);
|
|
||||||
|
|
||||||
// Case Insensitive Clarion Language Lexer
|
|
||||||
LexerModule lmClwNoCase(SCLEX_CLWNOCASE, ColouriseClwDocInsensitive, "clwnocase", NULL, rgWordListDescriptions);
|
|
||||||
@@ -1,404 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexCPP.cxx
|
|
||||||
** Lexer for C++, C, Java, and Javascript.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
#define KEYWORD_BOXHEADER 1
|
|
||||||
#define KEYWORD_FOLDCONTRACTED 2
|
|
||||||
|
|
||||||
static bool IsOKBeforeRE(const int ch) {
|
|
||||||
return (ch == '(') || (ch == '=') || (ch == ',');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsADoxygenChar(const int ch) {
|
|
||||||
return (islower(ch) || ch == '$' || ch == '@' ||
|
|
||||||
ch == '\\' || ch == '&' || ch == '<' ||
|
|
||||||
ch == '>' || ch == '#' || ch == '{' ||
|
|
||||||
ch == '}' || ch == '[' || ch == ']');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsStateComment(const int state) {
|
|
||||||
return ((state == SCE_C_COMMENT) ||
|
|
||||||
(state == SCE_C_COMMENTLINE) ||
|
|
||||||
(state == SCE_C_COMMENTDOC) ||
|
|
||||||
(state == SCE_C_COMMENTDOCKEYWORD) ||
|
|
||||||
(state == SCE_C_COMMENTDOCKEYWORDERROR));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsStateString(const int state) {
|
|
||||||
return ((state == SCE_C_STRING) || (state == SCE_C_VERBATIM));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler, bool caseSensitive) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
WordList &keywords4 = *keywordlists[3];
|
|
||||||
|
|
||||||
bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0;
|
|
||||||
|
|
||||||
// Do not leak onto next line
|
|
||||||
if (initStyle == SCE_C_STRINGEOL)
|
|
||||||
initStyle = SCE_C_DEFAULT;
|
|
||||||
|
|
||||||
int chPrevNonWhite = ' ';
|
|
||||||
int visibleChars = 0;
|
|
||||||
bool lastWordWasUUID = false;
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.atLineStart && (sc.state == SCE_C_STRING)) {
|
|
||||||
// Prevent SCE_C_STRINGEOL from leaking back to previous line
|
|
||||||
sc.SetState(SCE_C_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle line continuation generically.
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\n' || sc.chNext == '\r') {
|
|
||||||
sc.Forward();
|
|
||||||
if (sc.ch == '\r' && sc.chNext == '\n') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_C_OPERATOR) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_C_NUMBER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
|
|
||||||
char s[100];
|
|
||||||
if (caseSensitive) {
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
} else {
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
}
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
lastWordWasUUID = strcmp(s, "uuid") == 0;
|
|
||||||
sc.ChangeState(SCE_C_WORD);
|
|
||||||
} else if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_C_WORD2);
|
|
||||||
} else if (keywords4.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_C_GLOBALCLASS);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_PREPROCESSOR) {
|
|
||||||
if (stylingWithinPreprocessor) {
|
|
||||||
if (IsASpace(sc.ch)) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((sc.atLineEnd) || (sc.Match('/', '*')) || (sc.Match('/', '/'))) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_COMMENT) {
|
|
||||||
if (sc.Match('*', '/')) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_COMMENTDOC) {
|
|
||||||
if (sc.Match('*', '/')) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.ch == '@' || sc.ch == '\\') {
|
|
||||||
sc.SetState(SCE_C_COMMENTDOCKEYWORD);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_COMMENTLINE || sc.state == SCE_C_COMMENTLINEDOC) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_COMMENTDOCKEYWORD) {
|
|
||||||
if (sc.Match('*', '/')) {
|
|
||||||
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR);
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
} else if (!IsADoxygenChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
if (caseSensitive) {
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
} else {
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
}
|
|
||||||
if (!isspace(sc.ch) || !keywords3.InList(s + 1)) {
|
|
||||||
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_C_COMMENTDOC);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_STRING) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_C_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_CHARACTER) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_C_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
visibleChars = 0;
|
|
||||||
} else if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_REGEX) {
|
|
||||||
if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == '/') {
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.ch == '\\') {
|
|
||||||
// Gobble up the quoted character
|
|
||||||
if (sc.chNext == '\\' || sc.chNext == '/') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_VERBATIM) {
|
|
||||||
if (sc.ch == '\"') {
|
|
||||||
if (sc.chNext == '\"') {
|
|
||||||
sc.Forward();
|
|
||||||
} else {
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_C_UUID) {
|
|
||||||
if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_C_DEFAULT) {
|
|
||||||
if (sc.Match('@', '\"')) {
|
|
||||||
sc.SetState(SCE_C_VERBATIM);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
if (lastWordWasUUID) {
|
|
||||||
sc.SetState(SCE_C_UUID);
|
|
||||||
lastWordWasUUID = false;
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_C_NUMBER);
|
|
||||||
}
|
|
||||||
} else if (IsAWordStart(sc.ch) || (sc.ch == '@')) {
|
|
||||||
if (lastWordWasUUID) {
|
|
||||||
sc.SetState(SCE_C_UUID);
|
|
||||||
lastWordWasUUID = false;
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_C_IDENTIFIER);
|
|
||||||
}
|
|
||||||
} else if (sc.Match('/', '*')) {
|
|
||||||
if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style
|
|
||||||
sc.SetState(SCE_C_COMMENTDOC);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_C_COMMENT);
|
|
||||||
}
|
|
||||||
sc.Forward(); // Eat the * so it isn't used for the end of the comment
|
|
||||||
} else if (sc.Match('/', '/')) {
|
|
||||||
if (sc.Match("///") || sc.Match("//!")) // Support of Qt/Doxygen doc. style
|
|
||||||
sc.SetState(SCE_C_COMMENTLINEDOC);
|
|
||||||
else
|
|
||||||
sc.SetState(SCE_C_COMMENTLINE);
|
|
||||||
} else if (sc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) {
|
|
||||||
sc.SetState(SCE_C_REGEX);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_C_STRING);
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.SetState(SCE_C_CHARACTER);
|
|
||||||
} else if (sc.ch == '#' && visibleChars == 0) {
|
|
||||||
// Preprocessor commands are alone on their line
|
|
||||||
sc.SetState(SCE_C_PREPROCESSOR);
|
|
||||||
// Skip whitespace between # and preprocessor word
|
|
||||||
do {
|
|
||||||
sc.Forward();
|
|
||||||
} while ((sc.ch == ' ' || sc.ch == '\t') && sc.More());
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (isoperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_C_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
// Reset states to begining of colourise so no surprises
|
|
||||||
// if different sets of lines lexed.
|
|
||||||
chPrevNonWhite = ' ';
|
|
||||||
visibleChars = 0;
|
|
||||||
lastWordWasUUID = false;
|
|
||||||
}
|
|
||||||
if (!IsASpace(sc.ch)) {
|
|
||||||
chPrevNonWhite = sc.ch;
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsStreamCommentStyle(int style) {
|
|
||||||
return style == SCE_C_COMMENT ||
|
|
||||||
style == SCE_C_COMMENTDOC ||
|
|
||||||
style == SCE_C_COMMENTDOCKEYWORD ||
|
|
||||||
style == SCE_C_COMMENTDOCKEYWORDERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store both the current line's fold level and the next lines in the
|
|
||||||
// level store to make it easy to pick up with each increment
|
|
||||||
// and to make it possible to fiddle the current level for "} else {".
|
|
||||||
static void FoldNoBoxCppDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
Accessor &styler) {
|
|
||||||
bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
bool foldPreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0;
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelCurrent = SC_FOLDLEVELBASE;
|
|
||||||
if (lineCurrent > 0)
|
|
||||||
levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
|
|
||||||
int levelMinCurrent = levelCurrent;
|
|
||||||
int levelNext = levelCurrent;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style = initStyle;
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (foldComment && IsStreamCommentStyle(style)) {
|
|
||||||
if (!IsStreamCommentStyle(stylePrev)) {
|
|
||||||
levelNext++;
|
|
||||||
} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {
|
|
||||||
// Comments don't end at end of line and the next character may be unstyled.
|
|
||||||
levelNext--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (foldComment && (style == SCE_C_COMMENTLINE)) {
|
|
||||||
if ((ch == '/') && (chNext == '/')) {
|
|
||||||
char chNext2 = styler.SafeGetCharAt(i + 2);
|
|
||||||
if (chNext2 == '{') {
|
|
||||||
levelNext++;
|
|
||||||
} else if (chNext2 == '}') {
|
|
||||||
levelNext--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (foldPreprocessor && (style == SCE_C_PREPROCESSOR)) {
|
|
||||||
if (ch == '#') {
|
|
||||||
unsigned int j = i + 1;
|
|
||||||
while ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
if (styler.Match(j, "region") || styler.Match(j, "if")) {
|
|
||||||
levelNext++;
|
|
||||||
} else if (styler.Match(j, "end")) {
|
|
||||||
levelNext--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (style == SCE_C_OPERATOR) {
|
|
||||||
if (ch == '{') {
|
|
||||||
// Measure the minimum before a '{' to allow
|
|
||||||
// folding on "} else {"
|
|
||||||
if (levelMinCurrent > levelNext) {
|
|
||||||
levelMinCurrent = levelNext;
|
|
||||||
}
|
|
||||||
levelNext++;
|
|
||||||
} else if (ch == '}') {
|
|
||||||
levelNext--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int levelUse = levelCurrent;
|
|
||||||
if (foldAtElse) {
|
|
||||||
levelUse = levelMinCurrent;
|
|
||||||
}
|
|
||||||
int lev = levelUse | levelNext << 16;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if (levelUse < levelNext)
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelCurrent = levelNext;
|
|
||||||
levelMinCurrent = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldCppDoc(unsigned int startPos, int length, int initStyle, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
FoldNoBoxCppDoc(startPos, length, initStyle, styler);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const cppWordLists[] = {
|
|
||||||
"Primary keywords and identifiers",
|
|
||||||
"Secondary keywords and identifiers",
|
|
||||||
"Documentation comment keywords",
|
|
||||||
"Unused",
|
|
||||||
"Global classes and typedefs",
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ColouriseCppDocSensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
ColouriseCppDoc(startPos, length, initStyle, keywordlists, styler, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseCppDocInsensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
ColouriseCppDoc(startPos, length, initStyle, keywordlists, styler, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerModule lmCPP(SCLEX_CPP, ColouriseCppDocSensitive, "cpp", FoldCppDoc, cppWordLists);
|
|
||||||
LexerModule lmCPPNoCase(SCLEX_CPPNOCASE, ColouriseCppDocInsensitive, "cppnocase", FoldCppDoc, cppWordLists);
|
|
||||||
LexerModule lmTCL(SCLEX_TCL, ColouriseCppDocSensitive, "tcl", FoldCppDoc, cppWordLists);
|
|
||||||
@@ -1,261 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexCSS.cxx
|
|
||||||
** Lexer for Cascade Style Sheets
|
|
||||||
** Written by Jakub Vr<56>na
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const unsigned int ch) {
|
|
||||||
return (isalnum(ch) || ch == '-' || ch == '_' || ch >= 161); // _ is not in fact correct CSS word-character
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool IsCssOperator(const char ch) {
|
|
||||||
if (!isalnum(ch) && (ch == '{' || ch == '}' || ch == ':' || ch == ',' || ch == ';' || ch == '.' || ch == '#' || ch == '!' || ch == '@'))
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseCssDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) {
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &pseudoClasses = *keywordlists[1];
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
int lastState = -1; // before operator
|
|
||||||
int lastStateC = -1; // before comment
|
|
||||||
int op = ' '; // last operator
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
if (sc.state == SCE_CSS_COMMENT && sc.Match('*', '/')) {
|
|
||||||
if (lastStateC == -1) {
|
|
||||||
// backtrack to get last state
|
|
||||||
unsigned int i = startPos;
|
|
||||||
for (; i > 0; i--) {
|
|
||||||
if ((lastStateC = styler.StyleAt(i-1)) != SCE_CSS_COMMENT) {
|
|
||||||
if (lastStateC == SCE_CSS_OPERATOR) {
|
|
||||||
op = styler.SafeGetCharAt(i-1);
|
|
||||||
while (--i) {
|
|
||||||
lastState = styler.StyleAt(i-1);
|
|
||||||
if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i == 0)
|
|
||||||
lastState = SCE_CSS_DEFAULT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i == 0)
|
|
||||||
lastStateC = SCE_CSS_DEFAULT;
|
|
||||||
}
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(lastStateC);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_CSS_COMMENT)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (sc.state == SCE_CSS_DOUBLESTRING || sc.state == SCE_CSS_SINGLESTRING) {
|
|
||||||
if (sc.ch != (sc.state == SCE_CSS_DOUBLESTRING ? '\"' : '\''))
|
|
||||||
continue;
|
|
||||||
unsigned int i = sc.currentPos;
|
|
||||||
while (i && styler[i-1] == '\\')
|
|
||||||
i--;
|
|
||||||
if ((sc.currentPos - i) % 2 == 1)
|
|
||||||
continue;
|
|
||||||
sc.ForwardSetState(SCE_CSS_VALUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_CSS_OPERATOR) {
|
|
||||||
if (op == ' ') {
|
|
||||||
unsigned int i = startPos;
|
|
||||||
op = styler.SafeGetCharAt(i-1);
|
|
||||||
while (--i) {
|
|
||||||
lastState = styler.StyleAt(i-1);
|
|
||||||
if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (op) {
|
|
||||||
case '@':
|
|
||||||
if (lastState == SCE_CSS_DEFAULT)
|
|
||||||
sc.SetState(SCE_CSS_DIRECTIVE);
|
|
||||||
break;
|
|
||||||
case '{':
|
|
||||||
if (lastState == SCE_CSS_DIRECTIVE)
|
|
||||||
sc.SetState(SCE_CSS_DEFAULT);
|
|
||||||
else if (lastState == SCE_CSS_TAG)
|
|
||||||
sc.SetState(SCE_CSS_IDENTIFIER);
|
|
||||||
break;
|
|
||||||
case '}':
|
|
||||||
if (lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT || lastState == SCE_CSS_IDENTIFIER)
|
|
||||||
sc.SetState(SCE_CSS_DEFAULT);
|
|
||||||
break;
|
|
||||||
case ':':
|
|
||||||
if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_DEFAULT ||
|
|
||||||
lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS)
|
|
||||||
sc.SetState(SCE_CSS_PSEUDOCLASS);
|
|
||||||
else if (lastState == SCE_CSS_IDENTIFIER || lastState == SCE_CSS_UNKNOWN_IDENTIFIER)
|
|
||||||
sc.SetState(SCE_CSS_VALUE);
|
|
||||||
break;
|
|
||||||
case '.':
|
|
||||||
if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT)
|
|
||||||
sc.SetState(SCE_CSS_CLASS);
|
|
||||||
break;
|
|
||||||
case '#':
|
|
||||||
if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT)
|
|
||||||
sc.SetState(SCE_CSS_ID);
|
|
||||||
break;
|
|
||||||
case ',':
|
|
||||||
if (lastState == SCE_CSS_TAG)
|
|
||||||
sc.SetState(SCE_CSS_DEFAULT);
|
|
||||||
break;
|
|
||||||
case ';':
|
|
||||||
if (lastState == SCE_CSS_DIRECTIVE)
|
|
||||||
sc.SetState(SCE_CSS_DEFAULT);
|
|
||||||
else if (lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT)
|
|
||||||
sc.SetState(SCE_CSS_IDENTIFIER);
|
|
||||||
break;
|
|
||||||
case '!':
|
|
||||||
if (lastState == SCE_CSS_VALUE)
|
|
||||||
sc.SetState(SCE_CSS_IMPORTANT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsAWordChar(sc.ch)) {
|
|
||||||
if (sc.state == SCE_CSS_DEFAULT)
|
|
||||||
sc.SetState(SCE_CSS_TAG);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsAWordChar(sc.chPrev) && (
|
|
||||||
sc.state == SCE_CSS_IDENTIFIER || sc.state == SCE_CSS_UNKNOWN_IDENTIFIER
|
|
||||||
|| sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS
|
|
||||||
|| sc.state == SCE_CSS_IMPORTANT
|
|
||||||
)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
char *s2 = s;
|
|
||||||
while (*s2 && !IsAWordChar(*s2))
|
|
||||||
s2++;
|
|
||||||
switch (sc.state) {
|
|
||||||
case SCE_CSS_IDENTIFIER:
|
|
||||||
if (!keywords.InList(s2))
|
|
||||||
sc.ChangeState(SCE_CSS_UNKNOWN_IDENTIFIER);
|
|
||||||
break;
|
|
||||||
case SCE_CSS_UNKNOWN_IDENTIFIER:
|
|
||||||
if (keywords.InList(s2))
|
|
||||||
sc.ChangeState(SCE_CSS_IDENTIFIER);
|
|
||||||
break;
|
|
||||||
case SCE_CSS_PSEUDOCLASS:
|
|
||||||
if (!pseudoClasses.InList(s2))
|
|
||||||
sc.ChangeState(SCE_CSS_UNKNOWN_PSEUDOCLASS);
|
|
||||||
break;
|
|
||||||
case SCE_CSS_UNKNOWN_PSEUDOCLASS:
|
|
||||||
if (pseudoClasses.InList(s2))
|
|
||||||
sc.ChangeState(SCE_CSS_PSEUDOCLASS);
|
|
||||||
break;
|
|
||||||
case SCE_CSS_IMPORTANT:
|
|
||||||
if (strcmp(s2, "important") != 0)
|
|
||||||
sc.ChangeState(SCE_CSS_VALUE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.ch != '.' && sc.ch != ':' && sc.ch != '#' && (sc.state == SCE_CSS_CLASS || sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS || sc.state == SCE_CSS_ID))
|
|
||||||
sc.SetState(SCE_CSS_TAG);
|
|
||||||
|
|
||||||
if (sc.Match('/', '*')) {
|
|
||||||
lastStateC = sc.state;
|
|
||||||
sc.SetState(SCE_CSS_COMMENT);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.state == SCE_CSS_VALUE && (sc.ch == '\"' || sc.ch == '\'')) {
|
|
||||||
sc.SetState((sc.ch == '\"' ? SCE_CSS_DOUBLESTRING : SCE_CSS_SINGLESTRING));
|
|
||||||
} else if (IsCssOperator(static_cast<char>(sc.ch))
|
|
||||||
&& (sc.state != SCE_CSS_VALUE || sc.ch == ';' || sc.ch == '}' || sc.ch == '!')
|
|
||||||
&& (sc.state != SCE_CSS_DIRECTIVE || sc.ch == ';' || sc.ch == '{')
|
|
||||||
) {
|
|
||||||
if (sc.state != SCE_CSS_OPERATOR)
|
|
||||||
lastState = sc.state;
|
|
||||||
sc.SetState(SCE_CSS_OPERATOR);
|
|
||||||
op = sc.ch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldCSSDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
bool inComment = (styler.StyleAt(startPos-1) == SCE_CSS_COMMENT);
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styler.StyleAt(i);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (foldComment) {
|
|
||||||
if (!inComment && (style == SCE_CSS_COMMENT))
|
|
||||||
levelCurrent++;
|
|
||||||
else if (inComment && (style != SCE_CSS_COMMENT))
|
|
||||||
levelCurrent--;
|
|
||||||
inComment = (style == SCE_CSS_COMMENT);
|
|
||||||
}
|
|
||||||
if (style == SCE_CSS_OPERATOR) {
|
|
||||||
if (ch == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const cssWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
"Pseudo classes",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmCss(SCLEX_CSS, ColouriseCssDoc, "css", FoldCSSDoc, cssWordListDesc);
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexConf.cxx
|
|
||||||
** Lexer for Apache Configuration Files.
|
|
||||||
**
|
|
||||||
** First working version contributed by Ahmad Zawawi <zeus_go64@hotmail.com> on October 28, 2000.
|
|
||||||
** i created this lexer because i needed something pretty when dealing
|
|
||||||
** when Apache Configuration files...
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static void ColouriseConfDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
|
|
||||||
{
|
|
||||||
int state = SCE_CONF_DEFAULT;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
// create a buffer large enough to take the largest chunk...
|
|
||||||
char *buffer = new char[length];
|
|
||||||
int bufferCount = 0;
|
|
||||||
|
|
||||||
// this assumes that we have 2 keyword list in conf.properties
|
|
||||||
WordList &directives = *keywordLists[0];
|
|
||||||
WordList ¶ms = *keywordLists[1];
|
|
||||||
|
|
||||||
// go through all provided text segment
|
|
||||||
// using the hand-written state machine shown below
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
for (int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch(state) {
|
|
||||||
case SCE_CONF_DEFAULT:
|
|
||||||
if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') {
|
|
||||||
// whitespace is simply ignored here...
|
|
||||||
styler.ColourTo(i,SCE_CONF_DEFAULT);
|
|
||||||
break;
|
|
||||||
} else if( ch == '#' ) {
|
|
||||||
// signals the start of a comment...
|
|
||||||
state = SCE_CONF_COMMENT;
|
|
||||||
styler.ColourTo(i,SCE_CONF_COMMENT);
|
|
||||||
} else if( ch == '.' /*|| ch == '/'*/) {
|
|
||||||
// signals the start of a file...
|
|
||||||
state = SCE_CONF_EXTENSION;
|
|
||||||
styler.ColourTo(i,SCE_CONF_EXTENSION);
|
|
||||||
} else if( ch == '"') {
|
|
||||||
state = SCE_CONF_STRING;
|
|
||||||
styler.ColourTo(i,SCE_CONF_STRING);
|
|
||||||
} else if( ispunct(ch) ) {
|
|
||||||
// signals an operator...
|
|
||||||
// no state jump necessary for this
|
|
||||||
// simple case...
|
|
||||||
styler.ColourTo(i,SCE_CONF_OPERATOR);
|
|
||||||
} else if( isalpha(ch) ) {
|
|
||||||
// signals the start of an identifier
|
|
||||||
bufferCount = 0;
|
|
||||||
buffer[bufferCount++] = static_cast<char>(tolower(ch));
|
|
||||||
state = SCE_CONF_IDENTIFIER;
|
|
||||||
} else if( isdigit(ch) ) {
|
|
||||||
// signals the start of a number
|
|
||||||
bufferCount = 0;
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
//styler.ColourTo(i,SCE_CONF_NUMBER);
|
|
||||||
state = SCE_CONF_NUMBER;
|
|
||||||
} else {
|
|
||||||
// style it the default style..
|
|
||||||
styler.ColourTo(i,SCE_CONF_DEFAULT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_CONF_COMMENT:
|
|
||||||
// if we find a newline here,
|
|
||||||
// we simply go to default state
|
|
||||||
// else continue to work on it...
|
|
||||||
if( ch == '\n' || ch == '\r' ) {
|
|
||||||
state = SCE_CONF_DEFAULT;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i,SCE_CONF_COMMENT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_CONF_EXTENSION:
|
|
||||||
// if we find a non-alphanumeric char,
|
|
||||||
// we simply go to default state
|
|
||||||
// else we're still dealing with an extension...
|
|
||||||
if( isalnum(ch) || (ch == '_') ||
|
|
||||||
(ch == '-') || (ch == '$') ||
|
|
||||||
(ch == '/') || (ch == '.') || (ch == '*') )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i,SCE_CONF_EXTENSION);
|
|
||||||
} else {
|
|
||||||
state = SCE_CONF_DEFAULT;
|
|
||||||
chNext = styler[i--];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_CONF_STRING:
|
|
||||||
// if we find the end of a string char, we simply go to default state
|
|
||||||
// else we're still dealing with an string...
|
|
||||||
if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || (ch == '\n') || (ch == '\r') ) {
|
|
||||||
state = SCE_CONF_DEFAULT;
|
|
||||||
}
|
|
||||||
styler.ColourTo(i,SCE_CONF_STRING);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_CONF_IDENTIFIER:
|
|
||||||
// stay in CONF_IDENTIFIER state until we find a non-alphanumeric
|
|
||||||
if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) {
|
|
||||||
buffer[bufferCount++] = static_cast<char>(tolower(ch));
|
|
||||||
} else {
|
|
||||||
state = SCE_CONF_DEFAULT;
|
|
||||||
buffer[bufferCount] = '\0';
|
|
||||||
|
|
||||||
// check if the buffer contains a keyword, and highlight it if it is a keyword...
|
|
||||||
if(directives.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_CONF_DIRECTIVE );
|
|
||||||
} else if(params.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_CONF_PARAMETER );
|
|
||||||
} else if(strchr(buffer,'/') || strchr(buffer,'.')) {
|
|
||||||
styler.ColourTo(i-1,SCE_CONF_EXTENSION);
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i-1,SCE_CONF_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
// push back the faulty character
|
|
||||||
chNext = styler[i--];
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_CONF_NUMBER:
|
|
||||||
// stay in CONF_NUMBER state until we find a non-numeric
|
|
||||||
if( isdigit(ch) || ch == '.') {
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
} else {
|
|
||||||
state = SCE_CONF_DEFAULT;
|
|
||||||
buffer[bufferCount] = '\0';
|
|
||||||
|
|
||||||
// Colourize here...
|
|
||||||
if( strchr(buffer,'.') ) {
|
|
||||||
// it is an IP address...
|
|
||||||
styler.ColourTo(i-1,SCE_CONF_IP);
|
|
||||||
} else {
|
|
||||||
// normal number
|
|
||||||
styler.ColourTo(i-1,SCE_CONF_NUMBER);
|
|
||||||
}
|
|
||||||
|
|
||||||
// push back a character
|
|
||||||
chNext = styler[i--];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete []buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const confWordListDesc[] = {
|
|
||||||
"Directives",
|
|
||||||
"Parameters",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf", 0, confWordListDesc);
|
|
||||||
@@ -1,218 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexCrontab.cxx
|
|
||||||
** Lexer to use with extended crontab files used by a powerful
|
|
||||||
** Windows scheduler/event monitor/automation manager nnCron.
|
|
||||||
** (http://nemtsev.eserv.ru/)
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList
|
|
||||||
*keywordLists[], Accessor &styler)
|
|
||||||
{
|
|
||||||
int state = SCE_NNCRONTAB_DEFAULT;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
// create a buffer large enough to take the largest chunk...
|
|
||||||
char *buffer = new char[length];
|
|
||||||
int bufferCount = 0;
|
|
||||||
// used when highliting environment variables inside quoted string:
|
|
||||||
bool insideString = false;
|
|
||||||
|
|
||||||
// this assumes that we have 3 keyword list in conf.properties
|
|
||||||
WordList §ion = *keywordLists[0];
|
|
||||||
WordList &keyword = *keywordLists[1];
|
|
||||||
WordList &modifier = *keywordLists[2];
|
|
||||||
|
|
||||||
// go through all provided text segment
|
|
||||||
// using the hand-written state machine shown below
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
for (int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch(state) {
|
|
||||||
case SCE_NNCRONTAB_DEFAULT:
|
|
||||||
if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') {
|
|
||||||
// whitespace is simply ignored here...
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);
|
|
||||||
break;
|
|
||||||
} else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') {
|
|
||||||
// signals the start of a task...
|
|
||||||
state = SCE_NNCRONTAB_TASK;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
|
|
||||||
}
|
|
||||||
else if( ch == '\\' && (styler.SafeGetCharAt(i+1) == ' ' ||
|
|
||||||
styler.SafeGetCharAt(i+1) == '\t')) {
|
|
||||||
// signals the start of an extended comment...
|
|
||||||
state = SCE_NNCRONTAB_COMMENT;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
|
|
||||||
} else if( ch == '#' ) {
|
|
||||||
// signals the start of a plain comment...
|
|
||||||
state = SCE_NNCRONTAB_COMMENT;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
|
|
||||||
} else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') {
|
|
||||||
// signals the end of a task...
|
|
||||||
state = SCE_NNCRONTAB_TASK;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
|
|
||||||
} else if( ch == '"') {
|
|
||||||
state = SCE_NNCRONTAB_STRING;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_STRING);
|
|
||||||
} else if( ch == '%') {
|
|
||||||
// signals environment variables
|
|
||||||
state = SCE_NNCRONTAB_ENVIRONMENT;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);
|
|
||||||
} else if( ch == '<' && styler.SafeGetCharAt(i+1) == '%') {
|
|
||||||
// signals environment variables
|
|
||||||
state = SCE_NNCRONTAB_ENVIRONMENT;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);
|
|
||||||
} else if( ch == '*' ) {
|
|
||||||
// signals an asterisk
|
|
||||||
// no state jump necessary for this simple case...
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_ASTERISK);
|
|
||||||
} else if( isalpha(ch) || ch == '<' ) {
|
|
||||||
// signals the start of an identifier
|
|
||||||
bufferCount = 0;
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
state = SCE_NNCRONTAB_IDENTIFIER;
|
|
||||||
} else if( isdigit(ch) ) {
|
|
||||||
// signals the start of a number
|
|
||||||
bufferCount = 0;
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
state = SCE_NNCRONTAB_NUMBER;
|
|
||||||
} else {
|
|
||||||
// style it the default style..
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_NNCRONTAB_COMMENT:
|
|
||||||
// if we find a newline here,
|
|
||||||
// we simply go to default state
|
|
||||||
// else continue to work on it...
|
|
||||||
if( ch == '\n' || ch == '\r' ) {
|
|
||||||
state = SCE_NNCRONTAB_DEFAULT;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_NNCRONTAB_TASK:
|
|
||||||
// if we find a newline here,
|
|
||||||
// we simply go to default state
|
|
||||||
// else continue to work on it...
|
|
||||||
if( ch == '\n' || ch == '\r' ) {
|
|
||||||
state = SCE_NNCRONTAB_DEFAULT;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_NNCRONTAB_STRING:
|
|
||||||
if( ch == '%' ) {
|
|
||||||
state = SCE_NNCRONTAB_ENVIRONMENT;
|
|
||||||
insideString = true;
|
|
||||||
styler.ColourTo(i-1,SCE_NNCRONTAB_STRING);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// if we find the end of a string char, we simply go to default state
|
|
||||||
// else we're still dealing with an string...
|
|
||||||
if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') ||
|
|
||||||
(ch == '\n') || (ch == '\r') ) {
|
|
||||||
state = SCE_NNCRONTAB_DEFAULT;
|
|
||||||
}
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_STRING);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_NNCRONTAB_ENVIRONMENT:
|
|
||||||
// if we find the end of a string char, we simply go to default state
|
|
||||||
// else we're still dealing with an string...
|
|
||||||
if( ch == '%' && insideString ) {
|
|
||||||
state = SCE_NNCRONTAB_STRING;
|
|
||||||
insideString = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\')
|
|
||||||
|| (ch == '\n') || (ch == '\r') || (ch == '>') ) {
|
|
||||||
state = SCE_NNCRONTAB_DEFAULT;
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
styler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_NNCRONTAB_IDENTIFIER:
|
|
||||||
// stay in CONF_IDENTIFIER state until we find a non-alphanumeric
|
|
||||||
if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') ||
|
|
||||||
(ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') ||
|
|
||||||
(ch == '@') ) {
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
} else {
|
|
||||||
state = SCE_NNCRONTAB_DEFAULT;
|
|
||||||
buffer[bufferCount] = '\0';
|
|
||||||
|
|
||||||
// check if the buffer contains a keyword,
|
|
||||||
// and highlight it if it is a keyword...
|
|
||||||
if(section.InList(buffer)) {
|
|
||||||
styler.ColourTo(i,SCE_NNCRONTAB_SECTION );
|
|
||||||
} else if(keyword.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD );
|
|
||||||
} // else if(strchr(buffer,'/') || strchr(buffer,'.')) {
|
|
||||||
// styler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION);
|
|
||||||
// }
|
|
||||||
else if(modifier.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER );
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT);
|
|
||||||
}
|
|
||||||
// push back the faulty character
|
|
||||||
chNext = styler[i--];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_NNCRONTAB_NUMBER:
|
|
||||||
// stay in CONF_NUMBER state until we find a non-numeric
|
|
||||||
if( isdigit(ch) /* || ch == '.' */ ) {
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
} else {
|
|
||||||
state = SCE_NNCRONTAB_DEFAULT;
|
|
||||||
buffer[bufferCount] = '\0';
|
|
||||||
// Colourize here... (normal number)
|
|
||||||
styler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER);
|
|
||||||
// push back a character
|
|
||||||
chNext = styler[i--];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete []buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const cronWordListDesc[] = {
|
|
||||||
"Section keywords and Forth words",
|
|
||||||
"nnCrontab keywords",
|
|
||||||
"Modifiers",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, "nncrontab", 0, cronWordListDesc);
|
|
||||||
@@ -1,270 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexESCRIPT.cxx
|
|
||||||
** Lexer for ESCRIPT
|
|
||||||
**/
|
|
||||||
// Copyright 2003 by Patrizio Bekerle (patrizio@bekerle.com)
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ColouriseESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
|
|
||||||
// Do not leak onto next line
|
|
||||||
/*if (initStyle == SCE_ESCRIPT_STRINGEOL)
|
|
||||||
initStyle = SCE_ESCRIPT_DEFAULT;*/
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
bool caseSensitive = styler.GetPropertyInt("escript.case.sensitive", 0) != 0;
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
/*if (sc.atLineStart && (sc.state == SCE_ESCRIPT_STRING)) {
|
|
||||||
// Prevent SCE_ESCRIPT_STRINGEOL from leaking back to previous line
|
|
||||||
sc.SetState(SCE_ESCRIPT_STRING);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Handle line continuation generically.
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\n' || sc.chNext == '\r') {
|
|
||||||
sc.Forward();
|
|
||||||
if (sc.ch == '\r' && sc.chNext == '\n') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_ESCRIPT_OPERATOR || sc.state == SCE_ESCRIPT_BRACE) {
|
|
||||||
sc.SetState(SCE_ESCRIPT_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_ESCRIPT_NUMBER) {
|
|
||||||
if (!IsADigit(sc.ch) || sc.ch != '.') {
|
|
||||||
sc.SetState(SCE_ESCRIPT_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ESCRIPT_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
|
|
||||||
char s[100];
|
|
||||||
if (caseSensitive) {
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
} else {
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
// sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ESCRIPT_WORD);
|
|
||||||
} else if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ESCRIPT_WORD2);
|
|
||||||
} else if (keywords3.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ESCRIPT_WORD3);
|
|
||||||
// sc.state = SCE_ESCRIPT_IDENTIFIER;
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_ESCRIPT_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ESCRIPT_COMMENT) {
|
|
||||||
if (sc.Match('*', '/')) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_ESCRIPT_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ESCRIPT_COMMENTDOC) {
|
|
||||||
if (sc.Match('*', '/')) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_ESCRIPT_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ESCRIPT_COMMENTLINE) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_ESCRIPT_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ESCRIPT_STRING) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_ESCRIPT_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_ESCRIPT_DEFAULT) {
|
|
||||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_ESCRIPT_NUMBER);
|
|
||||||
} else if (IsAWordStart(sc.ch) || (sc.ch == '#')) {
|
|
||||||
sc.SetState(SCE_ESCRIPT_IDENTIFIER);
|
|
||||||
} else if (sc.Match('/', '*')) {
|
|
||||||
sc.SetState(SCE_ESCRIPT_COMMENT);
|
|
||||||
sc.Forward(); // Eat the * so it isn't used for the end of the comment
|
|
||||||
} else if (sc.Match('/', '/')) {
|
|
||||||
sc.SetState(SCE_ESCRIPT_COMMENTLINE);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_ESCRIPT_STRING);
|
|
||||||
//} else if (isoperator(static_cast<char>(sc.ch))) {
|
|
||||||
} else if (sc.ch == '+' || sc.ch == '-' || sc.ch == '*' || sc.ch == '/' || sc.ch == '=' || sc.ch == '<' || sc.ch == '>' || sc.ch == '&' || sc.ch == '|' || sc.ch == '!' || sc.ch == '?' || sc.ch == ':') {
|
|
||||||
sc.SetState(SCE_ESCRIPT_OPERATOR);
|
|
||||||
} else if (sc.ch == '{' || sc.ch == '}') {
|
|
||||||
sc.SetState(SCE_ESCRIPT_BRACE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int classifyFoldPointESCRIPT(const char* s, const char* prevWord) {
|
|
||||||
int lev = 0;
|
|
||||||
if (strcmp(prevWord, "end") == 0) return lev;
|
|
||||||
if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (strcmp(s, "for") == 0 || strcmp(s, "foreach") == 0
|
|
||||||
|| strcmp(s, "program") == 0 || strcmp(s, "function") == 0
|
|
||||||
|| strcmp(s, "while") == 0 || strcmp(s, "case") == 0
|
|
||||||
|| strcmp(s, "if") == 0 ) {
|
|
||||||
lev = 1;
|
|
||||||
} else if ( strcmp(s, "endfor") == 0 || strcmp(s, "endforeach") == 0
|
|
||||||
|| strcmp(s, "endprogram") == 0 || strcmp(s, "endfunction") == 0
|
|
||||||
|| strcmp(s, "endwhile") == 0 || strcmp(s, "endcase") == 0
|
|
||||||
|| strcmp(s, "endif") == 0 ) {
|
|
||||||
lev = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lev;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool IsStreamCommentStyle(int style) {
|
|
||||||
return style == SCE_ESCRIPT_COMMENT ||
|
|
||||||
style == SCE_ESCRIPT_COMMENTDOC ||
|
|
||||||
style == SCE_ESCRIPT_COMMENTLINE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) {
|
|
||||||
//~ bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
// Do not know how to fold the comment at the moment.
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
bool foldComment = true;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style = initStyle;
|
|
||||||
|
|
||||||
int lastStart = 0;
|
|
||||||
char prevWord[32] = "";
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
|
|
||||||
|
|
||||||
if (foldComment && IsStreamCommentStyle(style)) {
|
|
||||||
if (!IsStreamCommentStyle(stylePrev)) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {
|
|
||||||
// Comments don't end at end of line and the next character may be unstyled.
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foldComment && (style == SCE_ESCRIPT_COMMENTLINE)) {
|
|
||||||
if ((ch == '/') && (chNext == '/')) {
|
|
||||||
char chNext2 = styler.SafeGetCharAt(i + 2);
|
|
||||||
if (chNext2 == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (chNext2 == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stylePrev == SCE_ESCRIPT_DEFAULT && style == SCE_ESCRIPT_WORD3)
|
|
||||||
{
|
|
||||||
// Store last word start point.
|
|
||||||
lastStart = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (style == SCE_ESCRIPT_WORD3) {
|
|
||||||
if(iswordchar(ch) && !iswordchar(chNext)) {
|
|
||||||
char s[32];
|
|
||||||
unsigned int j;
|
|
||||||
for(j = 0; ( j < 31 ) && ( j < i-lastStart+1 ); j++) {
|
|
||||||
s[j] = static_cast<char>(tolower(styler[lastStart + j]));
|
|
||||||
}
|
|
||||||
s[j] = '\0';
|
|
||||||
levelCurrent += classifyFoldPointESCRIPT(s, prevWord);
|
|
||||||
strcpy(prevWord, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
strcpy(prevWord, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const char * const ESCRIPTWordLists[] = {
|
|
||||||
"Primary keywords and identifiers",
|
|
||||||
"Intrinsic functions",
|
|
||||||
"Extended and user defined functions",
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmESCRIPT(SCLEX_ESCRIPT, ColouriseESCRIPTDoc, "escript", FoldESCRIPTDoc, ESCRIPTWordLists);
|
|
||||||
@@ -1,235 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexEiffel.cxx
|
|
||||||
** Lexer for Eiffel.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool isEiffelOperator(unsigned int ch) {
|
|
||||||
// '.' left out as it is used to make up numbers
|
|
||||||
return ch == '*' || ch == '/' || ch == '\\' || ch == '-' || ch == '+' ||
|
|
||||||
ch == '(' || ch == ')' || ch == '=' ||
|
|
||||||
ch == '{' || ch == '}' || ch == '~' ||
|
|
||||||
ch == '[' || ch == ']' || ch == ';' ||
|
|
||||||
ch == '<' || ch == '>' || ch == ',' ||
|
|
||||||
ch == '.' || ch == '^' || ch == '%' || ch == ':' ||
|
|
||||||
ch == '!' || ch == '@' || ch == '?';
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(unsigned int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(unsigned int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseEiffelDoc(unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.state == SCE_EIFFEL_STRINGEOL) {
|
|
||||||
if (sc.ch != '\r' && sc.ch != '\n') {
|
|
||||||
sc.SetState(SCE_EIFFEL_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_EIFFEL_OPERATOR) {
|
|
||||||
sc.SetState(SCE_EIFFEL_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_EIFFEL_WORD) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
if (!keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_EIFFEL_IDENTIFIER);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_EIFFEL_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_EIFFEL_NUMBER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_EIFFEL_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_EIFFEL_COMMENTLINE) {
|
|
||||||
if (sc.ch == '\r' || sc.ch == '\n') {
|
|
||||||
sc.SetState(SCE_EIFFEL_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_EIFFEL_STRING) {
|
|
||||||
if (sc.ch == '%') {
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.Forward();
|
|
||||||
sc.SetState(SCE_EIFFEL_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_EIFFEL_CHARACTER) {
|
|
||||||
if (sc.ch == '\r' || sc.ch == '\n') {
|
|
||||||
sc.SetState(SCE_EIFFEL_STRINGEOL);
|
|
||||||
} else if (sc.ch == '%') {
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.Forward();
|
|
||||||
sc.SetState(SCE_EIFFEL_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_EIFFEL_DEFAULT) {
|
|
||||||
if (sc.ch == '-' && sc.chNext == '-') {
|
|
||||||
sc.SetState(SCE_EIFFEL_COMMENTLINE);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_EIFFEL_STRING);
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.SetState(SCE_EIFFEL_CHARACTER);
|
|
||||||
} else if (IsADigit(sc.ch) || (sc.ch == '.')) {
|
|
||||||
sc.SetState(SCE_EIFFEL_NUMBER);
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_EIFFEL_WORD);
|
|
||||||
} else if (isEiffelOperator(sc.ch)) {
|
|
||||||
sc.SetState(SCE_EIFFEL_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsEiffelComment(Accessor &styler, int pos, int len) {
|
|
||||||
return len>1 && styler[pos]=='-' && styler[pos+1]=='-';
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldEiffelDocIndent(unsigned int startPos, int length, int,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
|
|
||||||
// Backtrack to previous line in case need to fix its fold status
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (startPos > 0) {
|
|
||||||
if (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
startPos = styler.LineStart(lineCurrent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int spaceFlags = 0;
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsEiffelComment);
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
for (int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
|
|
||||||
int lev = indentCurrent;
|
|
||||||
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsEiffelComment);
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
|
|
||||||
// Only non whitespace lines can be headers
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
|
|
||||||
// Line after is blank so check the next - maybe should continue further?
|
|
||||||
int spaceFlags2 = 0;
|
|
||||||
int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsEiffelComment);
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
indentCurrent = indentNext;
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
lineCurrent++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldEiffelDocKeyWords(unsigned int startPos, int length, int /* initStyle */, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int stylePrev = 0;
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
// lastDeferred should be determined by looking back to last keyword in case
|
|
||||||
// the "deferred" is on a line before "class"
|
|
||||||
bool lastDeferred = false;
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if ((stylePrev != SCE_EIFFEL_WORD) && (style == SCE_EIFFEL_WORD)) {
|
|
||||||
char s[20];
|
|
||||||
unsigned int j = 0;
|
|
||||||
while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) {
|
|
||||||
s[j] = styler[i + j];
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
s[j] = '\0';
|
|
||||||
|
|
||||||
if (
|
|
||||||
(strcmp(s, "check") == 0) ||
|
|
||||||
(strcmp(s, "debug") == 0) ||
|
|
||||||
(strcmp(s, "deferred") == 0) ||
|
|
||||||
(strcmp(s, "do") == 0) ||
|
|
||||||
(strcmp(s, "from") == 0) ||
|
|
||||||
(strcmp(s, "if") == 0) ||
|
|
||||||
(strcmp(s, "inspect") == 0) ||
|
|
||||||
(strcmp(s, "once") == 0)
|
|
||||||
)
|
|
||||||
levelCurrent++;
|
|
||||||
if (!lastDeferred && (strcmp(s, "class") == 0))
|
|
||||||
levelCurrent++;
|
|
||||||
if (strcmp(s, "end") == 0)
|
|
||||||
levelCurrent--;
|
|
||||||
lastDeferred = strcmp(s, "deferred") == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
stylePrev = style;
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const eiffelWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmEiffel(SCLEX_EIFFEL, ColouriseEiffelDoc, "eiffel", FoldEiffelDocIndent, eiffelWordListDesc);
|
|
||||||
LexerModule lmEiffelkw(SCLEX_EIFFELKW, ColouriseEiffelDoc, "eiffelkw", FoldEiffelDocKeyWords, eiffelWordListDesc);
|
|
||||||
@@ -1,522 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexErlang.cxx
|
|
||||||
** Lexer for Erlang.
|
|
||||||
** Written by Peter-Henry Mander, based on Matlab lexer by Jos<6F> Fonseca
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
TODO:
|
|
||||||
o _Param should be a new lexical type
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int is_radix(int radix, int ch) {
|
|
||||||
int digit;
|
|
||||||
if ( 16 < radix || 2 > radix ) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ( isdigit(ch) ) {
|
|
||||||
digit = ch - '0';
|
|
||||||
} else if ( isxdigit(ch) ) {
|
|
||||||
digit = toupper(ch) - 'A' + 10;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ( digit < radix ) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
STATE_NULL,
|
|
||||||
ATOM_UNQUOTED,
|
|
||||||
ATOM_QUOTED,
|
|
||||||
ATOM_FUN_NAME,
|
|
||||||
NODE_NAME_UNQUOTED,
|
|
||||||
NODE_NAME_QUOTED,
|
|
||||||
MACRO_START,
|
|
||||||
MACRO_UNQUOTED,
|
|
||||||
MACRO_QUOTED,
|
|
||||||
RECORD_START,
|
|
||||||
RECORD_UNQUOTED,
|
|
||||||
RECORD_QUOTED,
|
|
||||||
NUMERAL_START,
|
|
||||||
NUMERAL_SIGNED,
|
|
||||||
NUMERAL_RADIX_LITERAL,
|
|
||||||
NUMERAL_SPECULATIVE_MANTISSA,
|
|
||||||
NUMERAL_FLOAT_MANTISSA,
|
|
||||||
NUMERAL_FLOAT_EXPONENT,
|
|
||||||
NUMERAL_FLOAT_SIGNED_EXPONENT,
|
|
||||||
PARSE_ERROR
|
|
||||||
} atom_parse_state_t;
|
|
||||||
|
|
||||||
static void ColouriseErlangDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
atom_parse_state_t parse_state = STATE_NULL;
|
|
||||||
int radix_digits = 0;
|
|
||||||
int exponent_digits = 0;
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
if ( STATE_NULL != parse_state ) {
|
|
||||||
switch (parse_state) {
|
|
||||||
case STATE_NULL:
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
break;
|
|
||||||
case ATOM_UNQUOTED:
|
|
||||||
if ( '@' == sc.ch ){
|
|
||||||
parse_state = NODE_NAME_UNQUOTED;
|
|
||||||
} else if ( !isalnum(sc.ch) && sc.ch != '_' ) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_KEYWORD);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else {
|
|
||||||
if ( '/' == sc.ch ) {
|
|
||||||
parse_state = ATOM_FUN_NAME;
|
|
||||||
} else {
|
|
||||||
sc.ChangeState(SCE_ERLANG_ATOM);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ATOM_QUOTED:
|
|
||||||
if ( '@' == sc.ch ){
|
|
||||||
parse_state = NODE_NAME_QUOTED;
|
|
||||||
} else if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_ATOM);
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ATOM_FUN_NAME:
|
|
||||||
if ( !isdigit(sc.ch) ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_FUNCTION_NAME);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NODE_NAME_QUOTED:
|
|
||||||
if ( '@' == sc.ch ) {
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_NODE_NAME);
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NODE_NAME_UNQUOTED:
|
|
||||||
if ( '@' == sc.ch ) {
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else if ( !isalnum(sc.ch) && sc.ch != '_' ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_NODE_NAME);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RECORD_START:
|
|
||||||
if ( '\'' == sc.ch ) {
|
|
||||||
parse_state = RECORD_QUOTED;
|
|
||||||
} else if (isalpha(sc.ch) && islower(sc.ch)) {
|
|
||||||
parse_state = RECORD_UNQUOTED;
|
|
||||||
} else { // error
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RECORD_QUOTED:
|
|
||||||
if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_RECORD);
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RECORD_UNQUOTED:
|
|
||||||
if ( !isalpha(sc.ch) && '_' != sc.ch ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_RECORD);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MACRO_START:
|
|
||||||
if ( '\'' == sc.ch ) {
|
|
||||||
parse_state = MACRO_QUOTED;
|
|
||||||
} else if (isalpha(sc.ch)) {
|
|
||||||
parse_state = MACRO_UNQUOTED;
|
|
||||||
} else { // error
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MACRO_UNQUOTED:
|
|
||||||
if ( !isalpha(sc.ch) && '_' != sc.ch ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_MACRO);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MACRO_QUOTED:
|
|
||||||
if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_MACRO);
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NUMERAL_START:
|
|
||||||
if ( isdigit(sc.ch) ) {
|
|
||||||
radix_digits *= 10;
|
|
||||||
radix_digits += sc.ch - '0'; // Assuming ASCII here!
|
|
||||||
} else if ( '#' == sc.ch ) {
|
|
||||||
if ( 2 > radix_digits || 16 < radix_digits) {
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else {
|
|
||||||
parse_state = NUMERAL_RADIX_LITERAL;
|
|
||||||
}
|
|
||||||
} else if ( '.' == sc.ch && isdigit(sc.chNext)) {
|
|
||||||
radix_digits = 0;
|
|
||||||
parse_state = NUMERAL_FLOAT_MANTISSA;
|
|
||||||
} else if ( 'e' == sc.ch || 'E' == sc.ch ) {
|
|
||||||
exponent_digits = 0;
|
|
||||||
parse_state = NUMERAL_FLOAT_EXPONENT;
|
|
||||||
} else {
|
|
||||||
radix_digits = 0;
|
|
||||||
sc.ChangeState(SCE_ERLANG_NUMBER);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NUMERAL_RADIX_LITERAL:
|
|
||||||
if ( !is_radix(radix_digits,sc.ch) ) {
|
|
||||||
radix_digits = 0;
|
|
||||||
if ( !isalnum(sc.ch) ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_NUMBER);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NUMERAL_FLOAT_MANTISSA:
|
|
||||||
if ( 'e' == sc.ch || 'E' == sc.ch ) {
|
|
||||||
exponent_digits = 0;
|
|
||||||
parse_state = NUMERAL_FLOAT_EXPONENT;
|
|
||||||
} else if ( !isdigit(sc.ch) ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_NUMBER);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NUMERAL_FLOAT_EXPONENT:
|
|
||||||
if ( '-' == sc.ch || '+' == sc.ch ) {
|
|
||||||
parse_state = NUMERAL_FLOAT_SIGNED_EXPONENT;
|
|
||||||
} else if ( !isdigit(sc.ch) ) {
|
|
||||||
if ( 0 < exponent_digits ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_NUMBER);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else {
|
|
||||||
++exponent_digits;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NUMERAL_FLOAT_SIGNED_EXPONENT:
|
|
||||||
if ( !isdigit(sc.ch) ) {
|
|
||||||
if ( 0 < exponent_digits ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_NUMBER);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else {
|
|
||||||
++exponent_digits;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NUMERAL_SIGNED:
|
|
||||||
if ( !isdigit(sc.ch) ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_NUMBER);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else if ( '.' == sc.ch ) {
|
|
||||||
parse_state = NUMERAL_FLOAT_MANTISSA;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NUMERAL_SPECULATIVE_MANTISSA:
|
|
||||||
if ( !isdigit(sc.ch) ) {
|
|
||||||
sc.ChangeState(SCE_ERLANG_OPERATOR);
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
} else {
|
|
||||||
parse_state = NUMERAL_FLOAT_MANTISSA;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PARSE_ERROR:
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
parse_state = STATE_NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ERLANG_OPERATOR) {
|
|
||||||
if (sc.chPrev == '.') {
|
|
||||||
if (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\' || sc.ch == '^') {
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ERLANG_VARIABLE) {
|
|
||||||
if (!isalnum(sc.ch) && sc.ch != '_') {
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ERLANG_STRING) {
|
|
||||||
if (sc.ch == '\"' && sc.chPrev != '\\') {
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ERLANG_COMMENT ) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_ERLANG_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_ERLANG_CHARACTER ) {
|
|
||||||
if ( sc.chPrev == '\\' ) {
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
} else if ( sc.ch != '\\' ) {
|
|
||||||
sc.ForwardSetState(SCE_ERLANG_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_ERLANG_DEFAULT) {
|
|
||||||
if (sc.ch == '%') {
|
|
||||||
sc.SetState(SCE_ERLANG_COMMENT);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_ERLANG_STRING);
|
|
||||||
} else if (sc.ch == '#') {
|
|
||||||
parse_state = RECORD_START;
|
|
||||||
sc.SetState(SCE_ERLANG_UNKNOWN);
|
|
||||||
} else if (sc.ch == '?') {
|
|
||||||
parse_state = MACRO_START;
|
|
||||||
sc.SetState(SCE_ERLANG_UNKNOWN);
|
|
||||||
} else if (sc.ch == '$') {
|
|
||||||
sc.SetState(SCE_ERLANG_CHARACTER);
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
parse_state = ATOM_QUOTED;
|
|
||||||
sc.SetState(SCE_ERLANG_UNKNOWN);
|
|
||||||
} else if ( isdigit(sc.ch) ) {
|
|
||||||
parse_state = NUMERAL_START;
|
|
||||||
radix_digits = sc.ch - '0';
|
|
||||||
sc.SetState(SCE_ERLANG_UNKNOWN);
|
|
||||||
} else if ( '.' == sc.ch ) {
|
|
||||||
parse_state = NUMERAL_SPECULATIVE_MANTISSA;
|
|
||||||
sc.SetState(SCE_ERLANG_UNKNOWN);
|
|
||||||
} else if (isalpha(sc.ch) && isupper(sc.ch)) {
|
|
||||||
sc.SetState(SCE_ERLANG_VARIABLE);
|
|
||||||
} else if (isalpha(sc.ch)) {
|
|
||||||
parse_state = ATOM_UNQUOTED;
|
|
||||||
sc.SetState(SCE_ERLANG_UNKNOWN);
|
|
||||||
} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '\\') {
|
|
||||||
sc.SetState(SCE_ERLANG_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ClassifyFoldPointErlang(
|
|
||||||
Accessor &styler,
|
|
||||||
int styleNext,
|
|
||||||
int keyword_start
|
|
||||||
) {
|
|
||||||
int lev = 0;
|
|
||||||
if ( styler.Match(keyword_start,"case")
|
|
||||||
|| (
|
|
||||||
styler.Match(keyword_start,"fun")
|
|
||||||
&& SCE_ERLANG_FUNCTION_NAME != styleNext)
|
|
||||||
|| styler.Match(keyword_start,"if")
|
|
||||||
|| styler.Match(keyword_start,"query")
|
|
||||||
|| styler.Match(keyword_start,"receive")
|
|
||||||
) {
|
|
||||||
++lev;
|
|
||||||
} else if ( styler.Match(keyword_start,"end") ) {
|
|
||||||
--lev;
|
|
||||||
}
|
|
||||||
return lev;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void FoldErlangDoc(
|
|
||||||
unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList** /*keywordlists*/, Accessor &styler
|
|
||||||
) {
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
//~ int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler.SafeGetCharAt(startPos);
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style = initStyle;
|
|
||||||
int keyword_start = 0;
|
|
||||||
|
|
||||||
bool fold_keywords = true;
|
|
||||||
bool fold_comments = true;
|
|
||||||
bool fold_braces = true;
|
|
||||||
bool fold_function_clauses = false;
|
|
||||||
bool fold_clauses = false;
|
|
||||||
|
|
||||||
//int clause_level = 0;
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
|
|
||||||
if ( (stylePrev != SCE_ERLANG_KEYWORD) && (style == SCE_ERLANG_KEYWORD) ) {
|
|
||||||
keyword_start = i;
|
|
||||||
}
|
|
||||||
if ( fold_keywords ) {
|
|
||||||
if ( (stylePrev == SCE_ERLANG_KEYWORD)
|
|
||||||
&& (style != SCE_ERLANG_KEYWORD)
|
|
||||||
&& (style != SCE_ERLANG_ATOM)
|
|
||||||
) {
|
|
||||||
levelCurrent += ClassifyFoldPointErlang(styler,styleNext,keyword_start);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( fold_comments ) {
|
|
||||||
if (style == SCE_ERLANG_COMMENT) {
|
|
||||||
if ((ch == '%') && (chNext == '{')) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if ((ch == '%') && (chNext == '}')) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( fold_function_clauses ) {
|
|
||||||
if ( (SC_FOLDLEVELBASE == levelCurrent) /*&& (style == SCE_ERLANG_OPERATOR)*/ ) {
|
|
||||||
if ( (ch == '-') && (chNext == '>')) {
|
|
||||||
//~ fprintf(stderr,"levelCurrent=%d\n", levelCurrent);
|
|
||||||
//++clause_level;
|
|
||||||
//~ if ( 0 < clause_level )
|
|
||||||
++levelCurrent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//~ if ( (stylePrev != SCE_ERLANG_RECORD)
|
|
||||||
//~ && (style != SCE_ERLANG_NUMBER)
|
|
||||||
//~ && (style != SCE_ERLANG_STRING)
|
|
||||||
//~ && (style != SCE_ERLANG_COMMENT)
|
|
||||||
//~ ) {
|
|
||||||
if ( (SC_FOLDLEVELBASE+1 == levelCurrent) && (ch == '.') ) {
|
|
||||||
//--clause_level;
|
|
||||||
//~ if ( 0 == clause_level )
|
|
||||||
--levelCurrent;
|
|
||||||
}
|
|
||||||
//~ }
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( fold_clauses ) {
|
|
||||||
if ( (0 < levelCurrent) && (style == SCE_ERLANG_OPERATOR) ) {
|
|
||||||
if ((ch == '-') && (chNext == '>')) {
|
|
||||||
levelCurrent++;
|
|
||||||
}
|
|
||||||
if ( (ch == ';') ) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( (stylePrev != SCE_ERLANG_RECORD)
|
|
||||||
&& (style != SCE_ERLANG_NUMBER)
|
|
||||||
&& (style != SCE_ERLANG_STRING)
|
|
||||||
&& (style != SCE_ERLANG_COMMENT)
|
|
||||||
) {
|
|
||||||
if ( (ch == '.') ) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( (stylePrev == SCE_ERLANG_KEYWORD)
|
|
||||||
&& (style != SCE_ERLANG_KEYWORD)
|
|
||||||
&& (style != SCE_ERLANG_ATOM)
|
|
||||||
&& (
|
|
||||||
styler.Match(keyword_start,"end") // 'end' counted twice if fold_keywords too
|
|
||||||
|| styler.Match(keyword_start,"after") )
|
|
||||||
) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( fold_braces ) {
|
|
||||||
if (style == SCE_ERLANG_OPERATOR) {
|
|
||||||
if ( (ch == '{') || (ch == '(') || (ch == '[') ) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if ( (ch == '}') || (ch == ')') || (ch == ']') ) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
//~ if (visibleChars == 0 && foldCompact)
|
|
||||||
//~ lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
//~ if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
if ((levelCurrent > levelPrev)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
//~ visibleChars = 0;
|
|
||||||
}
|
|
||||||
//~ if (!isspacechar(ch))
|
|
||||||
//~ visibleChars++;
|
|
||||||
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const erlangWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmErlang(
|
|
||||||
SCLEX_ERLANG,
|
|
||||||
ColouriseErlangDoc,
|
|
||||||
"erlang",
|
|
||||||
FoldErlangDoc,
|
|
||||||
erlangWordListDesc);
|
|
||||||
|
|
||||||
@@ -1,348 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexCrontab.cxx
|
|
||||||
** Lexer to use with extended crontab files used by a powerful
|
|
||||||
** Windows scheduler/event monitor/automation manager nnCron.
|
|
||||||
** (http://nemtsev.eserv.ru/)
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
bool is_whitespace(int ch){
|
|
||||||
return ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_blank(int ch){
|
|
||||||
return ch == '\t' || ch == ' ';
|
|
||||||
}
|
|
||||||
//#define FORTH_DEBUG
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
static FILE *f_debug;
|
|
||||||
#define log(x) fputs(f_debug,x);
|
|
||||||
#else
|
|
||||||
#define log(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define STATE_LOCALE
|
|
||||||
#define BL ' '
|
|
||||||
|
|
||||||
static Accessor *st;
|
|
||||||
static int cur_pos,pos1,pos2,pos0,lengthDoc;
|
|
||||||
char *buffer;
|
|
||||||
|
|
||||||
char getChar(bool is_bl){
|
|
||||||
char ch=st->SafeGetCharAt(cur_pos);
|
|
||||||
if(is_bl) if(is_whitespace(ch)) ch=BL;
|
|
||||||
return ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
char getCharBL(){
|
|
||||||
char ch=st->SafeGetCharAt(cur_pos);
|
|
||||||
return ch;
|
|
||||||
}
|
|
||||||
bool is_eol(char ch){
|
|
||||||
return ch=='\n' || ch=='\r';
|
|
||||||
}
|
|
||||||
|
|
||||||
int parse(char ch, bool skip_eol){
|
|
||||||
// pos1 - start pos of word
|
|
||||||
// pos2 - pos after of word
|
|
||||||
// pos0 - start pos
|
|
||||||
char c=0;
|
|
||||||
int len;
|
|
||||||
bool is_bl=ch==BL;
|
|
||||||
pos0=pos1=pos2=cur_pos;
|
|
||||||
for(;cur_pos<lengthDoc && (c=getChar(is_bl))==ch; cur_pos++){
|
|
||||||
if(is_eol(c) && !skip_eol){
|
|
||||||
pos2=pos1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pos1=cur_pos;
|
|
||||||
pos2=pos1;
|
|
||||||
if(cur_pos==lengthDoc) return 0;
|
|
||||||
for(len=0;cur_pos<lengthDoc && (c=getChar(is_bl))!=ch; cur_pos++){
|
|
||||||
if(is_eol(c) && !skip_eol) break;
|
|
||||||
pos2++;
|
|
||||||
buffer[len++]=c;
|
|
||||||
}
|
|
||||||
if(c==ch) pos2--;
|
|
||||||
buffer[len]='\0';
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
fprintf(f_debug,"parse: %c %s\n",ch,buffer);
|
|
||||||
#endif
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _is_number(char *s,int base){
|
|
||||||
for(;*s;s++){
|
|
||||||
int digit=((int)*s)-(int)'0';
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
fprintf(f_debug,"digit: %c %d\n",*s,digit);
|
|
||||||
#endif
|
|
||||||
if(digit>9 && base>10) digit-=7;
|
|
||||||
if(digit<0) return false;
|
|
||||||
if(digit>=base) return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_number(char *s){
|
|
||||||
if(strncmp(s,"0x",2)==0) return _is_number(s+2,16);
|
|
||||||
return _is_number(s,10);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseForthDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
|
|
||||||
{
|
|
||||||
st=&styler;
|
|
||||||
cur_pos=startPos;
|
|
||||||
lengthDoc = startPos + length;
|
|
||||||
buffer = new char[length];
|
|
||||||
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
f_debug=fopen("c:\\sci.log","at");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WordList &control = *keywordLists[0];
|
|
||||||
WordList &keyword = *keywordLists[1];
|
|
||||||
WordList &defword = *keywordLists[2];
|
|
||||||
WordList &preword1 = *keywordLists[3];
|
|
||||||
WordList &preword2 = *keywordLists[4];
|
|
||||||
WordList &strings = *keywordLists[5];
|
|
||||||
|
|
||||||
// go through all provided text segment
|
|
||||||
// using the hand-written state machine shown below
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
while(parse(BL,true)!=0){
|
|
||||||
if(pos0!=pos1){
|
|
||||||
styler.ColourTo(pos0,SCE_FORTH_DEFAULT);
|
|
||||||
styler.ColourTo(pos1-1,SCE_FORTH_DEFAULT);
|
|
||||||
}
|
|
||||||
if(strcmp("\\",buffer)==0){
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_COMMENT);
|
|
||||||
parse(1,false);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_COMMENT);
|
|
||||||
}else if(strcmp("(",buffer)==0){
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_COMMENT);
|
|
||||||
parse(')',true);
|
|
||||||
if(cur_pos<lengthDoc) cur_pos++;
|
|
||||||
styler.ColourTo(cur_pos,SCE_FORTH_COMMENT);
|
|
||||||
}else if(strcmp("[",buffer)==0){
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_STRING);
|
|
||||||
parse(']',true);
|
|
||||||
if(cur_pos<lengthDoc) cur_pos++;
|
|
||||||
styler.ColourTo(cur_pos,SCE_FORTH_STRING);
|
|
||||||
}else if(strcmp("{",buffer)==0){
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_LOCALE);
|
|
||||||
parse('}',false);
|
|
||||||
if(cur_pos<lengthDoc) cur_pos++;
|
|
||||||
styler.ColourTo(cur_pos,SCE_FORTH_LOCALE);
|
|
||||||
}else if(strings.InList(buffer)) {
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_STRING);
|
|
||||||
parse('"',false);
|
|
||||||
if(cur_pos<lengthDoc) cur_pos++;
|
|
||||||
styler.ColourTo(cur_pos,SCE_FORTH_STRING);
|
|
||||||
}else if(control.InList(buffer)) {
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_CONTROL);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_CONTROL);
|
|
||||||
}else if(keyword.InList(buffer)) {
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_KEYWORD);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_KEYWORD);
|
|
||||||
}else if(defword.InList(buffer)) {
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_KEYWORD);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_KEYWORD);
|
|
||||||
parse(BL,false);
|
|
||||||
styler.ColourTo(pos1-1,SCE_FORTH_DEFAULT);
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_DEFWORD);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_DEFWORD);
|
|
||||||
}else if(preword1.InList(buffer)) {
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_PREWORD1);
|
|
||||||
parse(BL,false);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_PREWORD1);
|
|
||||||
}else if(preword2.InList(buffer)) {
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_PREWORD2);
|
|
||||||
parse(BL,false);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_PREWORD2);
|
|
||||||
parse(BL,false);
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_STRING);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_STRING);
|
|
||||||
}else if(is_number(buffer)){
|
|
||||||
styler.ColourTo(pos1,SCE_FORTH_NUMBER);
|
|
||||||
styler.ColourTo(pos2,SCE_FORTH_NUMBER);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
fclose(f_debug);
|
|
||||||
#endif
|
|
||||||
delete []buffer;
|
|
||||||
return;
|
|
||||||
/*
|
|
||||||
if(control.InList(buffer)) {
|
|
||||||
styler.ColourTo(i,SCE_FORTH_CONTROL);
|
|
||||||
} else if(keyword.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_KEYWORD );
|
|
||||||
} else if(defword.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_DEFWORD );
|
|
||||||
// prev_state=SCE_FORTH_DEFWORD
|
|
||||||
} else if(preword1.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_PREWORD1 );
|
|
||||||
// state=SCE_FORTH_PREWORD1;
|
|
||||||
} else if(preword2.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_PREWORD2 );
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_DEFAULT);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
chPrev=' ';
|
|
||||||
for (int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
if(i!=startPos) chPrev=styler.SafeGetCharAt(i - 1);
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
fprintf(f_debug,"%c %d ",ch,state);
|
|
||||||
#endif
|
|
||||||
switch(state) {
|
|
||||||
case SCE_FORTH_DEFAULT:
|
|
||||||
if(is_whitespace(ch)) {
|
|
||||||
// whitespace is simply ignored here...
|
|
||||||
styler.ColourTo(i,SCE_FORTH_DEFAULT);
|
|
||||||
break;
|
|
||||||
} else if( ch == '\\' && is_blank(chNext)) {
|
|
||||||
// signals the start of an one line comment...
|
|
||||||
state = SCE_FORTH_COMMENT;
|
|
||||||
styler.ColourTo(i,SCE_FORTH_COMMENT);
|
|
||||||
} else if( is_whitespace(chPrev) && ch == '(' && is_whitespace(chNext)) {
|
|
||||||
// signals the start of a plain comment...
|
|
||||||
state = SCE_FORTH_COMMENT_ML;
|
|
||||||
styler.ColourTo(i,SCE_FORTH_COMMENT_ML);
|
|
||||||
} else if( isdigit(ch) ) {
|
|
||||||
// signals the start of a number
|
|
||||||
bufferCount = 0;
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
state = SCE_FORTH_NUMBER;
|
|
||||||
} else if( !is_whitespace(ch)) {
|
|
||||||
// signals the start of an identifier
|
|
||||||
bufferCount = 0;
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
state = SCE_FORTH_IDENTIFIER;
|
|
||||||
} else {
|
|
||||||
// style it the default style..
|
|
||||||
styler.ColourTo(i,SCE_FORTH_DEFAULT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_FORTH_COMMENT:
|
|
||||||
// if we find a newline here,
|
|
||||||
// we simply go to default state
|
|
||||||
// else continue to work on it...
|
|
||||||
if( ch == '\n' || ch == '\r' ) {
|
|
||||||
state = SCE_FORTH_DEFAULT;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i,SCE_FORTH_COMMENT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_FORTH_COMMENT_ML:
|
|
||||||
if( ch == ')') {
|
|
||||||
state = SCE_FORTH_DEFAULT;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i+1,SCE_FORTH_COMMENT_ML);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_FORTH_IDENTIFIER:
|
|
||||||
// stay in CONF_IDENTIFIER state until we find a non-alphanumeric
|
|
||||||
if( !is_whitespace(ch) ) {
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
} else {
|
|
||||||
state = SCE_FORTH_DEFAULT;
|
|
||||||
buffer[bufferCount] = '\0';
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
fprintf(f_debug,"\nid %s\n",buffer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// check if the buffer contains a keyword,
|
|
||||||
// and highlight it if it is a keyword...
|
|
||||||
// switch(prev_state)
|
|
||||||
// case SCE_FORTH_DEFAULT:
|
|
||||||
if(control.InList(buffer)) {
|
|
||||||
styler.ColourTo(i,SCE_FORTH_CONTROL);
|
|
||||||
} else if(keyword.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_KEYWORD );
|
|
||||||
} else if(defword.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_DEFWORD );
|
|
||||||
// prev_state=SCE_FORTH_DEFWORD
|
|
||||||
} else if(preword1.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_PREWORD1 );
|
|
||||||
// state=SCE_FORTH_PREWORD1;
|
|
||||||
} else if(preword2.InList(buffer)) {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_PREWORD2 );
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_DEFAULT);
|
|
||||||
}
|
|
||||||
// break;
|
|
||||||
// case
|
|
||||||
|
|
||||||
// push back the faulty character
|
|
||||||
chNext = styler[i--];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCE_FORTH_NUMBER:
|
|
||||||
// stay in CONF_NUMBER state until we find a non-numeric
|
|
||||||
if( isdigit(ch) ) {
|
|
||||||
buffer[bufferCount++] = ch;
|
|
||||||
} else {
|
|
||||||
state = SCE_FORTH_DEFAULT;
|
|
||||||
buffer[bufferCount] = '\0';
|
|
||||||
// Colourize here... (normal number)
|
|
||||||
styler.ColourTo(i-1,SCE_FORTH_NUMBER);
|
|
||||||
// push back a character
|
|
||||||
chNext = styler[i--];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef FORTH_DEBUG
|
|
||||||
fclose(f_debug);
|
|
||||||
#endif
|
|
||||||
delete []buffer;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldForthDoc(unsigned int, int, int, WordList *[],
|
|
||||||
Accessor &) {
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const forthWordLists[] = {
|
|
||||||
"control keywords",
|
|
||||||
"keywords",
|
|
||||||
"definition words",
|
|
||||||
"prewords with one argument",
|
|
||||||
"prewords with two arguments",
|
|
||||||
"string definition keywords",
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmForth(SCLEX_FORTH, ColouriseForthDoc, "forth",FoldForthDoc,forthWordLists);
|
|
||||||
@@ -1,450 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexFortran.cxx
|
|
||||||
** Lexer for Fortran.
|
|
||||||
** Writen by Chuan-jian Shen, Last changed Sep. 2003
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
/***************************************/
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
/***************************************/
|
|
||||||
#include "Platform.h"
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
/***********************************************/
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%');
|
|
||||||
}
|
|
||||||
/**********************************************/
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch));
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
inline bool IsABlank(unsigned int ch) {
|
|
||||||
return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
inline bool IsALineEnd(char ch) {
|
|
||||||
return ((ch == '\n') || (ch == '\r')) ;
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
unsigned int GetContinuedPos(unsigned int pos, Accessor &styler) {
|
|
||||||
while (!IsALineEnd(styler.SafeGetCharAt(pos++))) continue;
|
|
||||||
if (styler.SafeGetCharAt(pos) == '\n') pos++;
|
|
||||||
while (IsABlank(styler.SafeGetCharAt(pos++))) continue;
|
|
||||||
char chCur = styler.SafeGetCharAt(pos);
|
|
||||||
if (chCur == '&') {
|
|
||||||
while (IsABlank(styler.SafeGetCharAt(++pos))) continue;
|
|
||||||
return pos;
|
|
||||||
} else {
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler, bool isFixFormat) {
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
/***************************************/
|
|
||||||
int posLineStart = 0, numNonBlank = 0, prevState = 0;
|
|
||||||
int endPos = startPos + length;
|
|
||||||
/***************************************/
|
|
||||||
// backtrack to the nearest keyword
|
|
||||||
while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) {
|
|
||||||
startPos--;
|
|
||||||
}
|
|
||||||
startPos = styler.LineStart(styler.GetLine(startPos));
|
|
||||||
initStyle = styler.StyleAt(startPos - 1);
|
|
||||||
StyleContext sc(startPos, endPos-startPos, initStyle, styler);
|
|
||||||
/***************************************/
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
// remember the start position of the line
|
|
||||||
if (sc.atLineStart) {
|
|
||||||
posLineStart = sc.currentPos;
|
|
||||||
numNonBlank = 0;
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
if (!IsASpaceOrTab(sc.ch)) numNonBlank ++;
|
|
||||||
/***********************************************/
|
|
||||||
// Handle the fix format generically
|
|
||||||
int toLineStart = sc.currentPos - posLineStart;
|
|
||||||
if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) {
|
|
||||||
if (toLineStart == 0 && (tolower(sc.ch) == 'c' || sc.ch == '*') || sc.ch == '!') {
|
|
||||||
sc.SetState(SCE_F_COMMENT);
|
|
||||||
while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end
|
|
||||||
} else if (toLineStart > 72) {
|
|
||||||
sc.SetState(SCE_F_COMMENT);
|
|
||||||
while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end
|
|
||||||
} else if (toLineStart < 5) {
|
|
||||||
if (IsADigit(sc.ch))
|
|
||||||
sc.SetState(SCE_F_LABEL);
|
|
||||||
else
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
} else if (toLineStart == 5) {
|
|
||||||
if (!IsASpace(sc.ch) && sc.ch != '0') {
|
|
||||||
sc.SetState(SCE_F_CONTINUATION);
|
|
||||||
sc.ForwardSetState(prevState);
|
|
||||||
} else
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
// Handle line continuation generically.
|
|
||||||
if (!isFixFormat && sc.ch == '&') {
|
|
||||||
char chTemp = ' ';
|
|
||||||
int j = 1;
|
|
||||||
while (IsABlank(chTemp) && j<132) {
|
|
||||||
chTemp = static_cast<char>(sc.GetRelative(j));
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
if (chTemp == '!') {
|
|
||||||
sc.SetState(SCE_F_CONTINUATION);
|
|
||||||
if (sc.chNext == '!') sc.ForwardSetState(SCE_F_COMMENT);
|
|
||||||
} else if (chTemp == '\r' || chTemp == '\n') {
|
|
||||||
int currentState = sc.state;
|
|
||||||
sc.SetState(SCE_F_CONTINUATION);
|
|
||||||
sc.ForwardSetState(SCE_F_DEFAULT);
|
|
||||||
while (IsASpace(sc.ch) && sc.More()) sc.Forward();
|
|
||||||
if (sc.ch == '&') {
|
|
||||||
sc.SetState(SCE_F_CONTINUATION);
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
sc.SetState(currentState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_F_OPERATOR) {
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_F_NUMBER) {
|
|
||||||
if (!(IsAWordChar(sc.ch) || sc.ch=='\'' || sc.ch=='\"' || sc.ch=='.')) {
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_F_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch) || (sc.ch == '%')) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_F_WORD);
|
|
||||||
} else if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_F_WORD2);
|
|
||||||
} else if (keywords3.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_F_WORD3);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_F_COMMENT || sc.state == SCE_F_PREPROCESSOR) {
|
|
||||||
if (sc.ch == '\r' || sc.ch == '\n') {
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_F_STRING1) {
|
|
||||||
prevState = sc.state;
|
|
||||||
if (sc.ch == '\'') {
|
|
||||||
if (sc.chNext == '\'') {
|
|
||||||
sc.Forward();
|
|
||||||
} else {
|
|
||||||
sc.ForwardSetState(SCE_F_DEFAULT);
|
|
||||||
prevState = SCE_F_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_F_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_F_STRING2) {
|
|
||||||
prevState = sc.state;
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_F_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_F_DEFAULT);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
if (sc.chNext == '\"') {
|
|
||||||
sc.Forward();
|
|
||||||
} else {
|
|
||||||
sc.ForwardSetState(SCE_F_DEFAULT);
|
|
||||||
prevState = SCE_F_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_F_OPERATOR2) {
|
|
||||||
if (sc.ch == '.') {
|
|
||||||
sc.ForwardSetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_F_CONTINUATION) {
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_F_LABEL) {
|
|
||||||
if (!IsADigit(sc.ch)) {
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
} else {
|
|
||||||
if (isFixFormat && sc.currentPos-posLineStart > 4)
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
else if (numNonBlank > 5)
|
|
||||||
sc.SetState(SCE_F_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_F_DEFAULT) {
|
|
||||||
if (sc.ch == '!') {
|
|
||||||
if (sc.chNext == '$') {
|
|
||||||
sc.SetState(SCE_F_PREPROCESSOR);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_F_COMMENT);
|
|
||||||
}
|
|
||||||
} else if ((!isFixFormat) && IsADigit(sc.ch) && numNonBlank == 1) {
|
|
||||||
sc.SetState(SCE_F_LABEL);
|
|
||||||
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_F_NUMBER);
|
|
||||||
} else if ((tolower(sc.ch) == 'b' || tolower(sc.ch) == 'o' ||
|
|
||||||
tolower(sc.ch) == 'z') && (sc.chNext == '\"' || sc.chNext == '\'')) {
|
|
||||||
sc.SetState(SCE_F_NUMBER);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.ch == '.' && isalpha(sc.chNext)) {
|
|
||||||
sc.SetState(SCE_F_OPERATOR2);
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_F_IDENTIFIER);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_F_STRING2);
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.SetState(SCE_F_STRING1);
|
|
||||||
} else if (isoperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_F_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
// To determine the folding level depending on keywords
|
|
||||||
static int classifyFoldPointFortran(const char* s, const char* prevWord, const char chNextNonBlank) {
|
|
||||||
int lev = 0;
|
|
||||||
if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0)
|
|
||||||
return -1;
|
|
||||||
if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0
|
|
||||||
|| strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0
|
|
||||||
|| strcmp(s, "do") == 0 || strcmp(s, "enum") ==0
|
|
||||||
|| strcmp(s, "function") == 0 || strcmp(s, "interface") == 0
|
|
||||||
|| strcmp(s, "module") == 0 || strcmp(s, "program") == 0
|
|
||||||
|| strcmp(s, "subroutine") == 0 || strcmp(s, "then") == 0
|
|
||||||
|| (strcmp(s, "type") == 0 && chNextNonBlank != '(') ){
|
|
||||||
if (strcmp(prevWord, "end") == 0)
|
|
||||||
lev = 0;
|
|
||||||
else
|
|
||||||
lev = 1;
|
|
||||||
} else if (strcmp(s, "end") == 0 && chNextNonBlank != '='
|
|
||||||
|| strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0
|
|
||||||
|| strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0
|
|
||||||
|| strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0
|
|
||||||
|| strcmp(s, "endif") == 0 || strcmp(s, "endforall") == 0
|
|
||||||
|| strcmp(s, "endfunction") == 0 || strcmp(s, "endinterface") == 0
|
|
||||||
|| strcmp(s, "endmodule") == 0 || strcmp(s, "endprogram") == 0
|
|
||||||
|| strcmp(s, "endsubroutine") == 0 || strcmp(s, "endtype") == 0
|
|
||||||
|| strcmp(s, "endwhere") == 0
|
|
||||||
|| strcmp(s, "procedure") == 0 ) { // Take care of the module procedure statement
|
|
||||||
lev = -1;
|
|
||||||
} else if (strcmp(prevWord, "end") == 0 && strcmp(s, "if") == 0){ // end if
|
|
||||||
lev = 0;
|
|
||||||
}
|
|
||||||
return lev;
|
|
||||||
}
|
|
||||||
// Folding the code
|
|
||||||
static void FoldFortranDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
Accessor &styler, bool isFixFormat) {
|
|
||||||
//
|
|
||||||
// bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
// Do not know how to fold the comment at the moment.
|
|
||||||
//
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
char chNextNonBlank;
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style = initStyle;
|
|
||||||
/***************************************/
|
|
||||||
int lastStart = 0;
|
|
||||||
char prevWord[32] = "", Label[6] = "";
|
|
||||||
// Variables for do label folding.
|
|
||||||
static int doLabels[100], posLabel=-1;
|
|
||||||
/***************************************/
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
chNextNonBlank = chNext;
|
|
||||||
unsigned int j=i+1;
|
|
||||||
while(IsABlank(chNextNonBlank) && j<endPos) {
|
|
||||||
j ++ ;
|
|
||||||
chNextNonBlank = styler.SafeGetCharAt(j);
|
|
||||||
}
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
//
|
|
||||||
if (stylePrev == SCE_F_DEFAULT && (style == SCE_F_WORD || style == SCE_F_LABEL)) {
|
|
||||||
// Store last word and label start point.
|
|
||||||
lastStart = i;
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
if (style == SCE_F_WORD) {
|
|
||||||
if(iswordchar(ch) && !iswordchar(chNext)) {
|
|
||||||
char s[32];
|
|
||||||
unsigned int k;
|
|
||||||
for(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {
|
|
||||||
s[k] = static_cast<char>(tolower(styler[lastStart+k]));
|
|
||||||
}
|
|
||||||
s[k] = '\0';
|
|
||||||
// Handle the forall and where statement and structure.
|
|
||||||
if (strcmp(s, "forall") == 0 || strcmp(s, "where") == 0) {
|
|
||||||
if (strcmp(prevWord, "end") != 0) {
|
|
||||||
j = i + 1;
|
|
||||||
char chBrace = '(', chSeek = ')', ch1 = styler.SafeGetCharAt(j);
|
|
||||||
// Find the position of the first (
|
|
||||||
while (ch1 != chBrace && j<endPos) {
|
|
||||||
j++;
|
|
||||||
ch1 = styler.SafeGetCharAt(j);
|
|
||||||
}
|
|
||||||
char styBrace = styler.StyleAt(j);
|
|
||||||
int depth = 1;
|
|
||||||
char chAtPos;
|
|
||||||
char styAtPos;
|
|
||||||
while (j<endPos) {
|
|
||||||
j++;
|
|
||||||
chAtPos = styler.SafeGetCharAt(j);
|
|
||||||
styAtPos = styler.StyleAt(j);
|
|
||||||
if (styAtPos == styBrace) {
|
|
||||||
if (chAtPos == chBrace) depth++;
|
|
||||||
if (chAtPos == chSeek) depth--;
|
|
||||||
if (depth == 0) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (j<endPos) {
|
|
||||||
j++;
|
|
||||||
chAtPos = styler.SafeGetCharAt(j);
|
|
||||||
styAtPos = styler.StyleAt(j);
|
|
||||||
if (styAtPos == SCE_F_COMMENT || IsABlank(chAtPos)) continue;
|
|
||||||
if (isFixFormat) {
|
|
||||||
if (!IsALineEnd(chAtPos)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
if (lineCurrent < styler.GetLine(styler.Length()-1)) {
|
|
||||||
j = styler.LineStart(lineCurrent+1);
|
|
||||||
if (styler.StyleAt(j+5) == SCE_F_CONTINUATION) {
|
|
||||||
j += 5;
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
levelCurrent++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (chAtPos == '&' && styler.StyleAt(j) == SCE_F_CONTINUATION) {
|
|
||||||
j = GetContinuedPos(j+1, styler);
|
|
||||||
continue;
|
|
||||||
} else if (IsALineEnd(chAtPos)) {
|
|
||||||
levelCurrent ++;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
levelCurrent += classifyFoldPointFortran(s, prevWord, chNextNonBlank);
|
|
||||||
// Store the do Labels into array
|
|
||||||
if (strcmp(s, "do") == 0 && IsADigit(chNextNonBlank)) {
|
|
||||||
unsigned int k = 0;
|
|
||||||
for (i=j; (i<j+5 && i<endPos); i++) {
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
if (IsADigit(ch))
|
|
||||||
Label[k++] = ch;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Label[k] = '\0';
|
|
||||||
posLabel ++;
|
|
||||||
doLabels[posLabel] = atoi(Label);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strcpy(prevWord, s);
|
|
||||||
}
|
|
||||||
} else if (style == SCE_F_LABEL) {
|
|
||||||
if(IsADigit(ch) && !IsADigit(chNext)) {
|
|
||||||
for(j = 0; ( j < 5 ) && ( j < i-lastStart+1 ); j++) {
|
|
||||||
ch = styler.SafeGetCharAt(lastStart + j);
|
|
||||||
if (IsADigit(ch) && styler.StyleAt(lastStart+j) == SCE_F_LABEL)
|
|
||||||
Label[j] = ch;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Label[j] = '\0';
|
|
||||||
while (doLabels[posLabel] == atoi(Label) && posLabel > -1) {
|
|
||||||
levelCurrent--;
|
|
||||||
posLabel--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
strcpy(prevWord, "");
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
if (!isspacechar(ch)) visibleChars++;
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
static const char * const FortranWordLists[] = {
|
|
||||||
"Primary keywords and identifiers",
|
|
||||||
"Intrinsic functions",
|
|
||||||
"Extended and user defined functions",
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
/***************************************/
|
|
||||||
static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false);
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true);
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
static void FoldFortranDocFreeFormat(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
FoldFortranDoc(startPos, length, initStyle,styler, false);
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
static void FoldFortranDocFixFormat(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
FoldFortranDoc(startPos, length, initStyle,styler, true);
|
|
||||||
}
|
|
||||||
/***************************************/
|
|
||||||
LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDocFreeFormat, FortranWordLists);
|
|
||||||
LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDocFixFormat, FortranWordLists);
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,200 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexLisp.cxx
|
|
||||||
** Lexer for Lisp.
|
|
||||||
** Written by Alexey Yutkin.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
|
|
||||||
static inline bool isLispoperator(char ch) {
|
|
||||||
if (isascii(ch) && isalnum(ch))
|
|
||||||
return false;
|
|
||||||
if (ch == '\'' || ch == '(' || ch == ')' )
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isLispwordstart(char ch) {
|
|
||||||
return isascii(ch) && ch != ';' && !isspacechar(ch) && !isLispoperator(ch) &&
|
|
||||||
ch != '\n' && ch != '\r' && ch != '\"';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void classifyWordLisp(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
|
|
||||||
PLATFORM_ASSERT(end >= start);
|
|
||||||
char s[100];
|
|
||||||
unsigned int i;
|
|
||||||
bool digit_flag = true;
|
|
||||||
for (i = 0; (i < end - start + 1) && (i < 99); i++) {
|
|
||||||
s[i] = styler[start + i];
|
|
||||||
s[i + 1] = '\0';
|
|
||||||
if (!isdigit(s[i]) && (s[i] != '.')) digit_flag = false;
|
|
||||||
}
|
|
||||||
char chAttr = SCE_LISP_IDENTIFIER;
|
|
||||||
|
|
||||||
if(digit_flag) chAttr = SCE_LISP_NUMBER;
|
|
||||||
else {
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
chAttr = SCE_LISP_KEYWORD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styler.ColourTo(end, chAttr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void ColouriseLispDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
int state = initStyle;
|
|
||||||
if (state == SCE_LISP_STRINGEOL) // Does not leak onto next line
|
|
||||||
state = SCE_LISP_DEFAULT;
|
|
||||||
char chPrev = ' ';
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (atEOL) {
|
|
||||||
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
|
|
||||||
// Avoid triggering two times on Dos/Win
|
|
||||||
// End of line
|
|
||||||
if (state == SCE_LISP_STRINGEOL) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_LISP_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
chPrev = ' ';
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_LISP_DEFAULT) {
|
|
||||||
if (isLispwordstart(ch)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_LISP_IDENTIFIER;
|
|
||||||
}
|
|
||||||
else if (ch == ';') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_LISP_COMMENT;
|
|
||||||
}
|
|
||||||
else if (isLispoperator(ch) || ch=='\'') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
styler.ColourTo(i, SCE_LISP_OPERATOR);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (ch == '\"') {
|
|
||||||
state = SCE_LISP_STRING;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_LISP_IDENTIFIER) {
|
|
||||||
if (!isLispwordstart(ch)) {
|
|
||||||
classifyWordLisp(styler.GetStartSegment(), i - 1, keywords, styler);
|
|
||||||
state = SCE_LISP_DEFAULT;
|
|
||||||
} /*else*/
|
|
||||||
if (isLispoperator(ch) || ch=='\'') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
styler.ColourTo(i, SCE_LISP_OPERATOR);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (state == SCE_LISP_COMMENT) {
|
|
||||||
if (atEOL) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_LISP_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_LISP_STRING) {
|
|
||||||
if (ch == '\\') {
|
|
||||||
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (ch == '\"') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_LISP_DEFAULT;
|
|
||||||
} else if ((chNext == '\r' || chNext == '\n') && (chPrev != '\\')) {
|
|
||||||
styler.ColourTo(i - 1, SCE_LISP_STRINGEOL);
|
|
||||||
state = SCE_LISP_STRINGEOL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chPrev = ch;
|
|
||||||
}
|
|
||||||
styler.ColourTo(lengthDoc - 1, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldLispDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (style == SCE_LISP_OPERATOR) {
|
|
||||||
if (ch == '(') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == ')') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const lispWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmLISP(SCLEX_LISP, ColouriseLispDoc, "lisp", FoldLispDoc, lispWordListDesc);
|
|
||||||
@@ -1,208 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexLout.cxx
|
|
||||||
** Lexer for the Basser Lout (>= version 3) typesetting language
|
|
||||||
**/
|
|
||||||
// Copyright 2003 by Kein-Hong Man <mkh@pl.jaring.my>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalpha(ch) || ch == '@' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAnOther(const int ch) {
|
|
||||||
return (ch < 0x80) && (ch == '{' || ch == '}' ||
|
|
||||||
ch == '!' || ch == '$' || ch == '%' || ch == '&' || ch == '\'' ||
|
|
||||||
ch == '(' || ch == ')' || ch == '*' || ch == '+' || ch == ',' ||
|
|
||||||
ch == '-' || ch == '.' || ch == '/' || ch == ':' || ch == ';' ||
|
|
||||||
ch == '<' || ch == '=' || ch == '>' || ch == '?' || ch == '[' ||
|
|
||||||
ch == ']' || ch == '^' || ch == '`' || ch == '|' || ch == '~');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseLoutDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
|
|
||||||
int visibleChars = 0;
|
|
||||||
int firstWordInLine = 0;
|
|
||||||
int leadingAtSign = 0;
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.atLineStart && (sc.state == SCE_LOUT_STRING)) {
|
|
||||||
// Prevent SCE_LOUT_STRINGEOL from leaking back to previous line
|
|
||||||
sc.SetState(SCE_LOUT_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_LOUT_COMMENT) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_LOUT_DEFAULT);
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LOUT_NUMBER) {
|
|
||||||
if (!IsADigit(sc.ch) && sc.ch != '.') {
|
|
||||||
sc.SetState(SCE_LOUT_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LOUT_STRING) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_LOUT_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_LOUT_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_LOUT_DEFAULT);
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LOUT_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
|
|
||||||
if (leadingAtSign) {
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LOUT_WORD);
|
|
||||||
} else {
|
|
||||||
sc.ChangeState(SCE_LOUT_WORD4);
|
|
||||||
}
|
|
||||||
} else if (firstWordInLine && keywords3.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LOUT_WORD3);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_LOUT_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LOUT_OPERATOR) {
|
|
||||||
if (!IsAnOther(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
|
|
||||||
if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LOUT_WORD2);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_LOUT_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_LOUT_DEFAULT) {
|
|
||||||
if (sc.ch == '#') {
|
|
||||||
sc.SetState(SCE_LOUT_COMMENT);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_LOUT_STRING);
|
|
||||||
} else if (IsADigit(sc.ch) ||
|
|
||||||
(sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_LOUT_NUMBER);
|
|
||||||
} else if (IsAWordChar(sc.ch)) {
|
|
||||||
firstWordInLine = (visibleChars == 0);
|
|
||||||
leadingAtSign = (sc.ch == '@');
|
|
||||||
sc.SetState(SCE_LOUT_IDENTIFIER);
|
|
||||||
} else if (IsAnOther(sc.ch)) {
|
|
||||||
sc.SetState(SCE_LOUT_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
// Reset states to begining of colourise so no surprises
|
|
||||||
// if different sets of lines lexed.
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!IsASpace(sc.ch)) {
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldLoutDoc(unsigned int startPos, int length, int, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
char s[10];
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
|
|
||||||
if (style == SCE_LOUT_WORD) {
|
|
||||||
if (ch == '@') {
|
|
||||||
for (unsigned int j = 0; j < 8; j++) {
|
|
||||||
if (!IsAWordChar(styler[i + j])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s[j] = styler[i + j];
|
|
||||||
s[j + 1] = '\0';
|
|
||||||
}
|
|
||||||
if (strcmp(s, "@Begin") == 0) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (strcmp(s, "@End") == 0) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (style == SCE_LOUT_OPERATOR) {
|
|
||||||
if (ch == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact) {
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
}
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const loutWordLists[] = {
|
|
||||||
"Predefined identifiers",
|
|
||||||
"Predefined delimiters",
|
|
||||||
"Predefined keywords",
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmLout(SCLEX_LOUT, ColouriseLoutDoc, "lout", FoldLoutDoc, loutWordLists);
|
|
||||||
@@ -1,329 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexLua.cxx
|
|
||||||
** Lexer for Lua language.
|
|
||||||
**
|
|
||||||
** Written by Paul Winwood.
|
|
||||||
** Folder by Alexey Yutkin.
|
|
||||||
** Modified by Marcos E. Wurzius & Philippe Lhoste
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsANumberChar(const int ch) {
|
|
||||||
// Not exactly following number definition (several dots are seen as OK, etc.)
|
|
||||||
// but probably enough in most cases.
|
|
||||||
return (ch < 0x80) &&
|
|
||||||
(isdigit(ch) || toupper(ch) == 'E' ||
|
|
||||||
ch == '.' || ch == '-' || ch == '+');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsLuaOperator(int ch) {
|
|
||||||
if (ch >= 0x80 || isalnum(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 == ':') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseLuaDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
WordList &keywords4 = *keywordlists[3];
|
|
||||||
WordList &keywords5 = *keywordlists[4];
|
|
||||||
WordList &keywords6 = *keywordlists[5];
|
|
||||||
WordList &keywords7 = *keywordlists[6];
|
|
||||||
WordList &keywords8 = *keywordlists[7];
|
|
||||||
|
|
||||||
int currentLine = styler.GetLine(startPos);
|
|
||||||
// Initialize the literal string [[ ... ]] nesting level, if we are inside such a string.
|
|
||||||
int literalStringLevel = 0;
|
|
||||||
if (initStyle == SCE_LUA_LITERALSTRING) {
|
|
||||||
literalStringLevel = styler.GetLineState(currentLine - 1);
|
|
||||||
}
|
|
||||||
// Initialize the block comment --[[ ... ]] nesting level, if we are inside such a comment
|
|
||||||
int blockCommentLevel = 0;
|
|
||||||
if (initStyle == SCE_LUA_COMMENT) {
|
|
||||||
blockCommentLevel = styler.GetLineState(currentLine - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not leak onto next line
|
|
||||||
if (initStyle == SCE_LUA_STRINGEOL) {
|
|
||||||
initStyle = SCE_LUA_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
if (startPos == 0 && sc.ch == '#') {
|
|
||||||
// shbang line: # is a comment only if first char of the script
|
|
||||||
sc.SetState(SCE_LUA_COMMENTLINE);
|
|
||||||
}
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
// Update the line state, so it can be seen by next line
|
|
||||||
currentLine = styler.GetLine(sc.currentPos);
|
|
||||||
switch (sc.state) {
|
|
||||||
case SCE_LUA_LITERALSTRING:
|
|
||||||
// Inside a literal string, we set the line state
|
|
||||||
styler.SetLineState(currentLine, literalStringLevel);
|
|
||||||
break;
|
|
||||||
case SCE_LUA_COMMENT: // Block comment
|
|
||||||
// Inside a block comment, we set the line state
|
|
||||||
styler.SetLineState(currentLine, blockCommentLevel);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// Reset the line state
|
|
||||||
styler.SetLineState(currentLine, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sc.atLineStart && (sc.state == SCE_LUA_STRING)) {
|
|
||||||
// Prevent SCE_LUA_STRINGEOL from leaking back to previous line
|
|
||||||
sc.SetState(SCE_LUA_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle string line continuation
|
|
||||||
if ((sc.state == SCE_LUA_STRING || sc.state == SCE_LUA_CHARACTER) &&
|
|
||||||
sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\n' || sc.chNext == '\r') {
|
|
||||||
sc.Forward();
|
|
||||||
if (sc.ch == '\r' && sc.chNext == '\n') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_LUA_OPERATOR) {
|
|
||||||
sc.SetState(SCE_LUA_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_LUA_NUMBER) {
|
|
||||||
// We stop the number definition on non-numerical non-dot non-eE non-sign char
|
|
||||||
if (!IsANumberChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LUA_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD);
|
|
||||||
} else if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD2);
|
|
||||||
} else if (keywords3.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD3);
|
|
||||||
} else if (keywords4.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD4);
|
|
||||||
} else if (keywords5.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD5);
|
|
||||||
} else if (keywords6.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD6);
|
|
||||||
} else if (keywords6.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD6);
|
|
||||||
} else if (keywords7.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD7);
|
|
||||||
} else if (keywords8.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_LUA_WORD8);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LUA_COMMENTLINE ) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LUA_PREPROCESSOR ) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LUA_STRING) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_LUA_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_LUA_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LUA_CHARACTER) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.ForwardSetState(SCE_LUA_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_LUA_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LUA_LITERALSTRING) {
|
|
||||||
if (sc.Match('[', '[')) {
|
|
||||||
literalStringLevel++;
|
|
||||||
sc.Forward();
|
|
||||||
sc.SetState(SCE_LUA_LITERALSTRING);
|
|
||||||
} else if (sc.Match(']', ']') && literalStringLevel > 0) {
|
|
||||||
literalStringLevel--;
|
|
||||||
sc.Forward();
|
|
||||||
if (literalStringLevel == 0) {
|
|
||||||
sc.ForwardSetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_LUA_COMMENT) { // Lua 5.0's block comment
|
|
||||||
if (sc.Match('[', '[')) {
|
|
||||||
blockCommentLevel++;
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.Match(']', ']') && blockCommentLevel > 0) {
|
|
||||||
blockCommentLevel--;
|
|
||||||
sc.Forward();
|
|
||||||
if (blockCommentLevel == 0) {
|
|
||||||
sc.ForwardSetState(SCE_LUA_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_LUA_DEFAULT) {
|
|
||||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_LUA_NUMBER);
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_LUA_IDENTIFIER);
|
|
||||||
} else if (sc.Match('\"')) {
|
|
||||||
sc.SetState(SCE_LUA_STRING);
|
|
||||||
} else if (sc.Match('\'')) {
|
|
||||||
sc.SetState(SCE_LUA_CHARACTER);
|
|
||||||
} else if (sc.Match('[', '[')) {
|
|
||||||
literalStringLevel = 1;
|
|
||||||
sc.SetState(SCE_LUA_LITERALSTRING);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.Match("--[[")) { // Lua 5.0's block comment
|
|
||||||
blockCommentLevel = 1;
|
|
||||||
sc.SetState(SCE_LUA_COMMENT);
|
|
||||||
sc.Forward(3);
|
|
||||||
} else if (sc.Match('-', '-')) {
|
|
||||||
sc.SetState(SCE_LUA_COMMENTLINE);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.atLineStart && sc.Match('$')) {
|
|
||||||
sc.SetState(SCE_LUA_PREPROCESSOR); // Obsolete since Lua 4.0, but still in old code
|
|
||||||
} else if (IsLuaOperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_LUA_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldLuaDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
char s[10];
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (style == SCE_LUA_WORD) {
|
|
||||||
if (ch == 'i' || ch == 'd' || ch == 'f' || ch == 'e') {
|
|
||||||
for (unsigned int j = 0; j < 8; j++) {
|
|
||||||
if (!iswordchar(styler[i + j])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s[j] = styler[i + j];
|
|
||||||
s[j + 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((strcmp(s, "if") == 0) || (strcmp(s, "do") == 0) || (strcmp(s, "function") == 0)) {
|
|
||||||
levelCurrent++;
|
|
||||||
}
|
|
||||||
if ((strcmp(s, "end") == 0) || (strcmp(s, "elseif") == 0)) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (style == SCE_LUA_OPERATOR) {
|
|
||||||
if (ch == '{' || ch == '(') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == '}' || ch == ')') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact) {
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
}
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch)) {
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const luaWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
"Basic functions",
|
|
||||||
"String, (table) & math functions",
|
|
||||||
"(coroutines), I/O & system facilities",
|
|
||||||
"XXX",
|
|
||||||
"XXX",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc, "lua", FoldLuaDoc, luaWordListDesc);
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexMMIXAL.cxx
|
|
||||||
** Lexer for MMIX Assembler Language.
|
|
||||||
** Written by Christoph H<>sler <christoph.hoesler@student.uni-tuebingen.de>
|
|
||||||
** For information about MMIX visit http://www-cs-faculty.stanford.edu/~knuth/mmix.html
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == ':' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool isMMIXALOperator(char ch) {
|
|
||||||
if (isalnum(ch))
|
|
||||||
return false;
|
|
||||||
if (ch == '+' || ch == '-' || ch == '|' || ch == '^' ||
|
|
||||||
ch == '*' || ch == '/' || ch == '/' ||
|
|
||||||
ch == '%' || ch == '<' || ch == '>' || ch == '&' ||
|
|
||||||
ch == '~' || ch == '$' ||
|
|
||||||
ch == ',' || ch == '(' || ch == ')' ||
|
|
||||||
ch == '[' || ch == ']')
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseMMIXALDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &opcodes = *keywordlists[0];
|
|
||||||
WordList &special_register = *keywordlists[1];
|
|
||||||
WordList &predef_symbols = *keywordlists[2];
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward())
|
|
||||||
{
|
|
||||||
// No EOL continuation
|
|
||||||
if (sc.atLineStart) {
|
|
||||||
if (sc.ch == '@' && sc.chNext == 'i') {
|
|
||||||
sc.SetState(SCE_MMIXAL_INCLUDE);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_MMIXAL_LEADWS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if first non whitespace character in line is alphanumeric
|
|
||||||
if (sc.state == SCE_MMIXAL_LEADWS && !isspace(sc.ch)) { // LEADWS
|
|
||||||
if(!IsAWordChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_MMIXAL_COMMENT);
|
|
||||||
} else {
|
|
||||||
if(sc.atLineStart) {
|
|
||||||
sc.SetState(SCE_MMIXAL_LABEL);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_MMIXAL_OPCODE_PRE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_MMIXAL_OPERATOR) { // OPERATOR
|
|
||||||
sc.SetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
} else if (sc.state == SCE_MMIXAL_NUMBER) { // NUMBER
|
|
||||||
if (!isdigit(sc.ch)) {
|
|
||||||
if (IsAWordChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
sc.ChangeState(SCE_MMIXAL_REF);
|
|
||||||
sc.SetState(SCE_MMIXAL_REF);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_LABEL) { // LABEL
|
|
||||||
if (!IsAWordChar(sc.ch) ) {
|
|
||||||
sc.SetState(SCE_MMIXAL_OPCODE_PRE);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_REF) { // REF
|
|
||||||
if (!IsAWordChar(sc.ch) ) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
if (*s == ':') { // ignore base prefix for match
|
|
||||||
for (size_t i = 0; i != sizeof(s); ++i) {
|
|
||||||
*(s+i) = *(s+i+1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (special_register.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_MMIXAL_REGISTER);
|
|
||||||
} else if (predef_symbols.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_MMIXAL_SYMBOL);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_OPCODE_PRE) { // OPCODE_PRE
|
|
||||||
if (!isspace(sc.ch)) {
|
|
||||||
sc.SetState(SCE_MMIXAL_OPCODE);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_OPCODE) { // OPCODE
|
|
||||||
if (!IsAWordChar(sc.ch) ) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
if (opcodes.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_MMIXAL_OPCODE_VALID);
|
|
||||||
} else {
|
|
||||||
sc.ChangeState(SCE_MMIXAL_OPCODE_UNKNOWN);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_MMIXAL_OPCODE_POST);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_STRING) { // STRING
|
|
||||||
if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ForwardSetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_CHAR) { // CHAR
|
|
||||||
if (sc.ch == '\'') {
|
|
||||||
sc.ForwardSetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ForwardSetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_REGISTER) { // REGISTER
|
|
||||||
if (!isdigit(sc.ch)) {
|
|
||||||
sc.SetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MMIXAL_HEX) { // HEX
|
|
||||||
if (!isxdigit(sc.ch)) {
|
|
||||||
sc.SetState(SCE_MMIXAL_OPERANDS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_MMIXAL_OPCODE_POST || // OPCODE_POST
|
|
||||||
sc.state == SCE_MMIXAL_OPERANDS) { // OPERANDS
|
|
||||||
if (sc.state == SCE_MMIXAL_OPERANDS && isspace(sc.ch)) {
|
|
||||||
if (!sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_MMIXAL_COMMENT);
|
|
||||||
}
|
|
||||||
} else if (isdigit(sc.ch)) {
|
|
||||||
sc.SetState(SCE_MMIXAL_NUMBER);
|
|
||||||
} else if (IsAWordChar(sc.ch) || sc.Match('@')) {
|
|
||||||
sc.SetState(SCE_MMIXAL_REF);
|
|
||||||
} else if (sc.Match('\"')) {
|
|
||||||
sc.SetState(SCE_MMIXAL_STRING);
|
|
||||||
} else if (sc.Match('\'')) {
|
|
||||||
sc.SetState(SCE_MMIXAL_CHAR);
|
|
||||||
} else if (sc.Match('$')) {
|
|
||||||
sc.SetState(SCE_MMIXAL_REGISTER);
|
|
||||||
} else if (sc.Match('#')) {
|
|
||||||
sc.SetState(SCE_MMIXAL_HEX);
|
|
||||||
} else if (isMMIXALOperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_MMIXAL_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const MMIXALWordListDesc[] = {
|
|
||||||
"Operation Codes",
|
|
||||||
"Special Register",
|
|
||||||
"Predefined Symbols",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmMMIXAL(SCLEX_MMIXAL, ColouriseMMIXALDoc, "mmixal", 0, MMIXALWordListDesc);
|
|
||||||
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexMPT.cxx
|
|
||||||
** Lexer for MPT specific files. Based on LexOthers.cxx
|
|
||||||
** LOT = the text log file created by the MPT application while running a test program
|
|
||||||
** Other MPT specific files to be added later.
|
|
||||||
**/
|
|
||||||
// Copyright 2003 by Marius Gheorghe <mgheorghe@cabletest.com>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
#include "SString.h"
|
|
||||||
|
|
||||||
static int GetLotLineState(SString &line) {
|
|
||||||
if (line.length()) {
|
|
||||||
// Most of the time the first non-blank character in line determines that line's type
|
|
||||||
// Now finds the first non-blank character
|
|
||||||
unsigned i; // Declares counter here to make it persistent after the for loop
|
|
||||||
for (i = 0; i < line.length(); ++i) {
|
|
||||||
if (!isspace(line[i]))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks if it was a blank line
|
|
||||||
if (i == line.length())
|
|
||||||
return SCE_LOT_DEFAULT;
|
|
||||||
|
|
||||||
switch (line[i]) {
|
|
||||||
case '*': // Fail measurement
|
|
||||||
return SCE_LOT_FAIL;
|
|
||||||
|
|
||||||
case '+': // Header
|
|
||||||
case '|': // Header
|
|
||||||
return SCE_LOT_HEADER;
|
|
||||||
|
|
||||||
case ':': // Set test limits
|
|
||||||
return SCE_LOT_SET;
|
|
||||||
|
|
||||||
case '-': // Section break
|
|
||||||
return SCE_LOT_BREAK;
|
|
||||||
|
|
||||||
default: // Any other line
|
|
||||||
// Checks for message at the end of lot file
|
|
||||||
if (line.contains("PASSED")) {
|
|
||||||
return SCE_LOT_PASS;
|
|
||||||
}
|
|
||||||
else if (line.contains("FAILED")) {
|
|
||||||
return SCE_LOT_FAIL;
|
|
||||||
}
|
|
||||||
else if (line.contains("ABORTED")) {
|
|
||||||
return SCE_LOT_ABORT;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return i ? SCE_LOT_PASS : SCE_LOT_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return SCE_LOT_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourizeLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
bool atLineStart = true;// Arms the 'at line start' flag
|
|
||||||
char chNext = styler.SafeGetCharAt(startPos);
|
|
||||||
SString line("");
|
|
||||||
line.setsizegrowth(256); // Lot lines are less than 256 chars long most of the time. This should avoid reallocations
|
|
||||||
|
|
||||||
// Styles LOT document
|
|
||||||
unsigned int i; // Declared here because it's used after the for loop
|
|
||||||
for (i = startPos; i < startPos + length; ++i) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
line += ch;
|
|
||||||
atLineStart = false;
|
|
||||||
|
|
||||||
// LOT files are only used on the Win32 platform, thus EOL == CR+LF
|
|
||||||
// Searches for the end of line
|
|
||||||
if (ch == '\r' && chNext == '\n') {
|
|
||||||
line += chNext; // Gets the '\n'
|
|
||||||
++i; // Advances past the '\n'
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1); // Gets character of next line
|
|
||||||
styler.ColourTo(i, GetLotLineState(line));
|
|
||||||
line = "";
|
|
||||||
atLineStart = true; // Arms flag for next line
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last line may not have a line ending
|
|
||||||
if (!atLineStart) {
|
|
||||||
styler.ColourTo(i - 1, GetLotLineState(line));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Folds an MPT LOT file: the blocks that can be folded are:
|
|
||||||
// sections (headed by a set line)
|
|
||||||
// passes (contiguous pass results within a section)
|
|
||||||
// fails (contiguous fail results within a section)
|
|
||||||
static void FoldLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 0) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
|
|
||||||
char chNext = styler.SafeGetCharAt(startPos);
|
|
||||||
int style = SCE_LOT_DEFAULT;
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int lev = SC_FOLDLEVELBASE;
|
|
||||||
|
|
||||||
// Gets style of previous line if not at the beginning of the document
|
|
||||||
if (startPos > 1)
|
|
||||||
style = styler.StyleAt(startPos - 2);
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if (ch == '\r' && chNext == '\n') {
|
|
||||||
// TO DO:
|
|
||||||
// Should really get the state of the previous line from the styler
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 2);
|
|
||||||
|
|
||||||
switch (style) {
|
|
||||||
/*
|
|
||||||
case SCE_LOT_SET:
|
|
||||||
lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case SCE_LOT_FAIL:
|
|
||||||
/*
|
|
||||||
if (stylePrev != SCE_LOT_FAIL)
|
|
||||||
lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
|
|
||||||
else
|
|
||||||
lev = SC_FOLDLEVELBASE + 1;
|
|
||||||
*/
|
|
||||||
lev = SC_FOLDLEVELBASE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (lineCurrent == 0 || stylePrev == SCE_LOT_FAIL)
|
|
||||||
lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
|
|
||||||
else
|
|
||||||
lev = SC_FOLDLEVELBASE + 1;
|
|
||||||
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lev != styler.LevelAt(lineCurrent))
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
|
|
||||||
lineCurrent++;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, lev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const emptyWordListDesc[] = {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmLot(SCLEX_LOT, ColourizeLotDoc, "lot", FoldLotDoc, emptyWordListDesc);
|
|
||||||
@@ -1,225 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexMatlab.cxx
|
|
||||||
** Lexer for Matlab.
|
|
||||||
** Written by Jos<6F> Fonseca
|
|
||||||
**
|
|
||||||
** Changes by Christoph Dalitz 2003/12/04:
|
|
||||||
** - added support for Octave
|
|
||||||
** - Strings can now be included both in single or double quotes
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
|
|
||||||
static bool IsMatlabCommentChar(int c) {
|
|
||||||
return (c == '%') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsOctaveCommentChar(int c) {
|
|
||||||
return (c == '%' || c == '#') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsMatlabComment(Accessor &styler, int pos, int len) {
|
|
||||||
return len > 0 && IsMatlabCommentChar(styler[pos]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsOctaveComment(Accessor &styler, int pos, int len) {
|
|
||||||
return len > 0 && IsOctaveCommentChar(styler[pos]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseMatlabOctaveDoc(
|
|
||||||
unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler,
|
|
||||||
bool (*IsCommentChar)(int)) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
bool transpose = false;
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.state == SCE_MATLAB_OPERATOR) {
|
|
||||||
if (sc.chPrev == '.') {
|
|
||||||
if (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\' || sc.ch == '^') {
|
|
||||||
sc.ForwardSetState(SCE_MATLAB_DEFAULT);
|
|
||||||
transpose = false;
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
sc.ForwardSetState(SCE_MATLAB_DEFAULT);
|
|
||||||
transpose = true;
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_MATLAB_DEFAULT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_MATLAB_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MATLAB_KEYWORD) {
|
|
||||||
if (!isalnum(sc.ch) && sc.ch != '_') {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.SetState(SCE_MATLAB_DEFAULT);
|
|
||||||
transpose = false;
|
|
||||||
} else {
|
|
||||||
sc.ChangeState(SCE_MATLAB_IDENTIFIER);
|
|
||||||
sc.SetState(SCE_MATLAB_DEFAULT);
|
|
||||||
transpose = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MATLAB_NUMBER) {
|
|
||||||
if (!isdigit(sc.ch) && sc.ch != '.'
|
|
||||||
&& !(sc.ch == 'e' || sc.ch == 'E')
|
|
||||||
&& !((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E'))) {
|
|
||||||
sc.SetState(SCE_MATLAB_DEFAULT);
|
|
||||||
transpose = true;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MATLAB_STRING) {
|
|
||||||
if (sc.ch == '\'' && sc.chPrev != '\\') {
|
|
||||||
sc.ForwardSetState(SCE_MATLAB_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MATLAB_DOUBLEQUOTESTRING) {
|
|
||||||
if (sc.ch == '"' && sc.chPrev != '\\') {
|
|
||||||
sc.ForwardSetState(SCE_MATLAB_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_MATLAB_COMMENT || sc.state == SCE_MATLAB_COMMAND) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_MATLAB_DEFAULT);
|
|
||||||
transpose = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_MATLAB_DEFAULT) {
|
|
||||||
if (IsCommentChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_MATLAB_COMMENT);
|
|
||||||
} else if (sc.ch == '!') {
|
|
||||||
sc.SetState(SCE_MATLAB_COMMAND);
|
|
||||||
} else if (sc.ch == '\'') {
|
|
||||||
if (transpose) {
|
|
||||||
sc.SetState(SCE_MATLAB_OPERATOR);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_MATLAB_STRING);
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '"') {
|
|
||||||
sc.SetState(SCE_MATLAB_DOUBLEQUOTESTRING);
|
|
||||||
} else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_MATLAB_NUMBER);
|
|
||||||
} else if (isalpha(sc.ch)) {
|
|
||||||
sc.SetState(SCE_MATLAB_KEYWORD);
|
|
||||||
} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '\\') {
|
|
||||||
if (sc.ch == ')' || sc.ch == ']') {
|
|
||||||
transpose = true;
|
|
||||||
} else {
|
|
||||||
transpose = false;
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_MATLAB_OPERATOR);
|
|
||||||
} else {
|
|
||||||
transpose = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabCommentChar);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseOctaveDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveCommentChar);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldMatlabOctaveDoc(unsigned int startPos, int length, int,
|
|
||||||
WordList *[], Accessor &styler,
|
|
||||||
bool (*IsComment)(Accessor&,int,int)) {
|
|
||||||
|
|
||||||
int endPos = startPos + length;
|
|
||||||
|
|
||||||
// Backtrack to previous line in case need to fix its fold status
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (startPos > 0) {
|
|
||||||
if (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
startPos = styler.LineStart(lineCurrent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int spaceFlags = 0;
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsComment);
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
for (int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
|
|
||||||
int lev = indentCurrent;
|
|
||||||
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsComment);
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
|
|
||||||
// Only non whitespace lines can be headers
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
|
|
||||||
// Line after is blank so check the next - maybe should continue further?
|
|
||||||
int spaceFlags2 = 0;
|
|
||||||
int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsComment);
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
indentCurrent = indentNext;
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
lineCurrent++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldMatlabDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabComment);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldOctaveDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveComment);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const matlabWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char * const octaveWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmMatlab(SCLEX_MATLAB, ColouriseMatlabDoc, "matlab", FoldMatlabDoc, matlabWordListDesc);
|
|
||||||
|
|
||||||
LexerModule lmOctave(SCLEX_OCTAVE, ColouriseOctaveDoc, "octave", FoldOctaveDoc, octaveWordListDesc);
|
|
||||||
@@ -1,320 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
|
|
||||||
// File: LexMetapost.cxx - general context conformant metapost coloring scheme
|
|
||||||
// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
// This lexer is derived from the one written for the texwork environment (1999++) which in
|
|
||||||
// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
|
|
||||||
// val SCE_METAPOST_DEFAULT = 0
|
|
||||||
// val SCE_METAPOST_SPECIAL = 1
|
|
||||||
// val SCE_METAPOST_GROUP = 2
|
|
||||||
// val SCE_METAPOST_SYMBOL = 3
|
|
||||||
// val SCE_METAPOST_COMMAND = 4
|
|
||||||
// val SCE_METAPOST_TEXT = 5
|
|
||||||
|
|
||||||
// Definitions in SciTEGlobal.properties:
|
|
||||||
//
|
|
||||||
// Metapost Highlighting
|
|
||||||
//
|
|
||||||
// # Default
|
|
||||||
// style.metapost.0=fore:#7F7F00
|
|
||||||
// # Special
|
|
||||||
// style.metapost.1=fore:#007F7F
|
|
||||||
// # Group
|
|
||||||
// style.metapost.2=fore:#880000
|
|
||||||
// # Symbol
|
|
||||||
// style.metapost.3=fore:#7F7F00
|
|
||||||
// # Command
|
|
||||||
// style.metapost.4=fore:#008800
|
|
||||||
// # Text
|
|
||||||
// style.metapost.5=fore:#000000
|
|
||||||
|
|
||||||
// lexer.tex.comment.process=0
|
|
||||||
|
|
||||||
// Auxiliary functions:
|
|
||||||
|
|
||||||
static inline bool endOfLine(Accessor &styler, unsigned int i) {
|
|
||||||
return
|
|
||||||
(styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTcomment(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '%') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTone(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '[') || (ch == ']') || (ch == '(') || (ch == ')') ||
|
|
||||||
(ch == ':') || (ch == '=') || (ch == '<') || (ch == '>') ||
|
|
||||||
(ch == '{') || (ch == '}') || (ch == '\'') || (ch == '\"') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTtwo(int ch) {
|
|
||||||
return
|
|
||||||
(ch == ';') || (ch == '$') || (ch == '@') || (ch == '#');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTthree(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '.') || (ch == '-') || (ch == '+') || (ch == '/') ||
|
|
||||||
(ch == '*') || (ch == ',') || (ch == '|') || (ch == '`') ||
|
|
||||||
(ch == '!') || (ch == '?') || (ch == '^') || (ch == '&') ||
|
|
||||||
(ch == '%') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTidentifier(int ch) {
|
|
||||||
return
|
|
||||||
((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||
|
|
||||||
(ch == '_') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTnumber(int ch) {
|
|
||||||
return
|
|
||||||
(ch >= '0') && (ch <= '9') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTstring(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '\"') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTcolon(int ch) {
|
|
||||||
return
|
|
||||||
(ch == ':') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isMETAPOSTequal(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '=') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int CheckMETAPOSTInterface(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
Accessor &styler,
|
|
||||||
int defaultInterface) {
|
|
||||||
|
|
||||||
char lineBuffer[1024] ;
|
|
||||||
unsigned int linePos = 0 ;
|
|
||||||
|
|
||||||
// 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.SafeGetCharAt(i) ;
|
|
||||||
if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
if (strstr(lineBuffer, "interface=none")) {
|
|
||||||
return 0 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=metapost") || strstr(lineBuffer, "interface=mp")) {
|
|
||||||
return 1 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=metafun")) {
|
|
||||||
return 2 ;
|
|
||||||
} else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, "%D \\module")) {
|
|
||||||
// better would be to limit the search to just one line
|
|
||||||
return 2 ;
|
|
||||||
} else {
|
|
||||||
return defaultInterface ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return defaultInterface ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseMETAPOSTDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
styler.StartAt(startPos) ;
|
|
||||||
styler.StartSegment(startPos) ;
|
|
||||||
|
|
||||||
bool processComment = styler.GetPropertyInt("lexer.metapost.comment.process", 0) == 1 ;
|
|
||||||
int defaultInterface = styler.GetPropertyInt("lexer.metapost.interface.default", 1) ;
|
|
||||||
|
|
||||||
int currentInterface = CheckMETAPOSTInterface(startPos,length,styler,defaultInterface) ;
|
|
||||||
|
|
||||||
// 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] ;
|
|
||||||
|
|
||||||
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:
|
|
||||||
|
|
||||||
static const char * const metapostWordListDesc[] = {
|
|
||||||
"MetaPost",
|
|
||||||
"MetaFun",
|
|
||||||
0
|
|
||||||
} ;
|
|
||||||
|
|
||||||
LexerModule lmMETAPOST(SCLEX_METAPOST, ColouriseMETAPOSTDoc, "metapost", 0, metapostWordListDesc);
|
|
||||||
@@ -1,346 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexNsis.cxx
|
|
||||||
** Lexer for NSIS
|
|
||||||
**/
|
|
||||||
// Copyright 2003 by Angelo Mandato <angelo@spaceblue.com>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Put in SciLexer.h
|
|
||||||
#define SCLEX_NSIS 34
|
|
||||||
|
|
||||||
#define SCE_NSIS_DEFAULT 0
|
|
||||||
#define SCE_NSIS_COMMENT 1
|
|
||||||
#define SCE_NSIS_STRINGDQ 2
|
|
||||||
#define SCE_NSIS_STRINGLQ 3
|
|
||||||
#define SCE_NSIS_STRINGRQ 4
|
|
||||||
#define SCE_NSIS_FUNCTION 5
|
|
||||||
#define SCE_NSIS_VARIABLE 6
|
|
||||||
#define SCE_NSIS_LABEL 7
|
|
||||||
#define SCE_NSIS_USERDEFINED 8
|
|
||||||
#define SCE_NSIS_SECTIONDEF 9
|
|
||||||
#define SCE_NSIS_SUBSECTIONDEF 10
|
|
||||||
#define SCE_NSIS_IFDEFINEDEF 11
|
|
||||||
#define SCE_NSIS_MACRODEF 12
|
|
||||||
#define SCE_NSIS_STRINGVAR 13
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler)
|
|
||||||
{
|
|
||||||
char s[100];
|
|
||||||
|
|
||||||
WordList &Functions = *keywordLists[0];
|
|
||||||
WordList &Variables = *keywordLists[1];
|
|
||||||
WordList &Lables = *keywordLists[2];
|
|
||||||
WordList &UserDefined = *keywordLists[3];
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
|
|
||||||
{
|
|
||||||
s[i] = static_cast<char>( styler[ start + i ] );
|
|
||||||
s[i + 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for special words...
|
|
||||||
|
|
||||||
if( strcmp(s, "!macro") == 0 || strcmp(s, "!macroend") == 0 ) // Covers !micro and !microend
|
|
||||||
return SCE_NSIS_MACRODEF;
|
|
||||||
|
|
||||||
if( strcmp(s, "!ifdef") == 0 || strcmp(s, "!ifndef") == 0 || strcmp(s, "!endif") == 0 )
|
|
||||||
return SCE_NSIS_IFDEFINEDEF;
|
|
||||||
|
|
||||||
if( strcmp(s, "Section") == 0 || strcmp(s, "SectionEnd") == 0 ) // Covers Section and SectionEnd
|
|
||||||
return SCE_NSIS_SECTIONDEF;
|
|
||||||
|
|
||||||
if( strcmp(s, "SubSection") == 0 || strcmp(s, "SubSectionEnd") == 0 ) // Covers SubSection and SubSectionEnd
|
|
||||||
return SCE_NSIS_SUBSECTIONDEF;
|
|
||||||
|
|
||||||
if( strcmp(s, "Function") == 0 || strcmp(s, "FunctionEnd") == 0 ) // Covers SubSection and SubSectionEnd
|
|
||||||
return SCE_NSIS_FUNCTION;
|
|
||||||
|
|
||||||
if ( Functions.InList(s) )
|
|
||||||
return SCE_NSIS_FUNCTION;
|
|
||||||
|
|
||||||
if ( Variables.InList(s) )
|
|
||||||
return SCE_NSIS_VARIABLE;
|
|
||||||
|
|
||||||
if ( Lables.InList(s) )
|
|
||||||
return SCE_NSIS_LABEL;
|
|
||||||
|
|
||||||
if( UserDefined.InList(s) )
|
|
||||||
return SCE_NSIS_USERDEFINED;
|
|
||||||
|
|
||||||
if( strlen(s) > 2 )
|
|
||||||
{
|
|
||||||
if( s[1] == '{' && s[strlen(s)-1] == '}' )
|
|
||||||
return SCE_NSIS_VARIABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SCE_NSIS_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
|
|
||||||
{
|
|
||||||
int state = SCE_NSIS_DEFAULT;
|
|
||||||
styler.StartAt( startPos );
|
|
||||||
styler.GetLine( startPos );
|
|
||||||
|
|
||||||
unsigned int nLengthDoc = startPos + length;
|
|
||||||
styler.StartSegment( startPos );
|
|
||||||
|
|
||||||
char cCurrChar;
|
|
||||||
bool bVarInString = true;
|
|
||||||
|
|
||||||
unsigned int i;
|
|
||||||
for( i = startPos; i < nLengthDoc; i++ )
|
|
||||||
{
|
|
||||||
cCurrChar = styler.SafeGetCharAt( i );
|
|
||||||
char cNextChar = styler.SafeGetCharAt( i+1, EOF );
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch(state)
|
|
||||||
{
|
|
||||||
case SCE_NSIS_DEFAULT:
|
|
||||||
if( cNextChar == EOF )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i,SCE_NSIS_DEFAULT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if( cCurrChar == ';' || cCurrChar == '#' ) // we have a comment line
|
|
||||||
{
|
|
||||||
styler.ColourTo(i-1, state );
|
|
||||||
state = SCE_NSIS_COMMENT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if( cCurrChar == '"' )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i-1, state );
|
|
||||||
state = SCE_NSIS_STRINGDQ;
|
|
||||||
bVarInString = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if( cCurrChar == '\'' )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i-1, state );
|
|
||||||
state = SCE_NSIS_STRINGRQ;
|
|
||||||
bVarInString = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if( cCurrChar == '`' )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i-1, state );
|
|
||||||
state = SCE_NSIS_STRINGLQ;
|
|
||||||
bVarInString = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NSIS KeyWord,Function, Variable, UserDefined:
|
|
||||||
if( cCurrChar == '$' || iswordchar(cCurrChar) || cCurrChar == '!' )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i-1,state);
|
|
||||||
state = SCE_NSIS_FUNCTION;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_NSIS_COMMENT:
|
|
||||||
if( cNextChar == '\n' || cNextChar == '\r' || cNextChar == EOF )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i,state);
|
|
||||||
state = SCE_NSIS_DEFAULT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_NSIS_STRINGDQ:
|
|
||||||
if( cCurrChar == '"' || cNextChar == '\r' || cNextChar == '\n' )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i,SCE_NSIS_STRINGDQ);
|
|
||||||
state = SCE_NSIS_DEFAULT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_NSIS_STRINGLQ:
|
|
||||||
if( cCurrChar == '`' || cNextChar == '\r' || cNextChar == '\n' )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i,SCE_NSIS_STRINGLQ);
|
|
||||||
state = SCE_NSIS_DEFAULT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_NSIS_STRINGRQ:
|
|
||||||
if( cCurrChar == '\'' || cNextChar == '\r' || cNextChar == '\n' )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i,SCE_NSIS_STRINGRQ);
|
|
||||||
state = SCE_NSIS_DEFAULT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_NSIS_FUNCTION:
|
|
||||||
|
|
||||||
// NSIS KeyWord:
|
|
||||||
if( (iswordchar(cCurrChar) && !iswordchar( cNextChar) && cNextChar != '}') || cCurrChar == '}' )
|
|
||||||
{
|
|
||||||
state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
|
|
||||||
styler.ColourTo( i, state);
|
|
||||||
state = SCE_NSIS_DEFAULT; // Everything after goes back to the default state
|
|
||||||
}
|
|
||||||
else if( !iswordchar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' )
|
|
||||||
{
|
|
||||||
state = SCE_NSIS_DEFAULT;
|
|
||||||
|
|
||||||
if( cCurrChar == '"' ) // Next
|
|
||||||
{
|
|
||||||
state = SCE_NSIS_STRINGDQ;
|
|
||||||
bVarInString = false;
|
|
||||||
}
|
|
||||||
if( cCurrChar == '`' )
|
|
||||||
{
|
|
||||||
state = SCE_NSIS_STRINGLQ;
|
|
||||||
bVarInString = false;
|
|
||||||
}
|
|
||||||
if( cCurrChar == '\'' )
|
|
||||||
{
|
|
||||||
state = SCE_NSIS_STRINGRQ;
|
|
||||||
bVarInString = false;
|
|
||||||
}
|
|
||||||
if( cCurrChar == '#' || cCurrChar == ';' )
|
|
||||||
state = SCE_NSIS_COMMENT;
|
|
||||||
|
|
||||||
styler.ColourTo( i, state);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( state == SCE_NSIS_COMMENT )
|
|
||||||
{
|
|
||||||
styler.ColourTo(i,state);
|
|
||||||
}
|
|
||||||
else if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ )
|
|
||||||
{
|
|
||||||
// Check for var in String..
|
|
||||||
if( bVarInString && (iswordchar(cCurrChar) || cCurrChar == '}') ) // || cCurrChar == '{' ) )
|
|
||||||
{
|
|
||||||
int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
|
|
||||||
if( nWordState == SCE_NSIS_VARIABLE )
|
|
||||||
{
|
|
||||||
styler.ColourTo( i, SCE_NSIS_STRINGVAR);
|
|
||||||
bVarInString = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( cCurrChar == '$' )
|
|
||||||
{
|
|
||||||
styler.ColourTo( i-1, state);
|
|
||||||
bVarInString = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
|
|
||||||
{
|
|
||||||
// No folding enabled, no reason to continue...
|
|
||||||
if( styler.GetPropertyInt("fold") == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelCurrent = SC_FOLDLEVELBASE;
|
|
||||||
if (lineCurrent > 0)
|
|
||||||
levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
|
|
||||||
int levelNext = levelCurrent;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style;
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++)
|
|
||||||
{
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
// Functions Start: Function, Section, SubSection
|
|
||||||
// Functions End: FunctionEnd, SectionEnd, SubSectionEnd
|
|
||||||
// Label Start: !ifdef, !ifndef
|
|
||||||
// Label End: !endif
|
|
||||||
|
|
||||||
if( style == SCE_NSIS_FUNCTION )
|
|
||||||
{
|
|
||||||
if( styler.Match(i, "FunctionEnd") )
|
|
||||||
levelNext--;
|
|
||||||
else if( styler.Match(i, "Function") )
|
|
||||||
levelNext++;
|
|
||||||
}
|
|
||||||
else if( style == SCE_NSIS_SECTIONDEF )
|
|
||||||
{
|
|
||||||
if( styler.Match(i, "SectionEnd") )
|
|
||||||
levelNext--;
|
|
||||||
else if( styler.Match(i, "Section") )
|
|
||||||
levelNext++;
|
|
||||||
}
|
|
||||||
else if( style == SCE_NSIS_SUBSECTIONDEF )
|
|
||||||
{
|
|
||||||
if( styler.Match(i, "SubSectionEnd") )
|
|
||||||
levelNext--;
|
|
||||||
else if( styler.Match(i, "SubSection") )
|
|
||||||
levelNext++;
|
|
||||||
}
|
|
||||||
else if( style == SCE_NSIS_IFDEFINEDEF )
|
|
||||||
{
|
|
||||||
if( styler.Match(i, "!endif") )
|
|
||||||
levelNext--;
|
|
||||||
else if( styler.Match(i, "!ifdef") || styler.Match(i, "!ifndef"))
|
|
||||||
levelNext++;
|
|
||||||
}
|
|
||||||
else if( style == SCE_NSIS_MACRODEF )
|
|
||||||
{
|
|
||||||
if( styler.Match(i, "!macroend") )
|
|
||||||
levelNext--;
|
|
||||||
else if( styler.Match(i, "!macro") )
|
|
||||||
levelNext++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( atEOL )
|
|
||||||
{
|
|
||||||
int levelUse = levelCurrent;
|
|
||||||
int lev = levelUse | levelNext << 16;
|
|
||||||
if (levelUse < levelNext)
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent))
|
|
||||||
{
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelCurrent = levelNext;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int levelUse = levelCurrent;
|
|
||||||
int lev = levelUse | levelNext << 16;
|
|
||||||
if (levelUse < levelNext)
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent))
|
|
||||||
{
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const nsisWordLists[] = {
|
|
||||||
"Functions",
|
|
||||||
"Variables",
|
|
||||||
"Lables",
|
|
||||||
"UserDefined",
|
|
||||||
0, };
|
|
||||||
|
|
||||||
|
|
||||||
LexerModule lmNsis(SCLEX_NSIS, ColouriseNsisDoc, "nsis", FoldNsisDoc, nsisWordLists);
|
|
||||||
@@ -1,704 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexOthers.cxx
|
|
||||||
** Lexers for batch files, diff results, properties files, make files and error lists.
|
|
||||||
** Also lexer for LaTeX documents.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static bool Is0To9(char ch) {
|
|
||||||
return (ch >= '0') && (ch <= '9');
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool Is1To9(char ch) {
|
|
||||||
return (ch >= '1') && (ch <= '9');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool AtEOL(Accessor &styler, unsigned int i) {
|
|
||||||
return (styler[i] == '\n') ||
|
|
||||||
((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseBatchLine(
|
|
||||||
char *lineBuffer,
|
|
||||||
unsigned int lengthLine,
|
|
||||||
unsigned int startLine,
|
|
||||||
unsigned int endPos,
|
|
||||||
WordList &keywords,
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
unsigned int i = 0;
|
|
||||||
unsigned int state = SCE_BAT_DEFAULT;
|
|
||||||
|
|
||||||
while ((i < lengthLine) && isspacechar(lineBuffer[i])) { // Skip initial spaces
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (lineBuffer[i] == '@') { // Hide command (ECHO OFF)
|
|
||||||
styler.ColourTo(startLine + i, SCE_BAT_HIDE);
|
|
||||||
i++;
|
|
||||||
while ((i < lengthLine) && isspacechar(lineBuffer[i])) { // Skip next spaces
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (lineBuffer[i] == ':') {
|
|
||||||
// Label
|
|
||||||
if (lineBuffer[i + 1] == ':') {
|
|
||||||
// :: is a fake label, similar to REM, see http://content.techweb.com/winmag/columns/explorer/2000/21.htm
|
|
||||||
styler.ColourTo(endPos, SCE_BAT_COMMENT);
|
|
||||||
} else { // Real label
|
|
||||||
styler.ColourTo(endPos, SCE_BAT_LABEL);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Check if initial word is a keyword
|
|
||||||
char wordBuffer[21];
|
|
||||||
unsigned int wbl = 0, offset = i;
|
|
||||||
// Copy word in buffer
|
|
||||||
for (; offset < lengthLine && wbl < 20 &&
|
|
||||||
!isspacechar(lineBuffer[offset]); wbl++, offset++) {
|
|
||||||
wordBuffer[wbl] = static_cast<char>(tolower(lineBuffer[offset]));
|
|
||||||
}
|
|
||||||
wordBuffer[wbl] = '\0';
|
|
||||||
// Check if it is a comment
|
|
||||||
if (CompareCaseInsensitive(wordBuffer, "rem") == 0) {
|
|
||||||
styler.ColourTo(endPos, SCE_BAT_COMMENT);
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
// Check if it is in the list
|
|
||||||
if (keywords.InList(wordBuffer)) {
|
|
||||||
styler.ColourTo(startLine + offset - 1, SCE_BAT_WORD); // Regular keyword
|
|
||||||
} else {
|
|
||||||
// Search end of word (can be a long path)
|
|
||||||
while (offset < lengthLine &&
|
|
||||||
!isspacechar(lineBuffer[offset])) {
|
|
||||||
offset++;
|
|
||||||
}
|
|
||||||
styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND); // External command / program
|
|
||||||
}
|
|
||||||
// Remainder of the line: colourise the variables.
|
|
||||||
|
|
||||||
while (offset < lengthLine) {
|
|
||||||
if (state == SCE_BAT_DEFAULT && lineBuffer[offset] == '%') {
|
|
||||||
styler.ColourTo(startLine + offset - 1, state);
|
|
||||||
if (Is0To9(lineBuffer[offset + 1])) {
|
|
||||||
styler.ColourTo(startLine + offset + 1, SCE_BAT_IDENTIFIER);
|
|
||||||
offset += 2;
|
|
||||||
} else if (lineBuffer[offset + 1] == '%' &&
|
|
||||||
!isspacechar(lineBuffer[offset + 2])) {
|
|
||||||
// Should be safe, as there is CRLF at the end of the line...
|
|
||||||
styler.ColourTo(startLine + offset + 2, SCE_BAT_IDENTIFIER);
|
|
||||||
offset += 3;
|
|
||||||
} else {
|
|
||||||
state = SCE_BAT_IDENTIFIER;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_BAT_IDENTIFIER && lineBuffer[offset] == '%') {
|
|
||||||
styler.ColourTo(startLine + offset, state);
|
|
||||||
state = SCE_BAT_DEFAULT;
|
|
||||||
} else if (state == SCE_BAT_DEFAULT &&
|
|
||||||
(lineBuffer[offset] == '*' ||
|
|
||||||
lineBuffer[offset] == '?' ||
|
|
||||||
lineBuffer[offset] == '=' ||
|
|
||||||
lineBuffer[offset] == '<' ||
|
|
||||||
lineBuffer[offset] == '>' ||
|
|
||||||
lineBuffer[offset] == '|')) {
|
|
||||||
styler.ColourTo(startLine + offset - 1, state);
|
|
||||||
styler.ColourTo(startLine + offset, SCE_BAT_OPERATOR);
|
|
||||||
}
|
|
||||||
offset++;
|
|
||||||
}
|
|
||||||
// if (endPos > startLine + offset - 1) {
|
|
||||||
styler.ColourTo(endPos, SCE_BAT_DEFAULT); // Remainder of line, currently not lexed
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
// ToDo: (not necessarily at beginning of line) GOTO, [IF] NOT, ERRORLEVEL
|
|
||||||
// IF [NO] (test) (command) -- test is EXIST (filename) | (string1)==(string2) | ERRORLEVEL (number)
|
|
||||||
// FOR %%(variable) IN (set) DO (command) -- variable is [a-zA-Z] -- eg for %%X in (*.txt) do type %%X
|
|
||||||
// ToDo: %n (parameters), %EnvironmentVariable% colourising
|
|
||||||
// ToDo: Colourise = > >> < | "
|
|
||||||
|
|
||||||
static void ColouriseBatchDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int /*initStyle*/,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
char lineBuffer[1024];
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int linePos = 0;
|
|
||||||
unsigned int startLine = startPos;
|
|
||||||
for (unsigned int i = startPos; i < startPos + length; i++) {
|
|
||||||
lineBuffer[linePos++] = styler[i];
|
|
||||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
// End of line (or of line buffer) met, colourise it
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywords, styler);
|
|
||||||
linePos = 0;
|
|
||||||
startLine = i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (linePos > 0) { // Last line does not have ending characters
|
|
||||||
ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length - 1,
|
|
||||||
keywords, styler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) {
|
|
||||||
// It is needed to remember the current state to recognize starting
|
|
||||||
// comment lines before the first "diff " or "--- ". If a real
|
|
||||||
// difference starts then each line starting with ' ' is a whitespace
|
|
||||||
// otherwise it is considered a comment (Only in..., Binary file...)
|
|
||||||
if (0 == strncmp(lineBuffer, "diff ", 3)) {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_COMMAND);
|
|
||||||
} else if (0 == strncmp(lineBuffer, "--- ", 3)) {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_HEADER);
|
|
||||||
} else if (0 == strncmp(lineBuffer, "+++ ", 3)) {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_HEADER);
|
|
||||||
} else if (0 == strncmp(lineBuffer, "====", 4)) { // For p4's diff
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_HEADER);
|
|
||||||
} else if (0 == strncmp(lineBuffer, "***", 3)) {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_HEADER);
|
|
||||||
} else if (0 == strncmp(lineBuffer, "? ", 2)) { // For difflib
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_HEADER);
|
|
||||||
} else if (lineBuffer[0] == '@') {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_POSITION);
|
|
||||||
} else if (lineBuffer[0] == '-' || lineBuffer[0] == '<') {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_DELETED);
|
|
||||||
} else if (lineBuffer[0] == '+' || lineBuffer[0] == '>') {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_ADDED);
|
|
||||||
} else if (lineBuffer[0] != ' ') {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_COMMENT);
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(endLine, SCE_DIFF_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
char lineBuffer[1024];
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int linePos = 0;
|
|
||||||
for (unsigned int i = startPos; i < startPos + length; i++) {
|
|
||||||
lineBuffer[linePos++] = styler[i];
|
|
||||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
// End of line (or of line buffer) met, colourise it
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
ColouriseDiffLine(lineBuffer, i, styler);
|
|
||||||
linePos = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (linePos > 0) { // Last line does not have ending characters
|
|
||||||
ColouriseDiffLine(lineBuffer, startPos + length - 1, styler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePropsLine(
|
|
||||||
char *lineBuffer,
|
|
||||||
unsigned int lengthLine,
|
|
||||||
unsigned int startLine,
|
|
||||||
unsigned int endPos,
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
unsigned int i = 0;
|
|
||||||
while ((i < lengthLine) && isspacechar(lineBuffer[i])) // Skip initial spaces
|
|
||||||
i++;
|
|
||||||
if (i < lengthLine) {
|
|
||||||
if (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') {
|
|
||||||
styler.ColourTo(endPos, SCE_PROPS_COMMENT);
|
|
||||||
} else if (lineBuffer[i] == '[') {
|
|
||||||
styler.ColourTo(endPos, SCE_PROPS_SECTION);
|
|
||||||
} else if (lineBuffer[i] == '@') {
|
|
||||||
styler.ColourTo(startLine + i, SCE_PROPS_DEFVAL);
|
|
||||||
if (lineBuffer[++i] == '=')
|
|
||||||
styler.ColourTo(startLine + i, SCE_PROPS_ASSIGNMENT);
|
|
||||||
styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
|
|
||||||
} else {
|
|
||||||
// Search for the '=' character
|
|
||||||
while ((i < lengthLine) && (lineBuffer[i] != '='))
|
|
||||||
i++;
|
|
||||||
if ((i < lengthLine) && (lineBuffer[i] == '=')) {
|
|
||||||
styler.ColourTo(startLine + i - 1, SCE_PROPS_DEFAULT);
|
|
||||||
styler.ColourTo(startLine + i, 3);
|
|
||||||
styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
char lineBuffer[1024];
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int linePos = 0;
|
|
||||||
unsigned int startLine = startPos;
|
|
||||||
for (unsigned int i = startPos; i < startPos + length; i++) {
|
|
||||||
lineBuffer[linePos++] = styler[i];
|
|
||||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
// End of line (or of line buffer) met, colourise it
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
ColourisePropsLine(lineBuffer, linePos, startLine, i, styler);
|
|
||||||
linePos = 0;
|
|
||||||
startLine = i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (linePos > 0) { // Last line does not have ending characters
|
|
||||||
ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length - 1, styler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// adaption by ksc, using the "} else {" trick of 1.53
|
|
||||||
// 030721
|
|
||||||
static void FoldPropsDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
bool headerPoint = false;
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler[i+1];
|
|
||||||
|
|
||||||
int style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
|
|
||||||
if (style==2) {
|
|
||||||
headerPoint = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = SC_FOLDLEVELBASE+1;
|
|
||||||
if (headerPoint)
|
|
||||||
lev = SC_FOLDLEVELBASE;
|
|
||||||
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
|
|
||||||
if (headerPoint)
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
|
|
||||||
lineCurrent++;
|
|
||||||
visibleChars = 0;
|
|
||||||
headerPoint=false;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
|
|
||||||
int lev = headerPoint ? SC_FOLDLEVELBASE : SC_FOLDLEVELBASE+1;
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, lev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseMakeLine(
|
|
||||||
char *lineBuffer,
|
|
||||||
unsigned int lengthLine,
|
|
||||||
unsigned int startLine,
|
|
||||||
unsigned int endPos,
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
unsigned int i = 0;
|
|
||||||
int lastNonSpace = -1;
|
|
||||||
unsigned int state = SCE_MAKE_DEFAULT;
|
|
||||||
bool bSpecial = false;
|
|
||||||
// Skip initial spaces
|
|
||||||
while ((i < lengthLine) && isspacechar(lineBuffer[i])) {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (lineBuffer[i] == '#') { // Comment
|
|
||||||
styler.ColourTo(endPos, SCE_MAKE_COMMENT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (lineBuffer[i] == '!') { // Special directive
|
|
||||||
styler.ColourTo(endPos, SCE_MAKE_PREPROCESSOR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
while (i < lengthLine) {
|
|
||||||
if (lineBuffer[i] == '$' && lineBuffer[i + 1] == '(') {
|
|
||||||
styler.ColourTo(startLine + i - 1, state);
|
|
||||||
state = SCE_MAKE_IDENTIFIER;
|
|
||||||
} else if (state == SCE_MAKE_IDENTIFIER && lineBuffer[i] == ')') {
|
|
||||||
styler.ColourTo(startLine + i, state);
|
|
||||||
state = SCE_MAKE_DEFAULT;
|
|
||||||
}
|
|
||||||
if (!bSpecial) {
|
|
||||||
if (lineBuffer[i] == ':') {
|
|
||||||
// We should check that no colouring was made since the beginning of the line,
|
|
||||||
// to avoid colouring stuff like /OUT:file
|
|
||||||
if (lastNonSpace >= 0)
|
|
||||||
styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_TARGET);
|
|
||||||
styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
|
|
||||||
styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
|
|
||||||
bSpecial = true; // Only react to the first ':' of the line
|
|
||||||
state = SCE_MAKE_DEFAULT;
|
|
||||||
} else if (lineBuffer[i] == '=') {
|
|
||||||
if (lastNonSpace >= 0)
|
|
||||||
styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER);
|
|
||||||
styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
|
|
||||||
styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
|
|
||||||
bSpecial = true; // Only react to the first '=' of the line
|
|
||||||
state = SCE_MAKE_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isspacechar(lineBuffer[i])) {
|
|
||||||
lastNonSpace = i;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (state == SCE_MAKE_IDENTIFIER) {
|
|
||||||
styler.ColourTo(endPos, SCE_MAKE_IDEOL); // Error, variable reference not ended
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(endPos, SCE_MAKE_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
char lineBuffer[1024];
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int linePos = 0;
|
|
||||||
unsigned int startLine = startPos;
|
|
||||||
for (unsigned int i = startPos; i < startPos + length; i++) {
|
|
||||||
lineBuffer[linePos++] = styler[i];
|
|
||||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
// End of line (or of line buffer) met, colourise it
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
ColouriseMakeLine(lineBuffer, linePos, startLine, i, styler);
|
|
||||||
linePos = 0;
|
|
||||||
startLine = i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (linePos > 0) { // Last line does not have ending characters
|
|
||||||
ColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length - 1, styler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool strstart(char *haystack, char *needle) {
|
|
||||||
return strncmp(haystack, needle, strlen(needle)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseErrorListLine(
|
|
||||||
char *lineBuffer,
|
|
||||||
unsigned int lengthLine,
|
|
||||||
// unsigned int startLine,
|
|
||||||
unsigned int endPos,
|
|
||||||
Accessor &styler) {
|
|
||||||
const int unRecognized = 99;
|
|
||||||
if (lineBuffer[0] == '>') {
|
|
||||||
// Command or return status
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_CMD);
|
|
||||||
} else if (lineBuffer[0] == '<') {
|
|
||||||
// Diff removal, but not interested. Trapped to avoid hitting CTAG cases.
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_DEFAULT);
|
|
||||||
} else if (lineBuffer[0] == '!') {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_DIFF_CHANGED);
|
|
||||||
} else if (lineBuffer[0] == '+') {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
|
|
||||||
} else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
|
|
||||||
} else if (strstart(lineBuffer, "cf90-")) {
|
|
||||||
// Absoft Pro Fortran 90/95 v8.2 error and/or warning message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_ABSF);
|
|
||||||
} else if (strstart(lineBuffer, "fortcom:")) {
|
|
||||||
// Intel Fortran Compiler v8.0 error/warning message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_IFORT);
|
|
||||||
} else if (lineBuffer[0] == '-') {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
|
|
||||||
} else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_PYTHON);
|
|
||||||
} else if (strstr(lineBuffer, " in ") && strstr(lineBuffer, " on line ")) {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_PHP);
|
|
||||||
} else if ((strstart(lineBuffer, "Error ") ||
|
|
||||||
strstart(lineBuffer, "Warning ")) &&
|
|
||||||
strstr(lineBuffer, " at (") &&
|
|
||||||
strstr(lineBuffer, ") : ") &&
|
|
||||||
(strstr(lineBuffer, " at (") < strstr(lineBuffer, ") : "))) {
|
|
||||||
// Intel Fortran Compiler error/warning message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_IFC);
|
|
||||||
} else if (strstart(lineBuffer, "Error ")) {
|
|
||||||
// Borland error message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_BORLAND);
|
|
||||||
} else if (strstart(lineBuffer, "Warning ")) {
|
|
||||||
// Borland warning message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_BORLAND);
|
|
||||||
} else if (strstr(lineBuffer, "at line " ) &&
|
|
||||||
(strstr(lineBuffer, "at line " ) < (lineBuffer + lengthLine)) &&
|
|
||||||
strstr(lineBuffer, "file ") &&
|
|
||||||
(strstr(lineBuffer, "file ") < (lineBuffer + lengthLine))) {
|
|
||||||
// Lua error message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_LUA);
|
|
||||||
} else if (strstr(lineBuffer, " at " ) &&
|
|
||||||
(strstr(lineBuffer, " at " ) < (lineBuffer + lengthLine)) &&
|
|
||||||
strstr(lineBuffer, " line ") &&
|
|
||||||
(strstr(lineBuffer, " line ") < (lineBuffer + lengthLine)) &&
|
|
||||||
(strstr(lineBuffer, " at " ) < (strstr(lineBuffer, " line ")))) {
|
|
||||||
// perl error message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_PERL);
|
|
||||||
} else if ((memcmp(lineBuffer, " at ", 6) == 0) &&
|
|
||||||
strstr(lineBuffer, ":line ")) {
|
|
||||||
// A .NET traceback
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_NET);
|
|
||||||
} else if (strstart(lineBuffer, "Line ") &&
|
|
||||||
strstr(lineBuffer, ", file ")) {
|
|
||||||
// Essential Lahey Fortran error message
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_ELF);
|
|
||||||
} else {
|
|
||||||
// Look for GCC <filename>:<line>:message
|
|
||||||
// Look for Microsoft <filename>(line) :message
|
|
||||||
// Look for Microsoft <filename>(line,pos)message
|
|
||||||
// Look for CTags \tmessage
|
|
||||||
int state = 0;
|
|
||||||
for (unsigned int i = 0; i < lengthLine; i++) {
|
|
||||||
char ch = lineBuffer[i];
|
|
||||||
char chNext = ' ';
|
|
||||||
if ((i+1) < lengthLine)
|
|
||||||
chNext = lineBuffer[i+1];
|
|
||||||
if (state == 0) {
|
|
||||||
if (ch == ':') {
|
|
||||||
// May be GCC
|
|
||||||
if ((chNext != '\\') && (chNext != '/')) {
|
|
||||||
// This check is not completely accurate as may be on
|
|
||||||
// GTK+ with a file name that includes ':'.
|
|
||||||
state = 1;
|
|
||||||
}
|
|
||||||
} else if ((ch == '(') && Is1To9(chNext)) {
|
|
||||||
// May be Microsoft
|
|
||||||
// Check againt '0' often removes phone numbers
|
|
||||||
state = 10;
|
|
||||||
} else if (ch == '\t') {
|
|
||||||
// May be CTags
|
|
||||||
state = 20;
|
|
||||||
}
|
|
||||||
} else if (state == 1) {
|
|
||||||
state = Is1To9(ch) ? 2 : unRecognized;
|
|
||||||
} else if (state == 2) {
|
|
||||||
if (ch == ':') {
|
|
||||||
state = 3; // :9.*: is GCC
|
|
||||||
break;
|
|
||||||
} else if (!Is0To9(ch)) {
|
|
||||||
state = unRecognized;
|
|
||||||
}
|
|
||||||
} else if (state == 10) {
|
|
||||||
state = Is0To9(ch) ? 11 : unRecognized;
|
|
||||||
} else if (state == 11) {
|
|
||||||
if (ch == ',') {
|
|
||||||
state = 14;
|
|
||||||
} else if (ch == ')') {
|
|
||||||
state = 12;
|
|
||||||
} else if ((ch != ' ') && !Is0To9(ch)) {
|
|
||||||
state = unRecognized;
|
|
||||||
}
|
|
||||||
} else if (state == 12) {
|
|
||||||
if ((ch == ' ') && (chNext == ':'))
|
|
||||||
state = 13;
|
|
||||||
else
|
|
||||||
state = unRecognized;
|
|
||||||
} else if (state == 14) {
|
|
||||||
if (ch == ')') {
|
|
||||||
state = 15;
|
|
||||||
break;
|
|
||||||
} else if ((ch != ' ') && !Is0To9(ch)) {
|
|
||||||
state = unRecognized;
|
|
||||||
}
|
|
||||||
} else if (state == 20) {
|
|
||||||
if ((lineBuffer[i-1] == '\t') &&
|
|
||||||
((ch == '/' && lineBuffer[i+1] == '^') || Is0To9(ch))) {
|
|
||||||
state = 24;
|
|
||||||
break;
|
|
||||||
} else if ((ch == '/') && (lineBuffer[i+1] == '^')) {
|
|
||||||
state = 21;
|
|
||||||
}
|
|
||||||
} else if ((state == 21) && ((lineBuffer[i] == '$') && (lineBuffer[i+1] == '/'))) {
|
|
||||||
state = 22;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (state == 3) {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_GCC);
|
|
||||||
} else if ((state == 13) || (state == 14) || (state == 15)) {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_MS);
|
|
||||||
} else if (((state == 22) || (state == 24)) && (lineBuffer[0] != '\t')) {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_CTAG);
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(endPos, SCE_ERR_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
|
|
||||||
char lineBuffer[1024];
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int linePos = 0;
|
|
||||||
for (unsigned int i = startPos; i < startPos + length; i++) {
|
|
||||||
lineBuffer[linePos++] = styler[i];
|
|
||||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
// End of line (or of line buffer) met, colourise it
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
ColouriseErrorListLine(lineBuffer, linePos, i, styler);
|
|
||||||
linePos = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (linePos > 0) { // Last line does not have ending characters
|
|
||||||
ColouriseErrorListLine(lineBuffer, linePos, startPos + length - 1, styler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int isSpecial(char s) {
|
|
||||||
return (s == '\\') || (s == ',') || (s == ';') || (s == '\'') || (s == ' ') ||
|
|
||||||
(s == '\"') || (s == '`') || (s == '^') || (s == '~');
|
|
||||||
}
|
|
||||||
|
|
||||||
static int isTag(int start, Accessor &styler) {
|
|
||||||
char s[6];
|
|
||||||
unsigned int i = 0, e = 1;
|
|
||||||
while (i < 5 && e) {
|
|
||||||
s[i] = styler[start + i];
|
|
||||||
i++;
|
|
||||||
e = styler[start + i] != '{';
|
|
||||||
}
|
|
||||||
s[i] = '\0';
|
|
||||||
return (strcmp(s, "begin") == 0) || (strcmp(s, "end") == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
int state = initStyle;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
|
|
||||||
for (int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch (state) {
|
|
||||||
case SCE_L_DEFAULT :
|
|
||||||
switch (ch) {
|
|
||||||
case '\\' :
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
if (isSpecial(styler[i + 1])) {
|
|
||||||
styler.ColourTo(i + 1, SCE_L_COMMAND);
|
|
||||||
i++;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
} else {
|
|
||||||
if (isTag(i + 1, styler))
|
|
||||||
state = SCE_L_TAG;
|
|
||||||
else
|
|
||||||
state = SCE_L_COMMAND;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '$' :
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_L_MATH;
|
|
||||||
if (chNext == '$') {
|
|
||||||
i++;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '%' :
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_L_COMMENT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_L_COMMAND :
|
|
||||||
if (chNext == '[' || chNext == '{' || chNext == '}' ||
|
|
||||||
chNext == ' ' || chNext == '\r' || chNext == '\n') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_L_DEFAULT;
|
|
||||||
i++;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_L_TAG :
|
|
||||||
if (ch == '}') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_L_DEFAULT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_L_MATH :
|
|
||||||
if (ch == '$') {
|
|
||||||
if (chNext == '$') {
|
|
||||||
i++;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_L_DEFAULT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SCE_L_COMMENT :
|
|
||||||
if (ch == '\r' || ch == '\n') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_L_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styler.ColourTo(lengthDoc-1, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const batchWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char * const emptyWordListDesc[] = {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
// Null language means all style bytes are 0 so just mark the end - no need to fill in.
|
|
||||||
if (length > 0) {
|
|
||||||
styler.StartAt(startPos + length - 1);
|
|
||||||
styler.StartSegment(startPos + length - 1);
|
|
||||||
styler.ColourTo(startPos + length - 1, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", 0, batchWordListDesc);
|
|
||||||
LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff", 0, emptyWordListDesc);
|
|
||||||
LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props", FoldPropsDoc, emptyWordListDesc);
|
|
||||||
LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", 0, emptyWordListDesc);
|
|
||||||
LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist", 0, emptyWordListDesc);
|
|
||||||
LexerModule lmLatex(SCLEX_LATEX, ColouriseLatexDoc, "latex", 0, emptyWordListDesc);
|
|
||||||
LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null");
|
|
||||||
@@ -1,228 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexPB.cxx
|
|
||||||
** Lexer for PowerBasic by Roland Walter, roland@rowalt.de
|
|
||||||
** Last update: 17.10.2003 (toggling of subs/functions now until next sub/functin - this gives better results)
|
|
||||||
**/
|
|
||||||
//
|
|
||||||
// Necessary changes in Scintilla project:
|
|
||||||
// - In SciLexer.h and Scintilla.iface:
|
|
||||||
//
|
|
||||||
// #define SCLEX_PB 51 //ID for PowerBasic lexer
|
|
||||||
// (...)
|
|
||||||
// #define SCE_B_DEFAULT 0 //in both VB and PB lexer
|
|
||||||
// #define SCE_B_COMMENT 1 //in both VB and PB lexer
|
|
||||||
// #define SCE_B_NUMBER 2 //in both VB and PB lexer
|
|
||||||
// #define SCE_B_KEYWORD 3 //in both VB and PB lexer
|
|
||||||
// #define SCE_B_STRING 4 //in both VB and PB lexer
|
|
||||||
// #define SCE_B_PREPROCESSOR 5 //VB lexer only, unsupported by PB lexer
|
|
||||||
// #define SCE_B_OPERATOR 6 //in both VB and PB lexer
|
|
||||||
// #define SCE_B_IDENTIFIER 7 //in both VB and PB lexer
|
|
||||||
// #define SCE_B_DATE 8 //VB lexer only, unsupported by PB lexer
|
|
||||||
|
|
||||||
// - Statement added to KeyWords.cxx: 'LINK_LEXER(lmPB);'
|
|
||||||
// - Statement added to scintilla_vc6.mak: '$(DIR_O)\LexPB.obj: ...\src\LexPB.cxx $(LEX_HEADERS)'
|
|
||||||
//
|
|
||||||
// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool IsTypeCharacter(const int ch) {
|
|
||||||
return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MatchUpperCase(Accessor &styler, int pos, const char *s) //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)
|
|
||||||
{
|
|
||||||
char ch;
|
|
||||||
for (int i=0; *s; i++)
|
|
||||||
{
|
|
||||||
ch=styler.SafeGetCharAt(pos+i);
|
|
||||||
if (ch > 0x60) ch -= '\x20';
|
|
||||||
if (*s != ch) return false;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.state == SCE_B_OPERATOR)
|
|
||||||
{
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
else if (sc.state == SCE_B_KEYWORD)
|
|
||||||
{
|
|
||||||
if (!IsAWordChar(sc.ch))
|
|
||||||
{
|
|
||||||
if (!IsTypeCharacter(sc.ch))
|
|
||||||
{
|
|
||||||
if (sc.ch == ']') {sc.Forward();}
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
if (keywords.InList(s))
|
|
||||||
{
|
|
||||||
if (strcmp(s, "rem") == 0)
|
|
||||||
{
|
|
||||||
sc.ChangeState(SCE_B_COMMENT);
|
|
||||||
if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sc.ChangeState(SCE_B_IDENTIFIER);
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (sc.state == SCE_B_NUMBER)
|
|
||||||
{
|
|
||||||
if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
|
|
||||||
}
|
|
||||||
else if (sc.state == SCE_B_STRING)
|
|
||||||
{
|
|
||||||
// PB doubles quotes to preserve them, so just end this string
|
|
||||||
// state now as a following quote will start again
|
|
||||||
if (sc.ch == '\"')
|
|
||||||
{
|
|
||||||
if (tolower(sc.chNext) == 'c') {sc.Forward();}
|
|
||||||
sc.ForwardSetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (sc.state == SCE_B_COMMENT)
|
|
||||||
{
|
|
||||||
if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_B_DEFAULT)
|
|
||||||
{
|
|
||||||
if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);}
|
|
||||||
else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);}
|
|
||||||
else if (sc.ch == '#')
|
|
||||||
{ int n = 1;
|
|
||||||
int chSeek = ' ';
|
|
||||||
while ((n < 100) && (chSeek == ' ' || chSeek == '\t'))
|
|
||||||
{
|
|
||||||
chSeek = sc.GetRelative(n);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_B_OPERATOR);
|
|
||||||
}
|
|
||||||
else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}
|
|
||||||
else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}
|
|
||||||
else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}
|
|
||||||
else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}
|
|
||||||
else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {sc.SetState(SCE_B_KEYWORD);}
|
|
||||||
else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
|
|
||||||
{
|
|
||||||
// No folding enabled, no reason to continue...
|
|
||||||
if( styler.GetPropertyInt("fold") == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelCurrent = SC_FOLDLEVELBASE;
|
|
||||||
if (lineCurrent > 0)
|
|
||||||
levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
|
|
||||||
int levelNext = levelCurrent;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
|
|
||||||
bool atEOL=1;
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++)
|
|
||||||
{
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if( atEOL ) //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)
|
|
||||||
{
|
|
||||||
if( MatchUpperCase(styler,i,"FUNCTION") ) //else if(
|
|
||||||
{
|
|
||||||
styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
|
|
||||||
levelNext=SC_FOLDLEVELBASE+1;
|
|
||||||
}
|
|
||||||
else if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") )
|
|
||||||
{
|
|
||||||
styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
|
|
||||||
levelNext=SC_FOLDLEVELBASE+1;
|
|
||||||
}
|
|
||||||
else if( MatchUpperCase(styler,i,"STATIC FUNCTION") )
|
|
||||||
{
|
|
||||||
styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
|
|
||||||
levelNext=SC_FOLDLEVELBASE+1;
|
|
||||||
}
|
|
||||||
else if( MatchUpperCase(styler,i,"SUB") )
|
|
||||||
{
|
|
||||||
styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
|
|
||||||
levelNext=SC_FOLDLEVELBASE+1;
|
|
||||||
}
|
|
||||||
else if( MatchUpperCase(styler,i,"STATIC SUB") )
|
|
||||||
{
|
|
||||||
styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
|
|
||||||
levelNext=SC_FOLDLEVELBASE+1;
|
|
||||||
}
|
|
||||||
//else if( MatchUpperCase(styler,i,"MACRO") ) //ToDo: What's with single-line macros?
|
|
||||||
}
|
|
||||||
|
|
||||||
atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if( atEOL )
|
|
||||||
{
|
|
||||||
lineCurrent++;
|
|
||||||
levelCurrent = levelNext;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (levelNext == SC_FOLDLEVELBASE)
|
|
||||||
{
|
|
||||||
int levelUse = levelCurrent;
|
|
||||||
int lev = levelUse | levelNext << 16;
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const pbWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc);
|
|
||||||
@@ -1,310 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexPOV.cxx
|
|
||||||
** Lexer for POV-Ray SDL (Persistance of Vision Raytracer, Scene Description Language).
|
|
||||||
** Written by Philippe Lhoste but this is mostly a derivative of LexCPP...
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
// Some points that distinguish from a simple C lexer:
|
|
||||||
// Identifiers start only by a character.
|
|
||||||
// No line continuation character.
|
|
||||||
// Strings are limited to 256 characters.
|
|
||||||
// Directives are similar to preprocessor commands,
|
|
||||||
// but we match directive keywords and colorize incorrect ones.
|
|
||||||
// Block comments can be nested (code stolen from my code in LexLua).
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(const int ch) {
|
|
||||||
return ch < 0x80 && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(const int ch) {
|
|
||||||
return ch < 0x80 && isalpha(ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsANumberChar(const int ch) {
|
|
||||||
// Not exactly following number definition (several dots are seen as OK, etc.)
|
|
||||||
// but probably enough in most cases.
|
|
||||||
return (ch < 0x80) &&
|
|
||||||
(isdigit(ch) || toupper(ch) == 'E' ||
|
|
||||||
ch == '.' || ch == '-' || ch == '+');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePovDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords1 = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
WordList &keywords4 = *keywordlists[3];
|
|
||||||
WordList &keywords5 = *keywordlists[4];
|
|
||||||
WordList &keywords6 = *keywordlists[5];
|
|
||||||
WordList &keywords7 = *keywordlists[6];
|
|
||||||
WordList &keywords8 = *keywordlists[7];
|
|
||||||
|
|
||||||
int currentLine = styler.GetLine(startPos);
|
|
||||||
// Initialize the block comment /* */ nesting level, if we are inside such a comment.
|
|
||||||
int blockCommentLevel = 0;
|
|
||||||
if (initStyle == SCE_POV_COMMENT) {
|
|
||||||
blockCommentLevel = styler.GetLineState(currentLine - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not leak onto next line
|
|
||||||
if (initStyle == SCE_POV_STRINGEOL) {
|
|
||||||
initStyle = SCE_POV_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
short stringLen = 0;
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
// Update the line state, so it can be seen by next line
|
|
||||||
currentLine = styler.GetLine(sc.currentPos);
|
|
||||||
if (sc.state == SCE_POV_COMMENT) {
|
|
||||||
// Inside a block comment, we set the line state
|
|
||||||
styler.SetLineState(currentLine, blockCommentLevel);
|
|
||||||
} else {
|
|
||||||
// Reset the line state
|
|
||||||
styler.SetLineState(currentLine, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.atLineStart && (sc.state == SCE_POV_STRING)) {
|
|
||||||
// Prevent SCE_POV_STRINGEOL from leaking back to previous line
|
|
||||||
sc.SetState(SCE_POV_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_POV_OPERATOR) {
|
|
||||||
sc.SetState(SCE_POV_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_POV_NUMBER) {
|
|
||||||
// We stop the number definition on non-numerical non-dot non-eE non-sign char
|
|
||||||
if (!IsANumberChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_POV_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_POV_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_POV_WORD2);
|
|
||||||
} else if (keywords3.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_POV_WORD3);
|
|
||||||
} else if (keywords4.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_POV_WORD4);
|
|
||||||
} else if (keywords5.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_POV_WORD5);
|
|
||||||
} else if (keywords6.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_POV_WORD6);
|
|
||||||
} else if (keywords7.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_POV_WORD7);
|
|
||||||
} else if (keywords8.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_POV_WORD8);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_POV_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_POV_DIRECTIVE) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
char s[100], *p;
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
p = s;
|
|
||||||
// Skip # and whitespace between # and directive word
|
|
||||||
do {
|
|
||||||
p++;
|
|
||||||
} while ((*p == ' ' || *p == '\t') && *p != '\0');
|
|
||||||
if (!keywords1.InList(p)) {
|
|
||||||
sc.ChangeState(SCE_POV_BADDIRECTIVE);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_POV_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_POV_COMMENT) {
|
|
||||||
if (sc.Match('/', '*')) {
|
|
||||||
blockCommentLevel++;
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.Match('*', '/') && blockCommentLevel > 0) {
|
|
||||||
blockCommentLevel--;
|
|
||||||
sc.Forward();
|
|
||||||
if (blockCommentLevel == 0) {
|
|
||||||
sc.ForwardSetState(SCE_POV_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_POV_COMMENTLINE) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_POV_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_POV_STRING) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
stringLen++;
|
|
||||||
if (strchr("abfnrtuv0'\"", sc.chNext)) {
|
|
||||||
// Compound characters are counted as one.
|
|
||||||
// Note: for Unicode chars \u, we shouldn't count the next 4 digits...
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_POV_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_POV_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_POV_DEFAULT);
|
|
||||||
} else {
|
|
||||||
stringLen++;
|
|
||||||
}
|
|
||||||
if (stringLen > 256) {
|
|
||||||
// Strings are limited to 256 chars
|
|
||||||
sc.SetState(SCE_POV_STRINGEOL);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_POV_STRINGEOL) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if (sc.chNext == '\"' || sc.chNext == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.ForwardSetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ForwardSetState(SCE_POV_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_POV_DEFAULT) {
|
|
||||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_POV_NUMBER);
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_POV_IDENTIFIER);
|
|
||||||
} else if (sc.Match('/', '*')) {
|
|
||||||
blockCommentLevel = 1;
|
|
||||||
sc.SetState(SCE_POV_COMMENT);
|
|
||||||
sc.Forward(); // Eat the * so it isn't used for the end of the comment
|
|
||||||
} else if (sc.Match('/', '/')) {
|
|
||||||
sc.SetState(SCE_POV_COMMENTLINE);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_POV_STRING);
|
|
||||||
stringLen = 0;
|
|
||||||
} else if (sc.ch == '#') {
|
|
||||||
sc.SetState(SCE_POV_DIRECTIVE);
|
|
||||||
// Skip whitespace between # and directive word
|
|
||||||
do {
|
|
||||||
sc.Forward();
|
|
||||||
} while ((sc.ch == ' ' || sc.ch == '\t') && sc.More());
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_POV_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (isoperator(static_cast<char>(sc.ch))) {
|
|
||||||
sc.SetState(SCE_POV_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldPovDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
bool foldDirective = styler.GetPropertyInt("fold.directive") != 0;
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style = initStyle;
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (foldComment && (style == SCE_POV_COMMENT)) {
|
|
||||||
if (stylePrev != SCE_POV_COMMENT) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if ((styleNext != SCE_POV_COMMENT) && !atEOL) {
|
|
||||||
// Comments don't end at end of line and the next character may be unstyled.
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (foldComment && (style == SCE_POV_COMMENTLINE)) {
|
|
||||||
if ((ch == '/') && (chNext == '/')) {
|
|
||||||
char chNext2 = styler.SafeGetCharAt(i + 2);
|
|
||||||
if (chNext2 == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (chNext2 == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (foldDirective && (style == SCE_POV_DIRECTIVE)) {
|
|
||||||
if (ch == '#') {
|
|
||||||
unsigned int j=i+1;
|
|
||||||
while ((j<endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (style == SCE_POV_OPERATOR) {
|
|
||||||
if (ch == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const povWordLists[] = {
|
|
||||||
"Language directives",
|
|
||||||
"Objects & CSG & Appearance",
|
|
||||||
"Types & Modifiers & Items",
|
|
||||||
"Predefined Identifiers",
|
|
||||||
"Predefined Functions",
|
|
||||||
"User defined 1",
|
|
||||||
"User defined 2",
|
|
||||||
"User defined 3",
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmPOV(SCLEX_POV, ColourisePovDoc, "pov", FoldPovDoc, povWordLists);
|
|
||||||
@@ -1,344 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexPS.cxx
|
|
||||||
** Lexer for PostScript
|
|
||||||
**
|
|
||||||
** Written by Nigel Hathaway <nigel@bprj.co.uk>.
|
|
||||||
** The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static inline bool IsASelfDelimitingChar(const int ch) {
|
|
||||||
return (ch == '[' || ch == ']' || ch == '{' || ch == '}' ||
|
|
||||||
ch == '/' || ch == '<' || ch == '>' ||
|
|
||||||
ch == '(' || ch == ')' || ch == '%');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWhitespaceChar(const int ch) {
|
|
||||||
return (ch == ' ' || ch == '\t' || ch == '\r' ||
|
|
||||||
ch == '\n' || ch == '\f' || ch == '\0');
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsABaseNDigit(const int ch, const int base) {
|
|
||||||
int maxdig = '9';
|
|
||||||
int letterext = -1;
|
|
||||||
|
|
||||||
if (base <= 10)
|
|
||||||
maxdig = '0' + base - 1;
|
|
||||||
else
|
|
||||||
letterext = base - 11;
|
|
||||||
|
|
||||||
return ((ch >= '0' && ch <= maxdig) ||
|
|
||||||
(ch >= 'A' && ch <= ('A' + letterext)) ||
|
|
||||||
(ch >= 'a' && ch <= ('a' + letterext)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsABase85Char(const int ch) {
|
|
||||||
return ((ch >= '!' && ch <= 'u') || ch == 'z');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePSDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int initStyle,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords1 = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
WordList &keywords4 = *keywordlists[3];
|
|
||||||
WordList &keywords5 = *keywordlists[4];
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
bool tokenizing = styler.GetPropertyInt("ps.tokenize") != 0;
|
|
||||||
int pslevel = styler.GetPropertyInt("ps.level", 3);
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int nestTextCurrent = 0;
|
|
||||||
if (lineCurrent > 0 && initStyle == SCE_PS_TEXT)
|
|
||||||
nestTextCurrent = styler.GetLineState(lineCurrent - 1);
|
|
||||||
int numRadix = 0;
|
|
||||||
bool numHasPoint = false;
|
|
||||||
bool numHasExponent = false;
|
|
||||||
bool numHasSign = false;
|
|
||||||
|
|
||||||
// Clear out existing tokenization
|
|
||||||
if (tokenizing && length > 0) {
|
|
||||||
styler.StartAt(startPos, static_cast<char>(INDIC2_MASK));
|
|
||||||
styler.ColourTo(startPos + length-1, 0);
|
|
||||||
styler.Flush();
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
if (sc.atLineStart)
|
|
||||||
lineCurrent = styler.GetLine(sc.currentPos);
|
|
||||||
|
|
||||||
// Determine if the current state should terminate.
|
|
||||||
if (sc.state == SCE_PS_COMMENT || sc.state == SCE_PS_DSC_VALUE) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_PS_DSC_COMMENT) {
|
|
||||||
if (sc.ch == ':') {
|
|
||||||
sc.Forward();
|
|
||||||
if (!sc.atLineEnd)
|
|
||||||
sc.SetState(SCE_PS_DSC_VALUE);
|
|
||||||
else
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
} else if (IsAWhitespaceChar(sc.ch)) {
|
|
||||||
sc.ChangeState(SCE_PS_COMMENT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_PS_NUMBER) {
|
|
||||||
if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) {
|
|
||||||
if ((sc.chPrev == '+' || sc.chPrev == '-' ||
|
|
||||||
sc.chPrev == 'E' || sc.chPrev == 'e') && numRadix == 0)
|
|
||||||
sc.ChangeState(SCE_PS_NAME);
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.ch == '#') {
|
|
||||||
if (numHasPoint || numHasExponent || numHasSign || numRadix != 0) {
|
|
||||||
sc.ChangeState(SCE_PS_NAME);
|
|
||||||
} else {
|
|
||||||
char szradix[5];
|
|
||||||
sc.GetCurrent(szradix, 4);
|
|
||||||
numRadix = atoi(szradix);
|
|
||||||
if (numRadix < 2 || numRadix > 36)
|
|
||||||
sc.ChangeState(SCE_PS_NAME);
|
|
||||||
}
|
|
||||||
} else if ((sc.ch == 'E' || sc.ch == 'e') && numRadix == 0) {
|
|
||||||
if (numHasExponent) {
|
|
||||||
sc.ChangeState(SCE_PS_NAME);
|
|
||||||
} else {
|
|
||||||
numHasExponent = true;
|
|
||||||
if (sc.chNext == '+' || sc.chNext == '-')
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '.') {
|
|
||||||
if (numHasPoint || numHasExponent || numRadix != 0) {
|
|
||||||
sc.ChangeState(SCE_PS_NAME);
|
|
||||||
} else {
|
|
||||||
numHasPoint = true;
|
|
||||||
}
|
|
||||||
} else if (numRadix == 0) {
|
|
||||||
if (!IsABaseNDigit(sc.ch, 10))
|
|
||||||
sc.ChangeState(SCE_PS_NAME);
|
|
||||||
} else {
|
|
||||||
if (!IsABaseNDigit(sc.ch, numRadix))
|
|
||||||
sc.ChangeState(SCE_PS_NAME);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_PS_NAME || sc.state == SCE_PS_KEYWORD) {
|
|
||||||
if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
if ((pslevel >= 1 && keywords1.InList(s)) ||
|
|
||||||
(pslevel >= 2 && keywords2.InList(s)) ||
|
|
||||||
(pslevel >= 3 && keywords3.InList(s)) ||
|
|
||||||
keywords4.InList(s) || keywords5.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_PS_KEYWORD);
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_PS_LITERAL || sc.state == SCE_PS_IMMEVAL) {
|
|
||||||
if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch))
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_PS_PAREN_ARRAY || sc.state == SCE_PS_PAREN_DICT ||
|
|
||||||
sc.state == SCE_PS_PAREN_PROC) {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_PS_TEXT) {
|
|
||||||
if (sc.ch == '(') {
|
|
||||||
nestTextCurrent++;
|
|
||||||
} else if (sc.ch == ')') {
|
|
||||||
if (--nestTextCurrent == 0)
|
|
||||||
sc.ForwardSetState(SCE_PS_DEFAULT);
|
|
||||||
} else if (sc.ch == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_PS_HEXSTRING) {
|
|
||||||
if (sc.ch == '>') {
|
|
||||||
sc.ForwardSetState(SCE_PS_DEFAULT);
|
|
||||||
} else if (!IsABaseNDigit(sc.ch, 16) && !IsAWhitespaceChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_PS_HEXSTRING);
|
|
||||||
styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_PS_BASE85STRING) {
|
|
||||||
if (sc.Match('~', '>')) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_PS_DEFAULT);
|
|
||||||
} else if (!IsABase85Char(sc.ch) && !IsAWhitespaceChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_PS_BASE85STRING);
|
|
||||||
styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if a new state should be entered.
|
|
||||||
if (sc.state == SCE_C_DEFAULT) {
|
|
||||||
unsigned int tokenpos = sc.currentPos;
|
|
||||||
|
|
||||||
if (sc.ch == '[' || sc.ch == ']') {
|
|
||||||
sc.SetState(SCE_PS_PAREN_ARRAY);
|
|
||||||
} else if (sc.ch == '{' || sc.ch == '}') {
|
|
||||||
sc.SetState(SCE_PS_PAREN_PROC);
|
|
||||||
} else if (sc.ch == '/') {
|
|
||||||
if (sc.chNext == '/') {
|
|
||||||
sc.SetState(SCE_PS_IMMEVAL);
|
|
||||||
sc.Forward();
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_PS_LITERAL);
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '<') {
|
|
||||||
if (sc.chNext == '<') {
|
|
||||||
sc.SetState(SCE_PS_PAREN_DICT);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.chNext == '~') {
|
|
||||||
sc.SetState(SCE_PS_BASE85STRING);
|
|
||||||
sc.Forward();
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_PS_HEXSTRING);
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '>' && sc.chNext == '>') {
|
|
||||||
sc.SetState(SCE_PS_PAREN_DICT);
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.ch == '>' || sc.ch == ')') {
|
|
||||||
sc.SetState(SCE_C_DEFAULT);
|
|
||||||
styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR);
|
|
||||||
} else if (sc.ch == '(') {
|
|
||||||
sc.SetState(SCE_PS_TEXT);
|
|
||||||
nestTextCurrent = 1;
|
|
||||||
} else if (sc.ch == '%') {
|
|
||||||
if (sc.chNext == '%' && sc.atLineStart) {
|
|
||||||
sc.SetState(SCE_PS_DSC_COMMENT);
|
|
||||||
sc.Forward();
|
|
||||||
if (sc.chNext == '+') {
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_PS_DSC_VALUE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_PS_COMMENT);
|
|
||||||
}
|
|
||||||
} else if ((sc.ch == '+' || sc.ch == '-' || sc.ch == '.') &&
|
|
||||||
IsABaseNDigit(sc.chNext, 10)) {
|
|
||||||
sc.SetState(SCE_PS_NUMBER);
|
|
||||||
numRadix = 0;
|
|
||||||
numHasPoint = (sc.ch == '.');
|
|
||||||
numHasExponent = false;
|
|
||||||
numHasSign = (sc.ch == '+' || sc.ch == '-');
|
|
||||||
} else if ((sc.ch == '+' || sc.ch == '-') && sc.chNext == '.' &&
|
|
||||||
IsABaseNDigit(sc.GetRelative(2), 10)) {
|
|
||||||
sc.SetState(SCE_PS_NUMBER);
|
|
||||||
numRadix = 0;
|
|
||||||
numHasPoint = false;
|
|
||||||
numHasExponent = false;
|
|
||||||
numHasSign = true;
|
|
||||||
} else if (IsABaseNDigit(sc.ch, 10)) {
|
|
||||||
sc.SetState(SCE_PS_NUMBER);
|
|
||||||
numRadix = 0;
|
|
||||||
numHasPoint = false;
|
|
||||||
numHasExponent = false;
|
|
||||||
numHasSign = false;
|
|
||||||
} else if (!IsAWhitespaceChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_PS_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark the start of tokens
|
|
||||||
if (tokenizing && sc.state != SCE_C_DEFAULT && sc.state != SCE_PS_COMMENT &&
|
|
||||||
sc.state != SCE_PS_DSC_COMMENT && sc.state != SCE_PS_DSC_VALUE) {
|
|
||||||
styler.Flush();
|
|
||||||
styler.StartAt(tokenpos, static_cast<char>(INDIC2_MASK));
|
|
||||||
styler.ColourTo(tokenpos, INDIC2_MASK);
|
|
||||||
styler.Flush();
|
|
||||||
styler.StartAt(tokenpos);
|
|
||||||
styler.StartSegment(tokenpos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.atLineEnd)
|
|
||||||
styler.SetLineState(lineCurrent, nestTextCurrent);
|
|
||||||
}
|
|
||||||
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldPSDoc(unsigned int startPos, int length, int, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelCurrent = SC_FOLDLEVELBASE;
|
|
||||||
if (lineCurrent > 0)
|
|
||||||
levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
|
|
||||||
int levelMinCurrent = levelCurrent;
|
|
||||||
int levelNext = levelCurrent;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style;
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); //mac??
|
|
||||||
if ((style & 31) == SCE_PS_PAREN_PROC) {
|
|
||||||
if (ch == '{') {
|
|
||||||
// Measure the minimum before a '{' to allow
|
|
||||||
// folding on "} {"
|
|
||||||
if (levelMinCurrent > levelNext) {
|
|
||||||
levelMinCurrent = levelNext;
|
|
||||||
}
|
|
||||||
levelNext++;
|
|
||||||
} else if (ch == '}') {
|
|
||||||
levelNext--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int levelUse = levelCurrent;
|
|
||||||
if (foldAtElse) {
|
|
||||||
levelUse = levelMinCurrent;
|
|
||||||
}
|
|
||||||
int lev = levelUse | levelNext << 16;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if (levelUse < levelNext)
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelCurrent = levelNext;
|
|
||||||
levelMinCurrent = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const psWordListDesc[] = {
|
|
||||||
"PS Level 1 operators",
|
|
||||||
"PS Level 2 operators",
|
|
||||||
"PS Level 3 operators",
|
|
||||||
"RIP-specific operators",
|
|
||||||
"User-defined operators",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmPS(SCLEX_PS, ColourisePSDoc, "ps", FoldPSDoc, psWordListDesc);
|
|
||||||
@@ -1,369 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexPascal.cxx
|
|
||||||
** Lexer for Pascal.
|
|
||||||
** Written by Laurent le Tynevez
|
|
||||||
** Updated by Simon Steele <s.steele@pnotepad.org> September 2002
|
|
||||||
** Updated by Mathias Rauen <scite@madshi.net> May 2003 (Delphi adjustments)
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
|
|
||||||
static void getRange(unsigned int start,
|
|
||||||
unsigned int end,
|
|
||||||
Accessor &styler,
|
|
||||||
char *s,
|
|
||||||
unsigned int len) {
|
|
||||||
unsigned int i = 0;
|
|
||||||
while ((i < end - start + 1) && (i < len-1)) {
|
|
||||||
s[i] = static_cast<char>(tolower(styler[start + i]));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
s[i] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsStreamCommentStyle(int style) {
|
|
||||||
return style == SCE_C_COMMENT ||
|
|
||||||
style == SCE_C_COMMENTDOC ||
|
|
||||||
style == SCE_C_COMMENTDOCKEYWORD ||
|
|
||||||
style == SCE_C_COMMENTDOCKEYWORDERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourTo(Accessor &styler, unsigned int end, unsigned int attr, bool bInAsm) {
|
|
||||||
if ((bInAsm) && (attr == SCE_C_OPERATOR || attr == SCE_C_NUMBER || attr == SCE_C_DEFAULT || attr == SCE_C_WORD || attr == SCE_C_IDENTIFIER)) {
|
|
||||||
styler.ColourTo(end, SCE_C_REGEX);
|
|
||||||
} else
|
|
||||||
styler.ColourTo(end, attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns 1 if the item starts a class definition, and -1 if the word is "end", and 2 if the word is "asm"
|
|
||||||
static int classifyWordPascal(unsigned int start, unsigned int end, /*WordList &keywords*/WordList *keywordlists[], Accessor &styler, bool bInClass, bool bInAsm) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
WordList& keywords = *keywordlists[0];
|
|
||||||
WordList& classwords = *keywordlists[1];
|
|
||||||
|
|
||||||
char s[100];
|
|
||||||
getRange(start, end, styler, s, sizeof(s));
|
|
||||||
|
|
||||||
char chAttr = SCE_C_IDENTIFIER;
|
|
||||||
if (isdigit(s[0]) || (s[0] == '.') ||(s[0] == '$')) {
|
|
||||||
chAttr = SCE_C_NUMBER;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (s[0] == '#') {
|
|
||||||
chAttr = SCE_C_CHARACTER;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
chAttr = SCE_C_WORD;
|
|
||||||
|
|
||||||
if(strcmp(s, "class") == 0) {
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
else if (strcmp(s, "asm") == 0) {
|
|
||||||
ret = 2;
|
|
||||||
}
|
|
||||||
else if (strcmp(s, "end") == 0) {
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
} else if (bInClass) {
|
|
||||||
if (classwords.InList(s)) {
|
|
||||||
chAttr = SCE_C_WORD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ColourTo(styler, end, chAttr, (bInAsm && ret != -1));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int classifyFoldPointPascal(const char* s) {
|
|
||||||
int lev = 0;
|
|
||||||
if (!(isdigit(s[0]) || (s[0] == '.'))) {
|
|
||||||
if (strcmp(s, "begin") == 0 ||
|
|
||||||
strcmp(s, "object") == 0 ||
|
|
||||||
strcmp(s, "case") == 0 ||
|
|
||||||
strcmp(s, "class") == 0 ||
|
|
||||||
strcmp(s, "record") == 0 ||
|
|
||||||
strcmp(s, "try") == 0) {
|
|
||||||
lev=1;
|
|
||||||
} else if (strcmp(s, "end") == 0) {
|
|
||||||
lev=-1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePascalDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
int state = initStyle;
|
|
||||||
if (state == SCE_C_CHARACTER) // Does not leak onto next line
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
char chPrev = ' ';
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
|
|
||||||
bool bInClassDefinition;
|
|
||||||
|
|
||||||
int currentLine = styler.GetLine(startPos);
|
|
||||||
if (currentLine > 0) {
|
|
||||||
styler.SetLineState(currentLine, styler.GetLineState(currentLine-1));
|
|
||||||
bInClassDefinition = (styler.GetLineState(currentLine) == 1);
|
|
||||||
} else {
|
|
||||||
styler.SetLineState(currentLine, 0);
|
|
||||||
bInClassDefinition = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool bInAsm = (state == SCE_C_REGEX);
|
|
||||||
if (bInAsm)
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
|
|
||||||
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
|
|
||||||
// Avoid triggering two times on Dos/Win
|
|
||||||
// End of line
|
|
||||||
if (state == SCE_C_CHARACTER) {
|
|
||||||
ColourTo(styler, i, state, bInAsm);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
currentLine++;
|
|
||||||
styler.SetLineState(currentLine, (bInClassDefinition ? 1 : 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
chPrev = ' ';
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_C_DEFAULT) {
|
|
||||||
if (iswordstart(ch) || ch == '#' || ch == '$' || (ch == '@' && bInAsm)) {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_IDENTIFIER;
|
|
||||||
} else if (ch == '{' && chNext != '$' && chNext != '&') {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_COMMENT;
|
|
||||||
} else if (ch == '(' && chNext == '*'
|
|
||||||
&& styler.SafeGetCharAt(i + 2) != '$'
|
|
||||||
&& styler.SafeGetCharAt(i + 2) != '&') {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_COMMENTDOC;
|
|
||||||
} else if (ch == '/' && chNext == '/') {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_COMMENTLINE;
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_CHARACTER;
|
|
||||||
} else if (ch == '{' && (chNext == '$' || chNext=='&')) {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_PREPROCESSOR;
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
ColourTo(styler, i, SCE_C_OPERATOR, bInAsm);
|
|
||||||
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_IDENTIFIER) {
|
|
||||||
bool bDoublePoint = ((ch == '.') && (chPrev == '.'));
|
|
||||||
if ((!iswordchar(ch) && ch != '$' && ch != '#' && (ch != '@' || !bInAsm)) || bDoublePoint) {
|
|
||||||
if (bDoublePoint) i--;
|
|
||||||
int lStateChange = classifyWordPascal(styler.GetStartSegment(), i - 1, keywordlists, styler, bInClassDefinition, bInAsm);
|
|
||||||
|
|
||||||
if(lStateChange == 1) {
|
|
||||||
styler.SetLineState(currentLine, 1);
|
|
||||||
bInClassDefinition = true;
|
|
||||||
} else if(lStateChange == 2) {
|
|
||||||
bInAsm = true;
|
|
||||||
} else if(lStateChange == -1) {
|
|
||||||
styler.SetLineState(currentLine, 0);
|
|
||||||
bInClassDefinition = false;
|
|
||||||
bInAsm = false;
|
|
||||||
}
|
|
||||||
if (bDoublePoint) {
|
|
||||||
i++;
|
|
||||||
ColourTo(styler, i-1, SCE_C_DEFAULT, bInAsm);
|
|
||||||
}
|
|
||||||
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
if (ch == '{' && chNext != '$' && chNext != '&') {
|
|
||||||
state = SCE_C_COMMENT;
|
|
||||||
} else if (ch == '(' && chNext == '*'
|
|
||||||
&& styler.SafeGetCharAt(i + 2) != '$'
|
|
||||||
&& styler.SafeGetCharAt(i + 2) != '&') {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_COMMENTDOC;
|
|
||||||
} else if (ch == '/' && chNext == '/') {
|
|
||||||
state = SCE_C_COMMENTLINE;
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
state = SCE_C_CHARACTER;
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
ColourTo(styler, i, SCE_C_OPERATOR, bInAsm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (state == SCE_C_PREPROCESSOR) {
|
|
||||||
if (ch=='}'){
|
|
||||||
ColourTo(styler, i, state, bInAsm);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
} else {
|
|
||||||
if ((ch == '\r' || ch == '\n') && !(chPrev == '\\' || chPrev == '\r')) {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_COMMENT) {
|
|
||||||
if (ch == '}' ) {
|
|
||||||
ColourTo(styler, i, state, bInAsm);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_COMMENTDOC) {
|
|
||||||
if (ch == ')' && chPrev == '*') {
|
|
||||||
if (((i > styler.GetStartSegment() + 2) || (
|
|
||||||
(initStyle == SCE_C_COMMENTDOC) &&
|
|
||||||
(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
|
|
||||||
ColourTo(styler, i, state, bInAsm);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_COMMENTLINE) {
|
|
||||||
if (ch == '\r' || ch == '\n') {
|
|
||||||
ColourTo(styler, i-1, state, bInAsm);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_CHARACTER) {
|
|
||||||
if (ch == '\'') {
|
|
||||||
ColourTo(styler, i, state, bInAsm);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
chPrev = ch;
|
|
||||||
}
|
|
||||||
ColourTo(styler, lengthDoc - 1, state, bInAsm);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldPascalDoc(unsigned int startPos, int length, int initStyle, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
bool foldPreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0;
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
int style = initStyle;
|
|
||||||
|
|
||||||
int lastStart = 0;
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int stylePrev = style;
|
|
||||||
style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
|
|
||||||
if (stylePrev == SCE_C_DEFAULT && style == SCE_C_WORD)
|
|
||||||
{
|
|
||||||
// Store last word start point.
|
|
||||||
lastStart = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stylePrev == SCE_C_WORD) {
|
|
||||||
if(iswordchar(ch) && !iswordchar(chNext)) {
|
|
||||||
char s[100];
|
|
||||||
getRange(lastStart, i, styler, s, sizeof(s));
|
|
||||||
levelCurrent += classifyFoldPointPascal(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foldComment && (style == SCE_C_COMMENTLINE)) {
|
|
||||||
if ((ch == '/') && (chNext == '/')) {
|
|
||||||
char chNext2 = styler.SafeGetCharAt(i + 2);
|
|
||||||
if (chNext2 == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (chNext2 == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foldPreprocessor && (style == SCE_C_PREPROCESSOR)) {
|
|
||||||
if (ch == '{' && chNext == '$') {
|
|
||||||
unsigned int j=i+2; // skip {$
|
|
||||||
while ((j<endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
if (styler.Match(j, "region") || styler.Match(j, "if")) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (styler.Match(j, "end")) {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foldComment && IsStreamCommentStyle(style)) {
|
|
||||||
if (!IsStreamCommentStyle(stylePrev)) {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {
|
|
||||||
// Comments don't end at end of line and the next character may be unstyled.
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const pascalWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
"Classwords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmPascal(SCLEX_PASCAL, ColourisePascalDoc, "pascal", FoldPascalDoc, pascalWordListDesc);
|
|
||||||
@@ -1,888 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexPerl.cxx
|
|
||||||
** Lexer for subset of Perl.
|
|
||||||
**/
|
|
||||||
// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my> 20031020
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
#define PERLNUM_DECIMAL 1
|
|
||||||
#define PERLNUM_NON_DEC 2
|
|
||||||
#define PERLNUM_FLOAT 3
|
|
||||||
#define PERLNUM_VECTOR 4
|
|
||||||
#define PERLNUM_V_VECTOR 5
|
|
||||||
|
|
||||||
#define HERE_DELIM_MAX 256
|
|
||||||
|
|
||||||
static inline bool isEOLChar(char ch) {
|
|
||||||
return (ch == '\r') || (ch == '\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool isSingleCharOp(char ch) {
|
|
||||||
char strCharSet[2];
|
|
||||||
strCharSet[0] = ch;
|
|
||||||
strCharSet[1] = '\0';
|
|
||||||
return (NULL != strstr("rwxoRWXOezsfdlpSbctugkTBMAC", strCharSet));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isPerlOperator(char ch) {
|
|
||||||
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 == '.' || ch == '~')
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
|
|
||||||
char s[100];
|
|
||||||
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
|
|
||||||
s[i] = styler[start + i];
|
|
||||||
s[i + 1] = '\0';
|
|
||||||
}
|
|
||||||
char chAttr = SCE_PL_IDENTIFIER;
|
|
||||||
if (keywords.InList(s))
|
|
||||||
chAttr = SCE_PL_WORD;
|
|
||||||
styler.ColourTo(end, chAttr);
|
|
||||||
return chAttr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isEndVar(char ch) {
|
|
||||||
return !isalnum(ch) && ch != '#' && ch != '$' &&
|
|
||||||
ch != '_' && ch != '\'';
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isNonQuote(char ch) {
|
|
||||||
return isalnum(ch) || ch == '_';
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char actualNumStyle(int numberStyle) {
|
|
||||||
switch (numberStyle) {
|
|
||||||
case PERLNUM_VECTOR:
|
|
||||||
case PERLNUM_V_VECTOR:
|
|
||||||
return SCE_PL_STRING;
|
|
||||||
case PERLNUM_DECIMAL:
|
|
||||||
case PERLNUM_NON_DEC:
|
|
||||||
case PERLNUM_FLOAT:
|
|
||||||
default:
|
|
||||||
return SCE_PL_NUMBER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
|
|
||||||
if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
while (*val) {
|
|
||||||
if (*val != styler[pos++]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
val++;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char opposite(char ch) {
|
|
||||||
if (ch == '(')
|
|
||||||
return ')';
|
|
||||||
if (ch == '[')
|
|
||||||
return ']';
|
|
||||||
if (ch == '{')
|
|
||||||
return '}';
|
|
||||||
if (ch == '<')
|
|
||||||
return '>';
|
|
||||||
return ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
|
|
||||||
// Lexer for perl often has to backtrack to start of current style to determine
|
|
||||||
// which characters are being used as quotes, how deeply nested is the
|
|
||||||
// start position and what the termination string is for here documents
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
class HereDocCls {
|
|
||||||
public:
|
|
||||||
int State; // 0: '<<' encountered
|
|
||||||
// 1: collect the delimiter
|
|
||||||
// 2: here doc text (lines after the delimiter)
|
|
||||||
char Quote; // the char after '<<'
|
|
||||||
bool Quoted; // true if Quote in ('\'','"','`')
|
|
||||||
int DelimiterLength; // strlen(Delimiter)
|
|
||||||
char *Delimiter; // the Delimiter, 256: sizeof PL_tokenbuf
|
|
||||||
HereDocCls() {
|
|
||||||
State = 0;
|
|
||||||
DelimiterLength = 0;
|
|
||||||
Delimiter = new char[HERE_DELIM_MAX];
|
|
||||||
Delimiter[0] = '\0';
|
|
||||||
}
|
|
||||||
~HereDocCls() {
|
|
||||||
delete []Delimiter;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
HereDocCls HereDoc; // TODO: FIFO for stacked here-docs
|
|
||||||
|
|
||||||
class QuoteCls {
|
|
||||||
public:
|
|
||||||
int Rep;
|
|
||||||
int Count;
|
|
||||||
char Up;
|
|
||||||
char Down;
|
|
||||||
QuoteCls() {
|
|
||||||
this->New(1);
|
|
||||||
}
|
|
||||||
void New(int r) {
|
|
||||||
Rep = r;
|
|
||||||
Count = 0;
|
|
||||||
Up = '\0';
|
|
||||||
Down = '\0';
|
|
||||||
}
|
|
||||||
void Open(char u) {
|
|
||||||
Count++;
|
|
||||||
Up = u;
|
|
||||||
Down = opposite(Up);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
QuoteCls Quote;
|
|
||||||
|
|
||||||
int state = initStyle;
|
|
||||||
char numState = PERLNUM_DECIMAL;
|
|
||||||
int dotCount = 0;
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
//int sookedpos = 0; // these have no apparent use, see POD state
|
|
||||||
//char sooked[100];
|
|
||||||
//sooked[sookedpos] = '\0';
|
|
||||||
|
|
||||||
// If in a long distance lexical state, seek to the beginning to find quote characters
|
|
||||||
// Perl strings can be multi-line with embedded newlines, so backtrack.
|
|
||||||
// Perl numbers have additional state during lexing, so backtrack too.
|
|
||||||
if (state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX) {
|
|
||||||
while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_PL_HERE_DELIM)) {
|
|
||||||
startPos--;
|
|
||||||
}
|
|
||||||
startPos = styler.LineStart(styler.GetLine(startPos));
|
|
||||||
state = styler.StyleAt(startPos - 1);
|
|
||||||
}
|
|
||||||
if ( state == SCE_PL_STRING_Q
|
|
||||||
|| state == SCE_PL_STRING_QQ
|
|
||||||
|| state == SCE_PL_STRING_QX
|
|
||||||
|| state == SCE_PL_STRING_QR
|
|
||||||
|| state == SCE_PL_STRING_QW
|
|
||||||
|| state == SCE_PL_REGEX
|
|
||||||
|| state == SCE_PL_REGSUBST
|
|
||||||
|| state == SCE_PL_STRING
|
|
||||||
|| state == SCE_PL_BACKTICKS
|
|
||||||
|| state == SCE_PL_CHARACTER
|
|
||||||
|| state == SCE_PL_NUMBER
|
|
||||||
) {
|
|
||||||
while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
|
|
||||||
startPos--;
|
|
||||||
}
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
char chPrev = styler.SafeGetCharAt(startPos - 1);
|
|
||||||
if (startPos == 0)
|
|
||||||
chPrev = '\n';
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
// if the current character is not consumed due to the completion of an
|
|
||||||
// earlier style, lexing can be restarted via a simple goto
|
|
||||||
restartLexer:
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
char chNext2 = styler.SafeGetCharAt(i + 2);
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
chPrev = ' ';
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ((chPrev == '\r' && ch == '\n')) { // skip on DOS/Windows
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
chPrev = ch;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HereDoc.State == 1 && isEOLChar(ch)) {
|
|
||||||
// Begin of here-doc (the line after the here-doc delimiter):
|
|
||||||
// Lexically, the here-doc starts from the next line after the >>, but the
|
|
||||||
// first line of here-doc seem to follow the style of the last EOL sequence
|
|
||||||
HereDoc.State = 2;
|
|
||||||
if (HereDoc.Quoted) {
|
|
||||||
if (state == SCE_PL_HERE_DELIM) {
|
|
||||||
// Missing quote at end of string! We are stricter than perl.
|
|
||||||
// Colour here-doc anyway while marking this bit as an error.
|
|
||||||
state = SCE_PL_ERROR;
|
|
||||||
}
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
switch (HereDoc.Quote) {
|
|
||||||
case '\'':
|
|
||||||
state = SCE_PL_HERE_Q ;
|
|
||||||
break;
|
|
||||||
case '"':
|
|
||||||
state = SCE_PL_HERE_QQ;
|
|
||||||
break;
|
|
||||||
case '`':
|
|
||||||
state = SCE_PL_HERE_QX;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
switch (HereDoc.Quote) {
|
|
||||||
case '\\':
|
|
||||||
state = SCE_PL_HERE_Q ;
|
|
||||||
break;
|
|
||||||
default :
|
|
||||||
state = SCE_PL_HERE_QQ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_PL_DEFAULT) {
|
|
||||||
if (isdigit(ch) || (isdigit(chNext) &&
|
|
||||||
(ch == '.' || ch == 'v'))) {
|
|
||||||
state = SCE_PL_NUMBER;
|
|
||||||
numState = PERLNUM_DECIMAL;
|
|
||||||
dotCount = 0;
|
|
||||||
if (ch == '0') { // hex,bin,octal
|
|
||||||
if (chNext == 'x' || chNext == 'b' || isdigit(chNext)) {
|
|
||||||
numState = PERLNUM_NON_DEC;
|
|
||||||
}
|
|
||||||
} else if (ch == 'v') { // vector
|
|
||||||
numState = PERLNUM_V_VECTOR;
|
|
||||||
}
|
|
||||||
} else if (iswordstart(ch)) {
|
|
||||||
if (ch == 's' && !isNonQuote(chNext)) {
|
|
||||||
state = SCE_PL_REGSUBST;
|
|
||||||
Quote.New(2);
|
|
||||||
} else if (ch == 'm' && !isNonQuote(chNext)) {
|
|
||||||
state = SCE_PL_REGEX;
|
|
||||||
Quote.New(1);
|
|
||||||
} else if (ch == 'q' && !isNonQuote(chNext)) {
|
|
||||||
state = SCE_PL_STRING_Q;
|
|
||||||
Quote.New(1);
|
|
||||||
} else if (ch == 'y' && !isNonQuote(chNext)) {
|
|
||||||
state = SCE_PL_REGSUBST;
|
|
||||||
Quote.New(2);
|
|
||||||
} else if (ch == 't' && chNext == 'r' && !isNonQuote(chNext2)) {
|
|
||||||
state = SCE_PL_REGSUBST;
|
|
||||||
Quote.New(2);
|
|
||||||
i++;
|
|
||||||
chNext = chNext2;
|
|
||||||
} else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isNonQuote(chNext2)) {
|
|
||||||
if (chNext == 'q') state = SCE_PL_STRING_QQ;
|
|
||||||
else if (chNext == 'x') state = SCE_PL_STRING_QX;
|
|
||||||
else if (chNext == 'r') state = SCE_PL_STRING_QR;
|
|
||||||
else if (chNext == 'w') state = SCE_PL_STRING_QW;
|
|
||||||
i++;
|
|
||||||
chNext = chNext2;
|
|
||||||
Quote.New(1);
|
|
||||||
} else if (ch == 'x' && (chNext == '=' || // repetition
|
|
||||||
(chNext != '_' && !isalnum(chNext)) ||
|
|
||||||
(isdigit(chPrev) && isdigit(chNext)))) {
|
|
||||||
styler.ColourTo(i, SCE_PL_OPERATOR);
|
|
||||||
} else {
|
|
||||||
state = SCE_PL_WORD;
|
|
||||||
if ((!iswordchar(chNext) && chNext != '\'')
|
|
||||||
|| (chNext == '.' && chNext2 == '.')) {
|
|
||||||
// We need that if length of word == 1!
|
|
||||||
// This test is copied from the SCE_PL_WORD handler.
|
|
||||||
classifyWordPerl(styler.GetStartSegment(), i, keywords, styler);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ch == '#') {
|
|
||||||
state = SCE_PL_COMMENTLINE;
|
|
||||||
} else if (ch == '\"') {
|
|
||||||
state = SCE_PL_STRING;
|
|
||||||
Quote.New(1);
|
|
||||||
Quote.Open(ch);
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
if (chPrev == '&') {
|
|
||||||
// Archaic call
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
} else {
|
|
||||||
state = SCE_PL_CHARACTER;
|
|
||||||
Quote.New(1);
|
|
||||||
Quote.Open(ch);
|
|
||||||
}
|
|
||||||
} else if (ch == '`') {
|
|
||||||
state = SCE_PL_BACKTICKS;
|
|
||||||
Quote.New(1);
|
|
||||||
Quote.Open(ch);
|
|
||||||
} else if (ch == '$') {
|
|
||||||
if ((chNext == '{') || isspacechar(chNext)) {
|
|
||||||
styler.ColourTo(i, SCE_PL_SCALAR);
|
|
||||||
} else {
|
|
||||||
state = SCE_PL_SCALAR;
|
|
||||||
if (chNext == '`' && chNext2 == '`') {
|
|
||||||
i += 2;
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
} else {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = chNext2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ch == '@') {
|
|
||||||
if (isalpha(chNext) || chNext == '#' || chNext == '$'
|
|
||||||
|| chNext == '_' || chNext == '+') {
|
|
||||||
state = SCE_PL_ARRAY;
|
|
||||||
} else if (chNext != '{' && chNext != '[') {
|
|
||||||
styler.ColourTo(i, SCE_PL_ARRAY);
|
|
||||||
i++;
|
|
||||||
ch = ' ';
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i, SCE_PL_ARRAY);
|
|
||||||
}
|
|
||||||
} else if (ch == '%') {
|
|
||||||
if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
|
|
||||||
state = SCE_PL_HASH;
|
|
||||||
} else if (chNext == '{') {
|
|
||||||
styler.ColourTo(i, SCE_PL_HASH);
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i, SCE_PL_OPERATOR);
|
|
||||||
}
|
|
||||||
} else if (ch == '*') {
|
|
||||||
if (isalpha(chNext) || chNext == '_' || chNext == '{') {
|
|
||||||
state = SCE_PL_SYMBOLTABLE;
|
|
||||||
} else {
|
|
||||||
if (chNext == '*') { // exponentiation
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = chNext2;
|
|
||||||
}
|
|
||||||
styler.ColourTo(i, SCE_PL_OPERATOR);
|
|
||||||
}
|
|
||||||
} else if (ch == '/') {
|
|
||||||
// Explicit backward peeking to set a consistent preferRE for
|
|
||||||
// any slash found, so no longer need to track preferRE state.
|
|
||||||
// Find first previous significant lexed element and interpret.
|
|
||||||
bool preferRE = false;
|
|
||||||
unsigned int bk = (i > 0)? i - 1: 0;
|
|
||||||
char bkch;
|
|
||||||
styler.Flush();
|
|
||||||
while ((bk > 0) && (styler.StyleAt(bk) == SCE_PL_DEFAULT ||
|
|
||||||
styler.StyleAt(bk) == SCE_PL_COMMENTLINE)) {
|
|
||||||
bk--;
|
|
||||||
}
|
|
||||||
if (bk == 0) {
|
|
||||||
preferRE = true;
|
|
||||||
} else {
|
|
||||||
int bkstyle = styler.StyleAt(bk);
|
|
||||||
switch(bkstyle) {
|
|
||||||
case SCE_PL_OPERATOR:
|
|
||||||
preferRE = true;
|
|
||||||
bkch = styler.SafeGetCharAt(bk);
|
|
||||||
if (bkch == ')' || bkch == ']') {
|
|
||||||
preferRE = false;
|
|
||||||
} else if (bkch == '}') {
|
|
||||||
// backtrack further, count balanced brace pairs
|
|
||||||
// if a brace pair found, see if it's a variable
|
|
||||||
int braceCount = 1;
|
|
||||||
while (--bk > 0) {
|
|
||||||
bkstyle = styler.StyleAt(bk);
|
|
||||||
if (bkstyle == SCE_PL_OPERATOR) {
|
|
||||||
bkch = styler.SafeGetCharAt(bk);
|
|
||||||
if (bkch == '}') {
|
|
||||||
braceCount++;
|
|
||||||
} else if (bkch == '{') {
|
|
||||||
if (--braceCount == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bk == 0) {
|
|
||||||
// at beginning, true
|
|
||||||
} else if (braceCount == 0) {
|
|
||||||
// balanced { found, check for variable
|
|
||||||
bkstyle = styler.StyleAt(bk - 1);
|
|
||||||
if (bkstyle == SCE_PL_SCALAR
|
|
||||||
|| bkstyle == SCE_PL_ARRAY
|
|
||||||
|| bkstyle == SCE_PL_HASH
|
|
||||||
|| bkstyle == SCE_PL_SYMBOLTABLE) {
|
|
||||||
preferRE = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
// other styles uses the default, preferRE=false
|
|
||||||
case SCE_PL_IDENTIFIER:
|
|
||||||
case SCE_PL_POD:
|
|
||||||
case SCE_PL_WORD:
|
|
||||||
case SCE_PL_HERE_Q:
|
|
||||||
case SCE_PL_HERE_QQ:
|
|
||||||
case SCE_PL_HERE_QX:
|
|
||||||
preferRE = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (preferRE) {
|
|
||||||
state = SCE_PL_REGEX;
|
|
||||||
Quote.New(1);
|
|
||||||
Quote.Open(ch);
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i, SCE_PL_OPERATOR);
|
|
||||||
}
|
|
||||||
} else if (ch == '<' && chNext == '<') {
|
|
||||||
state = SCE_PL_HERE_DELIM;
|
|
||||||
HereDoc.State = 0;
|
|
||||||
} else if (ch == '=' // POD
|
|
||||||
&& isalpha(chNext)
|
|
||||||
&& (isEOLChar(chPrev))) {
|
|
||||||
state = SCE_PL_POD;
|
|
||||||
//sookedpos = 0;
|
|
||||||
//sooked[sookedpos] = '\0';
|
|
||||||
} else if (ch == '-' // file test operators
|
|
||||||
&& isSingleCharOp(chNext)
|
|
||||||
&& !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
|
|
||||||
styler.ColourTo(i + 1, SCE_PL_WORD);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = chNext2;
|
|
||||||
} else if (isPerlOperator(ch)) {
|
|
||||||
if (ch == '.' && chNext == '.') { // .. and ...
|
|
||||||
i++;
|
|
||||||
if (chNext2 == '.') { i++; }
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
styler.ColourTo(i, SCE_PL_OPERATOR);
|
|
||||||
} else {
|
|
||||||
// keep colouring defaults to make restart easier
|
|
||||||
styler.ColourTo(i, SCE_PL_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_NUMBER) {
|
|
||||||
if (ch == '.') {
|
|
||||||
if (chNext == '.') {
|
|
||||||
// double dot is always an operator
|
|
||||||
goto numAtEnd;
|
|
||||||
} else if (numState == PERLNUM_NON_DEC || numState == PERLNUM_FLOAT) {
|
|
||||||
// non-decimal number or float exponent, consume next dot
|
|
||||||
styler.ColourTo(i - 1, SCE_PL_NUMBER);
|
|
||||||
styler.ColourTo(i, SCE_PL_OPERATOR);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
} else { // decimal or vectors allows dots
|
|
||||||
dotCount++;
|
|
||||||
if (numState == PERLNUM_DECIMAL) {
|
|
||||||
if (dotCount > 1) {
|
|
||||||
if (isdigit(chNext)) { // really a vector
|
|
||||||
numState = PERLNUM_VECTOR;
|
|
||||||
} else // number then dot
|
|
||||||
goto numAtEnd;
|
|
||||||
}
|
|
||||||
} else { // vectors
|
|
||||||
if (!isdigit(chNext)) // vector then dot
|
|
||||||
goto numAtEnd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ch == '_' && numState == PERLNUM_DECIMAL) {
|
|
||||||
if (!isdigit(chNext)) {
|
|
||||||
goto numAtEnd;
|
|
||||||
}
|
|
||||||
} else if (isalnum(ch)) {
|
|
||||||
if (numState == PERLNUM_VECTOR || numState == PERLNUM_V_VECTOR) {
|
|
||||||
if (isalpha(ch)) {
|
|
||||||
if (dotCount == 0) { // change to word
|
|
||||||
state = SCE_PL_WORD;
|
|
||||||
} else { // vector then word
|
|
||||||
goto numAtEnd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (numState == PERLNUM_DECIMAL) {
|
|
||||||
if (ch == 'E' || ch == 'e') { // exponent
|
|
||||||
numState = PERLNUM_FLOAT;
|
|
||||||
if (chNext == '+' || chNext == '-') {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = chNext2;
|
|
||||||
}
|
|
||||||
} else if (!isdigit(ch)) { // number then word
|
|
||||||
goto numAtEnd;
|
|
||||||
}
|
|
||||||
} else if (numState == PERLNUM_FLOAT) {
|
|
||||||
if (!isdigit(ch)) { // float then word
|
|
||||||
goto numAtEnd;
|
|
||||||
}
|
|
||||||
} else {// (numState == PERLNUM_NON_DEC)
|
|
||||||
// allow alphanum for bin,hex,oct for now
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// complete current number or vector
|
|
||||||
numAtEnd:
|
|
||||||
styler.ColourTo(i - 1, actualNumStyle(numState));
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
goto restartLexer;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_WORD) {
|
|
||||||
if ((!iswordchar(chNext) && chNext != '\'')
|
|
||||||
|| (chNext == '.' && chNext2 == '.')) {
|
|
||||||
// ".." is always an operator if preceded by a SCE_PL_WORD.
|
|
||||||
// Archaic Perl has quotes inside names
|
|
||||||
if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")
|
|
||||||
|| isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
|
|
||||||
styler.ColourTo(i, SCE_PL_DATASECTION);
|
|
||||||
state = SCE_PL_DATASECTION;
|
|
||||||
} else {
|
|
||||||
classifyWordPerl(styler.GetStartSegment(), i, keywords, styler);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (state == SCE_PL_COMMENTLINE) {
|
|
||||||
if (isEOLChar(ch)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
goto restartLexer;
|
|
||||||
} else if (isEOLChar(chNext)) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_HERE_DELIM) {
|
|
||||||
//
|
|
||||||
// From perldata.pod:
|
|
||||||
// ------------------
|
|
||||||
// A line-oriented form of quoting is based on the shell ``here-doc''
|
|
||||||
// syntax.
|
|
||||||
// Following a << you specify a string to terminate the quoted material,
|
|
||||||
// and all lines following the current line down to the terminating
|
|
||||||
// string are the value of the item.
|
|
||||||
// The terminating string may be either an identifier (a word),
|
|
||||||
// or some quoted text.
|
|
||||||
// If quoted, the type of quotes you use determines the treatment of
|
|
||||||
// the text, just as in regular quoting.
|
|
||||||
// An unquoted identifier works like double quotes.
|
|
||||||
// There must be no space between the << and the identifier.
|
|
||||||
// (If you put a space it will be treated as a null identifier,
|
|
||||||
// which is valid, and matches the first empty line.)
|
|
||||||
// (This is deprecated, -w warns of this syntax)
|
|
||||||
// The terminating string must appear by itself (unquoted and with no
|
|
||||||
// surrounding whitespace) on the terminating line.
|
|
||||||
//
|
|
||||||
// From Bash info:
|
|
||||||
// ---------------
|
|
||||||
// Specifier format is: <<[-]WORD
|
|
||||||
// Optional '-' is for removal of leading tabs from here-doc.
|
|
||||||
// Whitespace acceptable after <<[-] operator.
|
|
||||||
//
|
|
||||||
if (HereDoc.State == 0) { // '<<' encountered
|
|
||||||
HereDoc.State = 1;
|
|
||||||
HereDoc.Quote = chNext;
|
|
||||||
HereDoc.Quoted = false;
|
|
||||||
HereDoc.DelimiterLength = 0;
|
|
||||||
HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
|
|
||||||
if (chNext == '\'' || chNext == '"' || chNext == '`') { // a quoted here-doc delimiter
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = chNext2;
|
|
||||||
HereDoc.Quoted = true;
|
|
||||||
} else if (isalpha(chNext) || chNext == '_') {
|
|
||||||
// an unquoted here-doc delimiter, no special handling
|
|
||||||
} else if (isspacechar(chNext) || isdigit(chNext) || chNext == '\\'
|
|
||||||
|| chNext == '=' || chNext == '$' || chNext == '@') {
|
|
||||||
// left shift << or <<= operator cases
|
|
||||||
styler.ColourTo(i, SCE_PL_OPERATOR);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
HereDoc.State = 0;
|
|
||||||
} else {
|
|
||||||
// symbols terminates; deprecated zero-length delimiter
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (HereDoc.State == 1) { // collect the delimiter
|
|
||||||
if (HereDoc.Quoted) { // a quoted here-doc delimiter
|
|
||||||
if (ch == HereDoc.Quote) { // closing quote => end of delimiter
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
} else {
|
|
||||||
if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = chNext2;
|
|
||||||
}
|
|
||||||
HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
|
|
||||||
HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
|
|
||||||
}
|
|
||||||
} else { // an unquoted here-doc delimiter
|
|
||||||
if (isalnum(ch) || ch == '_') {
|
|
||||||
HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
|
|
||||||
HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
goto restartLexer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_PL_ERROR;
|
|
||||||
goto restartLexer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (HereDoc.State == 2) {
|
|
||||||
// state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX
|
|
||||||
if (isEOLChar(chPrev) && isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {
|
|
||||||
i += HereDoc.DelimiterLength;
|
|
||||||
chPrev = styler.SafeGetCharAt(i - 1);
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
if (isEOLChar(ch)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
HereDoc.State = 0;
|
|
||||||
goto restartLexer;
|
|
||||||
}
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_POD) {
|
|
||||||
if (ch == '=' && isEOLChar(chPrev)) {
|
|
||||||
if (isMatch(styler, lengthDoc, i, "=cut")) {
|
|
||||||
styler.ColourTo(i - 1 + 4, state);
|
|
||||||
i += 4;
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
//chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
goto restartLexer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_SCALAR // variable names
|
|
||||||
|| state == SCE_PL_ARRAY
|
|
||||||
|| state == SCE_PL_HASH
|
|
||||||
|| state == SCE_PL_SYMBOLTABLE) {
|
|
||||||
if (ch == ':' && chNext == ':') { // skip ::
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = chNext2;
|
|
||||||
}
|
|
||||||
else if (isEndVar(ch)) {
|
|
||||||
if ((state == SCE_PL_SCALAR || state == SCE_PL_ARRAY)
|
|
||||||
&& i == (styler.GetStartSegment() + 1)) {
|
|
||||||
// Special variable: $(, $_ etc.
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
goto restartLexer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_REGEX
|
|
||||||
|| state == SCE_PL_STRING_QR
|
|
||||||
) {
|
|
||||||
if (!Quote.Up && !isspacechar(ch)) {
|
|
||||||
Quote.Open(ch);
|
|
||||||
} else if (ch == '\\' && Quote.Up != '\\') {
|
|
||||||
// SG: Is it save to skip *every* escaped char?
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
} else {
|
|
||||||
if (ch == Quote.Down /*&& chPrev != '\\'*/) {
|
|
||||||
Quote.Count--;
|
|
||||||
if (Quote.Count == 0) {
|
|
||||||
Quote.Rep--;
|
|
||||||
if (Quote.Up == Quote.Down) {
|
|
||||||
Quote.Count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isalpha(chNext)) {
|
|
||||||
if (Quote.Rep <= 0) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ch == Quote.Up /*&& chPrev != '\\'*/) {
|
|
||||||
Quote.Count++;
|
|
||||||
} else if (!isalpha(chNext)) {
|
|
||||||
if (Quote.Rep <= 0) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_REGSUBST) {
|
|
||||||
if (!Quote.Up && !isspacechar(ch)) {
|
|
||||||
Quote.Open(ch);
|
|
||||||
} else if (ch == '\\' && Quote.Up != '\\') {
|
|
||||||
// SG: Is it save to skip *every* escaped char?
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
} else {
|
|
||||||
if (Quote.Count == 0 && Quote.Rep == 1) {
|
|
||||||
/* We matched something like s(...) or tr{...}
|
|
||||||
* and are looking for the next matcher characters,
|
|
||||||
* which could be either bracketed ({...}) or non-bracketed
|
|
||||||
* (/.../).
|
|
||||||
*
|
|
||||||
* Number-signs are problematic. If they occur after
|
|
||||||
* the close of the first part, treat them like
|
|
||||||
* a Quote.Up char, even if they actually start comments.
|
|
||||||
*
|
|
||||||
* If we find an alnum, we end the regsubst, and punt.
|
|
||||||
*
|
|
||||||
* Eric Promislow ericp@activestate.com Aug 9,2000
|
|
||||||
*/
|
|
||||||
if (isspacechar(ch)) {
|
|
||||||
// Keep going
|
|
||||||
}
|
|
||||||
else if (isalnum(ch)) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = ' ';
|
|
||||||
} else {
|
|
||||||
Quote.Open(ch);
|
|
||||||
}
|
|
||||||
} else if (ch == Quote.Down /*&& chPrev != '\\'*/) {
|
|
||||||
Quote.Count--;
|
|
||||||
if (Quote.Count == 0) {
|
|
||||||
Quote.Rep--;
|
|
||||||
}
|
|
||||||
if (!isalpha(chNext)) {
|
|
||||||
if (Quote.Rep <= 0) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Quote.Up == Quote.Down) {
|
|
||||||
Quote.Count++;
|
|
||||||
}
|
|
||||||
} else if (ch == Quote.Up /*&& chPrev != '\\'*/) {
|
|
||||||
Quote.Count++;
|
|
||||||
} else if (!isalpha(chNext)) {
|
|
||||||
if (Quote.Rep <= 0) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_PL_STRING_Q
|
|
||||||
|| state == SCE_PL_STRING_QQ
|
|
||||||
|| state == SCE_PL_STRING_QX
|
|
||||||
|| state == SCE_PL_STRING_QW
|
|
||||||
|| state == SCE_PL_STRING
|
|
||||||
|| state == SCE_PL_CHARACTER
|
|
||||||
|| state == SCE_PL_BACKTICKS
|
|
||||||
) {
|
|
||||||
if (!Quote.Down && !isspacechar(ch)) {
|
|
||||||
Quote.Open(ch);
|
|
||||||
} else if (ch == '\\' && Quote.Up != '\\') {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
} else if (ch == Quote.Down) {
|
|
||||||
Quote.Count--;
|
|
||||||
if (Quote.Count == 0) {
|
|
||||||
Quote.Rep--;
|
|
||||||
if (Quote.Rep <= 0) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_PL_DEFAULT;
|
|
||||||
ch = ' ';
|
|
||||||
}
|
|
||||||
if (Quote.Up == Quote.Down) {
|
|
||||||
Quote.Count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ch == Quote.Up) {
|
|
||||||
Quote.Count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (state == SCE_PL_ERROR) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
chPrev = ch;
|
|
||||||
}
|
|
||||||
styler.ColourTo(lengthDoc - 1, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldPerlDoc(unsigned int startPos, int length, int, WordList *[],
|
|
||||||
Accessor &styler) {
|
|
||||||
bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
|
|
||||||
bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
int visibleChars = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
int levelCurrent = levelPrev;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
int styleNext = styler.StyleAt(startPos);
|
|
||||||
for (unsigned int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styleNext;
|
|
||||||
styleNext = styler.StyleAt(i + 1);
|
|
||||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
|
||||||
if (foldComment && (style == SCE_PL_COMMENTLINE)) {
|
|
||||||
if ((ch == '/') && (chNext == '/')) {
|
|
||||||
char chNext2 = styler.SafeGetCharAt(i + 2);
|
|
||||||
if (chNext2 == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (chNext2 == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (style == SCE_C_OPERATOR) {
|
|
||||||
if (ch == '{') {
|
|
||||||
levelCurrent++;
|
|
||||||
} else if (ch == '}') {
|
|
||||||
levelCurrent--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (atEOL) {
|
|
||||||
int lev = levelPrev;
|
|
||||||
if (visibleChars == 0 && foldCompact)
|
|
||||||
lev |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if ((levelCurrent > levelPrev) && (visibleChars > 0))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
if (lev != styler.LevelAt(lineCurrent)) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
levelPrev = levelCurrent;
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!isspacechar(ch))
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
|
||||||
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
|
|
||||||
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const perlWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc, "perl", FoldPerlDoc, perlWordListDesc);
|
|
||||||
@@ -1,439 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexPython.cxx
|
|
||||||
** Lexer for Python.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
enum kwType { kwOther, kwClass, kwDef, kwImport };
|
|
||||||
|
|
||||||
static bool IsPyComment(Accessor &styler, int pos, int len) {
|
|
||||||
return len > 0 && styler[pos] == '#';
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsPyStringStart(int ch, int chNext, int chNext2) {
|
|
||||||
if (ch == '\'' || ch == '"')
|
|
||||||
return true;
|
|
||||||
if (ch == 'u' || ch == 'U') {
|
|
||||||
if (chNext == '"' || chNext == '\'')
|
|
||||||
return true;
|
|
||||||
if ((chNext == 'r' || chNext == 'R') && (chNext2 == '"' || chNext2 == '\''))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((ch == 'r' || ch == 'R') && (chNext == '"' || chNext == '\''))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */
|
|
||||||
static int GetPyStringState(Accessor &styler, int i, unsigned int *nextIndex) {
|
|
||||||
char ch = styler.SafeGetCharAt(i);
|
|
||||||
char chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
// Advance beyond r, u, or ur prefix, but bail if there are any unexpected chars
|
|
||||||
if (ch == 'r' || ch == 'R') {
|
|
||||||
i++;
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
} else if (ch == 'u' || ch == 'U') {
|
|
||||||
if (chNext == 'r' || chNext == 'R')
|
|
||||||
i += 2;
|
|
||||||
else
|
|
||||||
i += 1;
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ch != '"' && ch != '\'') {
|
|
||||||
*nextIndex = i + 1;
|
|
||||||
return SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
|
|
||||||
*nextIndex = i + 3;
|
|
||||||
|
|
||||||
if (ch == '"')
|
|
||||||
return SCE_P_TRIPLEDOUBLE;
|
|
||||||
else
|
|
||||||
return SCE_P_TRIPLE;
|
|
||||||
} else {
|
|
||||||
*nextIndex = i + 1;
|
|
||||||
|
|
||||||
if (ch == '"')
|
|
||||||
return SCE_P_STRING;
|
|
||||||
else
|
|
||||||
return SCE_P_CHARACTER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordChar(int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(int ch) {
|
|
||||||
return (ch < 0x80) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
|
|
||||||
int endPos = startPos + length;
|
|
||||||
|
|
||||||
// Backtrack to previous line in case need to fix its tab whinging
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (startPos > 0) {
|
|
||||||
if (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
startPos = styler.LineStart(lineCurrent);
|
|
||||||
if (startPos == 0)
|
|
||||||
initStyle = SCE_P_DEFAULT;
|
|
||||||
else
|
|
||||||
initStyle = styler.StyleAt(startPos - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
const int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
|
|
||||||
|
|
||||||
initStyle = initStyle & 31;
|
|
||||||
if (initStyle == SCE_P_STRINGEOL) {
|
|
||||||
initStyle = SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
kwType kwLast = kwOther;
|
|
||||||
int spaceFlags = 0;
|
|
||||||
styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
|
|
||||||
bool hexadecimal = false;
|
|
||||||
|
|
||||||
// Python uses a different mask because bad indentation is marked by oring with 32
|
|
||||||
StyleContext sc(startPos, endPos - startPos, initStyle, styler, 0x7f);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.atLineStart) {
|
|
||||||
const char chBad = static_cast<char>(64);
|
|
||||||
const char chGood = static_cast<char>(0);
|
|
||||||
char chFlags = chGood;
|
|
||||||
if (whingeLevel == 1) {
|
|
||||||
chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
|
|
||||||
} else if (whingeLevel == 2) {
|
|
||||||
chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
|
|
||||||
} else if (whingeLevel == 3) {
|
|
||||||
chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
|
|
||||||
} else if (whingeLevel == 4) {
|
|
||||||
chFlags = (spaceFlags & wsTab) ? chBad : chGood;
|
|
||||||
}
|
|
||||||
sc.SetState(sc.state);
|
|
||||||
styler.SetFlags(chFlags, static_cast<char>(sc.state));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
if ((sc.state == SCE_P_DEFAULT) ||
|
|
||||||
(sc.state == SCE_P_TRIPLE) ||
|
|
||||||
(sc.state == SCE_P_TRIPLEDOUBLE)) {
|
|
||||||
// Perform colourisation of white space and triple quoted strings at end of each line to allow
|
|
||||||
// tab marking to work inside white space and triple quoted strings
|
|
||||||
sc.SetState(sc.state);
|
|
||||||
}
|
|
||||||
lineCurrent++;
|
|
||||||
styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
|
|
||||||
if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
|
|
||||||
sc.ChangeState(SCE_P_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_P_DEFAULT);
|
|
||||||
}
|
|
||||||
if (!sc.More())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool needEOLCheck = false;
|
|
||||||
|
|
||||||
// Check for a state end
|
|
||||||
if (sc.state == SCE_P_OPERATOR) {
|
|
||||||
kwLast = kwOther;
|
|
||||||
sc.SetState(SCE_P_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_P_NUMBER) {
|
|
||||||
if (!IsAWordChar(sc.ch) &&
|
|
||||||
!(!hexadecimal && ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) {
|
|
||||||
sc.SetState(SCE_P_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_P_IDENTIFIER) {
|
|
||||||
if ((sc.ch == '.') || (!IsAWordChar(sc.ch))) {
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrent(s, sizeof(s));
|
|
||||||
int style = SCE_P_IDENTIFIER;
|
|
||||||
if ((kwLast == kwImport) && (strcmp(s, "as") == 0)) {
|
|
||||||
style = SCE_P_WORD;
|
|
||||||
} else if (keywords.InList(s)) {
|
|
||||||
style = SCE_P_WORD;
|
|
||||||
} else if (kwLast == kwClass) {
|
|
||||||
style = SCE_P_CLASSNAME;
|
|
||||||
} else if (kwLast == kwDef) {
|
|
||||||
style = SCE_P_DEFNAME;
|
|
||||||
}
|
|
||||||
sc.ChangeState(style);
|
|
||||||
sc.SetState(SCE_P_DEFAULT);
|
|
||||||
if (style == SCE_P_WORD) {
|
|
||||||
if (0 == strcmp(s, "class"))
|
|
||||||
kwLast = kwClass;
|
|
||||||
else if (0 == strcmp(s, "def"))
|
|
||||||
kwLast = kwDef;
|
|
||||||
else if (0 == strcmp(s, "import"))
|
|
||||||
kwLast = kwImport;
|
|
||||||
else
|
|
||||||
kwLast = kwOther;
|
|
||||||
} else if (style == SCE_P_CLASSNAME) {
|
|
||||||
kwLast = kwOther;
|
|
||||||
} else if (style == SCE_P_DEFNAME) {
|
|
||||||
kwLast = kwOther;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ((sc.state == SCE_P_COMMENTLINE) || (sc.state == SCE_P_COMMENTBLOCK)) {
|
|
||||||
if (sc.ch == '\r' || sc.ch == '\n') {
|
|
||||||
sc.SetState(SCE_P_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
if ((sc.chNext == '\r') && (sc.GetRelative(2) == '\n')) {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
sc.Forward();
|
|
||||||
} else if ((sc.state == SCE_P_STRING) && (sc.ch == '\"')) {
|
|
||||||
sc.ForwardSetState(SCE_P_DEFAULT);
|
|
||||||
needEOLCheck = true;
|
|
||||||
} else if ((sc.state == SCE_P_CHARACTER) && (sc.ch == '\'')) {
|
|
||||||
sc.ForwardSetState(SCE_P_DEFAULT);
|
|
||||||
needEOLCheck = true;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_P_TRIPLE) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.Match("\'\'\'")) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_P_DEFAULT);
|
|
||||||
needEOLCheck = true;
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_P_TRIPLEDOUBLE) {
|
|
||||||
if (sc.ch == '\\') {
|
|
||||||
sc.Forward();
|
|
||||||
} else if (sc.Match("\"\"\"")) {
|
|
||||||
sc.Forward();
|
|
||||||
sc.Forward();
|
|
||||||
sc.ForwardSetState(SCE_P_DEFAULT);
|
|
||||||
needEOLCheck = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// State exit code may have moved on to end of line
|
|
||||||
if (needEOLCheck && sc.atLineEnd) {
|
|
||||||
lineCurrent++;
|
|
||||||
styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
|
|
||||||
if (!sc.More())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for a new state starting character
|
|
||||||
if (sc.state == SCE_P_DEFAULT) {
|
|
||||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
if (sc.ch == '0' && (sc.chNext == 'x' || sc.chNext == 'X')) {
|
|
||||||
hexadecimal = true;
|
|
||||||
} else {
|
|
||||||
hexadecimal = false;
|
|
||||||
}
|
|
||||||
sc.SetState(SCE_P_NUMBER);
|
|
||||||
} else if (isascii(sc.ch) && isoperator(static_cast<char>(sc.ch)) || sc.ch == '`') {
|
|
||||||
sc.SetState(SCE_P_OPERATOR);
|
|
||||||
} else if (sc.ch == '#') {
|
|
||||||
sc.SetState(sc.chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE);
|
|
||||||
} else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) {
|
|
||||||
unsigned int nextIndex = 0;
|
|
||||||
sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex));
|
|
||||||
while (nextIndex > (sc.currentPos + 1)) {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
} else if (IsAWordStart(sc.ch)) {
|
|
||||||
sc.SetState(SCE_P_IDENTIFIER);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsCommentLine(int line, Accessor &styler) {
|
|
||||||
int pos = styler.LineStart(line);
|
|
||||||
int eol_pos = styler.LineStart(line + 1) - 1;
|
|
||||||
for (int i = pos; i < eol_pos; i++) {
|
|
||||||
char ch = styler[i];
|
|
||||||
if (ch == '#')
|
|
||||||
return true;
|
|
||||||
else if (ch != ' ' && ch != '\t')
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsQuoteLine(int line, Accessor &styler) {
|
|
||||||
int style = styler.StyleAt(styler.LineStart(line)) & 31;
|
|
||||||
return ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
const int maxPos = startPos + length;
|
|
||||||
const int maxLines = styler.GetLine(maxPos - 1); // Requested last line
|
|
||||||
const int docLines = styler.GetLine(styler.Length() - 1); // Available last line
|
|
||||||
const bool foldComment = styler.GetPropertyInt("fold.comment.python") != 0;
|
|
||||||
const bool foldQuotes = styler.GetPropertyInt("fold.quotes.python") != 0;
|
|
||||||
|
|
||||||
// Backtrack to previous non-blank line so we can determine indent level
|
|
||||||
// for any white space lines (needed esp. within triple quoted strings)
|
|
||||||
// and so we can fix any preceding fold level (which is why we go back
|
|
||||||
// at least one line in all cases)
|
|
||||||
int spaceFlags = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
|
|
||||||
while (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&
|
|
||||||
(!IsCommentLine(lineCurrent, styler)) &&
|
|
||||||
(!IsQuoteLine(lineCurrent, styler)))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
|
|
||||||
// Set up initial loop state
|
|
||||||
startPos = styler.LineStart(lineCurrent);
|
|
||||||
int prev_state = SCE_P_DEFAULT & 31;
|
|
||||||
if (lineCurrent >= 1)
|
|
||||||
prev_state = styler.StyleAt(startPos - 1) & 31;
|
|
||||||
int prevQuote = foldQuotes && ((prev_state == SCE_P_TRIPLE) || (prev_state == SCE_P_TRIPLEDOUBLE));
|
|
||||||
int prevComment = 0;
|
|
||||||
if (lineCurrent >= 1)
|
|
||||||
prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
|
|
||||||
|
|
||||||
// Process all characters to end of requested range or end of any triple quote
|
|
||||||
// or comment that hangs over the end of the range. Cap processing in all cases
|
|
||||||
// to end of document (in case of unclosed quote or comment at end).
|
|
||||||
while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevQuote || prevComment)) {
|
|
||||||
|
|
||||||
// Gather info
|
|
||||||
int lev = indentCurrent;
|
|
||||||
int lineNext = lineCurrent + 1;
|
|
||||||
int indentNext = indentCurrent;
|
|
||||||
int quote = false;
|
|
||||||
if (lineNext <= docLines) {
|
|
||||||
// Information about next line is only available if not at end of document
|
|
||||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
|
|
||||||
int style = styler.StyleAt(styler.LineStart(lineNext)) & 31;
|
|
||||||
quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE));
|
|
||||||
}
|
|
||||||
const int quote_start = (quote && !prevQuote);
|
|
||||||
const int quote_continue = (quote && prevQuote);
|
|
||||||
const int comment = foldComment && IsCommentLine(lineCurrent, styler);
|
|
||||||
const int comment_start = (comment && !prevComment && (lineNext <= docLines) &&
|
|
||||||
IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
|
|
||||||
const int comment_continue = (comment && prevComment);
|
|
||||||
if ((!quote || !prevQuote) && !comment)
|
|
||||||
indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
if (quote)
|
|
||||||
indentNext = indentCurrentLevel;
|
|
||||||
if (indentNext & SC_FOLDLEVELWHITEFLAG)
|
|
||||||
indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
|
|
||||||
|
|
||||||
if (quote_start) {
|
|
||||||
// Place fold point at start of triple quoted string
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
} else if (quote_continue || prevQuote) {
|
|
||||||
// Add level to rest of lines in the string
|
|
||||||
lev = lev + 1;
|
|
||||||
} else if (comment_start) {
|
|
||||||
// Place fold point at start of a block of comments
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
} else if (comment_continue) {
|
|
||||||
// Add level to rest of lines in the block
|
|
||||||
lev = lev + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip past any blank lines for next indent level info; we skip also
|
|
||||||
// comments (all comments, not just those starting in column 0)
|
|
||||||
// which effectively folds them into surrounding code rather
|
|
||||||
// than screwing up folding.
|
|
||||||
|
|
||||||
while (!quote &&
|
|
||||||
(lineNext < docLines) &&
|
|
||||||
((indentNext & SC_FOLDLEVELWHITEFLAG) ||
|
|
||||||
(lineNext <= docLines && IsCommentLine(lineNext, styler)))) {
|
|
||||||
|
|
||||||
lineNext++;
|
|
||||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
const int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments);
|
|
||||||
|
|
||||||
// Now set all the indent levels on the lines we skipped
|
|
||||||
// Do this from end to start. Once we encounter one line
|
|
||||||
// which is indented more than the line after the end of
|
|
||||||
// the comment-block, use the level of the block before
|
|
||||||
|
|
||||||
int skipLine = lineNext;
|
|
||||||
int skipLevel = levelAfterComments;
|
|
||||||
|
|
||||||
while (--skipLine > lineCurrent) {
|
|
||||||
int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);
|
|
||||||
|
|
||||||
if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)
|
|
||||||
skipLevel = levelBeforeComments;
|
|
||||||
|
|
||||||
int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;
|
|
||||||
|
|
||||||
styler.SetLevel(skipLine, skipLevel | whiteFlag);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set fold header on non-quote/non-comment line
|
|
||||||
if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Keep track of triple quote and block comment state of previous line
|
|
||||||
prevQuote = quote;
|
|
||||||
prevComment = comment_start || comment_continue;
|
|
||||||
|
|
||||||
// Set fold level for this line and move to next line
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
indentCurrent = indentNext;
|
|
||||||
lineCurrent = lineNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: Cannot set level of last line here because indentCurrent doesn't have
|
|
||||||
// header flag set; the loop above is crafted to take care of this case!
|
|
||||||
//styler.SetLevel(lineCurrent, indentCurrent);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const pythonWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, "python", FoldPyDoc,
|
|
||||||
pythonWordListDesc);
|
|
||||||
@@ -1,365 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexRuby.cxx
|
|
||||||
** Lexer for Ruby.
|
|
||||||
**/
|
|
||||||
// Copyright 2001- by Clemens Wyss <wys@helbling.ch>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static void ClassifyWordRb(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
|
|
||||||
char s[100];
|
|
||||||
bool wordIsNumber = isdigit(styler[start]) != 0;
|
|
||||||
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
|
|
||||||
s[i] = styler[start + i];
|
|
||||||
s[i + 1] = '\0';
|
|
||||||
}
|
|
||||||
char chAttr = SCE_P_IDENTIFIER;
|
|
||||||
if (0 == strcmp(prevWord, "class"))
|
|
||||||
chAttr = SCE_P_CLASSNAME;
|
|
||||||
else if (0 == strcmp(prevWord, "module"))
|
|
||||||
chAttr = SCE_P_CLASSNAME;
|
|
||||||
else if (0 == strcmp(prevWord, "def"))
|
|
||||||
chAttr = SCE_P_DEFNAME;
|
|
||||||
else if (wordIsNumber)
|
|
||||||
chAttr = SCE_P_NUMBER;
|
|
||||||
else if (keywords.InList(s))
|
|
||||||
chAttr = SCE_P_WORD;
|
|
||||||
// make sure that dot-qualifiers inside the word are lexed correct
|
|
||||||
else for (unsigned int i = 0; i < end - start + 1; i++) {
|
|
||||||
if (styler[start + i] == '.') {
|
|
||||||
styler.ColourTo(start + i - 1, chAttr);
|
|
||||||
styler.ColourTo(start + i, SCE_P_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styler.ColourTo(end, chAttr);
|
|
||||||
strcpy(prevWord, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsRbComment(Accessor &styler, int pos, int len) {
|
|
||||||
return len>0 && styler[pos]=='#';
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsRbStringStart(char ch, char chNext, char chNext2) {
|
|
||||||
if (ch == '\'' || ch == '"')
|
|
||||||
return true;
|
|
||||||
if (ch == 'u' || ch == 'U') {
|
|
||||||
if (chNext == '"' || chNext == '\'')
|
|
||||||
return true;
|
|
||||||
if ((chNext == 'r' || chNext == 'R') && (chNext2 == '"' || chNext2 == '\''))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((ch == 'r' || ch == 'R') && (chNext == '"' || chNext == '\''))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsRbWordStart(char ch, char chNext, char chNext2) {
|
|
||||||
return (iswordchar(ch) && !IsRbStringStart(ch, chNext, chNext2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */
|
|
||||||
static int GetRbStringState(Accessor &styler, int i, int *nextIndex) {
|
|
||||||
char ch = styler.SafeGetCharAt(i);
|
|
||||||
char chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
// Advance beyond r, u, or ur prefix, but bail if there are any unexpected chars
|
|
||||||
if (ch == 'r' || ch == 'R') {
|
|
||||||
i++;
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
else if (ch == 'u' || ch == 'U') {
|
|
||||||
if (chNext == 'r' || chNext == 'R')
|
|
||||||
i += 2;
|
|
||||||
else
|
|
||||||
i += 1;
|
|
||||||
ch = styler.SafeGetCharAt(i);
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ch != '"' && ch != '\'') {
|
|
||||||
*nextIndex = i + 1;
|
|
||||||
return SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i>0 && styler.SafeGetCharAt(i-1) == '$') {
|
|
||||||
*nextIndex = i + 1;
|
|
||||||
return SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
|
|
||||||
*nextIndex = i + 3;
|
|
||||||
|
|
||||||
if (ch == '"')
|
|
||||||
return SCE_P_TRIPLEDOUBLE;
|
|
||||||
else
|
|
||||||
return SCE_P_TRIPLE;
|
|
||||||
} else {
|
|
||||||
*nextIndex = i + 1;
|
|
||||||
|
|
||||||
if (ch == '"')
|
|
||||||
return SCE_P_STRING;
|
|
||||||
else
|
|
||||||
return SCE_P_CHARACTER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseRbDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
|
|
||||||
// Backtrack to previous line in case need to fix its tab whinging
|
|
||||||
if (startPos > 0) {
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (lineCurrent > 0) {
|
|
||||||
startPos = styler.LineStart(lineCurrent-1);
|
|
||||||
if (startPos == 0)
|
|
||||||
initStyle = SCE_P_DEFAULT;
|
|
||||||
else
|
|
||||||
initStyle = styler.StyleAt(startPos-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ruby uses a different mask because bad indentation is marked by oring with 32
|
|
||||||
styler.StartAt(startPos, 127);
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
|
|
||||||
char prevWord[200];
|
|
||||||
prevWord[0] = '\0';
|
|
||||||
if (length == 0)
|
|
||||||
return ;
|
|
||||||
|
|
||||||
int state = initStyle & 31;
|
|
||||||
|
|
||||||
int nextIndex = 0;
|
|
||||||
char chPrev = ' ';
|
|
||||||
char chPrev2 = ' ';
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
bool atStartLine = true;
|
|
||||||
int spaceFlags = 0;
|
|
||||||
for (int i = startPos; i < lengthDoc; i++) {
|
|
||||||
|
|
||||||
if (atStartLine) {
|
|
||||||
char chBad = static_cast<char>(64);
|
|
||||||
char chGood = static_cast<char>(0);
|
|
||||||
char chFlags = chGood;
|
|
||||||
if (whingeLevel == 1) {
|
|
||||||
chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
|
|
||||||
} else if (whingeLevel == 2) {
|
|
||||||
chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
|
|
||||||
} else if (whingeLevel == 3) {
|
|
||||||
chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
|
|
||||||
} else if (whingeLevel == 4) {
|
|
||||||
chFlags = (spaceFlags & wsTab) ? chBad : chGood;
|
|
||||||
}
|
|
||||||
styler.SetFlags(chFlags, static_cast<char>(state));
|
|
||||||
atStartLine = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
char chNext2 = styler.SafeGetCharAt(i + 2);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
|
|
||||||
if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
|
|
||||||
// Perform colourisation of white space and triple quoted strings at end of each line to allow
|
|
||||||
// tab marking to work inside white space and triple quoted strings
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
}
|
|
||||||
atStartLine = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
chPrev = ' ';
|
|
||||||
chPrev2 = ' ';
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_P_STRINGEOL) {
|
|
||||||
if (ch != '\r' && ch != '\n') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (state == SCE_P_DEFAULT) {
|
|
||||||
if (IsRbWordStart(ch, chNext, chNext2)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_P_WORD;
|
|
||||||
} else if (ch == '#') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
|
|
||||||
} else if (ch == '=' && chNext == 'b') {
|
|
||||||
// =begin indicates the start of a comment (doc) block
|
|
||||||
if(styler.SafeGetCharAt(i + 2) == 'e' && styler.SafeGetCharAt(i + 3) == 'g' && styler.SafeGetCharAt(i + 4) == 'i' && styler.SafeGetCharAt(i + 5) == 'n') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_P_TRIPLEDOUBLE; //SCE_C_COMMENT;
|
|
||||||
}
|
|
||||||
} else if (IsRbStringStart(ch, chNext, chNext2)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = GetRbStringState(styler, i, &nextIndex);
|
|
||||||
if (nextIndex != i + 1) {
|
|
||||||
i = nextIndex - 1;
|
|
||||||
ch = ' ';
|
|
||||||
chPrev = ' ';
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
styler.ColourTo(i, SCE_P_OPERATOR);
|
|
||||||
}
|
|
||||||
} else if (state == SCE_P_WORD) {
|
|
||||||
if (!iswordchar(ch)) {
|
|
||||||
ClassifyWordRb(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
|
|
||||||
state = SCE_P_DEFAULT;
|
|
||||||
if (ch == '#') {
|
|
||||||
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
|
|
||||||
} else if (IsRbStringStart(ch, chNext, chNext2)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = GetRbStringState(styler, i, &nextIndex);
|
|
||||||
if (nextIndex != i + 1) {
|
|
||||||
i = nextIndex - 1;
|
|
||||||
ch = ' ';
|
|
||||||
chPrev = ' ';
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
styler.ColourTo(i, SCE_P_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) {
|
|
||||||
if (ch == '\r' || ch == '\n') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_P_STRING) {
|
|
||||||
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_P_STRINGEOL;
|
|
||||||
} else if (ch == '\\') {
|
|
||||||
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (ch == '\"') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_P_CHARACTER) {
|
|
||||||
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_P_STRINGEOL;
|
|
||||||
} else if (ch == '\\') {
|
|
||||||
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_P_TRIPLE) {
|
|
||||||
if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_P_TRIPLEDOUBLE) {
|
|
||||||
// =end terminates the comment block
|
|
||||||
if (ch == 'd' && chPrev == 'n' && chPrev2 == 'e') {
|
|
||||||
if (styler.SafeGetCharAt(i - 3) == '=') {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_P_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
chPrev2 = chPrev;
|
|
||||||
chPrev = ch;
|
|
||||||
}
|
|
||||||
if (state == SCE_P_WORD) {
|
|
||||||
ClassifyWordRb(styler.GetStartSegment(), lengthDoc-1, keywords, styler, prevWord);
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(lengthDoc-1, state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldRbDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
|
|
||||||
// Backtrack to previous line in case need to fix its fold status
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (startPos > 0) {
|
|
||||||
if (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
startPos = styler.LineStart(lineCurrent);
|
|
||||||
if (startPos == 0)
|
|
||||||
initStyle = SCE_P_DEFAULT;
|
|
||||||
else
|
|
||||||
initStyle = styler.StyleAt(startPos-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int state = initStyle & 31;
|
|
||||||
int spaceFlags = 0;
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsRbComment);
|
|
||||||
if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
|
|
||||||
indentCurrent |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
for (int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styler.StyleAt(i) & 31;
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
|
|
||||||
int lev = indentCurrent;
|
|
||||||
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsRbComment);
|
|
||||||
if ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE))
|
|
||||||
indentNext |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
|
|
||||||
// Only non whitespace lines can be headers
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
|
|
||||||
// Line after is blank so check the next - maybe should continue further?
|
|
||||||
int spaceFlags2 = 0;
|
|
||||||
int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsRbComment);
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
indentCurrent = indentNext;
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
lineCurrent++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const rubyWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmRuby(SCLEX_RUBY, ColouriseRbDoc, "ruby", FoldRbDoc, rubyWordListDesc);
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexSQL.cxx
|
|
||||||
** Lexer for SQL.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static void classifyWordSQL(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
|
|
||||||
char s[100];
|
|
||||||
bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
|
|
||||||
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
|
|
||||||
s[i] = static_cast<char>(tolower(styler[start + i]));
|
|
||||||
s[i + 1] = '\0';
|
|
||||||
}
|
|
||||||
char chAttr = SCE_C_IDENTIFIER;
|
|
||||||
if (wordIsNumber)
|
|
||||||
chAttr = SCE_C_NUMBER;
|
|
||||||
else {
|
|
||||||
if (keywords.InList(s))
|
|
||||||
chAttr = SCE_C_WORD;
|
|
||||||
}
|
|
||||||
styler.ColourTo(end, chAttr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseSQLDoc(unsigned int startPos, int length,
|
|
||||||
int initStyle, WordList *keywordlists[], Accessor &styler) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
bool fold = styler.GetPropertyInt("fold") != 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int spaceFlags = 0;
|
|
||||||
|
|
||||||
int state = initStyle;
|
|
||||||
char chPrev = ' ';
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int lengthDoc = startPos + length;
|
|
||||||
for (unsigned int i = startPos; i < lengthDoc; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);
|
|
||||||
int lev = indentCurrent;
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
|
|
||||||
// Only non whitespace lines can be headers
|
|
||||||
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);
|
|
||||||
if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fold) {
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch)) {
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
chPrev = ' ';
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_C_DEFAULT) {
|
|
||||||
if (iswordstart(ch)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_C_WORD;
|
|
||||||
} else if (ch == '/' && chNext == '*') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_C_COMMENT;
|
|
||||||
} else if (ch == '-' && chNext == '-') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_C_COMMENTLINE;
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_C_CHARACTER;
|
|
||||||
} else if (ch == '"') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_C_STRING;
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
styler.ColourTo(i, SCE_C_OPERATOR);
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_WORD) {
|
|
||||||
if (!iswordchar(ch)) {
|
|
||||||
classifyWordSQL(styler.GetStartSegment(), i - 1, keywords, styler);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
if (ch == '/' && chNext == '*') {
|
|
||||||
state = SCE_C_COMMENT;
|
|
||||||
} else if (ch == '-' && chNext == '-') {
|
|
||||||
state = SCE_C_COMMENTLINE;
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
state = SCE_C_CHARACTER;
|
|
||||||
} else if (ch == '"') {
|
|
||||||
state = SCE_C_STRING;
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
styler.ColourTo(i, SCE_C_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (state == SCE_C_COMMENT) {
|
|
||||||
if (ch == '/' && chPrev == '*') {
|
|
||||||
if (((i > (styler.GetStartSegment() + 2)) || ((initStyle == SCE_C_COMMENT) &&
|
|
||||||
(styler.GetStartSegment() == startPos)))) {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_COMMENTLINE) {
|
|
||||||
if (ch == '\r' || ch == '\n') {
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_CHARACTER) {
|
|
||||||
if (ch == '\'') {
|
|
||||||
if ( chNext == '\'' ) {
|
|
||||||
i++;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
} else if (state == SCE_C_STRING) {
|
|
||||||
if (ch == '"') {
|
|
||||||
if (chNext == '"') {
|
|
||||||
i++;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_C_DEFAULT;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (state == SCE_C_DEFAULT) { // One of the above succeeded
|
|
||||||
if (ch == '/' && chNext == '*') {
|
|
||||||
state = SCE_C_COMMENT;
|
|
||||||
} else if (ch == '-' && chNext == '-') {
|
|
||||||
state = SCE_C_COMMENTLINE;
|
|
||||||
} else if (ch == '\'') {
|
|
||||||
state = SCE_C_CHARACTER;
|
|
||||||
} else if (ch == '"') {
|
|
||||||
state = SCE_C_STRING;
|
|
||||||
} else if (iswordstart(ch)) {
|
|
||||||
state = SCE_C_WORD;
|
|
||||||
} else if (isoperator(ch)) {
|
|
||||||
styler.ColourTo(i, SCE_C_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
chPrev = ch;
|
|
||||||
}
|
|
||||||
styler.ColourTo(lengthDoc - 1, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const sqlWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmSQL(SCLEX_SQL, ColouriseSQLDoc, "sql", 0, sqlWordListDesc);
|
|
||||||
@@ -1,404 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexScriptol.cxx
|
|
||||||
** Lexer for Scriptol.
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord)
|
|
||||||
{
|
|
||||||
char s[100];
|
|
||||||
bool wordIsNumber = isdigit(styler[start]) != 0;
|
|
||||||
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
|
|
||||||
{
|
|
||||||
s[i] = styler[start + i];
|
|
||||||
s[i + 1] = '\0';
|
|
||||||
}
|
|
||||||
char chAttr = SCE_SCRIPTOL_IDENTIFIER;
|
|
||||||
if (0 == strcmp(prevWord, "class")) chAttr = SCE_SCRIPTOL_CLASSNAME;
|
|
||||||
else if (wordIsNumber) chAttr = SCE_SCRIPTOL_NUMBER;
|
|
||||||
else if (keywords.InList(s)) chAttr = SCE_SCRIPTOL_KEYWORD;
|
|
||||||
else for (unsigned int i = 0; i < end - start + 1; i++) // test dotted idents
|
|
||||||
{
|
|
||||||
if (styler[start + i] == '.')
|
|
||||||
{
|
|
||||||
styler.ColourTo(start + i - 1, chAttr);
|
|
||||||
styler.ColourTo(start + i, SCE_SCRIPTOL_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styler.ColourTo(end, chAttr);
|
|
||||||
strcpy(prevWord, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsSolComment(Accessor &styler, int pos, int len)
|
|
||||||
{
|
|
||||||
char c;
|
|
||||||
if(len > 0)
|
|
||||||
{
|
|
||||||
c = styler[pos];
|
|
||||||
if(c == '`') return true;
|
|
||||||
if(len > 1)
|
|
||||||
{
|
|
||||||
if(c == '/')
|
|
||||||
{
|
|
||||||
c = styler[pos + 1];
|
|
||||||
if(c == '/') return true;
|
|
||||||
if(c == '*') return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsSolStringStart(char ch)
|
|
||||||
{
|
|
||||||
if (ch == '\'' || ch == '"') return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsSolWordStart(char ch)
|
|
||||||
{
|
|
||||||
return (iswordchar(ch) && !IsSolStringStart(ch));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int GetSolStringState(Accessor &styler, int i, int *nextIndex)
|
|
||||||
{
|
|
||||||
char ch = styler.SafeGetCharAt(i);
|
|
||||||
char chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if (ch != '\"' && ch != '\'')
|
|
||||||
{
|
|
||||||
*nextIndex = i + 1;
|
|
||||||
return SCE_SCRIPTOL_DEFAULT;
|
|
||||||
}
|
|
||||||
// ch is either single or double quotes in string
|
|
||||||
// code below seem non-sense but is here for future extensions
|
|
||||||
if (ch == chNext && ch == styler.SafeGetCharAt(i + 2))
|
|
||||||
{
|
|
||||||
*nextIndex = i + 3;
|
|
||||||
if(ch == '\"') return SCE_SCRIPTOL_TRIPLE;
|
|
||||||
if(ch == '\'') return SCE_SCRIPTOL_TRIPLE;
|
|
||||||
return SCE_SCRIPTOL_STRING;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*nextIndex = i + 1;
|
|
||||||
if (ch == '"') return SCE_SCRIPTOL_STRING;
|
|
||||||
else return SCE_SCRIPTOL_STRING;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler)
|
|
||||||
{
|
|
||||||
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
char stringType = '\"';
|
|
||||||
|
|
||||||
if (startPos > 0)
|
|
||||||
{
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (lineCurrent > 0)
|
|
||||||
{
|
|
||||||
startPos = styler.LineStart(lineCurrent-1);
|
|
||||||
if (startPos == 0) initStyle = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
else initStyle = styler.StyleAt(startPos-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
styler.StartAt(startPos, 127);
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
|
|
||||||
int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
|
|
||||||
char prevWord[200];
|
|
||||||
prevWord[0] = '\0';
|
|
||||||
if (length == 0) return;
|
|
||||||
|
|
||||||
int state = initStyle & 31;
|
|
||||||
|
|
||||||
int nextIndex = 0;
|
|
||||||
char chPrev = ' ';
|
|
||||||
char chPrev2 = ' ';
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
bool atStartLine = true;
|
|
||||||
int spaceFlags = 0;
|
|
||||||
for (int i = startPos; i < lengthDoc; i++)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (atStartLine)
|
|
||||||
{
|
|
||||||
char chBad = static_cast<char>(64);
|
|
||||||
char chGood = static_cast<char>(0);
|
|
||||||
char chFlags = chGood;
|
|
||||||
|
|
||||||
if (whingeLevel == 1)
|
|
||||||
{
|
|
||||||
chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
|
|
||||||
}
|
|
||||||
else if (whingeLevel == 2)
|
|
||||||
{
|
|
||||||
chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
|
|
||||||
}
|
|
||||||
else if (whingeLevel == 3)
|
|
||||||
{
|
|
||||||
chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
|
|
||||||
}
|
|
||||||
else if (whingeLevel == 4)
|
|
||||||
{
|
|
||||||
chFlags = (spaceFlags & wsTab) ? chBad : chGood;
|
|
||||||
}
|
|
||||||
styler.SetFlags(chFlags, static_cast<char>(state));
|
|
||||||
atStartLine = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
|
|
||||||
{
|
|
||||||
if ((state == SCE_SCRIPTOL_DEFAULT) ||
|
|
||||||
(state == SCE_SCRIPTOL_TRIPLE) ||
|
|
||||||
(state == SCE_SCRIPTOL_COMMENTBLOCK))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
}
|
|
||||||
atStartLine = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (styler.IsLeadByte(ch))
|
|
||||||
{
|
|
||||||
chNext = styler.SafeGetCharAt(i + 2);
|
|
||||||
chPrev = ' ';
|
|
||||||
chPrev2 = ' ';
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_SCRIPTOL_STRINGEOL)
|
|
||||||
{
|
|
||||||
if (ch != '\r' && ch != '\n')
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == SCE_SCRIPTOL_DEFAULT)
|
|
||||||
{
|
|
||||||
if (IsSolWordStart(ch))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_SCRIPTOL_KEYWORD;
|
|
||||||
}
|
|
||||||
else if (ch == '`')
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_SCRIPTOL_COMMENTLINE;
|
|
||||||
}
|
|
||||||
else if (ch == '/')
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
if(chNext == '/') state = SCE_SCRIPTOL_CSTYLE;
|
|
||||||
if(chNext == '*') state = SCE_SCRIPTOL_COMMENTBLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (IsSolStringStart(ch))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = GetSolStringState(styler, i, &nextIndex);
|
|
||||||
if(state == SCE_SCRIPTOL_STRING)
|
|
||||||
{
|
|
||||||
stringType = ch;
|
|
||||||
}
|
|
||||||
if (nextIndex != i + 1)
|
|
||||||
{
|
|
||||||
i = nextIndex - 1;
|
|
||||||
ch = ' ';
|
|
||||||
chPrev = ' ';
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (isoperator(ch))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (state == SCE_SCRIPTOL_KEYWORD)
|
|
||||||
{
|
|
||||||
if (!iswordchar(ch))
|
|
||||||
{
|
|
||||||
ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
|
|
||||||
state = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
if (ch == '`')
|
|
||||||
{
|
|
||||||
state = chNext == '`' ? SCE_SCRIPTOL_PERSISTENT : SCE_SCRIPTOL_COMMENTLINE;
|
|
||||||
}
|
|
||||||
else if (IsSolStringStart(ch))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = GetSolStringState(styler, i, &nextIndex);
|
|
||||||
if (nextIndex != i + 1)
|
|
||||||
{
|
|
||||||
i = nextIndex - 1;
|
|
||||||
ch = ' ';
|
|
||||||
chPrev = ' ';
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (isoperator(ch))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (state == SCE_SCRIPTOL_COMMENTLINE ||
|
|
||||||
state == SCE_SCRIPTOL_PERSISTENT ||
|
|
||||||
state == SCE_SCRIPTOL_CSTYLE)
|
|
||||||
{
|
|
||||||
if (ch == '\r' || ch == '\n')
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(state == SCE_SCRIPTOL_COMMENTBLOCK)
|
|
||||||
{
|
|
||||||
if(chPrev == '*' && ch == '/')
|
|
||||||
{
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((state == SCE_SCRIPTOL_STRING) ||
|
|
||||||
(state == SCE_SCRIPTOL_CHARACTER))
|
|
||||||
{
|
|
||||||
if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i - 1, state);
|
|
||||||
state = SCE_SCRIPTOL_STRINGEOL;
|
|
||||||
}
|
|
||||||
else if (ch == '\\')
|
|
||||||
{
|
|
||||||
if (chNext == '\"' || chNext == '\'' || chNext == '\\')
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((ch == '\"') || (ch == '\''))
|
|
||||||
{
|
|
||||||
// must match the entered quote type
|
|
||||||
if(ch == stringType)
|
|
||||||
{
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (state == SCE_SCRIPTOL_TRIPLE)
|
|
||||||
{
|
|
||||||
if ((ch == '\'' && chPrev == '\'' && chPrev2 == '\'') ||
|
|
||||||
(ch == '\"' && chPrev == '\"' && chPrev2 == '\"'))
|
|
||||||
{
|
|
||||||
styler.ColourTo(i, state);
|
|
||||||
state = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
chPrev2 = chPrev;
|
|
||||||
chPrev = ch;
|
|
||||||
}
|
|
||||||
if (state == SCE_SCRIPTOL_KEYWORD)
|
|
||||||
{
|
|
||||||
ClassifyWordSol(styler.GetStartSegment(),
|
|
||||||
lengthDoc-1, keywords, styler, prevWord);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
styler.ColourTo(lengthDoc-1, state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldSolDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *[], Accessor &styler)
|
|
||||||
{
|
|
||||||
int lengthDoc = startPos + length;
|
|
||||||
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (startPos > 0)
|
|
||||||
{
|
|
||||||
if (lineCurrent > 0)
|
|
||||||
{
|
|
||||||
lineCurrent--;
|
|
||||||
startPos = styler.LineStart(lineCurrent);
|
|
||||||
if (startPos == 0)
|
|
||||||
initStyle = SCE_SCRIPTOL_DEFAULT;
|
|
||||||
else
|
|
||||||
initStyle = styler.StyleAt(startPos-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int state = initStyle & 31;
|
|
||||||
int spaceFlags = 0;
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment);
|
|
||||||
if ((state == SCE_SCRIPTOL_TRIPLE))
|
|
||||||
indentCurrent |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
for (int i = startPos; i < lengthDoc; i++)
|
|
||||||
{
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
int style = styler.StyleAt(i) & 31;
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
|
|
||||||
{
|
|
||||||
int lev = indentCurrent;
|
|
||||||
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment);
|
|
||||||
if (style == SCE_SCRIPTOL_TRIPLE)
|
|
||||||
indentNext |= SC_FOLDLEVELWHITEFLAG;
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG))
|
|
||||||
{
|
|
||||||
// Only non whitespace lines can be headers
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
|
|
||||||
{
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
else if (indentNext & SC_FOLDLEVELWHITEFLAG)
|
|
||||||
{
|
|
||||||
// Line after is blank so check the next - maybe should continue further?
|
|
||||||
int spaceFlags2 = 0;
|
|
||||||
int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment);
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK))
|
|
||||||
{
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
indentCurrent = indentNext;
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
lineCurrent++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerModule lmScriptol(SCLEX_SCRIPTOL, ColouriseSolDoc, "scriptol", FoldSolDoc);
|
|
||||||
@@ -1,288 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
|
|
||||||
// File: LexTeX.cxx - general context conformant tex coloring scheme
|
|
||||||
// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
// This lexer is derived from the one written for the texwork environment (1999++) which in
|
|
||||||
// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).
|
|
||||||
|
|
||||||
// If you run into strange boundary cases, just tell me and I'll look into it.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
|
|
||||||
// val SCE_TEX_DEFAULT = 0
|
|
||||||
// val SCE_TEX_SPECIAL = 1
|
|
||||||
// val SCE_TEX_GROUP = 2
|
|
||||||
// val SCE_TEX_SYMBOL = 3
|
|
||||||
// val SCE_TEX_COMMAND = 4
|
|
||||||
// val SCE_TEX_TEXT = 5
|
|
||||||
|
|
||||||
// Definitions in SciTEGlobal.properties:
|
|
||||||
//
|
|
||||||
// TeX Highlighting
|
|
||||||
//
|
|
||||||
// # Default
|
|
||||||
// style.tex.0=fore:#7F7F00
|
|
||||||
// # Special
|
|
||||||
// style.tex.1=fore:#007F7F
|
|
||||||
// # Group
|
|
||||||
// style.tex.2=fore:#880000
|
|
||||||
// # Symbol
|
|
||||||
// style.tex.3=fore:#7F7F00
|
|
||||||
// # Command
|
|
||||||
// style.tex.4=fore:#008800
|
|
||||||
// # Text
|
|
||||||
// style.tex.5=fore:#000000
|
|
||||||
|
|
||||||
// lexer.tex.interface.default=0
|
|
||||||
// lexer.tex.comment.process=0
|
|
||||||
|
|
||||||
// todo: lexer.tex.auto.if
|
|
||||||
|
|
||||||
// Auxiliary functions:
|
|
||||||
|
|
||||||
static inline bool endOfLine(Accessor &styler, unsigned int i) {
|
|
||||||
return
|
|
||||||
(styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXzero(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '%') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXone(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '[') || (ch == ']') || (ch == '=') || (ch == '#') ||
|
|
||||||
(ch == '(') || (ch == ')') || (ch == '<') || (ch == '>') ||
|
|
||||||
(ch == '"') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXtwo(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '{') || (ch == '}') || (ch == '$') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXthree(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '~') || (ch == '^') || (ch == '_') || (ch == '&') ||
|
|
||||||
(ch == '-') || (ch == '+') || (ch == '\"') || (ch == '`') ||
|
|
||||||
(ch == '/') || (ch == '|') || (ch == '%') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXfour(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '\\') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXfive(int ch) {
|
|
||||||
return
|
|
||||||
((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||
|
|
||||||
(ch == '@') || (ch == '!') || (ch == '?') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXsix(int ch) {
|
|
||||||
return
|
|
||||||
(ch == ' ') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isTeXseven(int ch) {
|
|
||||||
return
|
|
||||||
(ch == '^') ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Interface determination
|
|
||||||
|
|
||||||
static int CheckTeXInterface(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
Accessor &styler,
|
|
||||||
int defaultInterface) {
|
|
||||||
|
|
||||||
char lineBuffer[1024] ;
|
|
||||||
unsigned int linePos = 0 ;
|
|
||||||
|
|
||||||
// some day we can make something lexer.tex.mapping=(all,0)(nl,1)(en,2)...
|
|
||||||
|
|
||||||
if (styler.SafeGetCharAt(0) == '%') {
|
|
||||||
for (unsigned int i = 0; i < startPos + length; i++) {
|
|
||||||
lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;
|
|
||||||
if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
if (strstr(lineBuffer, "interface=all")) {
|
|
||||||
return 0 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=tex")) {
|
|
||||||
return 1 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=nl")) {
|
|
||||||
return 2 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=en")) {
|
|
||||||
return 3 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=de")) {
|
|
||||||
return 4 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=cz")) {
|
|
||||||
return 5 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=it")) {
|
|
||||||
return 6 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=ro")) {
|
|
||||||
return 7 ;
|
|
||||||
} else if (strstr(lineBuffer, "interface=latex")) {
|
|
||||||
// we will move latex cum suis up to 91+ when more keyword lists are supported
|
|
||||||
return 8 ;
|
|
||||||
} else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, "%D \\module")) {
|
|
||||||
// better would be to limit the search to just one line
|
|
||||||
return 3 ;
|
|
||||||
} else {
|
|
||||||
return defaultInterface ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return defaultInterface ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseTeXDoc(
|
|
||||||
unsigned int startPos,
|
|
||||||
int length,
|
|
||||||
int,
|
|
||||||
WordList *keywordlists[],
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
styler.StartAt(startPos) ;
|
|
||||||
styler.StartSegment(startPos) ;
|
|
||||||
|
|
||||||
bool processComment = styler.GetPropertyInt("lexer.tex.comment.process", 0) == 1 ;
|
|
||||||
bool useKeywords = styler.GetPropertyInt("lexer.tex.use.keywords", 1) == 1 ;
|
|
||||||
bool autoIf = styler.GetPropertyInt("lexer.tex.auto.if", 1) == 1 ;
|
|
||||||
int defaultInterface = styler.GetPropertyInt("lexer.tex.interface.default", 1) ;
|
|
||||||
|
|
||||||
char key[100] ;
|
|
||||||
int k ;
|
|
||||||
bool newifDone = false ;
|
|
||||||
bool inComment = false ;
|
|
||||||
|
|
||||||
int currentInterface = CheckTeXInterface(startPos,length,styler,defaultInterface) ;
|
|
||||||
|
|
||||||
if (currentInterface == 0) {
|
|
||||||
useKeywords = false ;
|
|
||||||
currentInterface = 1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[currentInterface-1] ;
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, SCE_TEX_TEXT, styler);
|
|
||||||
|
|
||||||
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 (inComment) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_TEX_TEXT) ;
|
|
||||||
newifDone = false ;
|
|
||||||
inComment = false ;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (! isTeXfive(sc.ch)) {
|
|
||||||
if (sc.state == SCE_TEX_COMMAND) {
|
|
||||||
if (sc.LengthCurrent() == 1) { // \<noncstoken>
|
|
||||||
if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {
|
|
||||||
sc.Forward(2) ; // \^^ and \^^<token>
|
|
||||||
}
|
|
||||||
sc.ForwardSetState(SCE_TEX_TEXT) ;
|
|
||||||
} else {
|
|
||||||
sc.GetCurrent(key, sizeof(key)-1) ;
|
|
||||||
k = strlen(key) ;
|
|
||||||
memmove(key,key+1,k) ; // shift left over escape token
|
|
||||||
key[k] = '\0' ;
|
|
||||||
k-- ;
|
|
||||||
if (! keywords || ! useKeywords) {
|
|
||||||
sc.SetState(SCE_TEX_COMMAND) ;
|
|
||||||
newifDone = false ;
|
|
||||||
} else if (k == 1) { //\<cstoken>
|
|
||||||
sc.SetState(SCE_TEX_COMMAND) ;
|
|
||||||
newifDone = false ;
|
|
||||||
} else if (keywords.InList(key)) {
|
|
||||||
sc.SetState(SCE_TEX_COMMAND) ;
|
|
||||||
newifDone = autoIf && (strcmp(key,"newif") == 0) ;
|
|
||||||
} else if (autoIf && ! newifDone && (key[0] == 'i') && (key[1] == 'f') && keywords.InList("if")) {
|
|
||||||
sc.SetState(SCE_TEX_COMMAND) ;
|
|
||||||
} else {
|
|
||||||
sc.ChangeState(SCE_TEX_TEXT) ;
|
|
||||||
sc.SetState(SCE_TEX_TEXT) ;
|
|
||||||
newifDone = false ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isTeXzero(sc.ch)) {
|
|
||||||
sc.SetState(SCE_TEX_SYMBOL) ;
|
|
||||||
sc.ForwardSetState(SCE_TEX_DEFAULT) ;
|
|
||||||
inComment = ! processComment ;
|
|
||||||
newifDone = false ;
|
|
||||||
} else if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {
|
|
||||||
sc.SetState(SCE_TEX_TEXT) ;
|
|
||||||
sc.ForwardSetState(SCE_TEX_TEXT) ;
|
|
||||||
} else if (isTeXone(sc.ch)) {
|
|
||||||
sc.SetState(SCE_TEX_SPECIAL) ;
|
|
||||||
newifDone = false ;
|
|
||||||
} else if (isTeXtwo(sc.ch)) {
|
|
||||||
sc.SetState(SCE_TEX_GROUP) ;
|
|
||||||
newifDone = false ;
|
|
||||||
} else if (isTeXthree(sc.ch)) {
|
|
||||||
sc.SetState(SCE_TEX_SYMBOL) ;
|
|
||||||
newifDone = false ;
|
|
||||||
} else if (isTeXfour(sc.ch)) {
|
|
||||||
sc.SetState(SCE_TEX_COMMAND) ;
|
|
||||||
} else if (isTeXsix(sc.ch)) {
|
|
||||||
sc.SetState(SCE_TEX_TEXT) ;
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_TEX_TEXT) ;
|
|
||||||
newifDone = false ;
|
|
||||||
inComment = false ;
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_TEX_TEXT) ;
|
|
||||||
}
|
|
||||||
} else if (sc.state != SCE_TEX_COMMAND) {
|
|
||||||
sc.SetState(SCE_TEX_TEXT) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.ChangeState(SCE_TEX_TEXT) ;
|
|
||||||
sc.Complete();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Hooks into the system:
|
|
||||||
|
|
||||||
static const char * const texWordListDesc[] = {
|
|
||||||
"TeX, eTeX, pdfTeX, Omega"
|
|
||||||
"ConTeXt Dutch",
|
|
||||||
"ConTeXt English",
|
|
||||||
"ConTeXt German",
|
|
||||||
"ConTeXt Czech",
|
|
||||||
"ConTeXt Italian",
|
|
||||||
"ConTeXt Romanian",
|
|
||||||
0,
|
|
||||||
} ;
|
|
||||||
|
|
||||||
LexerModule lmTeX(SCLEX_TEX, ColouriseTeXDoc, "tex", 0, texWordListDesc);
|
|
||||||
@@ -1,233 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexVB.cxx
|
|
||||||
** Lexer for Visual Basic and VBScript.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static bool IsVBComment(Accessor &styler, int pos, int len) {
|
|
||||||
return len>0 && styler[pos]=='\'';
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsTypeCharacter(int ch) {
|
|
||||||
return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extended to accept accented characters
|
|
||||||
static inline bool IsAWordChar(int ch) {
|
|
||||||
return ch >= 0x80 ||
|
|
||||||
(isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsAWordStart(int ch) {
|
|
||||||
return ch >= 0x80 ||
|
|
||||||
(isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsADateCharacter(const int ch) {
|
|
||||||
return (ch < 0x80) &&
|
|
||||||
(isalnum(ch) || ch == '|' || ch == '-' || ch == '/' || ch == ':' || ch == ' ' || ch == '\t');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler, bool vbScriptSyntax) {
|
|
||||||
|
|
||||||
WordList &keywords = *keywordlists[0];
|
|
||||||
WordList &keywords2 = *keywordlists[1];
|
|
||||||
WordList &keywords3 = *keywordlists[2];
|
|
||||||
WordList &keywords4 = *keywordlists[3];
|
|
||||||
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
|
|
||||||
int visibleChars = 0;
|
|
||||||
|
|
||||||
StyleContext sc(startPos, length, initStyle, styler);
|
|
||||||
|
|
||||||
for (; sc.More(); sc.Forward()) {
|
|
||||||
|
|
||||||
if (sc.state == SCE_B_OPERATOR) {
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
} else if (sc.state == SCE_B_IDENTIFIER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
// In Basic (except VBScript), a variable name or a function name
|
|
||||||
// can end with a special character indicating the type of the value
|
|
||||||
// held or returned.
|
|
||||||
bool skipType = false;
|
|
||||||
if (!vbScriptSyntax && IsTypeCharacter(sc.ch)) {
|
|
||||||
sc.Forward(); // Skip it
|
|
||||||
skipType = true;
|
|
||||||
}
|
|
||||||
if (sc.ch == ']') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
char s[100];
|
|
||||||
sc.GetCurrentLowered(s, sizeof(s));
|
|
||||||
if (skipType) {
|
|
||||||
s[strlen(s) - 1] = '\0';
|
|
||||||
}
|
|
||||||
if (strcmp(s, "rem") == 0) {
|
|
||||||
sc.ChangeState(SCE_B_COMMENT);
|
|
||||||
} else {
|
|
||||||
if (keywords.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_B_KEYWORD);
|
|
||||||
} else if (keywords2.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_B_KEYWORD2);
|
|
||||||
} else if (keywords3.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_B_KEYWORD3);
|
|
||||||
} else if (keywords4.InList(s)) {
|
|
||||||
sc.ChangeState(SCE_B_KEYWORD4);
|
|
||||||
} // Else, it is really an identifier...
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_B_NUMBER) {
|
|
||||||
if (!IsAWordChar(sc.ch)) {
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_B_STRING) {
|
|
||||||
// VB doubles quotes to preserve them, so just end this string
|
|
||||||
// state now as a following quote will start again
|
|
||||||
if (sc.ch == '\"') {
|
|
||||||
if (tolower(sc.chNext) == 'c') {
|
|
||||||
sc.Forward();
|
|
||||||
}
|
|
||||||
sc.ForwardSetState(SCE_B_DEFAULT);
|
|
||||||
} else if (sc.atLineEnd) {
|
|
||||||
sc.ChangeState(SCE_B_STRINGEOL);
|
|
||||||
sc.ForwardSetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_B_COMMENT) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_B_PREPROCESSOR) {
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
sc.SetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
} else if (sc.state == SCE_B_DATE) {
|
|
||||||
if (sc.ch == '#' || !IsADateCharacter(sc.chNext)) {
|
|
||||||
sc.ForwardSetState(SCE_B_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.state == SCE_B_DEFAULT) {
|
|
||||||
if (sc.ch == '\'') {
|
|
||||||
sc.SetState(SCE_B_COMMENT);
|
|
||||||
} else if (sc.ch == '\"') {
|
|
||||||
sc.SetState(SCE_B_STRING);
|
|
||||||
} else if (sc.ch == '#' && visibleChars == 0) {
|
|
||||||
// Preprocessor commands are alone on their line
|
|
||||||
sc.SetState(SCE_B_PREPROCESSOR);
|
|
||||||
} else if (sc.ch == '#') {
|
|
||||||
int n = 1;
|
|
||||||
int chSeek = ' ';
|
|
||||||
while ((n < 100) && (chSeek == ' ' || chSeek == '\t')) {
|
|
||||||
chSeek = sc.GetRelative(n);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (IsADigit(chSeek)) {
|
|
||||||
sc.SetState(SCE_B_DATE);
|
|
||||||
} else {
|
|
||||||
sc.SetState(SCE_B_OPERATOR);
|
|
||||||
}
|
|
||||||
} else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {
|
|
||||||
sc.SetState(SCE_B_NUMBER);
|
|
||||||
} else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {
|
|
||||||
sc.SetState(SCE_B_NUMBER);
|
|
||||||
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
|
||||||
sc.SetState(SCE_B_NUMBER);
|
|
||||||
} else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {
|
|
||||||
sc.SetState(SCE_B_IDENTIFIER);
|
|
||||||
} else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {
|
|
||||||
sc.SetState(SCE_B_OPERATOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc.atLineEnd) {
|
|
||||||
visibleChars = 0;
|
|
||||||
}
|
|
||||||
if (!IsASpace(sc.ch)) {
|
|
||||||
visibleChars++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sc.Complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldVBDoc(unsigned int startPos, int length, int,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
int endPos = startPos + length;
|
|
||||||
|
|
||||||
// Backtrack to previous line in case need to fix its fold status
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
if (startPos > 0) {
|
|
||||||
if (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
startPos = styler.LineStart(lineCurrent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int spaceFlags = 0;
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsVBComment);
|
|
||||||
char chNext = styler[startPos];
|
|
||||||
for (int i = startPos; i < endPos; i++) {
|
|
||||||
char ch = chNext;
|
|
||||||
chNext = styler.SafeGetCharAt(i + 1);
|
|
||||||
|
|
||||||
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
|
|
||||||
int lev = indentCurrent;
|
|
||||||
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsVBComment);
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
|
|
||||||
// Only non whitespace lines can be headers
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
|
|
||||||
// Line after is blank so check the next - maybe should continue further?
|
|
||||||
int spaceFlags2 = 0;
|
|
||||||
int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsVBComment);
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
indentCurrent = indentNext;
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
lineCurrent++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseVBNetDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
ColouriseVBDoc(startPos, length, initStyle, keywordlists, styler, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseVBScriptDoc(unsigned int startPos, int length, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) {
|
|
||||||
ColouriseVBDoc(startPos, length, initStyle, keywordlists, styler, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const vbWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
"user1",
|
|
||||||
"user2",
|
|
||||||
"user3",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
LexerModule lmVB(SCLEX_VB, ColouriseVBNetDoc, "vb", FoldVBDoc, vbWordListDesc);
|
|
||||||
LexerModule lmVBScript(SCLEX_VBSCRIPT, ColouriseVBScriptDoc, "vbscript", FoldVBDoc, vbWordListDesc);
|
|
||||||
|
|
||||||
@@ -1,305 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LexYAML.cxx
|
|
||||||
** Lexer for YAML.
|
|
||||||
**/
|
|
||||||
// Copyright 2003- by Sean O'Dell <sean@celsoft.com>
|
|
||||||
// Release under the same license as Scintilla/SciTE.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "SciLexer.h"
|
|
||||||
|
|
||||||
static const char * const yamlWordListDesc[] = {
|
|
||||||
"Keywords",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline bool AtEOL(Accessor &styler, unsigned int i) {
|
|
||||||
return (styler[i] == '\n') ||
|
|
||||||
((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int SpaceCount(char* lineBuffer) {
|
|
||||||
if (lineBuffer == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
char* headBuffer = lineBuffer;
|
|
||||||
|
|
||||||
while (*headBuffer == ' ')
|
|
||||||
headBuffer++;
|
|
||||||
|
|
||||||
return headBuffer - lineBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define YAML_STATE_BITSIZE 16
|
|
||||||
#define YAML_STATE_MASK (0xFFFF0000)
|
|
||||||
#define YAML_STATE_DOCUMENT (1 << YAML_STATE_BITSIZE)
|
|
||||||
#define YAML_STATE_VALUE (2 << YAML_STATE_BITSIZE)
|
|
||||||
#define YAML_STATE_COMMENT (3 << YAML_STATE_BITSIZE)
|
|
||||||
#define YAML_STATE_TEXT_PARENT (4 << YAML_STATE_BITSIZE)
|
|
||||||
#define YAML_STATE_TEXT (5 << YAML_STATE_BITSIZE)
|
|
||||||
|
|
||||||
static void ColouriseYAMLLine(
|
|
||||||
char *lineBuffer,
|
|
||||||
unsigned int currentLine,
|
|
||||||
unsigned int lengthLine,
|
|
||||||
unsigned int startLine,
|
|
||||||
unsigned int endPos,
|
|
||||||
WordList &keywords,
|
|
||||||
Accessor &styler) {
|
|
||||||
|
|
||||||
unsigned int i = 0;
|
|
||||||
bool bInQuotes = false;
|
|
||||||
unsigned int indentAmount = SpaceCount(lineBuffer);
|
|
||||||
|
|
||||||
if (currentLine > 0) {
|
|
||||||
int parentLineState = styler.GetLineState(currentLine - 1);
|
|
||||||
|
|
||||||
if ((parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT || (parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT_PARENT) {
|
|
||||||
unsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK);
|
|
||||||
if (indentAmount > parentIndentAmount) {
|
|
||||||
styler.SetLineState(currentLine, YAML_STATE_TEXT | parentIndentAmount);
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_TEXT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styler.SetLineState(currentLine, 0);
|
|
||||||
if (strncmp(lineBuffer, "---", 3) == 0) { // Document marker
|
|
||||||
styler.SetLineState(currentLine, YAML_STATE_DOCUMENT);
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_DOCUMENT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Skip initial spaces
|
|
||||||
while ((i < lengthLine) && lineBuffer[i] == ' ') { // YAML always uses space, never TABS or anything else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (lineBuffer[i] == '\t') { // if we skipped all spaces, and we are NOT inside a text block, this is wrong
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_ERROR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (lineBuffer[i] == '#') { // Comment
|
|
||||||
styler.SetLineState(currentLine, YAML_STATE_COMMENT);
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_COMMENT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
while (i < lengthLine) {
|
|
||||||
if (lineBuffer[i] == '\'' || lineBuffer[i] == '\"') {
|
|
||||||
bInQuotes = !bInQuotes;
|
|
||||||
} else if (lineBuffer[i] == ':' && !bInQuotes) {
|
|
||||||
styler.ColourTo(startLine + i, SCE_YAML_IDENTIFIER);
|
|
||||||
// Non-folding scalar
|
|
||||||
i++;
|
|
||||||
while ((i < lengthLine) && isspacechar(lineBuffer[i]))
|
|
||||||
i++;
|
|
||||||
unsigned int endValue = lengthLine - 1;
|
|
||||||
while ((endValue >= i) && isspacechar(lineBuffer[endValue]))
|
|
||||||
endValue--;
|
|
||||||
lineBuffer[endValue + 1] = '\0';
|
|
||||||
if (lineBuffer[i] == '|' || lineBuffer[i] == '>') {
|
|
||||||
i++;
|
|
||||||
if (lineBuffer[i] == '+' || lineBuffer[i] == '-')
|
|
||||||
i++;
|
|
||||||
while ((i < lengthLine) && isspacechar(lineBuffer[i]))
|
|
||||||
i++;
|
|
||||||
if (lineBuffer[i] == '\0') {
|
|
||||||
styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_DEFAULT);
|
|
||||||
return;
|
|
||||||
} else if (lineBuffer[i] == '#') {
|
|
||||||
styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);
|
|
||||||
styler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT);
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_COMMENT);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_ERROR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styler.SetLineState(currentLine, YAML_STATE_VALUE);
|
|
||||||
if (lineBuffer[i] == '&' || lineBuffer[i] == '*') {
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_REFERENCE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (keywords.InList(&lineBuffer[i])) { // Convertible value (true/false, etc.)
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_KEYWORD);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
unsigned int i2 = i;
|
|
||||||
while ((i < lengthLine) && lineBuffer[i]) {
|
|
||||||
if (!isdigit(lineBuffer[i]) && lineBuffer[i] != '-' && lineBuffer[i] != '.' && lineBuffer[i] != ',') {
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_DEFAULT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (i > i2) {
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_NUMBER);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break; // shouldn't get here, but just in case, the rest of the line is coloured the default
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
styler.ColourTo(endPos, SCE_YAML_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ColouriseYAMLDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {
|
|
||||||
char lineBuffer[1024];
|
|
||||||
styler.StartAt(startPos);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int linePos = 0;
|
|
||||||
unsigned int startLine = startPos;
|
|
||||||
unsigned int endPos = startPos + length;
|
|
||||||
unsigned int maxPos = styler.Length();
|
|
||||||
unsigned int lineCurrent = styler.GetLine(startPos);
|
|
||||||
|
|
||||||
for (unsigned int i = startPos; i < maxPos && i < endPos; i++) {
|
|
||||||
lineBuffer[linePos++] = styler[i];
|
|
||||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
|
||||||
// End of line (or of line buffer) met, colourise it
|
|
||||||
lineBuffer[linePos] = '\0';
|
|
||||||
ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, i, *keywordLists[0], styler);
|
|
||||||
linePos = 0;
|
|
||||||
startLine = i + 1;
|
|
||||||
lineCurrent++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (linePos > 0) { // Last line does not have ending characters
|
|
||||||
ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, startPos + length - 1, *keywordLists[0], styler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsCommentLine(int line, Accessor &styler) {
|
|
||||||
int pos = styler.LineStart(line);
|
|
||||||
if (styler[pos] == '#')
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FoldYAMLDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
|
|
||||||
WordList *[], Accessor &styler) {
|
|
||||||
const int maxPos = startPos + length;
|
|
||||||
const int maxLines = styler.GetLine(maxPos - 1); // Requested last line
|
|
||||||
const int docLines = styler.GetLine(styler.Length() - 1); // Available last line
|
|
||||||
const bool foldComment = styler.GetPropertyInt("fold.comment.yaml") != 0;
|
|
||||||
|
|
||||||
// Backtrack to previous non-blank line so we can determine indent level
|
|
||||||
// for any white space lines
|
|
||||||
// and so we can fix any preceding fold level (which is why we go back
|
|
||||||
// at least one line in all cases)
|
|
||||||
int spaceFlags = 0;
|
|
||||||
int lineCurrent = styler.GetLine(startPos);
|
|
||||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
|
|
||||||
while (lineCurrent > 0) {
|
|
||||||
lineCurrent--;
|
|
||||||
indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
|
|
||||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&
|
|
||||||
(!IsCommentLine(lineCurrent, styler)))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
|
|
||||||
// Set up initial loop state
|
|
||||||
int prevComment = 0;
|
|
||||||
if (lineCurrent >= 1)
|
|
||||||
prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
|
|
||||||
|
|
||||||
// Process all characters to end of requested range
|
|
||||||
// or comment that hangs over the end of the range. Cap processing in all cases
|
|
||||||
// to end of document (in case of unclosed comment at end).
|
|
||||||
while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevComment)) {
|
|
||||||
|
|
||||||
// Gather info
|
|
||||||
int lev = indentCurrent;
|
|
||||||
int lineNext = lineCurrent + 1;
|
|
||||||
int indentNext = indentCurrent;
|
|
||||||
if (lineNext <= docLines) {
|
|
||||||
// Information about next line is only available if not at end of document
|
|
||||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
|
|
||||||
}
|
|
||||||
const int comment = foldComment && IsCommentLine(lineCurrent, styler);
|
|
||||||
const int comment_start = (comment && !prevComment && (lineNext <= docLines) &&
|
|
||||||
IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
|
|
||||||
const int comment_continue = (comment && prevComment);
|
|
||||||
if (!comment)
|
|
||||||
indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
if (indentNext & SC_FOLDLEVELWHITEFLAG)
|
|
||||||
indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
|
|
||||||
|
|
||||||
if (comment_start) {
|
|
||||||
// Place fold point at start of a block of comments
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
} else if (comment_continue) {
|
|
||||||
// Add level to rest of lines in the block
|
|
||||||
lev = lev + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip past any blank lines for next indent level info; we skip also
|
|
||||||
// comments (all comments, not just those starting in column 0)
|
|
||||||
// which effectively folds them into surrounding code rather
|
|
||||||
// than screwing up folding.
|
|
||||||
|
|
||||||
while ((lineNext < docLines) &&
|
|
||||||
((indentNext & SC_FOLDLEVELWHITEFLAG) ||
|
|
||||||
(lineNext <= docLines && IsCommentLine(lineNext, styler)))) {
|
|
||||||
|
|
||||||
lineNext++;
|
|
||||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;
|
|
||||||
const int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments);
|
|
||||||
|
|
||||||
// Now set all the indent levels on the lines we skipped
|
|
||||||
// Do this from end to start. Once we encounter one line
|
|
||||||
// which is indented more than the line after the end of
|
|
||||||
// the comment-block, use the level of the block before
|
|
||||||
|
|
||||||
int skipLine = lineNext;
|
|
||||||
int skipLevel = levelAfterComments;
|
|
||||||
|
|
||||||
while (--skipLine > lineCurrent) {
|
|
||||||
int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);
|
|
||||||
|
|
||||||
if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)
|
|
||||||
skipLevel = levelBeforeComments;
|
|
||||||
|
|
||||||
int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;
|
|
||||||
|
|
||||||
styler.SetLevel(skipLine, skipLevel | whiteFlag);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set fold header on non-comment line
|
|
||||||
if (!comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
|
|
||||||
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
|
|
||||||
lev |= SC_FOLDLEVELHEADERFLAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Keep track of block comment state of previous line
|
|
||||||
prevComment = comment_start || comment_continue;
|
|
||||||
|
|
||||||
// Set fold level for this line and move to next line
|
|
||||||
styler.SetLevel(lineCurrent, lev);
|
|
||||||
indentCurrent = indentNext;
|
|
||||||
lineCurrent = lineNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: Cannot set level of last line here because indentCurrent doesn't have
|
|
||||||
// header flag set; the loop above is crafted to take care of this case!
|
|
||||||
//styler.SetLevel(lineCurrent, indentCurrent);
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerModule lmYAML(SCLEX_YAML, ColouriseYAMLDoc, "yaml", FoldYAMLDoc, yamlWordListDesc);
|
|
||||||
@@ -1,299 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LineMarker.cxx
|
|
||||||
** Defines the look of a line marker in the margin .
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "XPM.h"
|
|
||||||
#include "LineMarker.h"
|
|
||||||
|
|
||||||
void LineMarker::RefreshColourPalette(Palette &pal, bool want) {
|
|
||||||
pal.WantFind(fore, want);
|
|
||||||
pal.WantFind(back, want);
|
|
||||||
if (pxpm) {
|
|
||||||
pxpm->RefreshColourPalette(pal, want);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void LineMarker::SetXPM(const char *textForm) {
|
|
||||||
delete pxpm;
|
|
||||||
pxpm = new XPM(textForm);
|
|
||||||
markType = SC_MARK_PIXMAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LineMarker::SetXPM(const char * const *linesForm) {
|
|
||||||
delete pxpm;
|
|
||||||
pxpm = new XPM(linesForm);
|
|
||||||
markType = SC_MARK_PIXMAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DrawBox(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore, ColourAllocated back) {
|
|
||||||
PRectangle rc;
|
|
||||||
rc.left = centreX - armSize;
|
|
||||||
rc.top = centreY - armSize;
|
|
||||||
rc.right = centreX + armSize + 1;
|
|
||||||
rc.bottom = centreY + armSize + 1;
|
|
||||||
surface->RectangleDraw(rc, back, fore);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DrawCircle(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore, ColourAllocated back) {
|
|
||||||
PRectangle rcCircle;
|
|
||||||
rcCircle.left = centreX - armSize;
|
|
||||||
rcCircle.top = centreY - armSize;
|
|
||||||
rcCircle.right = centreX + armSize + 1;
|
|
||||||
rcCircle.bottom = centreY + armSize + 1;
|
|
||||||
surface->Ellipse(rcCircle, back, fore);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DrawPlus(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore) {
|
|
||||||
PRectangle rcV(centreX, centreY - armSize + 2, centreX + 1, centreY + armSize - 2 + 1);
|
|
||||||
surface->FillRectangle(rcV, fore);
|
|
||||||
PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);
|
|
||||||
surface->FillRectangle(rcH, fore);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore) {
|
|
||||||
PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);
|
|
||||||
surface->FillRectangle(rcH, fore);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter) {
|
|
||||||
if ((markType == SC_MARK_PIXMAP) && (pxpm)) {
|
|
||||||
pxpm->Draw(surface, rcWhole);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Restrict most shapes a bit
|
|
||||||
PRectangle rc = rcWhole;
|
|
||||||
rc.top++;
|
|
||||||
rc.bottom--;
|
|
||||||
int minDim = Platform::Minimum(rc.Width(), rc.Height());
|
|
||||||
minDim--; // Ensure does not go beyond edge
|
|
||||||
int centreX = (rc.right + rc.left) / 2;
|
|
||||||
int centreY = (rc.bottom + rc.top) / 2;
|
|
||||||
int dimOn2 = minDim / 2;
|
|
||||||
int dimOn4 = minDim / 4;
|
|
||||||
int blobSize = dimOn2-1;
|
|
||||||
int armSize = dimOn2-2;
|
|
||||||
if (rc.Width() > (rc.Height() * 2)) {
|
|
||||||
// Wide column is line number so move to left to try to avoid overlapping number
|
|
||||||
centreX = rc.left + dimOn2 + 1;
|
|
||||||
}
|
|
||||||
if (markType == SC_MARK_ROUNDRECT) {
|
|
||||||
PRectangle rcRounded = rc;
|
|
||||||
rcRounded.left = rc.left + 1;
|
|
||||||
rcRounded.right = rc.right - 1;
|
|
||||||
surface->RoundedRectangle(rcRounded, fore.allocated, back.allocated);
|
|
||||||
} else if (markType == SC_MARK_CIRCLE) {
|
|
||||||
PRectangle rcCircle;
|
|
||||||
rcCircle.left = centreX - dimOn2;
|
|
||||||
rcCircle.top = centreY - dimOn2;
|
|
||||||
rcCircle.right = centreX + dimOn2;
|
|
||||||
rcCircle.bottom = centreY + dimOn2;
|
|
||||||
surface->Ellipse(rcCircle, fore.allocated, back.allocated);
|
|
||||||
} else if (markType == SC_MARK_ARROW) {
|
|
||||||
Point pts[] = {
|
|
||||||
Point(centreX - dimOn4, centreY - dimOn2),
|
|
||||||
Point(centreX - dimOn4, centreY + dimOn2),
|
|
||||||
Point(centreX + dimOn2 - dimOn4, centreY),
|
|
||||||
};
|
|
||||||
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
|
|
||||||
fore.allocated, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_ARROWDOWN) {
|
|
||||||
Point pts[] = {
|
|
||||||
Point(centreX - dimOn2, centreY - dimOn4),
|
|
||||||
Point(centreX + dimOn2, centreY - dimOn4),
|
|
||||||
Point(centreX, centreY + dimOn2 - dimOn4),
|
|
||||||
};
|
|
||||||
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
|
|
||||||
fore.allocated, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_PLUS) {
|
|
||||||
Point pts[] = {
|
|
||||||
Point(centreX - armSize, centreY - 1),
|
|
||||||
Point(centreX - 1, centreY - 1),
|
|
||||||
Point(centreX - 1, centreY - armSize),
|
|
||||||
Point(centreX + 1, centreY - armSize),
|
|
||||||
Point(centreX + 1, centreY - 1),
|
|
||||||
Point(centreX + armSize, centreY -1),
|
|
||||||
Point(centreX + armSize, centreY +1),
|
|
||||||
Point(centreX + 1, centreY + 1),
|
|
||||||
Point(centreX + 1, centreY + armSize),
|
|
||||||
Point(centreX - 1, centreY + armSize),
|
|
||||||
Point(centreX - 1, centreY + 1),
|
|
||||||
Point(centreX - armSize, centreY + 1),
|
|
||||||
};
|
|
||||||
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
|
|
||||||
fore.allocated, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_MINUS) {
|
|
||||||
Point pts[] = {
|
|
||||||
Point(centreX - armSize, centreY - 1),
|
|
||||||
Point(centreX + armSize, centreY -1),
|
|
||||||
Point(centreX + armSize, centreY +1),
|
|
||||||
Point(centreX - armSize, centreY + 1),
|
|
||||||
};
|
|
||||||
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
|
|
||||||
fore.allocated, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_SMALLRECT) {
|
|
||||||
PRectangle rcSmall;
|
|
||||||
rcSmall.left = rc.left + 1;
|
|
||||||
rcSmall.top = rc.top + 2;
|
|
||||||
rcSmall.right = rc.right - 1;
|
|
||||||
rcSmall.bottom = rc.bottom - 2;
|
|
||||||
surface->RectangleDraw(rcSmall, fore.allocated, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_EMPTY || markType == SC_MARK_BACKGROUND) {
|
|
||||||
// An invisible marker so don't draw anything
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_VLINE) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_LCORNER) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, rc.top + dimOn2);
|
|
||||||
surface->LineTo(rc.right - 2, rc.top + dimOn2);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_TCORNER) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
surface->MoveTo(centreX, rc.top + dimOn2);
|
|
||||||
surface->LineTo(rc.right - 2, rc.top + dimOn2);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_LCORNERCURVE) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, rc.top + dimOn2-3);
|
|
||||||
surface->LineTo(centreX+3, rc.top + dimOn2);
|
|
||||||
surface->LineTo(rc.right - 1, rc.top + dimOn2);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_TCORNERCURVE) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, rc.top + dimOn2-3);
|
|
||||||
surface->LineTo(centreX+3, rc.top + dimOn2);
|
|
||||||
surface->LineTo(rc.right - 1, rc.top + dimOn2);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_BOXPLUS) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_BOXPLUSCONNECTED) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, centreY + blobSize);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, centreY - blobSize);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_BOXMINUS) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, centreY + blobSize);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_BOXMINUSCONNECTED) {
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, centreY + blobSize);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, centreY - blobSize);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_CIRCLEPLUS) {
|
|
||||||
DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) {
|
|
||||||
DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, centreY + blobSize);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, centreY - blobSize);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_CIRCLEMINUS) {
|
|
||||||
DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, centreY + blobSize);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) {
|
|
||||||
DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
|
|
||||||
surface->PenColour(back.allocated);
|
|
||||||
DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, centreY + blobSize);
|
|
||||||
surface->LineTo(centreX, rcWhole.bottom);
|
|
||||||
|
|
||||||
surface->MoveTo(centreX, rcWhole.top);
|
|
||||||
surface->LineTo(centreX, centreY - blobSize);
|
|
||||||
|
|
||||||
} else if (markType >= SC_MARK_CHARACTER) {
|
|
||||||
char character[1];
|
|
||||||
character[0] = static_cast<char>(markType - SC_MARK_CHARACTER);
|
|
||||||
int width = surface->WidthText(fontForCharacter, character, 1);
|
|
||||||
rc.left += (rc.Width() - width) / 2;
|
|
||||||
rc.right = rc.left + width;
|
|
||||||
surface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2,
|
|
||||||
character, 1, fore.allocated, back.allocated);
|
|
||||||
|
|
||||||
} else if (markType == SC_MARK_DOTDOTDOT) {
|
|
||||||
int right = centreX - 6;
|
|
||||||
for (int b=0; b<3; b++) {
|
|
||||||
PRectangle rcBlob(right, rc.bottom - 4, right + 2, rc.bottom-2);
|
|
||||||
surface->FillRectangle(rcBlob, fore.allocated);
|
|
||||||
right += 5;
|
|
||||||
}
|
|
||||||
} else if (markType == SC_MARK_ARROWS) {
|
|
||||||
surface->PenColour(fore.allocated);
|
|
||||||
int right = centreX - 2;
|
|
||||||
for (int b=0; b<3; b++) {
|
|
||||||
surface->MoveTo(right - 4, centreY - 4);
|
|
||||||
surface->LineTo(right, centreY);
|
|
||||||
surface->LineTo(right - 5, centreY + 5);
|
|
||||||
right += 4;
|
|
||||||
}
|
|
||||||
} else { // SC_MARK_SHORTARROW
|
|
||||||
Point pts[] = {
|
|
||||||
Point(centreX, centreY + dimOn2),
|
|
||||||
Point(centreX + dimOn2, centreY),
|
|
||||||
Point(centreX, centreY - dimOn2),
|
|
||||||
Point(centreX, centreY - dimOn4),
|
|
||||||
Point(centreX - dimOn4, centreY - dimOn4),
|
|
||||||
Point(centreX - dimOn4, centreY + dimOn4),
|
|
||||||
Point(centreX, centreY + dimOn4),
|
|
||||||
Point(centreX, centreY + dimOn2),
|
|
||||||
};
|
|
||||||
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
|
|
||||||
fore.allocated, back.allocated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file LineMarker.h
|
|
||||||
** Defines the look of a line marker in the margin .
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef LINEMARKER_H
|
|
||||||
#define LINEMARKER_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class LineMarker {
|
|
||||||
public:
|
|
||||||
int markType;
|
|
||||||
ColourPair fore;
|
|
||||||
ColourPair back;
|
|
||||||
XPM *pxpm;
|
|
||||||
LineMarker() {
|
|
||||||
markType = SC_MARK_CIRCLE;
|
|
||||||
fore = ColourDesired(0,0,0);
|
|
||||||
back = ColourDesired(0xff,0xff,0xff);
|
|
||||||
pxpm = NULL;
|
|
||||||
}
|
|
||||||
LineMarker(const LineMarker &) {
|
|
||||||
// Defined to avoid pxpm being blindly copied, not as real copy constructor
|
|
||||||
markType = SC_MARK_CIRCLE;
|
|
||||||
fore = ColourDesired(0,0,0);
|
|
||||||
back = ColourDesired(0xff,0xff,0xff);
|
|
||||||
pxpm = NULL;
|
|
||||||
}
|
|
||||||
~LineMarker() {
|
|
||||||
delete pxpm;
|
|
||||||
}
|
|
||||||
LineMarker &operator=(const LineMarker &) {
|
|
||||||
// Defined to avoid pxpm being blindly copied, not as real assignment operator
|
|
||||||
markType = SC_MARK_CIRCLE;
|
|
||||||
fore = ColourDesired(0,0,0);
|
|
||||||
back = ColourDesired(0xff,0xff,0xff);
|
|
||||||
delete pxpm;
|
|
||||||
pxpm = NULL;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
void RefreshColourPalette(Palette &pal, bool want);
|
|
||||||
void SetXPM(const char *textForm);
|
|
||||||
void SetXPM(const char * const *linesForm);
|
|
||||||
void Draw(Surface *surface, PRectangle &rc, Font &fontForCharacter);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,767 +0,0 @@
|
|||||||
// SciTE - Scintilla based Text Editor
|
|
||||||
/** @file PropSet.cxx
|
|
||||||
** A Java style properties file module.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
// Maintain a dictionary of properties
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
|
|
||||||
// The comparison and case changing functions here assume ASCII
|
|
||||||
// or extended ASCII such as the normal Windows code page.
|
|
||||||
|
|
||||||
static inline char MakeUpperCase(char ch) {
|
|
||||||
if (ch < 'a' || ch > 'z')
|
|
||||||
return ch;
|
|
||||||
else
|
|
||||||
return static_cast<char>(ch - 'a' + 'A');
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool IsLetter(char ch) {
|
|
||||||
return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool IsASpace(unsigned int ch) {
|
|
||||||
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
|
|
||||||
}
|
|
||||||
|
|
||||||
int CompareCaseInsensitive(const char *a, const char *b) {
|
|
||||||
while (*a && *b) {
|
|
||||||
if (*a != *b) {
|
|
||||||
char upperA = MakeUpperCase(*a);
|
|
||||||
char upperB = MakeUpperCase(*b);
|
|
||||||
if (upperA != upperB)
|
|
||||||
return upperA - upperB;
|
|
||||||
}
|
|
||||||
a++;
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
// Either *a or *b is nul
|
|
||||||
return *a - *b;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CompareNCaseInsensitive(const char *a, const char *b, size_t len) {
|
|
||||||
while (*a && *b && len) {
|
|
||||||
if (*a != *b) {
|
|
||||||
char upperA = MakeUpperCase(*a);
|
|
||||||
char upperB = MakeUpperCase(*b);
|
|
||||||
if (upperA != upperB)
|
|
||||||
return upperA - upperB;
|
|
||||||
}
|
|
||||||
a++;
|
|
||||||
b++;
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
if (len == 0)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
// Either *a or *b is nul
|
|
||||||
return *a - *b;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EqualCaseInsensitive(const char *a, const char *b) {
|
|
||||||
return 0 == CompareCaseInsensitive(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
PropSet::PropSet() {
|
|
||||||
superPS = 0;
|
|
||||||
for (int root = 0; root < hashRoots; root++)
|
|
||||||
props[root] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
PropSet::~PropSet() {
|
|
||||||
superPS = 0;
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PropSet::Set(const char *key, const char *val, int lenKey, int lenVal) {
|
|
||||||
if (!*key) // Empty keys are not supported
|
|
||||||
return;
|
|
||||||
if (lenKey == -1)
|
|
||||||
lenKey = static_cast<int>(strlen(key));
|
|
||||||
if (lenVal == -1)
|
|
||||||
lenVal = static_cast<int>(strlen(val));
|
|
||||||
unsigned int hash = HashString(key, lenKey);
|
|
||||||
for (Property *p = props[hash % hashRoots]; p; p = p->next) {
|
|
||||||
if ((hash == p->hash) &&
|
|
||||||
((strlen(p->key) == static_cast<unsigned int>(lenKey)) &&
|
|
||||||
(0 == strncmp(p->key, key, lenKey)))) {
|
|
||||||
// Replace current value
|
|
||||||
delete [](p->val);
|
|
||||||
p->val = StringDup(val, lenVal);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Not found
|
|
||||||
Property *pNew = new Property;
|
|
||||||
if (pNew) {
|
|
||||||
pNew->hash = hash;
|
|
||||||
pNew->key = StringDup(key, lenKey);
|
|
||||||
pNew->val = StringDup(val, lenVal);
|
|
||||||
pNew->next = props[hash % hashRoots];
|
|
||||||
props[hash % hashRoots] = pNew;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PropSet::Set(const char *keyVal) {
|
|
||||||
while (IsASpace(*keyVal))
|
|
||||||
keyVal++;
|
|
||||||
const char *endVal = keyVal;
|
|
||||||
while (*endVal && (*endVal != '\n'))
|
|
||||||
endVal++;
|
|
||||||
const char *eqAt = strchr(keyVal, '=');
|
|
||||||
if (eqAt) {
|
|
||||||
Set(keyVal, eqAt + 1, eqAt-keyVal, endVal - eqAt - 1);
|
|
||||||
} else if (*keyVal) { // No '=' so assume '=1'
|
|
||||||
Set(keyVal, "1", endVal-keyVal, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PropSet::SetMultiple(const char *s) {
|
|
||||||
const char *eol = strchr(s, '\n');
|
|
||||||
while (eol) {
|
|
||||||
Set(s);
|
|
||||||
s = eol + 1;
|
|
||||||
eol = strchr(s, '\n');
|
|
||||||
}
|
|
||||||
Set(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
SString PropSet::Get(const char *key) {
|
|
||||||
unsigned int hash = HashString(key, strlen(key));
|
|
||||||
for (Property *p = props[hash % hashRoots]; p; p = p->next) {
|
|
||||||
if ((hash == p->hash) && (0 == strcmp(p->key, key))) {
|
|
||||||
return p->val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (superPS) {
|
|
||||||
// Failed here, so try in base property set
|
|
||||||
return superPS->Get(key);
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PropSet::IncludesVar(const char *value, const char *key) {
|
|
||||||
const char *var = strstr(value, "$(");
|
|
||||||
while (var) {
|
|
||||||
if (isprefix(var + 2, key) && (var[2 + strlen(key)] == ')')) {
|
|
||||||
// Found $(key) which would lead to an infinite loop so exit
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
var = strstr(var + 2, ")");
|
|
||||||
if (var)
|
|
||||||
var = strstr(var + 1, "$(");
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SString PropSet::GetExpanded(const char *key) {
|
|
||||||
SString val = Get(key);
|
|
||||||
if (IncludesVar(val.c_str(), key))
|
|
||||||
return val;
|
|
||||||
return Expand(val.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
SString PropSet::Expand(const char *withVars, int maxExpands) {
|
|
||||||
char *base = StringDup(withVars);
|
|
||||||
char *cpvar = strstr(base, "$(");
|
|
||||||
while (cpvar && (maxExpands > 0)) {
|
|
||||||
char *cpendvar = strchr(cpvar, ')');
|
|
||||||
if (!cpendvar)
|
|
||||||
break;
|
|
||||||
int lenvar = cpendvar - cpvar - 2; // Subtract the $()
|
|
||||||
char *var = StringDup(cpvar + 2, lenvar);
|
|
||||||
SString val = Get(var);
|
|
||||||
if (IncludesVar(val.c_str(), var))
|
|
||||||
break;
|
|
||||||
size_t newlenbase = strlen(base) + val.length() - lenvar;
|
|
||||||
char *newbase = new char[newlenbase];
|
|
||||||
strncpy(newbase, base, cpvar - base);
|
|
||||||
strcpy(newbase + (cpvar - base), val.c_str());
|
|
||||||
strcpy(newbase + (cpvar - base) + val.length(), cpendvar + 1);
|
|
||||||
delete []var;
|
|
||||||
delete []base;
|
|
||||||
base = newbase;
|
|
||||||
cpvar = strstr(base, "$(");
|
|
||||||
maxExpands--;
|
|
||||||
}
|
|
||||||
SString sret = base;
|
|
||||||
delete []base;
|
|
||||||
return sret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int PropSet::GetInt(const char *key, int defaultValue) {
|
|
||||||
SString val = GetExpanded(key);
|
|
||||||
if (val.length())
|
|
||||||
return val.value();
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isprefix(const char *target, const char *prefix) {
|
|
||||||
while (*target && *prefix) {
|
|
||||||
if (*target != *prefix)
|
|
||||||
return false;
|
|
||||||
target++;
|
|
||||||
prefix++;
|
|
||||||
}
|
|
||||||
if (*prefix)
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsSuffixCaseInsensitive(const char *target, const char *suffix) {
|
|
||||||
size_t lentarget = strlen(target);
|
|
||||||
size_t lensuffix = strlen(suffix);
|
|
||||||
if (lensuffix > lentarget)
|
|
||||||
return false;
|
|
||||||
for (int i = static_cast<int>(lensuffix) - 1; i >= 0; i--) {
|
|
||||||
if (MakeUpperCase(target[i + lentarget - lensuffix]) !=
|
|
||||||
MakeUpperCase(suffix[i]))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SString PropSet::GetWild(const char *keybase, const char *filename) {
|
|
||||||
for (int root = 0; root < hashRoots; root++) {
|
|
||||||
for (Property *p = props[root]; p; p = p->next) {
|
|
||||||
if (isprefix(p->key, keybase)) {
|
|
||||||
char * orgkeyfile = p->key + strlen(keybase);
|
|
||||||
char *keyfile = NULL;
|
|
||||||
|
|
||||||
if (strstr(orgkeyfile, "$(") == orgkeyfile) {
|
|
||||||
char *cpendvar = strchr(orgkeyfile, ')');
|
|
||||||
if (cpendvar) {
|
|
||||||
*cpendvar = '\0';
|
|
||||||
SString s = GetExpanded(orgkeyfile + 2);
|
|
||||||
*cpendvar = ')';
|
|
||||||
keyfile = StringDup(s.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
char *keyptr = keyfile;
|
|
||||||
|
|
||||||
if (keyfile == NULL)
|
|
||||||
keyfile = orgkeyfile;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
char *del = strchr(keyfile, ';');
|
|
||||||
if (del == NULL)
|
|
||||||
del = keyfile + strlen(keyfile);
|
|
||||||
char delchr = *del;
|
|
||||||
*del = '\0';
|
|
||||||
if (*keyfile == '*') {
|
|
||||||
if (IsSuffixCaseInsensitive(filename, keyfile + 1)) {
|
|
||||||
*del = delchr;
|
|
||||||
delete []keyptr;
|
|
||||||
return p->val;
|
|
||||||
}
|
|
||||||
} else if (0 == strcmp(keyfile, filename)) {
|
|
||||||
*del = delchr;
|
|
||||||
delete []keyptr;
|
|
||||||
return p->val;
|
|
||||||
}
|
|
||||||
if (delchr == '\0')
|
|
||||||
break;
|
|
||||||
*del = delchr;
|
|
||||||
keyfile = del + 1;
|
|
||||||
}
|
|
||||||
delete []keyptr;
|
|
||||||
|
|
||||||
if (0 == strcmp(p->key, keybase)) {
|
|
||||||
return p->val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (superPS) {
|
|
||||||
// Failed here, so try in base property set
|
|
||||||
return superPS->GetWild(keybase, filename);
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNewExpand does not use Expand as it has to use GetWild with the filename for each
|
|
||||||
// variable reference found.
|
|
||||||
SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
|
|
||||||
char *base = StringDup(GetWild(keybase, filename).c_str());
|
|
||||||
char *cpvar = strstr(base, "$(");
|
|
||||||
int maxExpands = 1000; // Avoid infinite expansion of recursive definitions
|
|
||||||
while (cpvar && (maxExpands > 0)) {
|
|
||||||
char *cpendvar = strchr(cpvar, ')');
|
|
||||||
if (cpendvar) {
|
|
||||||
int lenvar = cpendvar - cpvar - 2; // Subtract the $()
|
|
||||||
char *var = StringDup(cpvar + 2, lenvar);
|
|
||||||
SString val = GetWild(var, filename);
|
|
||||||
size_t newlenbase = strlen(base) + val.length() - lenvar;
|
|
||||||
char *newbase = new char[newlenbase];
|
|
||||||
strncpy(newbase, base, cpvar - base);
|
|
||||||
strcpy(newbase + (cpvar - base), val.c_str());
|
|
||||||
strcpy(newbase + (cpvar - base) + val.length(), cpendvar + 1);
|
|
||||||
delete []var;
|
|
||||||
delete []base;
|
|
||||||
base = newbase;
|
|
||||||
}
|
|
||||||
cpvar = strstr(base, "$(");
|
|
||||||
maxExpands--;
|
|
||||||
}
|
|
||||||
SString sret = base;
|
|
||||||
delete []base;
|
|
||||||
return sret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PropSet::Clear() {
|
|
||||||
for (int root = 0; root < hashRoots; root++) {
|
|
||||||
Property *p = props[root];
|
|
||||||
while (p) {
|
|
||||||
Property *pNext = p->next;
|
|
||||||
p->hash = 0;
|
|
||||||
delete []p->key;
|
|
||||||
p->key = 0;
|
|
||||||
delete []p->val;
|
|
||||||
p->val = 0;
|
|
||||||
delete p;
|
|
||||||
p = pNext;
|
|
||||||
}
|
|
||||||
props[root] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char *PropSet::ToString() {
|
|
||||||
size_t len=0;
|
|
||||||
for (int r = 0; r < hashRoots; r++) {
|
|
||||||
for (Property *p = props[r]; p; p = p->next) {
|
|
||||||
len += strlen(p->key) + 1;
|
|
||||||
len += strlen(p->val) + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (len == 0)
|
|
||||||
len = 1; // Return as empty string
|
|
||||||
char *ret = new char [len];
|
|
||||||
if (ret) {
|
|
||||||
char *w = ret;
|
|
||||||
for (int root = 0; root < hashRoots; root++) {
|
|
||||||
for (Property *p = props[root]; p; p = p->next) {
|
|
||||||
strcpy(w, p->key);
|
|
||||||
w += strlen(p->key);
|
|
||||||
*w++ = '=';
|
|
||||||
strcpy(w, p->val);
|
|
||||||
w += strlen(p->val);
|
|
||||||
*w++ = '\n';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret[len-1] = '\0';
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initiate enumeration.
|
|
||||||
*/
|
|
||||||
bool PropSet::GetFirst(char **key, char **val) {
|
|
||||||
for (int i = 0; i < hashRoots; i++) {
|
|
||||||
for (Property *p = props[i]; p; p = p->next) {
|
|
||||||
if (p) {
|
|
||||||
*key = p->key;
|
|
||||||
*val = p->val;
|
|
||||||
enumnext = p->next; // GetNext will begin here ...
|
|
||||||
enumhash = i; // ... in this block
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Continue enumeration.
|
|
||||||
*/
|
|
||||||
bool PropSet::GetNext(char ** key, char ** val) {
|
|
||||||
bool firstloop = true;
|
|
||||||
|
|
||||||
// search begins where we left it : in enumhash block
|
|
||||||
for (int i = enumhash; i < hashRoots; i++) {
|
|
||||||
if (!firstloop)
|
|
||||||
enumnext = props[i]; // Begin with first property in block
|
|
||||||
// else : begin where we left
|
|
||||||
firstloop = false;
|
|
||||||
|
|
||||||
for (Property *p = enumnext; p; p = p->next) {
|
|
||||||
if (p) {
|
|
||||||
*key = p->key;
|
|
||||||
*val = p->val;
|
|
||||||
enumnext = p->next; // for GetNext
|
|
||||||
enumhash = i;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an array that points into each word in the string and puts \0 terminators
|
|
||||||
* after each word.
|
|
||||||
*/
|
|
||||||
static char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = false) {
|
|
||||||
int prev = '\n';
|
|
||||||
int words = 0;
|
|
||||||
// For rapid determination of whether a character is a separator, build
|
|
||||||
// a look up table.
|
|
||||||
bool wordSeparator[256];
|
|
||||||
for (int i=0;i<256; i++) {
|
|
||||||
wordSeparator[i] = false;
|
|
||||||
}
|
|
||||||
wordSeparator['\r'] = true;
|
|
||||||
wordSeparator['\n'] = true;
|
|
||||||
if (!onlyLineEnds) {
|
|
||||||
wordSeparator[' '] = true;
|
|
||||||
wordSeparator['\t'] = true;
|
|
||||||
}
|
|
||||||
for (int j = 0; wordlist[j]; j++) {
|
|
||||||
int curr = static_cast<unsigned char>(wordlist[j]);
|
|
||||||
if (!wordSeparator[curr] && wordSeparator[prev])
|
|
||||||
words++;
|
|
||||||
prev = curr;
|
|
||||||
}
|
|
||||||
char **keywords = new char *[words + 1];
|
|
||||||
if (keywords) {
|
|
||||||
words = 0;
|
|
||||||
prev = '\0';
|
|
||||||
size_t slen = strlen(wordlist);
|
|
||||||
for (size_t k = 0; k < slen; k++) {
|
|
||||||
if (!wordSeparator[static_cast<unsigned char>(wordlist[k])]) {
|
|
||||||
if (!prev) {
|
|
||||||
keywords[words] = &wordlist[k];
|
|
||||||
words++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
wordlist[k] = '\0';
|
|
||||||
}
|
|
||||||
prev = wordlist[k];
|
|
||||||
}
|
|
||||||
keywords[words] = &wordlist[slen];
|
|
||||||
*len = words;
|
|
||||||
} else {
|
|
||||||
*len = 0;
|
|
||||||
}
|
|
||||||
return keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WordList::Clear() {
|
|
||||||
if (words) {
|
|
||||||
delete []list;
|
|
||||||
delete []words;
|
|
||||||
delete []wordsNoCase;
|
|
||||||
}
|
|
||||||
words = 0;
|
|
||||||
wordsNoCase = 0;
|
|
||||||
list = 0;
|
|
||||||
len = 0;
|
|
||||||
sorted = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WordList::Set(const char *s) {
|
|
||||||
list = StringDup(s);
|
|
||||||
sorted = false;
|
|
||||||
words = ArrayFromWordList(list, &len, onlyLineEnds);
|
|
||||||
wordsNoCase = new char * [len + 1];
|
|
||||||
memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *WordList::Allocate(int size) {
|
|
||||||
list = new char[size + 1];
|
|
||||||
list[size] = '\0';
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WordList::SetFromAllocated() {
|
|
||||||
sorted = false;
|
|
||||||
words = ArrayFromWordList(list, &len, onlyLineEnds);
|
|
||||||
wordsNoCase = new char * [len + 1];
|
|
||||||
memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
|
|
||||||
}
|
|
||||||
|
|
||||||
int cmpString(const void *a1, const void *a2) {
|
|
||||||
// Can't work out the correct incantation to use modern casts here
|
|
||||||
return strcmp(*(char**)(a1), *(char**)(a2));
|
|
||||||
}
|
|
||||||
|
|
||||||
int cmpStringNoCase(const void *a1, const void *a2) {
|
|
||||||
// Can't work out the correct incantation to use modern casts here
|
|
||||||
return CompareCaseInsensitive(*(char**)(a1), *(char**)(a2));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SortWordList(char **words, char **wordsNoCase, unsigned int len) {
|
|
||||||
qsort(reinterpret_cast<void*>(words), len, sizeof(*words),
|
|
||||||
cmpString);
|
|
||||||
qsort(reinterpret_cast<void*>(wordsNoCase), len, sizeof(*wordsNoCase),
|
|
||||||
cmpStringNoCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WordList::InList(const char *s) {
|
|
||||||
if (0 == words)
|
|
||||||
return false;
|
|
||||||
if (!sorted) {
|
|
||||||
sorted = true;
|
|
||||||
SortWordList(words, wordsNoCase, len);
|
|
||||||
for (unsigned int k = 0; k < (sizeof(starts) / sizeof(starts[0])); k++)
|
|
||||||
starts[k] = -1;
|
|
||||||
for (int l = len - 1; l >= 0; l--) {
|
|
||||||
unsigned char indexChar = words[l][0];
|
|
||||||
starts[indexChar] = l;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unsigned char firstChar = s[0];
|
|
||||||
int j = starts[firstChar];
|
|
||||||
if (j >= 0) {
|
|
||||||
while (words[j][0] == firstChar) {
|
|
||||||
if (s[1] == words[j][1]) {
|
|
||||||
const char *a = words[j] + 1;
|
|
||||||
const char *b = s + 1;
|
|
||||||
while (*a && *a == *b) {
|
|
||||||
a++;
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
if (!*a && !*b)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
j = starts['^'];
|
|
||||||
if (j >= 0) {
|
|
||||||
while (words[j][0] == '^') {
|
|
||||||
const char *a = words[j] + 1;
|
|
||||||
const char *b = s;
|
|
||||||
while (*a && *a == *b) {
|
|
||||||
a++;
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
if (!*a)
|
|
||||||
return true;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an element (complete) of the wordlist array which has
|
|
||||||
* the same beginning as the passed string.
|
|
||||||
* The length of the word to compare is passed too.
|
|
||||||
* Letter case can be ignored or preserved (default).
|
|
||||||
*/
|
|
||||||
const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/, SString wordCharacters /*='/0' */, int wordIndex /*= -1 */) {
|
|
||||||
int start = 0; // lower bound of the api array block to search
|
|
||||||
int end = len - 1; // upper bound of the api array block to search
|
|
||||||
int pivot; // index of api array element just being compared
|
|
||||||
int cond; // comparison result (in the sense of strcmp() result)
|
|
||||||
const char *word; // api array element just being compared
|
|
||||||
|
|
||||||
if (0 == words)
|
|
||||||
return NULL;
|
|
||||||
if (!sorted) {
|
|
||||||
sorted = true;
|
|
||||||
SortWordList(words, wordsNoCase, len);
|
|
||||||
}
|
|
||||||
if (ignoreCase) {
|
|
||||||
while (start <= end) { // binary searching loop
|
|
||||||
pivot = (start + end) >> 1;
|
|
||||||
word = wordsNoCase[pivot];
|
|
||||||
cond = CompareNCaseInsensitive(wordStart, word, searchLen);
|
|
||||||
if (!cond && (!wordCharacters.contains(word[searchLen]))) {
|
|
||||||
// Found a word in a binary fashion. Now checks if a specific index was requested
|
|
||||||
if (wordIndex < 0)
|
|
||||||
return word; // result must not be freed with free()
|
|
||||||
|
|
||||||
// Finds first word in a series of equal words
|
|
||||||
int first = pivot;
|
|
||||||
end = pivot - 1;
|
|
||||||
while (start <= end) {
|
|
||||||
pivot = (start + end) >> 1;
|
|
||||||
word = wordsNoCase[pivot];
|
|
||||||
cond = CompareNCaseInsensitive(wordStart, word, searchLen);
|
|
||||||
if (!cond && (!wordCharacters.contains(word[searchLen]))) {
|
|
||||||
// Found another word
|
|
||||||
first = pivot;
|
|
||||||
end = pivot - 1;
|
|
||||||
}
|
|
||||||
else if (cond > 0)
|
|
||||||
start = pivot + 1;
|
|
||||||
else if (cond <= 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets the word at the requested index
|
|
||||||
word = wordsNoCase[first + wordIndex];
|
|
||||||
return word;
|
|
||||||
}
|
|
||||||
else if (cond > 0)
|
|
||||||
start = pivot + 1;
|
|
||||||
else if (cond <= 0)
|
|
||||||
end = pivot - 1;
|
|
||||||
}
|
|
||||||
} else { // preserve the letter case
|
|
||||||
while (start <= end) { // binary searching loop
|
|
||||||
pivot = (start + end) >> 1;
|
|
||||||
word = words[pivot];
|
|
||||||
cond = strncmp(wordStart, word, searchLen);
|
|
||||||
if (!cond && (!wordCharacters.contains(word[searchLen]))) {
|
|
||||||
// Found a word in a binary fashion. Now checks if a specific index was requested
|
|
||||||
if (wordIndex < 0)
|
|
||||||
return word; // result must not be freed with free()
|
|
||||||
|
|
||||||
// Finds first word in a series of equal words
|
|
||||||
int first = pivot;
|
|
||||||
end = pivot - 1;
|
|
||||||
while (start <= end) {
|
|
||||||
pivot = (start + end) >> 1;
|
|
||||||
word = words[pivot];
|
|
||||||
cond = strncmp(wordStart, word, searchLen);
|
|
||||||
if (!cond && (!wordCharacters.contains(word[searchLen]))) {
|
|
||||||
// Found another word
|
|
||||||
first = pivot;
|
|
||||||
end = pivot - 1;
|
|
||||||
}
|
|
||||||
else if (cond > 0)
|
|
||||||
start = pivot + 1;
|
|
||||||
else if (cond <= 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets the word at the requested index
|
|
||||||
word = words[first + wordIndex];
|
|
||||||
return word;
|
|
||||||
}
|
|
||||||
else if (cond > 0)
|
|
||||||
start = pivot + 1;
|
|
||||||
else if (cond <= 0)
|
|
||||||
end = pivot - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find the length of a 'word' which is actually an identifier in a string
|
|
||||||
* which looks like "identifier(..." or "identifier:" or "identifier" and where
|
|
||||||
* there may be extra spaces after the identifier that should not be
|
|
||||||
* counted in the length.
|
|
||||||
*/
|
|
||||||
static unsigned int LengthWord(const char *word, char otherSeparator) {
|
|
||||||
// Find a '(', or ':'. If that fails go to the end of the string.
|
|
||||||
const char *endWord = strchr(word, '(');
|
|
||||||
if (!endWord)
|
|
||||||
endWord = strchr(word, ':');
|
|
||||||
if (!endWord && otherSeparator)
|
|
||||||
endWord = strchr(word, otherSeparator);
|
|
||||||
if (!endWord)
|
|
||||||
endWord = word + strlen(word);
|
|
||||||
// Last case always succeeds so endWord != 0
|
|
||||||
|
|
||||||
// Drop any space characters.
|
|
||||||
if (endWord > word) {
|
|
||||||
endWord--; // Back from the '(', ':', or '\0'
|
|
||||||
// Move backwards over any spaces
|
|
||||||
while ((endWord > word) && (IsASpace(*endWord))) {
|
|
||||||
endWord--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return endWord - word;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns elements (first words of them) of the wordlist array which have
|
|
||||||
* the same beginning as the passed string.
|
|
||||||
* The length of the word to compare is passed too.
|
|
||||||
* Letter case can be ignored or preserved (default).
|
|
||||||
* If there are more words meeting the condition they are returned all of
|
|
||||||
* them in the ascending order separated with spaces.
|
|
||||||
*
|
|
||||||
* NOTE: returned buffer has to be freed with delete[].
|
|
||||||
*/
|
|
||||||
char *WordList::GetNearestWords(
|
|
||||||
const char *wordStart,
|
|
||||||
int searchLen /*= -1*/,
|
|
||||||
bool ignoreCase /*= false*/,
|
|
||||||
char otherSeparator /*= '\0'*/) {
|
|
||||||
int wordlen; // length of the word part (before the '(' brace) of the api array element
|
|
||||||
SString wordsNear;
|
|
||||||
wordsNear.setsizegrowth(1000);
|
|
||||||
int start = 0; // lower bound of the api array block to search
|
|
||||||
int end = len - 1; // upper bound of the api array block to search
|
|
||||||
int pivot; // index of api array element just being compared
|
|
||||||
int cond; // comparison result (in the sense of strcmp() result)
|
|
||||||
|
|
||||||
if (0 == words)
|
|
||||||
return NULL;
|
|
||||||
if (!sorted) {
|
|
||||||
sorted = true;
|
|
||||||
SortWordList(words, wordsNoCase, len);
|
|
||||||
}
|
|
||||||
if (ignoreCase) {
|
|
||||||
while (start <= end) { // Binary searching loop
|
|
||||||
pivot = (start + end) / 2;
|
|
||||||
cond = CompareNCaseInsensitive(wordStart, wordsNoCase[pivot], searchLen);
|
|
||||||
if (!cond) {
|
|
||||||
// Find first match
|
|
||||||
while ((pivot > start) &&
|
|
||||||
(0 == CompareNCaseInsensitive(wordStart,
|
|
||||||
wordsNoCase[pivot-1], searchLen))) {
|
|
||||||
--pivot;
|
|
||||||
}
|
|
||||||
// Grab each match
|
|
||||||
while ((pivot <= end) &&
|
|
||||||
(0 == CompareNCaseInsensitive(wordStart,
|
|
||||||
wordsNoCase[pivot], searchLen))) {
|
|
||||||
wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;
|
|
||||||
wordsNear.append(wordsNoCase[pivot], wordlen, ' ');
|
|
||||||
++pivot;
|
|
||||||
}
|
|
||||||
return wordsNear.detach();
|
|
||||||
} else if (cond < 0) {
|
|
||||||
end = pivot - 1;
|
|
||||||
} else if (cond > 0) {
|
|
||||||
start = pivot + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { // Preserve the letter case
|
|
||||||
while (start <= end) { // Binary searching loop
|
|
||||||
pivot = (start + end) / 2;
|
|
||||||
cond = strncmp(wordStart, words[pivot], searchLen);
|
|
||||||
if (!cond) {
|
|
||||||
// Find first match
|
|
||||||
while ((pivot > start) &&
|
|
||||||
(0 == strncmp(wordStart,
|
|
||||||
words[pivot-1], searchLen))) {
|
|
||||||
--pivot;
|
|
||||||
}
|
|
||||||
// Grab each match
|
|
||||||
while ((pivot <= end) &&
|
|
||||||
(0 == strncmp(wordStart,
|
|
||||||
words[pivot], searchLen))) {
|
|
||||||
wordlen = LengthWord(words[pivot], otherSeparator) + 1;
|
|
||||||
wordsNear.append(words[pivot], wordlen, ' ');
|
|
||||||
++pivot;
|
|
||||||
}
|
|
||||||
return wordsNear.detach();
|
|
||||||
} else if (cond < 0) {
|
|
||||||
end = pivot - 1;
|
|
||||||
} else if (cond > 0) {
|
|
||||||
start = pivot + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
@@ -1,835 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file RESearch.cxx
|
|
||||||
** Regular expression search library.
|
|
||||||
**/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* regex - Regular expression pattern matching and replacement
|
|
||||||
*
|
|
||||||
* By: Ozan S. Yigit (oz)
|
|
||||||
* Dept. of Computer Science
|
|
||||||
* York University
|
|
||||||
*
|
|
||||||
* Original code available from http://www.cs.yorku.ca/~oz/
|
|
||||||
* Translation to C++ by Neil Hodgson neilh@scintilla.org
|
|
||||||
* Removed all use of register.
|
|
||||||
* Converted to modern function prototypes.
|
|
||||||
* Put all global/static variables into an object so this code can be
|
|
||||||
* used from multiple threads etc.
|
|
||||||
*
|
|
||||||
* These routines are the PUBLIC DOMAIN equivalents of regex
|
|
||||||
* routines as found in 4.nBSD UN*X, with minor extensions.
|
|
||||||
*
|
|
||||||
* These routines are derived from various implementations found
|
|
||||||
* in software tools books, and Conroy's grep. They are NOT derived
|
|
||||||
* from licensed/restricted software.
|
|
||||||
* For more interesting/academic/complicated implementations,
|
|
||||||
* see Henry Spencer's regexp routines, or GNU Emacs pattern
|
|
||||||
* matching module.
|
|
||||||
*
|
|
||||||
* Modification history removed.
|
|
||||||
*
|
|
||||||
* Interfaces:
|
|
||||||
* RESearch::Compile: compile a regular expression into a NFA.
|
|
||||||
*
|
|
||||||
* char *RESearch::Compile(s)
|
|
||||||
* char *s;
|
|
||||||
*
|
|
||||||
* RESearch::Execute: execute the NFA to match a pattern.
|
|
||||||
*
|
|
||||||
* int RESearch::Execute(s)
|
|
||||||
* char *s;
|
|
||||||
*
|
|
||||||
* RESearch::ModifyWord change RESearch::Execute's understanding of what a "word"
|
|
||||||
* looks like (for \< and \>) by adding into the
|
|
||||||
* hidden word-syntax table.
|
|
||||||
*
|
|
||||||
* void RESearch::ModifyWord(s)
|
|
||||||
* char *s;
|
|
||||||
*
|
|
||||||
* RESearch::Substitute: substitute the matched portions in a new string.
|
|
||||||
*
|
|
||||||
* int RESearch::Substitute(src, dst)
|
|
||||||
* char *src;
|
|
||||||
* char *dst;
|
|
||||||
*
|
|
||||||
* re_fail: failure routine for RESearch::Execute.
|
|
||||||
*
|
|
||||||
* void re_fail(msg, op)
|
|
||||||
* char *msg;
|
|
||||||
* char op;
|
|
||||||
*
|
|
||||||
* Regular Expressions:
|
|
||||||
*
|
|
||||||
* [1] char matches itself, unless it is a special
|
|
||||||
* character (metachar): . \ [ ] * + ^ $
|
|
||||||
*
|
|
||||||
* [2] . matches any character.
|
|
||||||
*
|
|
||||||
* [3] \ matches the character following it, except
|
|
||||||
* when followed by a left or right round bracket,
|
|
||||||
* a digit 1 to 9 or a left or right angle bracket.
|
|
||||||
* (see [7], [8] and [9])
|
|
||||||
* It is used as an escape character for all
|
|
||||||
* other meta-characters, and itself. When used
|
|
||||||
* in a set ([4]), it is treated as an ordinary
|
|
||||||
* character.
|
|
||||||
*
|
|
||||||
* [4] [set] matches one of the characters in the set.
|
|
||||||
* If the first character in the set is "^",
|
|
||||||
* it matches a character NOT in the set, i.e.
|
|
||||||
* complements the set. A shorthand S-E is
|
|
||||||
* used to specify a set of characters S upto
|
|
||||||
* E, inclusive. The special characters "]" and
|
|
||||||
* "-" have no special meaning if they appear
|
|
||||||
* as the first chars in the set.
|
|
||||||
* examples: match:
|
|
||||||
*
|
|
||||||
* [a-z] any lowercase alpha
|
|
||||||
*
|
|
||||||
* [^]-] any char except ] and -
|
|
||||||
*
|
|
||||||
* [^A-Z] any char except uppercase
|
|
||||||
* alpha
|
|
||||||
*
|
|
||||||
* [a-zA-Z] any alpha
|
|
||||||
*
|
|
||||||
* [5] * any regular expression form [1] to [4], followed by
|
|
||||||
* closure char (*) matches zero or more matches of
|
|
||||||
* that form.
|
|
||||||
*
|
|
||||||
* [6] + same as [5], except it matches one or more.
|
|
||||||
*
|
|
||||||
* [7] a regular expression in the form [1] to [10], enclosed
|
|
||||||
* as \(form\) matches what form matches. The enclosure
|
|
||||||
* creates a set of tags, used for [8] and for
|
|
||||||
* pattern substution. The tagged forms are numbered
|
|
||||||
* starting from 1.
|
|
||||||
*
|
|
||||||
* [8] a \ followed by a digit 1 to 9 matches whatever a
|
|
||||||
* previously tagged regular expression ([7]) matched.
|
|
||||||
*
|
|
||||||
* [9] \< a regular expression starting with a \< construct
|
|
||||||
* \> and/or ending with a \> construct, restricts the
|
|
||||||
* pattern matching to the beginning of a word, and/or
|
|
||||||
* the end of a word. A word is defined to be a character
|
|
||||||
* string beginning and/or ending with the characters
|
|
||||||
* A-Z a-z 0-9 and _. It must also be preceded and/or
|
|
||||||
* followed by any character outside those mentioned.
|
|
||||||
*
|
|
||||||
* [10] a composite regular expression xy where x and y
|
|
||||||
* are in the form [1] to [10] matches the longest
|
|
||||||
* match of x followed by a match for y.
|
|
||||||
*
|
|
||||||
* [11] ^ a regular expression starting with a ^ character
|
|
||||||
* $ and/or ending with a $ character, restricts the
|
|
||||||
* pattern matching to the beginning of the line,
|
|
||||||
* or the end of line. [anchors] Elsewhere in the
|
|
||||||
* pattern, ^ and $ are treated as ordinary characters.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Acknowledgements:
|
|
||||||
*
|
|
||||||
* HCR's Hugh Redelmeier has been most helpful in various
|
|
||||||
* stages of development. He convinced me to include BOW
|
|
||||||
* and EOW constructs, originally invented by Rob Pike at
|
|
||||||
* the University of Toronto.
|
|
||||||
*
|
|
||||||
* References:
|
|
||||||
* Software tools Kernighan & Plauger
|
|
||||||
* Software tools in Pascal Kernighan & Plauger
|
|
||||||
* Grep [rsx-11 C dist] David Conroy
|
|
||||||
* ed - text editor Un*x Programmer's Manual
|
|
||||||
* Advanced editing on Un*x B. W. Kernighan
|
|
||||||
* RegExp routines Henry Spencer
|
|
||||||
*
|
|
||||||
* Notes:
|
|
||||||
*
|
|
||||||
* This implementation uses a bit-set representation for character
|
|
||||||
* classes for speed and compactness. Each character is represented
|
|
||||||
* by one bit in a 128-bit block. Thus, CCL always takes a
|
|
||||||
* constant 16 bytes in the internal nfa, and RESearch::Execute does a single
|
|
||||||
* bit comparison to locate the character in the set.
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
*
|
|
||||||
* pattern: foo*.*
|
|
||||||
* compile: CHR f CHR o CLO CHR o END CLO ANY END END
|
|
||||||
* matches: fo foo fooo foobar fobar foxx ...
|
|
||||||
*
|
|
||||||
* pattern: fo[ob]a[rz]
|
|
||||||
* compile: CHR f CHR o CCL bitset CHR a CCL bitset END
|
|
||||||
* matches: fobar fooar fobaz fooaz
|
|
||||||
*
|
|
||||||
* pattern: foo\\+
|
|
||||||
* compile: CHR f CHR o CHR o CHR \ CLO CHR \ END END
|
|
||||||
* matches: foo\ foo\\ foo\\\ ...
|
|
||||||
*
|
|
||||||
* pattern: \(foo\)[1-3]\1 (same as foo[1-3]foo)
|
|
||||||
* compile: BOT 1 CHR f CHR o CHR o EOT 1 CCL bitset REF 1 END
|
|
||||||
* matches: foo1foo foo2foo foo3foo
|
|
||||||
*
|
|
||||||
* pattern: \(fo.*\)-\1
|
|
||||||
* compile: BOT 1 CHR f CHR o CLO ANY END EOT 1 CHR - REF 1 END
|
|
||||||
* matches: foo-foo fo-fo fob-fob foobar-foobar ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "RESearch.h"
|
|
||||||
|
|
||||||
#define OKP 1
|
|
||||||
#define NOP 0
|
|
||||||
|
|
||||||
#define CHR 1
|
|
||||||
#define ANY 2
|
|
||||||
#define CCL 3
|
|
||||||
#define BOL 4
|
|
||||||
#define EOL 5
|
|
||||||
#define BOT 6
|
|
||||||
#define EOT 7
|
|
||||||
#define BOW 8
|
|
||||||
#define EOW 9
|
|
||||||
#define REF 10
|
|
||||||
#define CLO 11
|
|
||||||
|
|
||||||
#define END 0
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following defines are not meant to be changeable.
|
|
||||||
* They are for readability only.
|
|
||||||
*/
|
|
||||||
#define BLKIND 0370
|
|
||||||
#define BITIND 07
|
|
||||||
|
|
||||||
#define ASCIIB 0177
|
|
||||||
|
|
||||||
const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
|
|
||||||
|
|
||||||
#define badpat(x) (*nfa = END, x)
|
|
||||||
|
|
||||||
RESearch::RESearch() {
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
RESearch::~RESearch() {
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RESearch::Init() {
|
|
||||||
sta = NOP; /* status of lastpat */
|
|
||||||
bol = 0;
|
|
||||||
for (int i=0; i<MAXTAG; i++)
|
|
||||||
pat[i] = 0;
|
|
||||||
for (int j=0; j<BITBLK; j++)
|
|
||||||
bittab[j] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RESearch::Clear() {
|
|
||||||
for (int i=0; i<MAXTAG; i++) {
|
|
||||||
delete []pat[i];
|
|
||||||
pat[i] = 0;
|
|
||||||
bopat[i] = NOTFOUND;
|
|
||||||
eopat[i] = NOTFOUND;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RESearch::GrabMatches(CharacterIndexer &ci) {
|
|
||||||
bool success = true;
|
|
||||||
for (unsigned int i=0; i<MAXTAG; i++) {
|
|
||||||
if ((bopat[i] != NOTFOUND) && (eopat[i] != NOTFOUND)) {
|
|
||||||
unsigned int len = eopat[i] - bopat[i];
|
|
||||||
pat[i] = new char[len + 1];
|
|
||||||
if (pat[i]) {
|
|
||||||
for (unsigned int j=0; j<len; j++)
|
|
||||||
pat[i][j] = ci.CharAt(bopat[i] + j);
|
|
||||||
pat[i][len] = '\0';
|
|
||||||
} else {
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RESearch::ChSet(char c) {
|
|
||||||
bittab[((c) & BLKIND) >> 3] |= bitarr[(c) & BITIND];
|
|
||||||
}
|
|
||||||
|
|
||||||
void RESearch::ChSetWithCase(char c, bool caseSensitive) {
|
|
||||||
if (caseSensitive) {
|
|
||||||
ChSet(c);
|
|
||||||
} else {
|
|
||||||
if ((c >= 'a') && (c <= 'z')) {
|
|
||||||
ChSet(c);
|
|
||||||
ChSet(static_cast<char>(c - 'a' + 'A'));
|
|
||||||
} else if ((c >= 'A') && (c <= 'Z')) {
|
|
||||||
ChSet(c);
|
|
||||||
ChSet(static_cast<char>(c - 'A' + 'a'));
|
|
||||||
} else {
|
|
||||||
ChSet(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char escapeValue(char ch) {
|
|
||||||
switch (ch) {
|
|
||||||
case 'a': return '\a';
|
|
||||||
case 'b': return '\b';
|
|
||||||
case 'f': return '\f';
|
|
||||||
case 'n': return '\n';
|
|
||||||
case 'r': return '\r';
|
|
||||||
case 't': return '\t';
|
|
||||||
case 'v': return '\v';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, bool posix) {
|
|
||||||
char *mp=nfa; /* nfa pointer */
|
|
||||||
char *lp; /* saved pointer.. */
|
|
||||||
char *sp=nfa; /* another one.. */
|
|
||||||
char *mpMax = mp + MAXNFA - BITBLK - 10;
|
|
||||||
|
|
||||||
int tagi = 0; /* tag stack index */
|
|
||||||
int tagc = 1; /* actual tag count */
|
|
||||||
|
|
||||||
int n;
|
|
||||||
char mask; /* xor mask -CCL/NCL */
|
|
||||||
int c1, c2;
|
|
||||||
|
|
||||||
if (!pat || !length)
|
|
||||||
if (sta)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return badpat("No previous regular expression");
|
|
||||||
sta = NOP;
|
|
||||||
|
|
||||||
const char *p=pat; /* pattern pointer */
|
|
||||||
for (int i=0; i<length; i++, p++) {
|
|
||||||
if (mp > mpMax)
|
|
||||||
return badpat("Pattern too long");
|
|
||||||
lp = mp;
|
|
||||||
switch(*p) {
|
|
||||||
|
|
||||||
case '.': /* match any char.. */
|
|
||||||
*mp++ = ANY;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '^': /* match beginning.. */
|
|
||||||
if (p == pat)
|
|
||||||
*mp++ = BOL;
|
|
||||||
else {
|
|
||||||
*mp++ = CHR;
|
|
||||||
*mp++ = *p;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '$': /* match endofline.. */
|
|
||||||
if (!*(p+1))
|
|
||||||
*mp++ = EOL;
|
|
||||||
else {
|
|
||||||
*mp++ = CHR;
|
|
||||||
*mp++ = *p;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '[': /* match char class..*/
|
|
||||||
*mp++ = CCL;
|
|
||||||
|
|
||||||
i++;
|
|
||||||
if (*++p == '^') {
|
|
||||||
mask = '\377';
|
|
||||||
i++;
|
|
||||||
p++;
|
|
||||||
} else
|
|
||||||
mask = 0;
|
|
||||||
|
|
||||||
if (*p == '-') { /* real dash */
|
|
||||||
i++;
|
|
||||||
ChSet(*p++);
|
|
||||||
}
|
|
||||||
if (*p == ']') { /* real brace */
|
|
||||||
i++;
|
|
||||||
ChSet(*p++);
|
|
||||||
}
|
|
||||||
while (*p && *p != ']') {
|
|
||||||
if (*p == '-' && *(p+1) && *(p+1) != ']') {
|
|
||||||
i++;
|
|
||||||
p++;
|
|
||||||
c1 = *(p-2) + 1;
|
|
||||||
i++;
|
|
||||||
c2 = *p++;
|
|
||||||
while (c1 <= c2) {
|
|
||||||
ChSetWithCase(static_cast<char>(c1++), caseSensitive);
|
|
||||||
}
|
|
||||||
} else if (*p == '\\' && *(p+1)) {
|
|
||||||
i++;
|
|
||||||
p++;
|
|
||||||
char escape = escapeValue(*p);
|
|
||||||
if (escape)
|
|
||||||
ChSetWithCase(escape, caseSensitive);
|
|
||||||
else
|
|
||||||
ChSetWithCase(*p, caseSensitive);
|
|
||||||
i++;
|
|
||||||
p++;
|
|
||||||
} else {
|
|
||||||
i++;
|
|
||||||
ChSetWithCase(*p++, caseSensitive);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!*p)
|
|
||||||
return badpat("Missing ]");
|
|
||||||
|
|
||||||
for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
|
|
||||||
*mp++ = static_cast<char>(mask ^ bittab[n]);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '*': /* match 0 or more.. */
|
|
||||||
case '+': /* match 1 or more.. */
|
|
||||||
if (p == pat)
|
|
||||||
return badpat("Empty closure");
|
|
||||||
lp = sp; /* previous opcode */
|
|
||||||
if (*lp == CLO) /* equivalence.. */
|
|
||||||
break;
|
|
||||||
switch(*lp) {
|
|
||||||
|
|
||||||
case BOL:
|
|
||||||
case BOT:
|
|
||||||
case EOT:
|
|
||||||
case BOW:
|
|
||||||
case EOW:
|
|
||||||
case REF:
|
|
||||||
return badpat("Illegal closure");
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*p == '+')
|
|
||||||
for (sp = mp; lp < sp; lp++)
|
|
||||||
*mp++ = *lp;
|
|
||||||
|
|
||||||
*mp++ = END;
|
|
||||||
*mp++ = END;
|
|
||||||
sp = mp;
|
|
||||||
while (--mp > lp)
|
|
||||||
*mp = mp[-1];
|
|
||||||
*mp = CLO;
|
|
||||||
mp = sp;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '\\': /* tags, backrefs .. */
|
|
||||||
i++;
|
|
||||||
switch(*++p) {
|
|
||||||
|
|
||||||
case '<':
|
|
||||||
*mp++ = BOW;
|
|
||||||
break;
|
|
||||||
case '>':
|
|
||||||
if (*sp == BOW)
|
|
||||||
return badpat("Null pattern inside \\<\\>");
|
|
||||||
*mp++ = EOW;
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
case '2':
|
|
||||||
case '3':
|
|
||||||
case '4':
|
|
||||||
case '5':
|
|
||||||
case '6':
|
|
||||||
case '7':
|
|
||||||
case '8':
|
|
||||||
case '9':
|
|
||||||
n = *p-'0';
|
|
||||||
if (tagi > 0 && tagstk[tagi] == n)
|
|
||||||
return badpat("Cyclical reference");
|
|
||||||
if (tagc > n) {
|
|
||||||
*mp++ = static_cast<char>(REF);
|
|
||||||
*mp++ = static_cast<char>(n);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return badpat("Undetermined reference");
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
case 'b':
|
|
||||||
case 'n':
|
|
||||||
case 'f':
|
|
||||||
case 'r':
|
|
||||||
case 't':
|
|
||||||
case 'v':
|
|
||||||
*mp++ = CHR;
|
|
||||||
*mp++ = escapeValue(*p);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (!posix && *p == '(') {
|
|
||||||
if (tagc < MAXTAG) {
|
|
||||||
tagstk[++tagi] = tagc;
|
|
||||||
*mp++ = BOT;
|
|
||||||
*mp++ = static_cast<char>(tagc++);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return badpat("Too many \\(\\) pairs");
|
|
||||||
} else if (!posix && *p == ')') {
|
|
||||||
if (*sp == BOT)
|
|
||||||
return badpat("Null pattern inside \\(\\)");
|
|
||||||
if (tagi > 0) {
|
|
||||||
*mp++ = static_cast<char>(EOT);
|
|
||||||
*mp++ = static_cast<char>(tagstk[tagi--]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return badpat("Unmatched \\)");
|
|
||||||
} else {
|
|
||||||
*mp++ = CHR;
|
|
||||||
*mp++ = *p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default : /* an ordinary char */
|
|
||||||
if (posix && *p == '(') {
|
|
||||||
if (tagc < MAXTAG) {
|
|
||||||
tagstk[++tagi] = tagc;
|
|
||||||
*mp++ = BOT;
|
|
||||||
*mp++ = static_cast<char>(tagc++);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return badpat("Too many () pairs");
|
|
||||||
} else if (posix && *p == ')') {
|
|
||||||
if (*sp == BOT)
|
|
||||||
return badpat("Null pattern inside ()");
|
|
||||||
if (tagi > 0) {
|
|
||||||
*mp++ = static_cast<char>(EOT);
|
|
||||||
*mp++ = static_cast<char>(tagstk[tagi--]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return badpat("Unmatched )");
|
|
||||||
} else if (caseSensitive) {
|
|
||||||
*mp++ = CHR;
|
|
||||||
*mp++ = *p;
|
|
||||||
} else {
|
|
||||||
*mp++ = CCL;
|
|
||||||
mask = 0;
|
|
||||||
ChSetWithCase(*p, false);
|
|
||||||
for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
|
|
||||||
*mp++ = static_cast<char>(mask ^ bittab[n]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sp = lp;
|
|
||||||
}
|
|
||||||
if (tagi > 0)
|
|
||||||
return badpat((posix ? "Unmatched (" : "Unmatched \\("));
|
|
||||||
*mp = END;
|
|
||||||
sta = OKP;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RESearch::Execute:
|
|
||||||
* execute nfa to find a match.
|
|
||||||
*
|
|
||||||
* special cases: (nfa[0])
|
|
||||||
* BOL
|
|
||||||
* Match only once, starting from the
|
|
||||||
* beginning.
|
|
||||||
* CHR
|
|
||||||
* First locate the character without
|
|
||||||
* calling PMatch, and if found, call
|
|
||||||
* PMatch for the remaining string.
|
|
||||||
* END
|
|
||||||
* RESearch::Compile failed, poor luser did not
|
|
||||||
* check for it. Fail fast.
|
|
||||||
*
|
|
||||||
* If a match is found, bopat[0] and eopat[0] are set
|
|
||||||
* to the beginning and the end of the matched fragment,
|
|
||||||
* respectively.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
|
|
||||||
char c;
|
|
||||||
int ep = NOTFOUND;
|
|
||||||
char *ap = nfa;
|
|
||||||
|
|
||||||
bol = lp;
|
|
||||||
failure = 0;
|
|
||||||
|
|
||||||
Clear();
|
|
||||||
|
|
||||||
switch(*ap) {
|
|
||||||
|
|
||||||
case BOL: /* anchored: match from BOL only */
|
|
||||||
ep = PMatch(ci, lp, endp, ap);
|
|
||||||
break;
|
|
||||||
case EOL: /* just searching for end of line normal path doesn't work */
|
|
||||||
if (*(ap+1) == END) {
|
|
||||||
lp = endp;
|
|
||||||
ep = lp;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
case CHR: /* ordinary char: locate it fast */
|
|
||||||
c = *(ap+1);
|
|
||||||
while ((lp < endp) && (ci.CharAt(lp) != c))
|
|
||||||
lp++;
|
|
||||||
if (lp >= endp) /* if EOS, fail, else fall thru. */
|
|
||||||
return 0;
|
|
||||||
default: /* regular matching all the way. */
|
|
||||||
while (lp < endp) {
|
|
||||||
ep = PMatch(ci, lp, endp, ap);
|
|
||||||
if (ep != NOTFOUND)
|
|
||||||
break;
|
|
||||||
lp++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case END: /* munged automaton. fail always */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (ep == NOTFOUND)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
bopat[0] = lp;
|
|
||||||
eopat[0] = ep;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PMatch: internal routine for the hard part
|
|
||||||
*
|
|
||||||
* This code is partly snarfed from an early grep written by
|
|
||||||
* David Conroy. The backref and tag stuff, and various other
|
|
||||||
* innovations are by oz.
|
|
||||||
*
|
|
||||||
* special case optimizations: (nfa[n], nfa[n+1])
|
|
||||||
* CLO ANY
|
|
||||||
* We KNOW .* will match everything upto the
|
|
||||||
* end of line. Thus, directly go to the end of
|
|
||||||
* line, without recursive PMatch calls. As in
|
|
||||||
* the other closure cases, the remaining pattern
|
|
||||||
* must be matched by moving backwards on the
|
|
||||||
* string recursively, to find a match for xy
|
|
||||||
* (x is ".*" and y is the remaining pattern)
|
|
||||||
* where the match satisfies the LONGEST match for
|
|
||||||
* x followed by a match for y.
|
|
||||||
* CLO CHR
|
|
||||||
* We can again scan the string forward for the
|
|
||||||
* single char and at the point of failure, we
|
|
||||||
* execute the remaining nfa recursively, same as
|
|
||||||
* above.
|
|
||||||
*
|
|
||||||
* At the end of a successful match, bopat[n] and eopat[n]
|
|
||||||
* are set to the beginning and end of subpatterns matched
|
|
||||||
* by tagged expressions (n = 1 to 9).
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void re_fail(char *,char);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* character classification table for word boundary operators BOW
|
|
||||||
* and EOW. the reason for not using ctype macros is that we can
|
|
||||||
* let the user add into our own table. see RESearch::ModifyWord. This table
|
|
||||||
* is not in the bitset form, since we may wish to extend it in the
|
|
||||||
* future for other character classifications.
|
|
||||||
*
|
|
||||||
* TRUE for 0-9 A-Z a-z _
|
|
||||||
*/
|
|
||||||
static char chrtyp[MAXCHR] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 0, 0, 0, 0, 1, 0, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
#define inascii(x) (0177&(x))
|
|
||||||
#define iswordc(x) chrtyp[inascii(x)]
|
|
||||||
#define isinset(x,y) ((x)[((y)&BLKIND)>>3] & bitarr[(y)&BITIND])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* skip values for CLO XXX to skip past the closure
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ANYSKIP 2 /* [CLO] ANY END ... */
|
|
||||||
#define CHRSKIP 3 /* [CLO] CHR chr END ... */
|
|
||||||
#define CCLSKIP 34 /* [CLO] CCL 32bytes END ... */
|
|
||||||
|
|
||||||
int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {
|
|
||||||
int op, c, n;
|
|
||||||
int e; /* extra pointer for CLO */
|
|
||||||
int bp; /* beginning of subpat.. */
|
|
||||||
int ep; /* ending of subpat.. */
|
|
||||||
int are; /* to save the line ptr. */
|
|
||||||
|
|
||||||
while ((op = *ap++) != END)
|
|
||||||
switch(op) {
|
|
||||||
|
|
||||||
case CHR:
|
|
||||||
if (ci.CharAt(lp++) != *ap++)
|
|
||||||
return NOTFOUND;
|
|
||||||
break;
|
|
||||||
case ANY:
|
|
||||||
if (lp++ >= endp)
|
|
||||||
return NOTFOUND;
|
|
||||||
break;
|
|
||||||
case CCL:
|
|
||||||
c = ci.CharAt(lp++);
|
|
||||||
if (!isinset(ap,c))
|
|
||||||
return NOTFOUND;
|
|
||||||
ap += BITBLK;
|
|
||||||
break;
|
|
||||||
case BOL:
|
|
||||||
if (lp != bol)
|
|
||||||
return NOTFOUND;
|
|
||||||
break;
|
|
||||||
case EOL:
|
|
||||||
if (lp < endp)
|
|
||||||
return NOTFOUND;
|
|
||||||
break;
|
|
||||||
case BOT:
|
|
||||||
bopat[*ap++] = lp;
|
|
||||||
break;
|
|
||||||
case EOT:
|
|
||||||
eopat[*ap++] = lp;
|
|
||||||
break;
|
|
||||||
case BOW:
|
|
||||||
if (lp!=bol && iswordc(ci.CharAt(lp-1)) || !iswordc(ci.CharAt(lp)))
|
|
||||||
return NOTFOUND;
|
|
||||||
break;
|
|
||||||
case EOW:
|
|
||||||
if (lp==bol || !iswordc(ci.CharAt(lp-1)) || iswordc(ci.CharAt(lp)))
|
|
||||||
return NOTFOUND;
|
|
||||||
break;
|
|
||||||
case REF:
|
|
||||||
n = *ap++;
|
|
||||||
bp = bopat[n];
|
|
||||||
ep = eopat[n];
|
|
||||||
while (bp < ep)
|
|
||||||
if (ci.CharAt(bp++) != ci.CharAt(lp++))
|
|
||||||
return NOTFOUND;
|
|
||||||
break;
|
|
||||||
case CLO:
|
|
||||||
are = lp;
|
|
||||||
switch(*ap) {
|
|
||||||
|
|
||||||
case ANY:
|
|
||||||
while (lp < endp)
|
|
||||||
lp++;
|
|
||||||
n = ANYSKIP;
|
|
||||||
break;
|
|
||||||
case CHR:
|
|
||||||
c = *(ap+1);
|
|
||||||
while ((lp < endp) && (c == ci.CharAt(lp)))
|
|
||||||
lp++;
|
|
||||||
n = CHRSKIP;
|
|
||||||
break;
|
|
||||||
case CCL:
|
|
||||||
while ((lp < endp) && isinset(ap+1,ci.CharAt(lp)))
|
|
||||||
lp++;
|
|
||||||
n = CCLSKIP;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
failure = true;
|
|
||||||
//re_fail("closure: bad nfa.", *ap);
|
|
||||||
return NOTFOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
ap += n;
|
|
||||||
|
|
||||||
while (lp >= are) {
|
|
||||||
if ((e = PMatch(ci, lp, endp, ap)) != NOTFOUND)
|
|
||||||
return e;
|
|
||||||
--lp;
|
|
||||||
}
|
|
||||||
return NOTFOUND;
|
|
||||||
default:
|
|
||||||
//re_fail("RESearch::Execute: bad nfa.", static_cast<char>(op));
|
|
||||||
return NOTFOUND;
|
|
||||||
}
|
|
||||||
return lp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RESearch::ModifyWord:
|
|
||||||
* add new characters into the word table to change RESearch::Execute's
|
|
||||||
* understanding of what a word should look like. Note that we
|
|
||||||
* only accept additions into the word definition.
|
|
||||||
*
|
|
||||||
* If the string parameter is 0 or null string, the table is
|
|
||||||
* reset back to the default containing A-Z a-z 0-9 _. [We use
|
|
||||||
* the compact bitset representation for the default table]
|
|
||||||
*/
|
|
||||||
|
|
||||||
static char deftab[16] = {
|
|
||||||
0, 0, 0, 0, 0, 0, '\377', 003, '\376', '\377', '\377', '\207',
|
|
||||||
'\376', '\377', '\377', 007
|
|
||||||
};
|
|
||||||
|
|
||||||
void RESearch::ModifyWord(char *s) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!s || !*s) {
|
|
||||||
for (i = 0; i < MAXCHR; i++)
|
|
||||||
if (!isinset(deftab,i))
|
|
||||||
iswordc(i) = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
while(*s)
|
|
||||||
iswordc(*s++) = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RESearch::Substitute:
|
|
||||||
* substitute the matched portions of the src in dst.
|
|
||||||
*
|
|
||||||
* & substitute the entire matched pattern.
|
|
||||||
*
|
|
||||||
* \digit substitute a subpattern, with the given tag number.
|
|
||||||
* Tags are numbered from 1 to 9. If the particular
|
|
||||||
* tagged subpattern does not exist, null is substituted.
|
|
||||||
*/
|
|
||||||
int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst) {
|
|
||||||
char c;
|
|
||||||
int pin;
|
|
||||||
int bp;
|
|
||||||
int ep;
|
|
||||||
|
|
||||||
if (!*src || !bopat[0])
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
while ((c = *src++) != 0) {
|
|
||||||
switch(c) {
|
|
||||||
|
|
||||||
case '&':
|
|
||||||
pin = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '\\':
|
|
||||||
c = *src++;
|
|
||||||
if (c >= '0' && c <= '9') {
|
|
||||||
pin = c - '0';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
*dst++ = c;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((bp = bopat[pin]) != 0 && (ep = eopat[pin]) != 0) {
|
|
||||||
while (ci.CharAt(bp) && bp < ep)
|
|
||||||
*dst++ = ci.CharAt(bp++);
|
|
||||||
if (bp < ep)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst = (char) 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file RESearch.h
|
|
||||||
** Interface to the regular expression search library.
|
|
||||||
**/
|
|
||||||
// Written by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// Based on the work of Ozan S. Yigit.
|
|
||||||
// This file is in the public domain.
|
|
||||||
|
|
||||||
#ifndef RESEARCH_H
|
|
||||||
#define RESEARCH_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following defines are not meant to be changeable.
|
|
||||||
* They are for readability only.
|
|
||||||
*/
|
|
||||||
#define MAXCHR 256
|
|
||||||
#define CHRBIT 8
|
|
||||||
#define BITBLK MAXCHR/CHRBIT
|
|
||||||
|
|
||||||
class CharacterIndexer {
|
|
||||||
public:
|
|
||||||
virtual char CharAt(int index)=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class RESearch {
|
|
||||||
|
|
||||||
public:
|
|
||||||
RESearch();
|
|
||||||
~RESearch();
|
|
||||||
void Init();
|
|
||||||
void Clear();
|
|
||||||
bool GrabMatches(CharacterIndexer &ci);
|
|
||||||
void ChSet(char c);
|
|
||||||
void ChSetWithCase(char c, bool caseSensitive);
|
|
||||||
const char *Compile(const char *pat, int length, bool caseSensitive, bool posix);
|
|
||||||
int Execute(CharacterIndexer &ci, int lp, int endp);
|
|
||||||
void ModifyWord(char *s);
|
|
||||||
int Substitute(CharacterIndexer &ci, char *src, char *dst);
|
|
||||||
|
|
||||||
enum {MAXTAG=10};
|
|
||||||
enum {MAXNFA=2048};
|
|
||||||
enum {NOTFOUND=-1};
|
|
||||||
|
|
||||||
int bopat[MAXTAG];
|
|
||||||
int eopat[MAXTAG];
|
|
||||||
char *pat[MAXTAG];
|
|
||||||
|
|
||||||
private:
|
|
||||||
int PMatch(CharacterIndexer &ci, int lp, int endp, char *ap);
|
|
||||||
|
|
||||||
int bol;
|
|
||||||
int tagstk[MAXTAG]; /* subpat tag stack..*/
|
|
||||||
char nfa[MAXNFA]; /* automaton.. */
|
|
||||||
int sta;
|
|
||||||
char bittab[BITBLK]; /* bit table for CCL */
|
|
||||||
/* pre-set bits... */
|
|
||||||
int failure;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file SVector.h
|
|
||||||
** A simple expandable vector.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@hare.net.au>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef SVECTOR_H
|
|
||||||
#define SVECTOR_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple expandable integer vector.
|
|
||||||
* Storage not allocated for elements until an element is used.
|
|
||||||
* This makes it very lightweight unless used so is a good match for optional features.
|
|
||||||
*/
|
|
||||||
class SVector {
|
|
||||||
enum { allocSize = 4000 };
|
|
||||||
|
|
||||||
int *v; ///< The vector
|
|
||||||
unsigned int size; ///< Number of elements allocated
|
|
||||||
unsigned int len; ///< Number of elements used in vector
|
|
||||||
bool allocFailure; ///< A memory allocation call has failed
|
|
||||||
|
|
||||||
/** Internally allocate more elements than the user wants
|
|
||||||
* to avoid thrashing the memory allocator. */
|
|
||||||
void SizeTo(int newSize) {
|
|
||||||
if (newSize < allocSize)
|
|
||||||
newSize += allocSize;
|
|
||||||
else
|
|
||||||
newSize = (newSize * 3) / 2;
|
|
||||||
int* newv = new int[newSize];
|
|
||||||
if (!newv) {
|
|
||||||
allocFailure = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
size = newSize;
|
|
||||||
unsigned int i=0;
|
|
||||||
for (; i<len; i++) {
|
|
||||||
newv[i] = v[i];
|
|
||||||
}
|
|
||||||
for (; i<size; i++) {
|
|
||||||
newv[i] = 0;
|
|
||||||
}
|
|
||||||
delete []v;
|
|
||||||
v = newv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
SVector() {
|
|
||||||
allocFailure = false;
|
|
||||||
v = 0;
|
|
||||||
len = 0;
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
~SVector() {
|
|
||||||
Free();
|
|
||||||
}
|
|
||||||
/// Constructor from another vector.
|
|
||||||
SVector(const SVector &other) {
|
|
||||||
allocFailure = false;
|
|
||||||
v = 0;
|
|
||||||
len = 0;
|
|
||||||
size = 0;
|
|
||||||
if (other.Length() > 0) {
|
|
||||||
SizeTo(other.Length());
|
|
||||||
if (!allocFailure) {
|
|
||||||
for (int i=0;i<other.Length();i++)
|
|
||||||
v[i] = other.v[i];
|
|
||||||
len = other.Length();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// Copy constructor.
|
|
||||||
SVector &operator=(const SVector &other) {
|
|
||||||
if (this != &other) {
|
|
||||||
delete []v;
|
|
||||||
allocFailure = false;
|
|
||||||
v = 0;
|
|
||||||
len = 0;
|
|
||||||
size = 0;
|
|
||||||
if (other.Length() > 0) {
|
|
||||||
SizeTo(other.Length());
|
|
||||||
if (!allocFailure) {
|
|
||||||
for (int i=0;i<other.Length();i++)
|
|
||||||
v[i] = other.v[i];
|
|
||||||
}
|
|
||||||
len = other.Length();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/** @brief Accessor.
|
|
||||||
* Allows to access values from the list, and grows it if accessing
|
|
||||||
* outside the current bounds. The returned value in this case is 0. */
|
|
||||||
int &operator[](unsigned int i) {
|
|
||||||
if (i >= len) {
|
|
||||||
if (i >= size) {
|
|
||||||
SizeTo(i);
|
|
||||||
}
|
|
||||||
len = i+1;
|
|
||||||
}
|
|
||||||
return v[i];
|
|
||||||
}
|
|
||||||
/// Reset vector.
|
|
||||||
void Free() {
|
|
||||||
delete []v;
|
|
||||||
v = 0;
|
|
||||||
size = 0;
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
/** @brief Grow vector size.
|
|
||||||
* Doesn't allow a vector to be shrinked. */
|
|
||||||
void SetLength(unsigned int newLength) {
|
|
||||||
if (newLength > len) {
|
|
||||||
if (newLength >= size) {
|
|
||||||
SizeTo(newLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
len = newLength;
|
|
||||||
}
|
|
||||||
/// Get the current length (number of used elements) of the vector.
|
|
||||||
int Length() const {
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,642 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ScintillaBase.cxx
|
|
||||||
** An enhanced subclass of Editor with calltips, autocomplete and context menu.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "PropSet.h"
|
|
||||||
#ifdef SCI_LEXER
|
|
||||||
#include "SciLexer.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "DocumentAccessor.h"
|
|
||||||
#include "KeyWords.h"
|
|
||||||
#endif
|
|
||||||
#include "ContractionState.h"
|
|
||||||
#include "SVector.h"
|
|
||||||
#include "CellBuffer.h"
|
|
||||||
#include "CallTip.h"
|
|
||||||
#include "KeyMap.h"
|
|
||||||
#include "Indicator.h"
|
|
||||||
#include "XPM.h"
|
|
||||||
#include "LineMarker.h"
|
|
||||||
#include "Style.h"
|
|
||||||
#include "ViewStyle.h"
|
|
||||||
#include "AutoComplete.h"
|
|
||||||
#include "Document.h"
|
|
||||||
#include "Editor.h"
|
|
||||||
#include "ScintillaBase.h"
|
|
||||||
|
|
||||||
ScintillaBase::ScintillaBase() {
|
|
||||||
displayPopupMenu = true;
|
|
||||||
listType = 0;
|
|
||||||
#ifdef SCI_LEXER
|
|
||||||
lexLanguage = SCLEX_CONTAINER;
|
|
||||||
lexCurrent = 0;
|
|
||||||
for (int wl = 0;wl < numWordLists;wl++)
|
|
||||||
keyWordLists[wl] = new WordList;
|
|
||||||
keyWordLists[numWordLists] = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ScintillaBase::~ScintillaBase() {
|
|
||||||
#ifdef SCI_LEXER
|
|
||||||
for (int wl = 0;wl < numWordLists;wl++)
|
|
||||||
delete keyWordLists[wl];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::Finalise() {
|
|
||||||
Editor::Finalise();
|
|
||||||
popup.Destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::RefreshColourPalette(Palette &pal, bool want) {
|
|
||||||
Editor::RefreshColourPalette(pal, want);
|
|
||||||
ct.RefreshColourPalette(pal, want);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {
|
|
||||||
bool isFillUp = ac.Active() && ac.IsFillUpChar(*s);
|
|
||||||
if (!isFillUp) {
|
|
||||||
Editor::AddCharUTF(s, len, treatAsDBCS);
|
|
||||||
}
|
|
||||||
if (ac.Active()) {
|
|
||||||
AutoCompleteCharacterAdded(s[0]);
|
|
||||||
// For fill ups add the character after the autocompletion has
|
|
||||||
// triggered so containers see the key so can display a calltip.
|
|
||||||
if (isFillUp) {
|
|
||||||
Editor::AddCharUTF(s, len, treatAsDBCS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::Command(int cmdId) {
|
|
||||||
|
|
||||||
switch (cmdId) {
|
|
||||||
|
|
||||||
case idAutoComplete: // Nothing to do
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idCallTip: // Nothing to do
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idcmdUndo:
|
|
||||||
WndProc(SCI_UNDO, 0, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idcmdRedo:
|
|
||||||
WndProc(SCI_REDO, 0, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idcmdCut:
|
|
||||||
WndProc(SCI_CUT, 0, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idcmdCopy:
|
|
||||||
WndProc(SCI_COPY, 0, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idcmdPaste:
|
|
||||||
WndProc(SCI_PASTE, 0, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idcmdDelete:
|
|
||||||
WndProc(SCI_CLEAR, 0, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case idcmdSelectAll:
|
|
||||||
WndProc(SCI_SELECTALL, 0, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int ScintillaBase::KeyCommand(unsigned int iMessage) {
|
|
||||||
// Most key commands cancel autocompletion mode
|
|
||||||
if (ac.Active()) {
|
|
||||||
switch (iMessage) {
|
|
||||||
// Except for these
|
|
||||||
case SCI_LINEDOWN:
|
|
||||||
AutoCompleteMove(1);
|
|
||||||
return 0;
|
|
||||||
case SCI_LINEUP:
|
|
||||||
AutoCompleteMove( -1);
|
|
||||||
return 0;
|
|
||||||
case SCI_PAGEDOWN:
|
|
||||||
AutoCompleteMove(5);
|
|
||||||
return 0;
|
|
||||||
case SCI_PAGEUP:
|
|
||||||
AutoCompleteMove( -5);
|
|
||||||
return 0;
|
|
||||||
case SCI_VCHOME:
|
|
||||||
AutoCompleteMove( -5000);
|
|
||||||
return 0;
|
|
||||||
case SCI_LINEEND:
|
|
||||||
AutoCompleteMove(5000);
|
|
||||||
return 0;
|
|
||||||
case SCI_DELETEBACK:
|
|
||||||
DelCharBack(true);
|
|
||||||
AutoCompleteCharacterDeleted();
|
|
||||||
EnsureCaretVisible();
|
|
||||||
return 0;
|
|
||||||
case SCI_DELETEBACKNOTLINE:
|
|
||||||
DelCharBack(false);
|
|
||||||
AutoCompleteCharacterDeleted();
|
|
||||||
EnsureCaretVisible();
|
|
||||||
return 0;
|
|
||||||
case SCI_TAB:
|
|
||||||
AutoCompleteCompleted();
|
|
||||||
return 0;
|
|
||||||
case SCI_NEWLINE:
|
|
||||||
AutoCompleteCompleted();
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ac.Cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ct.inCallTipMode) {
|
|
||||||
if (
|
|
||||||
(iMessage != SCI_CHARLEFT) &&
|
|
||||||
(iMessage != SCI_CHARLEFTEXTEND) &&
|
|
||||||
(iMessage != SCI_CHARRIGHT) &&
|
|
||||||
(iMessage != SCI_CHARLEFTEXTEND) &&
|
|
||||||
(iMessage != SCI_EDITTOGGLEOVERTYPE) &&
|
|
||||||
(iMessage != SCI_DELETEBACK) &&
|
|
||||||
(iMessage != SCI_DELETEBACKNOTLINE)
|
|
||||||
) {
|
|
||||||
ct.CallTipCancel();
|
|
||||||
}
|
|
||||||
if ((iMessage == SCI_DELETEBACK) || (iMessage == SCI_DELETEBACKNOTLINE)) {
|
|
||||||
if (currentPos <= ct.posStartCallTip) {
|
|
||||||
ct.CallTipCancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Editor::KeyCommand(iMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteDoubleClick(void* p) {
|
|
||||||
ScintillaBase* sci = reinterpret_cast<ScintillaBase*>(p);
|
|
||||||
sci->AutoCompleteCompleted();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
|
|
||||||
//Platform::DebugPrintf("AutoComplete %s\n", list);
|
|
||||||
ct.CallTipCancel();
|
|
||||||
|
|
||||||
if (ac.chooseSingle && (listType == 0)) {
|
|
||||||
if (list && !strchr(list, ac.GetSeparator())) {
|
|
||||||
const char *typeSep = strchr(list, ac.GetTypesep());
|
|
||||||
size_t lenInsert = (typeSep) ? (typeSep-list) : strlen(list);
|
|
||||||
if (ac.ignoreCase) {
|
|
||||||
SetEmptySelection(currentPos - lenEntered);
|
|
||||||
pdoc->DeleteChars(currentPos, lenEntered);
|
|
||||||
SetEmptySelection(currentPos);
|
|
||||||
pdoc->InsertString(currentPos, list, lenInsert);
|
|
||||||
SetEmptySelection(currentPos + lenInsert);
|
|
||||||
} else {
|
|
||||||
SetEmptySelection(currentPos);
|
|
||||||
pdoc->InsertString(currentPos, list + lenEntered, lenInsert - lenEntered);
|
|
||||||
SetEmptySelection(currentPos + lenInsert - lenEntered);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ac.Start(wMain, idAutoComplete, currentPos, lenEntered, vs.lineHeight, IsUnicodeMode());
|
|
||||||
|
|
||||||
PRectangle rcClient = GetClientRectangle();
|
|
||||||
Point pt = LocationFromPosition(currentPos - lenEntered);
|
|
||||||
|
|
||||||
int heightLB = 100;
|
|
||||||
int widthLB = 100;
|
|
||||||
if (pt.x >= rcClient.right - widthLB) {
|
|
||||||
HorizontalScrollTo(xOffset + pt.x - rcClient.right + widthLB);
|
|
||||||
Redraw();
|
|
||||||
pt = LocationFromPosition(currentPos);
|
|
||||||
}
|
|
||||||
PRectangle rcac;
|
|
||||||
rcac.left = pt.x - ac.lb->CaretFromEdge();
|
|
||||||
if (pt.y >= rcClient.bottom - heightLB && // Wont fit below.
|
|
||||||
pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
|
|
||||||
rcac.top = pt.y - heightLB;
|
|
||||||
if (rcac.top < 0) {
|
|
||||||
heightLB += rcac.top;
|
|
||||||
rcac.top = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rcac.top = pt.y + vs.lineHeight;
|
|
||||||
}
|
|
||||||
rcac.right = rcac.left + widthLB;
|
|
||||||
rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcClient.bottom);
|
|
||||||
ac.lb->SetPositionRelative(rcac, wMain);
|
|
||||||
ac.lb->SetFont(vs.styles[STYLE_DEFAULT].font);
|
|
||||||
ac.lb->SetAverageCharWidth(vs.styles[STYLE_DEFAULT].aveCharWidth);
|
|
||||||
ac.lb->SetDoubleClickAction(AutoCompleteDoubleClick, this);
|
|
||||||
|
|
||||||
ac.SetList(list);
|
|
||||||
|
|
||||||
// Fiddle the position of the list so it is right next to the target and wide enough for all its strings
|
|
||||||
PRectangle rcList = ac.lb->GetDesiredRect();
|
|
||||||
int heightAlloced = rcList.bottom - rcList.top;
|
|
||||||
widthLB = Platform::Maximum(widthLB, rcList.right - rcList.left);
|
|
||||||
// Make an allowance for large strings in list
|
|
||||||
rcList.left = pt.x - ac.lb->CaretFromEdge();
|
|
||||||
rcList.right = rcList.left + widthLB;
|
|
||||||
if (((pt.y + vs.lineHeight) >= (rcClient.bottom - heightAlloced)) && // Wont fit below.
|
|
||||||
((pt.y + vs.lineHeight / 2) >= (rcClient.bottom + rcClient.top) / 2)) { // and there is more room above.
|
|
||||||
rcList.top = pt.y - heightAlloced;
|
|
||||||
} else {
|
|
||||||
rcList.top = pt.y + vs.lineHeight;
|
|
||||||
}
|
|
||||||
rcList.bottom = rcList.top + heightAlloced;
|
|
||||||
ac.lb->SetPositionRelative(rcList, wMain);
|
|
||||||
ac.Show();
|
|
||||||
if (lenEntered != 0) {
|
|
||||||
AutoCompleteMoveToCurrentWord();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteCancel() {
|
|
||||||
ac.Cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteMove(int delta) {
|
|
||||||
ac.Move(delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteMoveToCurrentWord() {
|
|
||||||
char wordCurrent[1000];
|
|
||||||
int i;
|
|
||||||
int startWord = ac.posStart - ac.startLen;
|
|
||||||
for (i = startWord; i < currentPos; i++)
|
|
||||||
wordCurrent[i - startWord] = pdoc->CharAt(i);
|
|
||||||
wordCurrent[i - startWord] = '\0';
|
|
||||||
ac.Select(wordCurrent);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteCharacterAdded(char ch) {
|
|
||||||
if (ac.IsFillUpChar(ch)) {
|
|
||||||
AutoCompleteCompleted();
|
|
||||||
} else if (ac.IsStopChar(ch)) {
|
|
||||||
ac.Cancel();
|
|
||||||
} else {
|
|
||||||
AutoCompleteMoveToCurrentWord();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteCharacterDeleted() {
|
|
||||||
if (currentPos <= ac.posStart - ac.startLen) {
|
|
||||||
ac.Cancel();
|
|
||||||
} else if (ac.cancelAtStartPos && (currentPos <= ac.posStart)) {
|
|
||||||
ac.Cancel();
|
|
||||||
} else {
|
|
||||||
AutoCompleteMoveToCurrentWord();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::AutoCompleteCompleted() {
|
|
||||||
int item = ac.lb->GetSelection();
|
|
||||||
char selected[1000];
|
|
||||||
selected[0] = '\0';
|
|
||||||
if (item != -1) {
|
|
||||||
ac.lb->GetValue(item, selected, sizeof(selected));
|
|
||||||
}
|
|
||||||
ac.Cancel();
|
|
||||||
|
|
||||||
if (listType > 0) {
|
|
||||||
userListSelected = selected;
|
|
||||||
SCNotification scn;
|
|
||||||
scn.nmhdr.code = SCN_USERLISTSELECTION;
|
|
||||||
scn.message = 0;
|
|
||||||
scn.wParam = listType;
|
|
||||||
scn.listType = listType;
|
|
||||||
scn.lParam = 0;
|
|
||||||
scn.text = userListSelected.c_str();
|
|
||||||
NotifyParent(scn);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Position firstPos = ac.posStart - ac.startLen;
|
|
||||||
Position endPos = currentPos;
|
|
||||||
if (ac.dropRestOfWord)
|
|
||||||
endPos = pdoc->ExtendWordSelect(endPos, 1, true);
|
|
||||||
if (endPos < firstPos)
|
|
||||||
return;
|
|
||||||
pdoc->BeginUndoAction();
|
|
||||||
if (endPos != firstPos) {
|
|
||||||
pdoc->DeleteChars(firstPos, endPos - firstPos);
|
|
||||||
}
|
|
||||||
SetEmptySelection(ac.posStart);
|
|
||||||
if (item != -1) {
|
|
||||||
SString piece = selected;
|
|
||||||
pdoc->InsertString(firstPos, piece.c_str());
|
|
||||||
SetEmptySelection(firstPos + static_cast<int>(piece.length()));
|
|
||||||
}
|
|
||||||
pdoc->EndUndoAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
int ScintillaBase::AutoCompleteGetCurrent() {
|
|
||||||
return ac.lb->GetSelection();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::CallTipShow(Point pt, const char *defn) {
|
|
||||||
AutoCompleteCancel();
|
|
||||||
pt.y += vs.lineHeight;
|
|
||||||
PRectangle rc = ct.CallTipStart(currentPos, pt,
|
|
||||||
defn,
|
|
||||||
vs.styles[STYLE_DEFAULT].fontName,
|
|
||||||
vs.styles[STYLE_DEFAULT].sizeZoomed,
|
|
||||||
IsUnicodeMode(),
|
|
||||||
wMain);
|
|
||||||
// If the call-tip window would be out of the client
|
|
||||||
// space, adjust so it displays above the text.
|
|
||||||
PRectangle rcClient = GetClientRectangle();
|
|
||||||
if (rc.bottom > rcClient.bottom) {
|
|
||||||
int offset = vs.lineHeight + rc.Height();
|
|
||||||
rc.top -= offset;
|
|
||||||
rc.bottom -= offset;
|
|
||||||
}
|
|
||||||
// Now display the window.
|
|
||||||
CreateCallTipWindow(rc);
|
|
||||||
ct.wCallTip.SetPositionRelative(rc, wMain);
|
|
||||||
ct.wCallTip.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::CallTipClick() {
|
|
||||||
SCNotification scn;
|
|
||||||
scn.nmhdr.code = SCN_CALLTIPCLICK;
|
|
||||||
scn.position = ct.clickPlace;
|
|
||||||
NotifyParent(scn);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::ContextMenu(Point pt) {
|
|
||||||
if (displayPopupMenu) {
|
|
||||||
bool writable = !WndProc(SCI_GETREADONLY, 0, 0);
|
|
||||||
popup.CreatePopUp();
|
|
||||||
AddToPopUp("Undo", idcmdUndo, writable && pdoc->CanUndo());
|
|
||||||
AddToPopUp("Redo", idcmdRedo, writable && pdoc->CanRedo());
|
|
||||||
AddToPopUp("");
|
|
||||||
AddToPopUp("Cut", idcmdCut, writable && currentPos != anchor);
|
|
||||||
AddToPopUp("Copy", idcmdCopy, currentPos != anchor);
|
|
||||||
AddToPopUp("Paste", idcmdPaste, writable && WndProc(SCI_CANPASTE, 0, 0));
|
|
||||||
AddToPopUp("Delete", idcmdDelete, writable && currentPos != anchor);
|
|
||||||
AddToPopUp("");
|
|
||||||
AddToPopUp("Select All", idcmdSelectAll);
|
|
||||||
popup.Show(pt, wMain);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::CancelModes() {
|
|
||||||
AutoCompleteCancel();
|
|
||||||
ct.CallTipCancel();
|
|
||||||
Editor::CancelModes();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
|
|
||||||
CancelModes();
|
|
||||||
Editor::ButtonDown(pt, curTime, shift, ctrl, alt);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SCI_LEXER
|
|
||||||
void ScintillaBase::SetLexer(uptr_t wParam) {
|
|
||||||
lexLanguage = wParam;
|
|
||||||
lexCurrent = LexerModule::Find(lexLanguage);
|
|
||||||
if (!lexCurrent)
|
|
||||||
lexCurrent = LexerModule::Find(SCLEX_NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::SetLexerLanguage(const char *languageName) {
|
|
||||||
lexLanguage = SCLEX_CONTAINER;
|
|
||||||
lexCurrent = LexerModule::Find(languageName);
|
|
||||||
if (!lexCurrent)
|
|
||||||
lexCurrent = LexerModule::Find(SCLEX_NULL);
|
|
||||||
if (lexCurrent)
|
|
||||||
lexLanguage = lexCurrent->GetLanguage();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaBase::Colourise(int start, int end) {
|
|
||||||
int lengthDoc = pdoc->Length();
|
|
||||||
if (end == -1)
|
|
||||||
end = lengthDoc;
|
|
||||||
int len = end - start;
|
|
||||||
|
|
||||||
PLATFORM_ASSERT(len >= 0);
|
|
||||||
PLATFORM_ASSERT(start + len <= lengthDoc);
|
|
||||||
|
|
||||||
//WindowAccessor styler(wMain.GetID(), props);
|
|
||||||
DocumentAccessor styler(pdoc, props, wMain.GetID());
|
|
||||||
|
|
||||||
int styleStart = 0;
|
|
||||||
if (start > 0)
|
|
||||||
styleStart = styler.StyleAt(start - 1);
|
|
||||||
styler.SetCodePage(pdoc->dbcsCodePage);
|
|
||||||
|
|
||||||
if (lexCurrent && (len > 0)) { // Should always succeed as null lexer should always be available
|
|
||||||
lexCurrent->Lex(start, len, styleStart, keyWordLists, styler);
|
|
||||||
styler.Flush();
|
|
||||||
if (styler.GetPropertyInt("fold")) {
|
|
||||||
lexCurrent->Fold(start, len, styleStart, keyWordLists, styler);
|
|
||||||
styler.Flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) {
|
|
||||||
#ifdef SCI_LEXER
|
|
||||||
if (lexLanguage != SCLEX_CONTAINER) {
|
|
||||||
int endStyled = WndProc(SCI_GETENDSTYLED, 0, 0);
|
|
||||||
int lineEndStyled = WndProc(SCI_LINEFROMPOSITION, endStyled, 0);
|
|
||||||
endStyled = WndProc(SCI_POSITIONFROMLINE, lineEndStyled, 0);
|
|
||||||
Colourise(endStyled, endStyleNeeded);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
Editor::NotifyStyleToNeeded(endStyleNeeded);
|
|
||||||
}
|
|
||||||
|
|
||||||
sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
|
|
||||||
switch (iMessage) {
|
|
||||||
case SCI_AUTOCSHOW:
|
|
||||||
listType = 0;
|
|
||||||
AutoCompleteStart(wParam, reinterpret_cast<const char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCCANCEL:
|
|
||||||
AutoCompleteCancel();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCACTIVE:
|
|
||||||
return ac.Active();
|
|
||||||
|
|
||||||
case SCI_AUTOCPOSSTART:
|
|
||||||
return ac.posStart;
|
|
||||||
|
|
||||||
case SCI_AUTOCCOMPLETE:
|
|
||||||
AutoCompleteCompleted();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCSETSEPARATOR:
|
|
||||||
ac.SetSeparator(static_cast<char>(wParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETSEPARATOR:
|
|
||||||
return ac.GetSeparator();
|
|
||||||
|
|
||||||
case SCI_AUTOCSTOPS:
|
|
||||||
ac.SetStopChars(reinterpret_cast<char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCSELECT:
|
|
||||||
ac.Select(reinterpret_cast<char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETCURRENT:
|
|
||||||
return AutoCompleteGetCurrent();
|
|
||||||
|
|
||||||
case SCI_AUTOCSETCANCELATSTART:
|
|
||||||
ac.cancelAtStartPos = wParam != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETCANCELATSTART:
|
|
||||||
return ac.cancelAtStartPos;
|
|
||||||
|
|
||||||
case SCI_AUTOCSETFILLUPS:
|
|
||||||
ac.SetFillUpChars(reinterpret_cast<char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCSETCHOOSESINGLE:
|
|
||||||
ac.chooseSingle = wParam != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETCHOOSESINGLE:
|
|
||||||
return ac.chooseSingle;
|
|
||||||
|
|
||||||
case SCI_AUTOCSETIGNORECASE:
|
|
||||||
ac.ignoreCase = wParam != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETIGNORECASE:
|
|
||||||
return ac.ignoreCase;
|
|
||||||
|
|
||||||
case SCI_USERLISTSHOW:
|
|
||||||
listType = wParam;
|
|
||||||
AutoCompleteStart(0, reinterpret_cast<const char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCSETAUTOHIDE:
|
|
||||||
ac.autoHide = wParam != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETAUTOHIDE:
|
|
||||||
return ac.autoHide;
|
|
||||||
|
|
||||||
case SCI_AUTOCSETDROPRESTOFWORD:
|
|
||||||
ac.dropRestOfWord = wParam != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETDROPRESTOFWORD:
|
|
||||||
return ac.dropRestOfWord;
|
|
||||||
|
|
||||||
case SCI_REGISTERIMAGE:
|
|
||||||
ac.lb->RegisterImage(wParam, reinterpret_cast<const char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_CLEARREGISTEREDIMAGES:
|
|
||||||
ac.lb->ClearRegisteredImages();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCSETTYPESEPARATOR:
|
|
||||||
ac.SetTypesep(static_cast<char>(wParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_AUTOCGETTYPESEPARATOR:
|
|
||||||
return ac.GetTypesep();
|
|
||||||
|
|
||||||
case SCI_CALLTIPSHOW:
|
|
||||||
CallTipShow(LocationFromPosition(wParam),
|
|
||||||
reinterpret_cast<const char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_CALLTIPCANCEL:
|
|
||||||
ct.CallTipCancel();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_CALLTIPACTIVE:
|
|
||||||
return ct.inCallTipMode;
|
|
||||||
|
|
||||||
case SCI_CALLTIPPOSSTART:
|
|
||||||
return ct.posStartCallTip;
|
|
||||||
|
|
||||||
case SCI_CALLTIPSETHLT:
|
|
||||||
ct.SetHighlight(wParam, lParam);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_CALLTIPSETBACK:
|
|
||||||
ct.colourBG = ColourDesired(wParam);
|
|
||||||
InvalidateStyleRedraw();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_CALLTIPSETFORE:
|
|
||||||
ct.colourUnSel = ColourDesired(wParam);
|
|
||||||
InvalidateStyleRedraw();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_CALLTIPSETFOREHLT:
|
|
||||||
ct.colourSel = ColourDesired(wParam);
|
|
||||||
InvalidateStyleRedraw();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_USEPOPUP:
|
|
||||||
displayPopupMenu = wParam != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef SCI_LEXER
|
|
||||||
case SCI_SETLEXER:
|
|
||||||
SetLexer(wParam);
|
|
||||||
lexLanguage = wParam;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_GETLEXER:
|
|
||||||
return lexLanguage;
|
|
||||||
|
|
||||||
case SCI_COLOURISE:
|
|
||||||
Colourise(wParam, lParam);
|
|
||||||
Redraw();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_SETPROPERTY:
|
|
||||||
props.Set(reinterpret_cast<const char *>(wParam),
|
|
||||||
reinterpret_cast<const char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_SETKEYWORDS:
|
|
||||||
if (wParam < numWordLists) {
|
|
||||||
keyWordLists[wParam]->Clear();
|
|
||||||
keyWordLists[wParam]->Set(reinterpret_cast<const char *>(lParam));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCI_SETLEXERLANGUAGE:
|
|
||||||
SetLexerLanguage(reinterpret_cast<const char *>(lParam));
|
|
||||||
break;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
return Editor::WndProc(iMessage, wParam, lParam);
|
|
||||||
}
|
|
||||||
return 0l;
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ScintillaBase.h
|
|
||||||
** Defines an enhanced subclass of Editor with calltips, autocomplete and context menu.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef SCINTILLABASE_H
|
|
||||||
#define SCINTILLABASE_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class ScintillaBase : public Editor {
|
|
||||||
// Private so ScintillaBase objects can not be copied
|
|
||||||
ScintillaBase(const ScintillaBase &) : Editor() {}
|
|
||||||
ScintillaBase &operator=(const ScintillaBase &) { return *this; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/** Enumeration of commands and child windows. */
|
|
||||||
enum {
|
|
||||||
idCallTip=1,
|
|
||||||
idAutoComplete=2,
|
|
||||||
|
|
||||||
idcmdUndo=10,
|
|
||||||
idcmdRedo=11,
|
|
||||||
idcmdCut=12,
|
|
||||||
idcmdCopy=13,
|
|
||||||
idcmdPaste=14,
|
|
||||||
idcmdDelete=15,
|
|
||||||
idcmdSelectAll=16
|
|
||||||
};
|
|
||||||
|
|
||||||
bool displayPopupMenu;
|
|
||||||
Menu popup;
|
|
||||||
AutoComplete ac;
|
|
||||||
|
|
||||||
CallTip ct;
|
|
||||||
|
|
||||||
int listType; ///< 0 is an autocomplete list
|
|
||||||
SString userListSelected; ///< Receives listbox selected string
|
|
||||||
|
|
||||||
#ifdef SCI_LEXER
|
|
||||||
int lexLanguage;
|
|
||||||
const LexerModule *lexCurrent;
|
|
||||||
PropSet props;
|
|
||||||
enum {numWordLists=KEYWORDSET_MAX+1};
|
|
||||||
WordList *keyWordLists[numWordLists+1];
|
|
||||||
void SetLexer(uptr_t wParam);
|
|
||||||
void SetLexerLanguage(const char *languageName);
|
|
||||||
void Colourise(int start, int end);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ScintillaBase();
|
|
||||||
virtual ~ScintillaBase();
|
|
||||||
virtual void Initialise() = 0;
|
|
||||||
virtual void Finalise() = 0;
|
|
||||||
|
|
||||||
virtual void RefreshColourPalette(Palette &pal, bool want);
|
|
||||||
|
|
||||||
virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false);
|
|
||||||
void Command(int cmdId);
|
|
||||||
virtual void CancelModes();
|
|
||||||
virtual int KeyCommand(unsigned int iMessage);
|
|
||||||
|
|
||||||
void AutoCompleteStart(int lenEntered, const char *list);
|
|
||||||
void AutoCompleteCancel();
|
|
||||||
void AutoCompleteMove(int delta);
|
|
||||||
int AutoCompleteGetCurrent();
|
|
||||||
void AutoCompleteCharacterAdded(char ch);
|
|
||||||
void AutoCompleteCharacterDeleted();
|
|
||||||
void AutoCompleteCompleted();
|
|
||||||
void AutoCompleteMoveToCurrentWord();
|
|
||||||
static void AutoCompleteDoubleClick(void* p);
|
|
||||||
|
|
||||||
void CallTipClick();
|
|
||||||
void CallTipShow(Point pt, const char *defn);
|
|
||||||
virtual void CreateCallTipWindow(PRectangle rc) = 0;
|
|
||||||
|
|
||||||
virtual void AddToPopUp(const char *label, int cmd=0, bool enabled=true) = 0;
|
|
||||||
void ContextMenu(Point pt);
|
|
||||||
|
|
||||||
virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
|
|
||||||
|
|
||||||
virtual void NotifyStyleToNeeded(int endStyleNeeded);
|
|
||||||
public:
|
|
||||||
// Public so scintilla_send_message can use it
|
|
||||||
virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Style.cxx
|
|
||||||
** Defines the font and colour style for a class of text.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "Style.h"
|
|
||||||
|
|
||||||
Style::Style() {
|
|
||||||
aliasOfDefaultFont = true;
|
|
||||||
Clear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),
|
|
||||||
Platform::DefaultFontSize(), 0, SC_CHARSET_DEFAULT,
|
|
||||||
false, false, false, false, caseMixed, true, true, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
Style::Style(const Style &source) {
|
|
||||||
Clear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),
|
|
||||||
0, 0, 0,
|
|
||||||
false, false, false, false, caseMixed, true, true, false);
|
|
||||||
fore.desired = source.fore.desired;
|
|
||||||
back.desired = source.back.desired;
|
|
||||||
characterSet = source.characterSet;
|
|
||||||
bold = source.bold;
|
|
||||||
italic = source.italic;
|
|
||||||
size = source.size;
|
|
||||||
eolFilled = source.eolFilled;
|
|
||||||
underline = source.underline;
|
|
||||||
caseForce = source.caseForce;
|
|
||||||
visible = source.visible;
|
|
||||||
changeable = source.changeable;
|
|
||||||
hotspot = source.hotspot;
|
|
||||||
}
|
|
||||||
|
|
||||||
Style::~Style() {
|
|
||||||
if (aliasOfDefaultFont)
|
|
||||||
font.SetID(0);
|
|
||||||
else
|
|
||||||
font.Release();
|
|
||||||
aliasOfDefaultFont = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Style &Style::operator=(const Style &source) {
|
|
||||||
if (this == &source)
|
|
||||||
return * this;
|
|
||||||
Clear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),
|
|
||||||
0, 0, SC_CHARSET_DEFAULT,
|
|
||||||
false, false, false, false, caseMixed, true, true, false);
|
|
||||||
fore.desired = source.fore.desired;
|
|
||||||
back.desired = source.back.desired;
|
|
||||||
characterSet = source.characterSet;
|
|
||||||
bold = source.bold;
|
|
||||||
italic = source.italic;
|
|
||||||
size = source.size;
|
|
||||||
eolFilled = source.eolFilled;
|
|
||||||
underline = source.underline;
|
|
||||||
caseForce = source.caseForce;
|
|
||||||
visible = source.visible;
|
|
||||||
changeable = source.changeable;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Style::Clear(ColourDesired fore_, ColourDesired back_, int size_,
|
|
||||||
const char *fontName_, int characterSet_,
|
|
||||||
bool bold_, bool italic_, bool eolFilled_,
|
|
||||||
bool underline_, ecaseForced caseForce_,
|
|
||||||
bool visible_, bool changeable_, bool hotspot_) {
|
|
||||||
fore.desired = fore_;
|
|
||||||
back.desired = back_;
|
|
||||||
characterSet = characterSet_;
|
|
||||||
bold = bold_;
|
|
||||||
italic = italic_;
|
|
||||||
size = size_;
|
|
||||||
fontName = fontName_;
|
|
||||||
eolFilled = eolFilled_;
|
|
||||||
underline = underline_;
|
|
||||||
caseForce = caseForce_;
|
|
||||||
visible = visible_;
|
|
||||||
changeable = changeable_;
|
|
||||||
hotspot = hotspot_;
|
|
||||||
if (aliasOfDefaultFont)
|
|
||||||
font.SetID(0);
|
|
||||||
else
|
|
||||||
font.Release();
|
|
||||||
aliasOfDefaultFont = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Style::ClearTo(const Style &source) {
|
|
||||||
Clear(
|
|
||||||
source.fore.desired,
|
|
||||||
source.back.desired,
|
|
||||||
source.size,
|
|
||||||
source.fontName,
|
|
||||||
source.characterSet,
|
|
||||||
source.bold,
|
|
||||||
source.italic,
|
|
||||||
source.eolFilled,
|
|
||||||
source.underline,
|
|
||||||
source.caseForce,
|
|
||||||
source.visible,
|
|
||||||
source.changeable,
|
|
||||||
source.hotspot);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Style::EquivalentFontTo(const Style *other) const {
|
|
||||||
if (bold != other->bold ||
|
|
||||||
italic != other->italic ||
|
|
||||||
size != other->size ||
|
|
||||||
characterSet != other->characterSet)
|
|
||||||
return false;
|
|
||||||
if (fontName == other->fontName)
|
|
||||||
return true;
|
|
||||||
if (!fontName)
|
|
||||||
return false;
|
|
||||||
if (!other->fontName)
|
|
||||||
return false;
|
|
||||||
return strcmp(fontName, other->fontName) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Style::Realise(Surface &surface, int zoomLevel, Style *defaultStyle) {
|
|
||||||
sizeZoomed = size + zoomLevel;
|
|
||||||
if (sizeZoomed <= 2) // Hangs if sizeZoomed <= 1
|
|
||||||
sizeZoomed = 2;
|
|
||||||
|
|
||||||
if (aliasOfDefaultFont)
|
|
||||||
font.SetID(0);
|
|
||||||
else
|
|
||||||
font.Release();
|
|
||||||
int deviceHeight = surface.DeviceHeightFont(sizeZoomed);
|
|
||||||
aliasOfDefaultFont = defaultStyle &&
|
|
||||||
(EquivalentFontTo(defaultStyle) || !fontName);
|
|
||||||
if (aliasOfDefaultFont) {
|
|
||||||
font.SetID(defaultStyle->font.GetID());
|
|
||||||
} else if (fontName) {
|
|
||||||
font.Create(fontName, characterSet, deviceHeight, bold, italic);
|
|
||||||
} else {
|
|
||||||
font.SetID(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ascent = surface.Ascent(font);
|
|
||||||
descent = surface.Descent(font);
|
|
||||||
// Probably more typographically correct to include leading
|
|
||||||
// but that means more complex drawing as leading must be erased
|
|
||||||
//lineHeight = surface.ExternalLeading() + surface.Height();
|
|
||||||
externalLeading = surface.ExternalLeading(font);
|
|
||||||
lineHeight = surface.Height(font);
|
|
||||||
aveCharWidth = surface.AverageCharWidth(font);
|
|
||||||
spaceWidth = surface.WidthChar(font, ' ');
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Style.h
|
|
||||||
** Defines the font and colour style for a class of text.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef STYLE_H
|
|
||||||
#define STYLE_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class Style {
|
|
||||||
public:
|
|
||||||
ColourPair fore;
|
|
||||||
ColourPair back;
|
|
||||||
bool aliasOfDefaultFont;
|
|
||||||
bool bold;
|
|
||||||
bool italic;
|
|
||||||
int size;
|
|
||||||
const char *fontName;
|
|
||||||
int characterSet;
|
|
||||||
bool eolFilled;
|
|
||||||
bool underline;
|
|
||||||
enum ecaseForced {caseMixed, caseUpper, caseLower};
|
|
||||||
ecaseForced caseForce;
|
|
||||||
bool visible;
|
|
||||||
bool changeable;
|
|
||||||
bool hotspot;
|
|
||||||
|
|
||||||
Font font;
|
|
||||||
int sizeZoomed;
|
|
||||||
unsigned int lineHeight;
|
|
||||||
unsigned int ascent;
|
|
||||||
unsigned int descent;
|
|
||||||
unsigned int externalLeading;
|
|
||||||
unsigned int aveCharWidth;
|
|
||||||
unsigned int spaceWidth;
|
|
||||||
|
|
||||||
Style();
|
|
||||||
Style(const Style &source);
|
|
||||||
~Style();
|
|
||||||
Style &operator=(const Style &source);
|
|
||||||
void Clear(ColourDesired fore_, ColourDesired back_,
|
|
||||||
int size_,
|
|
||||||
const char *fontName_, int characterSet_,
|
|
||||||
bool bold_, bool italic_, bool eolFilled_,
|
|
||||||
bool underline_, ecaseForced caseForce_,
|
|
||||||
bool visible_, bool changeable_, bool hotspot_);
|
|
||||||
void ClearTo(const Style &source);
|
|
||||||
bool EquivalentFontTo(const Style *other) const;
|
|
||||||
void Realise(Surface &surface, int zoomLevel, Style *defaultStyle = 0);
|
|
||||||
bool IsProtected() const { return !(changeable && visible);};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file StyleContext.cxx
|
|
||||||
** Lexer infrastructure.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// This file is in the public domain.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "StyleContext.h"
|
|
||||||
|
|
||||||
static void getRange(unsigned int start,
|
|
||||||
unsigned int end,
|
|
||||||
Accessor &styler,
|
|
||||||
char *s,
|
|
||||||
unsigned int len) {
|
|
||||||
unsigned int i = 0;
|
|
||||||
while ((i < end - start + 1) && (i < len-1)) {
|
|
||||||
s[i] = styler[start + i];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
s[i] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
void StyleContext::GetCurrent(char *s, unsigned int len) {
|
|
||||||
getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void getRangeLowered(unsigned int start,
|
|
||||||
unsigned int end,
|
|
||||||
Accessor &styler,
|
|
||||||
char *s,
|
|
||||||
unsigned int len) {
|
|
||||||
unsigned int i = 0;
|
|
||||||
while ((i < end - start + 1) && (i < len-1)) {
|
|
||||||
s[i] = static_cast<char>(tolower(styler[start + i]));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
s[i] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
void StyleContext::GetCurrentLowered(char *s, unsigned int len) {
|
|
||||||
getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
|
|
||||||
}
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file StyleContext.cxx
|
|
||||||
** Lexer infrastructure.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// This file is in the public domain.
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
unsigned int endPos;
|
|
||||||
StyleContext& operator=(const StyleContext&) {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
void GetNextChar(unsigned int pos) {
|
|
||||||
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
|
|
||||||
if (styler.IsLeadByte(static_cast<char>(chNext))) {
|
|
||||||
chNext = chNext << 8;
|
|
||||||
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
|
|
||||||
}
|
|
||||||
// End of line?
|
|
||||||
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win)
|
|
||||||
// or on LF alone (Unix). Avoid triggering two times on Dos/Win.
|
|
||||||
atLineEnd = (ch == '\r' && chNext != '\n') ||
|
|
||||||
(ch == '\n') ||
|
|
||||||
(currentPos >= endPos);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
unsigned int currentPos;
|
|
||||||
bool atLineStart;
|
|
||||||
bool atLineEnd;
|
|
||||||
int state;
|
|
||||||
int chPrev;
|
|
||||||
int ch;
|
|
||||||
int chNext;
|
|
||||||
|
|
||||||
StyleContext(unsigned int startPos, unsigned int length,
|
|
||||||
int initStyle, Accessor &styler_, char chMask=31) :
|
|
||||||
styler(styler_),
|
|
||||||
endPos(startPos + length),
|
|
||||||
currentPos(startPos),
|
|
||||||
atLineStart(true),
|
|
||||||
atLineEnd(false),
|
|
||||||
state(initStyle),
|
|
||||||
chPrev(0),
|
|
||||||
ch(0),
|
|
||||||
chNext(0) {
|
|
||||||
styler.StartAt(startPos, chMask);
|
|
||||||
styler.StartSegment(startPos);
|
|
||||||
unsigned int pos = currentPos;
|
|
||||||
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
|
|
||||||
if (styler.IsLeadByte(static_cast<char>(ch))) {
|
|
||||||
pos++;
|
|
||||||
ch = ch << 8;
|
|
||||||
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
|
|
||||||
}
|
|
||||||
GetNextChar(pos);
|
|
||||||
}
|
|
||||||
void Complete() {
|
|
||||||
styler.ColourTo(currentPos - 1, state);
|
|
||||||
}
|
|
||||||
bool More() {
|
|
||||||
return currentPos < endPos;
|
|
||||||
}
|
|
||||||
void Forward() {
|
|
||||||
if (currentPos < endPos) {
|
|
||||||
atLineStart = atLineEnd;
|
|
||||||
chPrev = ch;
|
|
||||||
currentPos++;
|
|
||||||
if (ch >= 0x100)
|
|
||||||
currentPos++;
|
|
||||||
ch = chNext;
|
|
||||||
GetNextChar(currentPos + ((ch >= 0x100) ? 1 : 0));
|
|
||||||
} else {
|
|
||||||
atLineStart = false;
|
|
||||||
chPrev = ' ';
|
|
||||||
ch = ' ';
|
|
||||||
chNext = ' ';
|
|
||||||
atLineEnd = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void Forward(int nb) {
|
|
||||||
for (int i = 0; i < nb; i++) {
|
|
||||||
Forward();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void ChangeState(int state_) {
|
|
||||||
state = state_;
|
|
||||||
}
|
|
||||||
void SetState(int state_) {
|
|
||||||
styler.ColourTo(currentPos - 1, state);
|
|
||||||
state = state_;
|
|
||||||
}
|
|
||||||
void ForwardSetState(int state_) {
|
|
||||||
Forward();
|
|
||||||
styler.ColourTo(currentPos - 1, state);
|
|
||||||
state = state_;
|
|
||||||
}
|
|
||||||
int LengthCurrent() {
|
|
||||||
return currentPos - styler.GetStartSegment();
|
|
||||||
}
|
|
||||||
int GetRelative(int n) {
|
|
||||||
return styler.SafeGetCharAt(currentPos+n);
|
|
||||||
}
|
|
||||||
bool Match(char ch0) {
|
|
||||||
return ch == ch0;
|
|
||||||
}
|
|
||||||
bool Match(char ch0, char ch1) {
|
|
||||||
return (ch == ch0) && (chNext == ch1);
|
|
||||||
}
|
|
||||||
bool Match(const char *s) {
|
|
||||||
if (ch != *s)
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
if (chNext != *s)
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
for (int n=2; *s; n++) {
|
|
||||||
if (*s != styler.SafeGetCharAt(currentPos+n))
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
bool MatchIgnoreCase(const char *s) {
|
|
||||||
if (tolower(ch) != *s)
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
if (tolower(chNext) != *s)
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
for (int n=2; *s; n++) {
|
|
||||||
if (*s != tolower((styler.SafeGetCharAt(currentPos+n))))
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// Non-inline
|
|
||||||
void GetCurrent(char *s, unsigned int len);
|
|
||||||
void GetCurrentLowered(char *s, unsigned int len);
|
|
||||||
};
|
|
||||||
|
|
||||||
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');
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file UniConversion.cxx
|
|
||||||
** Functions to handle UFT-8 and UCS-2 strings.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "UniConversion.h"
|
|
||||||
|
|
||||||
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen) {
|
|
||||||
unsigned int len = 0;
|
|
||||||
for (unsigned int i = 0; i < tlen && uptr[i]; i++) {
|
|
||||||
unsigned int uch = uptr[i];
|
|
||||||
if (uch < 0x80)
|
|
||||||
len++;
|
|
||||||
else if (uch < 0x800)
|
|
||||||
len+=2;
|
|
||||||
else
|
|
||||||
len +=3;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UTF8FromUCS2(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len) {
|
|
||||||
int k = 0;
|
|
||||||
for (unsigned int i = 0; i < tlen && uptr[i]; i++) {
|
|
||||||
unsigned int uch = uptr[i];
|
|
||||||
if (uch < 0x80) {
|
|
||||||
putf[k++] = static_cast<char>(uch);
|
|
||||||
} else if (uch < 0x800) {
|
|
||||||
putf[k++] = static_cast<char>(0xC0 | (uch >> 6));
|
|
||||||
putf[k++] = static_cast<char>(0x80 | (uch & 0x3f));
|
|
||||||
} else {
|
|
||||||
putf[k++] = static_cast<char>(0xE0 | (uch >> 12));
|
|
||||||
putf[k++] = static_cast<char>(0x80 | ((uch >> 6) & 0x3f));
|
|
||||||
putf[k++] = static_cast<char>(0x80 | (uch & 0x3f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
putf[len] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int UCS2Length(const char *s, unsigned int len) {
|
|
||||||
unsigned int ulen = 0;
|
|
||||||
for (unsigned int i=0;i<len;i++) {
|
|
||||||
unsigned char ch = static_cast<unsigned char>(s[i]);
|
|
||||||
if ((ch < 0x80) || (ch > (0x80 + 0x40)))
|
|
||||||
ulen++;
|
|
||||||
}
|
|
||||||
return ulen;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int UCS2FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen) {
|
|
||||||
unsigned int ui=0;
|
|
||||||
const unsigned char *us = reinterpret_cast<const unsigned char *>(s);
|
|
||||||
unsigned int i=0;
|
|
||||||
while ((i<len) && (ui<tlen)) {
|
|
||||||
unsigned char ch = us[i++];
|
|
||||||
if (ch < 0x80) {
|
|
||||||
tbuf[ui] = ch;
|
|
||||||
} else if (ch < 0x80 + 0x40 + 0x20) {
|
|
||||||
tbuf[ui] = static_cast<wchar_t>((ch & 0x1F) << 6);
|
|
||||||
ch = us[i++];
|
|
||||||
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));
|
|
||||||
} else {
|
|
||||||
tbuf[ui] = static_cast<wchar_t>((ch & 0xF) << 12);
|
|
||||||
ch = us[i++];
|
|
||||||
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + ((ch & 0x7F) << 6));
|
|
||||||
ch = us[i++];
|
|
||||||
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));
|
|
||||||
}
|
|
||||||
ui++;
|
|
||||||
}
|
|
||||||
return ui;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file UniConversion.h
|
|
||||||
** Functions to handle UFT-8 and UCS-2 strings.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen);
|
|
||||||
void UTF8FromUCS2(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len);
|
|
||||||
unsigned int UCS2Length(const char *s, unsigned int len);
|
|
||||||
unsigned int UCS2FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen);
|
|
||||||
|
|
||||||
@@ -1,286 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ViewStyle.cxx
|
|
||||||
** Store information on how the document is to be viewed.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "Scintilla.h"
|
|
||||||
#include "Indicator.h"
|
|
||||||
#include "XPM.h"
|
|
||||||
#include "LineMarker.h"
|
|
||||||
#include "Style.h"
|
|
||||||
#include "ViewStyle.h"
|
|
||||||
|
|
||||||
MarginStyle::MarginStyle() :
|
|
||||||
symbol(false), width(16), mask(0xffffffff), sensitive(false) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of the fontnames - avoids wasting space in each style
|
|
||||||
FontNames::FontNames() {
|
|
||||||
max = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FontNames::~FontNames() {
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FontNames::Clear() {
|
|
||||||
for (int i=0;i<max;i++) {
|
|
||||||
delete []names[i];
|
|
||||||
}
|
|
||||||
max = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *FontNames::Save(const char *name) {
|
|
||||||
if (!name)
|
|
||||||
return 0;
|
|
||||||
for (int i=0;i<max;i++) {
|
|
||||||
if (strcmp(names[i], name) == 0) {
|
|
||||||
return names[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
names[max] = new char[strlen(name) + 1];
|
|
||||||
strcpy(names[max], name);
|
|
||||||
max++;
|
|
||||||
return names[max-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
ViewStyle::ViewStyle() {
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
ViewStyle::ViewStyle(const ViewStyle &source) {
|
|
||||||
Init();
|
|
||||||
for (unsigned int sty=0;sty<(sizeof(styles)/sizeof(styles[0]));sty++) {
|
|
||||||
styles[sty] = source.styles[sty];
|
|
||||||
// Can't just copy fontname as its lifetime is relative to its owning ViewStyle
|
|
||||||
styles[sty].fontName = fontNames.Save(source.styles[sty].fontName);
|
|
||||||
}
|
|
||||||
for (int mrk=0;mrk<=MARKER_MAX;mrk++) {
|
|
||||||
markers[mrk] = source.markers[mrk];
|
|
||||||
}
|
|
||||||
for (int ind=0;ind<=INDIC_MAX;ind++) {
|
|
||||||
indicators[ind] = source.indicators[ind];
|
|
||||||
}
|
|
||||||
|
|
||||||
selforeset = source.selforeset;
|
|
||||||
selforeground.desired = source.selforeground.desired;
|
|
||||||
selbackset = source.selbackset;
|
|
||||||
selbackground.desired = source.selbackground.desired;
|
|
||||||
selbackground2.desired = source.selbackground2.desired;
|
|
||||||
|
|
||||||
foldmarginColourSet = source.foldmarginColourSet;
|
|
||||||
foldmarginColour.desired = source.foldmarginColour.desired;
|
|
||||||
foldmarginHighlightColourSet = source.foldmarginHighlightColourSet;
|
|
||||||
foldmarginHighlightColour.desired = source.foldmarginHighlightColour.desired;
|
|
||||||
|
|
||||||
hotspotForegroundSet = source.hotspotForegroundSet;
|
|
||||||
hotspotForeground.desired = source.hotspotForeground.desired;
|
|
||||||
hotspotBackgroundSet = source.hotspotBackgroundSet;
|
|
||||||
hotspotBackground.desired = source.hotspotBackground.desired;
|
|
||||||
hotspotUnderline = source.hotspotUnderline;
|
|
||||||
hotspotSingleLine = source.hotspotSingleLine;
|
|
||||||
|
|
||||||
whitespaceForegroundSet = source.whitespaceForegroundSet;
|
|
||||||
whitespaceForeground.desired = source.whitespaceForeground.desired;
|
|
||||||
whitespaceBackgroundSet = source.whitespaceBackgroundSet;
|
|
||||||
whitespaceBackground.desired = source.whitespaceBackground.desired;
|
|
||||||
selbar.desired = source.selbar.desired;
|
|
||||||
selbarlight.desired = source.selbarlight.desired;
|
|
||||||
caretcolour.desired = source.caretcolour.desired;
|
|
||||||
showCaretLineBackground = source.showCaretLineBackground;
|
|
||||||
caretLineBackground.desired = source.caretLineBackground.desired;
|
|
||||||
edgecolour.desired = source.edgecolour.desired;
|
|
||||||
edgeState = source.edgeState;
|
|
||||||
caretWidth = source.caretWidth;
|
|
||||||
leftMarginWidth = source.leftMarginWidth;
|
|
||||||
rightMarginWidth = source.rightMarginWidth;
|
|
||||||
for (int i=0;i < margins; i++) {
|
|
||||||
ms[i] = source.ms[i];
|
|
||||||
}
|
|
||||||
symbolMargin = source.symbolMargin;
|
|
||||||
maskInLine = source.maskInLine;
|
|
||||||
fixedColumnWidth = source.fixedColumnWidth;
|
|
||||||
zoomLevel = source.zoomLevel;
|
|
||||||
viewWhitespace = source.viewWhitespace;
|
|
||||||
viewIndentationGuides = source.viewIndentationGuides;
|
|
||||||
viewEOL = source.viewEOL;
|
|
||||||
showMarkedLines = source.showMarkedLines;
|
|
||||||
}
|
|
||||||
|
|
||||||
ViewStyle::~ViewStyle() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewStyle::Init() {
|
|
||||||
fontNames.Clear();
|
|
||||||
ResetDefaultStyle();
|
|
||||||
|
|
||||||
indicators[0].style = INDIC_SQUIGGLE;
|
|
||||||
indicators[0].fore = ColourDesired(0, 0x7f, 0);
|
|
||||||
indicators[1].style = INDIC_TT;
|
|
||||||
indicators[1].fore = ColourDesired(0, 0, 0xff);
|
|
||||||
indicators[2].style = INDIC_PLAIN;
|
|
||||||
indicators[2].fore = ColourDesired(0xff, 0, 0);
|
|
||||||
|
|
||||||
lineHeight = 1;
|
|
||||||
maxAscent = 1;
|
|
||||||
maxDescent = 1;
|
|
||||||
aveCharWidth = 8;
|
|
||||||
spaceWidth = 8;
|
|
||||||
|
|
||||||
selforeset = false;
|
|
||||||
selforeground.desired = ColourDesired(0xff, 0, 0);
|
|
||||||
selbackset = true;
|
|
||||||
selbackground.desired = ColourDesired(0xc0, 0xc0, 0xc0);
|
|
||||||
selbackground2.desired = ColourDesired(0xb0, 0xb0, 0xb0);
|
|
||||||
|
|
||||||
foldmarginColourSet = false;
|
|
||||||
foldmarginColour.desired = ColourDesired(0xff, 0, 0);
|
|
||||||
foldmarginHighlightColourSet = false;
|
|
||||||
foldmarginHighlightColour.desired = ColourDesired(0xc0, 0xc0, 0xc0);
|
|
||||||
|
|
||||||
whitespaceForegroundSet = false;
|
|
||||||
whitespaceForeground.desired = ColourDesired(0, 0, 0);
|
|
||||||
whitespaceBackgroundSet = false;
|
|
||||||
whitespaceBackground.desired = ColourDesired(0xff, 0xff, 0xff);
|
|
||||||
selbar.desired = Platform::Chrome();
|
|
||||||
selbarlight.desired = Platform::ChromeHighlight();
|
|
||||||
styles[STYLE_LINENUMBER].fore.desired = ColourDesired(0, 0, 0);
|
|
||||||
styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
|
|
||||||
caretcolour.desired = ColourDesired(0, 0, 0);
|
|
||||||
showCaretLineBackground = false;
|
|
||||||
caretLineBackground.desired = ColourDesired(0xff, 0xff, 0);
|
|
||||||
edgecolour.desired = ColourDesired(0xc0, 0xc0, 0xc0);
|
|
||||||
edgeState = EDGE_NONE;
|
|
||||||
caretWidth = 1;
|
|
||||||
someStylesProtected = false;
|
|
||||||
|
|
||||||
hotspotForegroundSet = false;
|
|
||||||
hotspotForeground.desired = ColourDesired(0, 0, 0xff);
|
|
||||||
hotspotBackgroundSet = false;
|
|
||||||
hotspotBackground.desired = ColourDesired(0xff, 0xff, 0xff);
|
|
||||||
hotspotUnderline = true;
|
|
||||||
hotspotSingleLine = true;
|
|
||||||
|
|
||||||
leftMarginWidth = 1;
|
|
||||||
rightMarginWidth = 1;
|
|
||||||
ms[0].symbol = false;
|
|
||||||
ms[0].width = 0;
|
|
||||||
ms[0].mask = 0;
|
|
||||||
ms[1].symbol = true;
|
|
||||||
ms[1].width = 16;
|
|
||||||
ms[1].mask = ~SC_MASK_FOLDERS;
|
|
||||||
ms[2].symbol = true;
|
|
||||||
ms[2].width = 0;
|
|
||||||
ms[2].mask = 0;
|
|
||||||
fixedColumnWidth = leftMarginWidth;
|
|
||||||
symbolMargin = false;
|
|
||||||
maskInLine = 0xffffffff;
|
|
||||||
for (int margin=0; margin < margins; margin++) {
|
|
||||||
fixedColumnWidth += ms[margin].width;
|
|
||||||
symbolMargin = symbolMargin || ms[margin].symbol;
|
|
||||||
if (ms[margin].width > 0)
|
|
||||||
maskInLine &= ~ms[margin].mask;
|
|
||||||
}
|
|
||||||
zoomLevel = 0;
|
|
||||||
viewWhitespace = wsInvisible;
|
|
||||||
viewIndentationGuides = false;
|
|
||||||
viewEOL = false;
|
|
||||||
showMarkedLines = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
|
|
||||||
unsigned int i;
|
|
||||||
for (i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
|
|
||||||
pal.WantFind(styles[i].fore, want);
|
|
||||||
pal.WantFind(styles[i].back, want);
|
|
||||||
}
|
|
||||||
for (i=0;i<(sizeof(indicators)/sizeof(indicators[0]));i++) {
|
|
||||||
pal.WantFind(indicators[i].fore, want);
|
|
||||||
}
|
|
||||||
for (i=0;i<(sizeof(markers)/sizeof(markers[0]));i++) {
|
|
||||||
markers[i].RefreshColourPalette(pal, want);
|
|
||||||
}
|
|
||||||
pal.WantFind(selforeground, want);
|
|
||||||
pal.WantFind(selbackground, want);
|
|
||||||
pal.WantFind(selbackground2, want);
|
|
||||||
|
|
||||||
pal.WantFind(foldmarginColour, want);
|
|
||||||
pal.WantFind(foldmarginHighlightColour, want);
|
|
||||||
|
|
||||||
pal.WantFind(whitespaceForeground, want);
|
|
||||||
pal.WantFind(whitespaceBackground, want);
|
|
||||||
pal.WantFind(selbar, want);
|
|
||||||
pal.WantFind(selbarlight, want);
|
|
||||||
pal.WantFind(caretcolour, want);
|
|
||||||
pal.WantFind(caretLineBackground, want);
|
|
||||||
pal.WantFind(edgecolour, want);
|
|
||||||
pal.WantFind(hotspotForeground, want);
|
|
||||||
pal.WantFind(hotspotBackground, want);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewStyle::Refresh(Surface &surface) {
|
|
||||||
selbar.desired = Platform::Chrome();
|
|
||||||
selbarlight.desired = Platform::ChromeHighlight();
|
|
||||||
styles[STYLE_DEFAULT].Realise(surface, zoomLevel);
|
|
||||||
maxAscent = styles[STYLE_DEFAULT].ascent;
|
|
||||||
maxDescent = styles[STYLE_DEFAULT].descent;
|
|
||||||
someStylesProtected = false;
|
|
||||||
for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
|
|
||||||
if (i != STYLE_DEFAULT) {
|
|
||||||
styles[i].Realise(surface, zoomLevel, &styles[STYLE_DEFAULT]);
|
|
||||||
if (maxAscent < styles[i].ascent)
|
|
||||||
maxAscent = styles[i].ascent;
|
|
||||||
if (maxDescent < styles[i].descent)
|
|
||||||
maxDescent = styles[i].descent;
|
|
||||||
}
|
|
||||||
if (styles[i].IsProtected()) {
|
|
||||||
someStylesProtected = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lineHeight = maxAscent + maxDescent;
|
|
||||||
aveCharWidth = styles[STYLE_DEFAULT].aveCharWidth;
|
|
||||||
spaceWidth = styles[STYLE_DEFAULT].spaceWidth;
|
|
||||||
|
|
||||||
fixedColumnWidth = leftMarginWidth;
|
|
||||||
symbolMargin = false;
|
|
||||||
maskInLine = 0xffffffff;
|
|
||||||
for (int margin=0; margin < margins; margin++) {
|
|
||||||
fixedColumnWidth += ms[margin].width;
|
|
||||||
symbolMargin = symbolMargin || ms[margin].symbol;
|
|
||||||
if (ms[margin].width > 0)
|
|
||||||
maskInLine &= ~ms[margin].mask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewStyle::ResetDefaultStyle() {
|
|
||||||
styles[STYLE_DEFAULT].Clear(ColourDesired(0,0,0),
|
|
||||||
ColourDesired(0xff,0xff,0xff),
|
|
||||||
Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),
|
|
||||||
SC_CHARSET_DEFAULT,
|
|
||||||
false, false, false, false, Style::caseMixed, true, true, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewStyle::ClearStyles() {
|
|
||||||
// Reset all styles to be like the default style
|
|
||||||
for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
|
|
||||||
if (i != STYLE_DEFAULT) {
|
|
||||||
styles[i].ClearTo(styles[STYLE_DEFAULT]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {
|
|
||||||
styles[styleIndex].fontName = fontNames.Save(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ViewStyle::ProtectionActive() const {
|
|
||||||
return someStylesProtected;
|
|
||||||
}
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ViewStyle.h
|
|
||||||
** Store information on how the document is to be viewed.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef VIEWSTYLE_H
|
|
||||||
#define VIEWSTYLE_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class MarginStyle {
|
|
||||||
public:
|
|
||||||
bool symbol;
|
|
||||||
int width;
|
|
||||||
int mask;
|
|
||||||
bool sensitive;
|
|
||||||
MarginStyle();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class FontNames {
|
|
||||||
private:
|
|
||||||
char *names[STYLE_MAX + 1];
|
|
||||||
int max;
|
|
||||||
|
|
||||||
public:
|
|
||||||
FontNames();
|
|
||||||
~FontNames();
|
|
||||||
void Clear();
|
|
||||||
const char *Save(const char *name);
|
|
||||||
};
|
|
||||||
|
|
||||||
enum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterIndent=2};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class ViewStyle {
|
|
||||||
public:
|
|
||||||
FontNames fontNames;
|
|
||||||
Style styles[STYLE_MAX + 1];
|
|
||||||
LineMarker markers[MARKER_MAX + 1];
|
|
||||||
Indicator indicators[INDIC_MAX + 1];
|
|
||||||
int lineHeight;
|
|
||||||
unsigned int maxAscent;
|
|
||||||
unsigned int maxDescent;
|
|
||||||
unsigned int aveCharWidth;
|
|
||||||
unsigned int spaceWidth;
|
|
||||||
bool selforeset;
|
|
||||||
ColourPair selforeground;
|
|
||||||
bool selbackset;
|
|
||||||
ColourPair selbackground;
|
|
||||||
ColourPair selbackground2;
|
|
||||||
bool whitespaceForegroundSet;
|
|
||||||
ColourPair whitespaceForeground;
|
|
||||||
bool whitespaceBackgroundSet;
|
|
||||||
ColourPair whitespaceBackground;
|
|
||||||
ColourPair selbar;
|
|
||||||
ColourPair selbarlight;
|
|
||||||
bool foldmarginColourSet;
|
|
||||||
ColourPair foldmarginColour;
|
|
||||||
bool foldmarginHighlightColourSet;
|
|
||||||
ColourPair foldmarginHighlightColour;
|
|
||||||
bool hotspotForegroundSet;
|
|
||||||
ColourPair hotspotForeground;
|
|
||||||
bool hotspotBackgroundSet;
|
|
||||||
ColourPair hotspotBackground;
|
|
||||||
bool hotspotUnderline;
|
|
||||||
bool hotspotSingleLine;
|
|
||||||
/// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
|
|
||||||
enum { margins=3 };
|
|
||||||
int leftMarginWidth; ///< Spacing margin on left of text
|
|
||||||
int rightMarginWidth; ///< Spacing margin on left of text
|
|
||||||
bool symbolMargin;
|
|
||||||
int maskInLine; ///< Mask for markers to be put into text because there is nowhere for them to go in margin
|
|
||||||
MarginStyle ms[margins];
|
|
||||||
int fixedColumnWidth;
|
|
||||||
int zoomLevel;
|
|
||||||
WhiteSpaceVisibility viewWhitespace;
|
|
||||||
bool viewIndentationGuides;
|
|
||||||
bool viewEOL;
|
|
||||||
bool showMarkedLines;
|
|
||||||
ColourPair caretcolour;
|
|
||||||
bool showCaretLineBackground;
|
|
||||||
ColourPair caretLineBackground;
|
|
||||||
ColourPair edgecolour;
|
|
||||||
int edgeState;
|
|
||||||
int caretWidth;
|
|
||||||
bool someStylesProtected;
|
|
||||||
|
|
||||||
ViewStyle();
|
|
||||||
ViewStyle(const ViewStyle &source);
|
|
||||||
~ViewStyle();
|
|
||||||
void Init();
|
|
||||||
void RefreshColourPalette(Palette &pal, bool want);
|
|
||||||
void Refresh(Surface &surface);
|
|
||||||
void ResetDefaultStyle();
|
|
||||||
void ClearStyles();
|
|
||||||
void SetStyleFontName(int styleIndex, const char *name);
|
|
||||||
bool ProtectionActive() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file WindowAccessor.cxx
|
|
||||||
** Rapid easy access to contents of a Scintilla.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "PropSet.h"
|
|
||||||
#include "Accessor.h"
|
|
||||||
#include "WindowAccessor.h"
|
|
||||||
#include "Scintilla.h"
|
|
||||||
|
|
||||||
WindowAccessor::~WindowAccessor() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WindowAccessor::InternalIsLeadByte(char ch) {
|
|
||||||
if (SC_CP_UTF8 == codePage)
|
|
||||||
// For lexing, all characters >= 0x80 are treated the
|
|
||||||
// same so none is considered a lead byte.
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return Platform::IsDBCSLeadByte(codePage, ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowAccessor::Fill(int position) {
|
|
||||||
if (lenDoc == -1)
|
|
||||||
lenDoc = Platform::SendScintilla(id, SCI_GETTEXTLENGTH, 0, 0);
|
|
||||||
startPos = position - slopSize;
|
|
||||||
if (startPos + bufferSize > lenDoc)
|
|
||||||
startPos = lenDoc - bufferSize;
|
|
||||||
if (startPos < 0)
|
|
||||||
startPos = 0;
|
|
||||||
endPos = startPos + bufferSize;
|
|
||||||
if (endPos > lenDoc)
|
|
||||||
endPos = lenDoc;
|
|
||||||
|
|
||||||
TextRange tr = {{startPos, endPos}, buf};
|
|
||||||
Platform::SendScintillaPointer(id, SCI_GETTEXTRANGE, 0, &tr);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WindowAccessor::Match(int pos, const char *s) {
|
|
||||||
for (int i=0; *s; i++) {
|
|
||||||
if (*s != SafeGetCharAt(pos+i))
|
|
||||||
return false;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
char WindowAccessor::StyleAt(int position) {
|
|
||||||
return static_cast<char>(Platform::SendScintilla(
|
|
||||||
id, SCI_GETSTYLEAT, position, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
int WindowAccessor::GetLine(int position) {
|
|
||||||
return Platform::SendScintilla(id, SCI_LINEFROMPOSITION, position, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int WindowAccessor::LineStart(int line) {
|
|
||||||
return Platform::SendScintilla(id, SCI_POSITIONFROMLINE, line, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int WindowAccessor::LevelAt(int line) {
|
|
||||||
return Platform::SendScintilla(id, SCI_GETFOLDLEVEL, line, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int WindowAccessor::Length() {
|
|
||||||
if (lenDoc == -1)
|
|
||||||
lenDoc = Platform::SendScintilla(id, SCI_GETTEXTLENGTH, 0, 0);
|
|
||||||
return lenDoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int WindowAccessor::GetLineState(int line) {
|
|
||||||
return Platform::SendScintilla(id, SCI_GETLINESTATE, line);
|
|
||||||
}
|
|
||||||
|
|
||||||
int WindowAccessor::SetLineState(int line, int state) {
|
|
||||||
return Platform::SendScintilla(id, SCI_SETLINESTATE, line, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowAccessor::StartAt(unsigned int start, char chMask) {
|
|
||||||
Platform::SendScintilla(id, SCI_STARTSTYLING, start, chMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowAccessor::StartSegment(unsigned int pos) {
|
|
||||||
startSeg = pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowAccessor::ColourTo(unsigned int pos, int chAttr) {
|
|
||||||
// Only perform styling if non empty range
|
|
||||||
if (pos != startSeg - 1) {
|
|
||||||
if (pos < startSeg) {
|
|
||||||
Platform::DebugPrintf("Bad colour positions %d - %d\n", startSeg, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (validLen + (pos - startSeg + 1) >= bufferSize)
|
|
||||||
Flush();
|
|
||||||
if (validLen + (pos - startSeg + 1) >= bufferSize) {
|
|
||||||
// Too big for buffer so send directly
|
|
||||||
Platform::SendScintilla(id, SCI_SETSTYLING, pos - startSeg + 1, chAttr);
|
|
||||||
} else {
|
|
||||||
if (chAttr != chWhile)
|
|
||||||
chFlags = 0;
|
|
||||||
chAttr |= chFlags;
|
|
||||||
for (unsigned int i = startSeg; i <= pos; i++) {
|
|
||||||
styleBuf[validLen++] = static_cast<char>(chAttr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
startSeg = pos+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowAccessor::SetLevel(int line, int level) {
|
|
||||||
Platform::SendScintilla(id, SCI_SETFOLDLEVEL, line, level);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowAccessor::Flush() {
|
|
||||||
startPos = extremePosition;
|
|
||||||
lenDoc = -1;
|
|
||||||
if (validLen > 0) {
|
|
||||||
Platform::SendScintillaPointer(id, SCI_SETSTYLINGEX, validLen,
|
|
||||||
styleBuf);
|
|
||||||
validLen = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int WindowAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
|
|
||||||
int end = Length();
|
|
||||||
int spaceFlags = 0;
|
|
||||||
|
|
||||||
// Determines the indentation level of the current line and also checks for consistent
|
|
||||||
// indentation compared to the previous line.
|
|
||||||
// Indentation is judged consistent when the indentation whitespace of each line lines
|
|
||||||
// the same or the indentation of one line is a prefix of the other.
|
|
||||||
|
|
||||||
int pos = LineStart(line);
|
|
||||||
char ch = (*this)[pos];
|
|
||||||
int indent = 0;
|
|
||||||
bool inPrevPrefix = line > 0;
|
|
||||||
int posPrev = inPrevPrefix ? LineStart(line-1) : 0;
|
|
||||||
while ((ch == ' ' || ch == '\t') && (pos < end)) {
|
|
||||||
if (inPrevPrefix) {
|
|
||||||
char chPrev = (*this)[posPrev++];
|
|
||||||
if (chPrev == ' ' || chPrev == '\t') {
|
|
||||||
if (chPrev != ch)
|
|
||||||
spaceFlags |= wsInconsistent;
|
|
||||||
} else {
|
|
||||||
inPrevPrefix = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ch == ' ') {
|
|
||||||
spaceFlags |= wsSpace;
|
|
||||||
indent++;
|
|
||||||
} else { // Tab
|
|
||||||
spaceFlags |= wsTab;
|
|
||||||
if (spaceFlags & wsSpace)
|
|
||||||
spaceFlags |= wsSpaceTab;
|
|
||||||
indent = (indent / 8 + 1) * 8;
|
|
||||||
}
|
|
||||||
ch = (*this)[++pos];
|
|
||||||
}
|
|
||||||
|
|
||||||
*flags = spaceFlags;
|
|
||||||
indent += SC_FOLDLEVELBASE;
|
|
||||||
// if completely empty line or the start of a comment...
|
|
||||||
if (isspace(ch) || (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
|
|
||||||
return indent | SC_FOLDLEVELWHITEFLAG;
|
|
||||||
else
|
|
||||||
return indent;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,297 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file XPM.cxx
|
|
||||||
** Define a class that holds data in the X Pixmap (XPM) format.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "Platform.h"
|
|
||||||
|
|
||||||
#include "XPM.h"
|
|
||||||
|
|
||||||
static const char *NextField(const char *s) {
|
|
||||||
while (*s && *s != ' ') {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
while (*s && *s == ' ') {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Data lines in XPM can be terminated either with NUL or "
|
|
||||||
static size_t MeasureLength(const char *s) {
|
|
||||||
size_t i = 0;
|
|
||||||
while (s[i] && (s[i] != '\"'))
|
|
||||||
i++;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
ColourAllocated XPM::ColourFromCode(int ch) {
|
|
||||||
return colourCodeTable[ch]->allocated;
|
|
||||||
#ifdef SLOW
|
|
||||||
for (int i=0; i<nColours; i++) {
|
|
||||||
if (codes[i] == ch) {
|
|
||||||
return colours[i].allocated;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return colours[0].allocated;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPM::FillRun(Surface *surface, int code, int startX, int y, int x) {
|
|
||||||
if ((code != codeTransparent) && (startX != x)) {
|
|
||||||
PRectangle rc(startX, y, x, y+1);
|
|
||||||
surface->FillRectangle(rc, ColourFromCode(code));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XPM::XPM(const char *textForm) :
|
|
||||||
data(0), codes(0), colours(0), lines(0) {
|
|
||||||
Init(textForm);
|
|
||||||
}
|
|
||||||
|
|
||||||
XPM::XPM(const char * const *linesForm) :
|
|
||||||
data(0), codes(0), colours(0), lines(0) {
|
|
||||||
Init(linesForm);
|
|
||||||
}
|
|
||||||
|
|
||||||
XPM::~XPM() {
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPM::Init(const char *textForm) {
|
|
||||||
Clear();
|
|
||||||
// Test done is two parts to avoid possibility of overstepping the memory
|
|
||||||
// if memcmp implemented strangely. Must be 4 bytes at least at destination.
|
|
||||||
if ((0 == memcmp(textForm, "/* X", 4)) && (0 == memcmp(textForm, "/* XPM */", 9))) {
|
|
||||||
// Build the lines form out of the text form
|
|
||||||
const char **linesForm = LinesFormFromTextForm(textForm);
|
|
||||||
Init(linesForm);
|
|
||||||
delete []linesForm;
|
|
||||||
} else {
|
|
||||||
// It is really in line form
|
|
||||||
Init(reinterpret_cast<const char * const *>(textForm));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPM::Init(const char * const *linesForm) {
|
|
||||||
Clear();
|
|
||||||
height = 1;
|
|
||||||
width = 1;
|
|
||||||
nColours = 1;
|
|
||||||
data = NULL;
|
|
||||||
codeTransparent = ' ';
|
|
||||||
codes = NULL;
|
|
||||||
colours = NULL;
|
|
||||||
lines = NULL;
|
|
||||||
if (!linesForm)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const char *line0 = linesForm[0];
|
|
||||||
width = atoi(line0);
|
|
||||||
line0 = NextField(line0);
|
|
||||||
height = atoi(line0);
|
|
||||||
line0 = NextField(line0);
|
|
||||||
nColours = atoi(line0);
|
|
||||||
codes = new char[nColours];
|
|
||||||
colours = new ColourPair[nColours];
|
|
||||||
|
|
||||||
int strings = 1+height+nColours;
|
|
||||||
lines = new char *[strings];
|
|
||||||
size_t allocation = 0;
|
|
||||||
for (int i=0; i<strings; i++) {
|
|
||||||
allocation += MeasureLength(linesForm[i]) + 1;
|
|
||||||
}
|
|
||||||
data = new char[allocation];
|
|
||||||
char *nextBit = data;
|
|
||||||
for (int j=0; j<strings; j++) {
|
|
||||||
lines[j] = nextBit;
|
|
||||||
size_t len = MeasureLength(linesForm[j]);
|
|
||||||
memcpy(nextBit, linesForm[j], len);
|
|
||||||
nextBit += len;
|
|
||||||
*nextBit++ = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int code=0; code<256; code++) {
|
|
||||||
colourCodeTable[code] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int c=0; c<nColours; c++) {
|
|
||||||
const char *colourDef = linesForm[c+1];
|
|
||||||
codes[c] = colourDef[0];
|
|
||||||
colourDef += 4;
|
|
||||||
if (*colourDef == '#') {
|
|
||||||
colours[c].desired.Set(colourDef);
|
|
||||||
} else {
|
|
||||||
colours[c].desired = ColourDesired(0xff, 0xff, 0xff);
|
|
||||||
codeTransparent = codes[c];
|
|
||||||
}
|
|
||||||
colourCodeTable[static_cast<unsigned char>(codes[c])] = &(colours[c]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPM::Clear() {
|
|
||||||
delete []data;
|
|
||||||
data = 0;
|
|
||||||
delete []codes;
|
|
||||||
codes = 0;
|
|
||||||
delete []colours;
|
|
||||||
colours = 0;
|
|
||||||
delete []lines;
|
|
||||||
lines = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPM::RefreshColourPalette(Palette &pal, bool want) {
|
|
||||||
if (!data || !codes || !colours || !lines) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i=0; i<nColours; i++) {
|
|
||||||
pal.WantFind(colours[i], want);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPM::CopyDesiredColours() {
|
|
||||||
if (!data || !codes || !colours || !lines) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i=0; i<nColours; i++) {
|
|
||||||
colours[i].Copy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPM::Draw(Surface *surface, PRectangle &rc) {
|
|
||||||
if (!data || !codes || !colours || !lines) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Centre the pixmap
|
|
||||||
int startY = rc.top + (rc.Height() - height) / 2;
|
|
||||||
int startX = rc.left + (rc.Width() - width) / 2;
|
|
||||||
for (int y=0;y<height;y++) {
|
|
||||||
int prevCode = 0;
|
|
||||||
int xStartRun = 0;
|
|
||||||
for (int x=0; x<width; x++) {
|
|
||||||
int code = lines[y+nColours+1][x];
|
|
||||||
if (code != prevCode) {
|
|
||||||
FillRun(surface, prevCode, startX + xStartRun, startY + y, startX + x);
|
|
||||||
xStartRun = x;
|
|
||||||
prevCode = code;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FillRun(surface, prevCode, startX + xStartRun, startY + y, startX + width);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char **XPM::LinesFormFromTextForm(const char *textForm) {
|
|
||||||
// Build the lines form out of the text form
|
|
||||||
const char **linesForm = 0;
|
|
||||||
int countQuotes = 0;
|
|
||||||
int strings=1;
|
|
||||||
for (int j=0; countQuotes < (2*strings); j++) {
|
|
||||||
if (textForm[j] == '\"') {
|
|
||||||
if (countQuotes == 0) {
|
|
||||||
const char *line0 = textForm + j + 1;
|
|
||||||
// Skip width
|
|
||||||
line0 = NextField(line0);
|
|
||||||
// Add 1 line for each pixel of height
|
|
||||||
strings += atoi(line0);
|
|
||||||
line0 = NextField(line0);
|
|
||||||
// Add 1 line for each colour
|
|
||||||
strings += atoi(line0);
|
|
||||||
linesForm = new const char *[strings];
|
|
||||||
}
|
|
||||||
if (linesForm && ((countQuotes & 1) == 0)) {
|
|
||||||
linesForm[countQuotes / 2] = textForm + j + 1;
|
|
||||||
}
|
|
||||||
countQuotes++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return linesForm;
|
|
||||||
}
|
|
||||||
|
|
||||||
// In future, may want to minimize search time by sorting and using a binary search.
|
|
||||||
|
|
||||||
XPMSet::XPMSet() : set(0), len(0), maximum(0), height(-1), width(-1) {
|
|
||||||
}
|
|
||||||
|
|
||||||
XPMSet::~XPMSet() {
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPMSet::Clear() {
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
delete set[i];
|
|
||||||
}
|
|
||||||
delete []set;
|
|
||||||
set = 0;
|
|
||||||
len = 0;
|
|
||||||
maximum = 0;
|
|
||||||
height = -1;
|
|
||||||
width = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void XPMSet::Add(int id, const char *textForm) {
|
|
||||||
// Invalidate cached dimensions
|
|
||||||
height = -1;
|
|
||||||
width = -1;
|
|
||||||
|
|
||||||
// Replace if this id already present
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
if (set[i]->GetId() == id) {
|
|
||||||
set[i]->Init(textForm);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not present, so add to end
|
|
||||||
XPM *pxpm = new XPM(textForm);
|
|
||||||
if (pxpm) {
|
|
||||||
pxpm->SetId(id);
|
|
||||||
pxpm->CopyDesiredColours();
|
|
||||||
if (len == maximum) {
|
|
||||||
maximum += 64;
|
|
||||||
XPM **setNew = new XPM *[maximum];
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
setNew[i] = set[i];
|
|
||||||
}
|
|
||||||
delete []set;
|
|
||||||
set = setNew;
|
|
||||||
}
|
|
||||||
set[len] = pxpm;
|
|
||||||
len++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XPM *XPMSet::Get(int id) {
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
if (set[i]->GetId() == id) {
|
|
||||||
return set[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int XPMSet::GetHeight() {
|
|
||||||
if (height < 0) {
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
if (height < set[i]->GetHeight()) {
|
|
||||||
height = set[i]->GetHeight();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (height > 0) ? height : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int XPMSet::GetWidth() {
|
|
||||||
if (width < 0) {
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
if (width < set[i]->GetWidth()) {
|
|
||||||
width = set[i]->GetWidth();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (width > 0) ? width : 0;
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file XPM.h
|
|
||||||
** Define a class that holds data in the X Pixmap (XPM) format.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef XPM_H
|
|
||||||
#define XPM_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hold a pixmap in XPM format.
|
|
||||||
*/
|
|
||||||
class XPM {
|
|
||||||
int id; // Assigned by container
|
|
||||||
int height;
|
|
||||||
int width;
|
|
||||||
int nColours;
|
|
||||||
char *data;
|
|
||||||
char codeTransparent;
|
|
||||||
char *codes;
|
|
||||||
ColourPair *colours;
|
|
||||||
ColourAllocated ColourFromCode(int ch);
|
|
||||||
void FillRun(Surface *surface, int code, int startX, int y, int x);
|
|
||||||
char **lines;
|
|
||||||
ColourPair *colourCodeTable[256];
|
|
||||||
public:
|
|
||||||
XPM(const char *textForm);
|
|
||||||
XPM(const char * const *linesForm);
|
|
||||||
~XPM();
|
|
||||||
void Init(const char *textForm);
|
|
||||||
void Init(const char * const *linesForm);
|
|
||||||
void Clear();
|
|
||||||
/// Similar to same named method in ViewStyle:
|
|
||||||
void RefreshColourPalette(Palette &pal, bool want);
|
|
||||||
/// No palette used, so just copy the desired colours to the allocated colours
|
|
||||||
void CopyDesiredColours();
|
|
||||||
/// Decompose image into runs and use FillRectangle for each run
|
|
||||||
void Draw(Surface *surface, PRectangle &rc);
|
|
||||||
char **InLinesForm() { return lines; }
|
|
||||||
void SetId(int id_) { id = id_; }
|
|
||||||
int GetId() { return id; }
|
|
||||||
int GetHeight() { return height; }
|
|
||||||
int GetWidth() { return width; }
|
|
||||||
static const char **LinesFormFromTextForm(const char *textForm);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A collection of pixmaps indexed by integer id.
|
|
||||||
*/
|
|
||||||
class XPMSet {
|
|
||||||
XPM **set; ///< The stored XPMs.
|
|
||||||
int len; ///< Current number of XPMs.
|
|
||||||
int maximum; ///< Current maximum number of XPMs, increased by steps if reached.
|
|
||||||
int height; ///< Memorize largest height of the set.
|
|
||||||
int width; ///< Memorize largest width of the set.
|
|
||||||
public:
|
|
||||||
XPMSet();
|
|
||||||
~XPMSet();
|
|
||||||
/// Remove all XPMs.
|
|
||||||
void Clear();
|
|
||||||
/// Add a XPM.
|
|
||||||
void Add(int id, const char *textForm);
|
|
||||||
/// Get XPM by id.
|
|
||||||
XPM *Get(int id);
|
|
||||||
/// Give the largest height of the set.
|
|
||||||
int GetHeight();
|
|
||||||
/// Give the largest width of the set.
|
|
||||||
int GetWidth();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
License for Scintilla and SciTE
|
|
||||||
|
|
||||||
Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation.
|
|
||||||
|
|
||||||
NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
|
||||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY
|
|
||||||
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
|
|
||||||
OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
This directory contains copies of the scintilla/src and
|
|
||||||
scintilla/include directories from the Scintilla/SCiTE source
|
|
||||||
distribution. All other code needed to implement Scintilla on top of
|
|
||||||
wxWindows is located in the directory above this one.
|
|
||||||
|
|
||||||
The current version of the Scintilla code is 1.58
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Accessor.h
|
|
||||||
** Rapid easy access to contents of a Scintilla.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8};
|
|
||||||
|
|
||||||
class Accessor;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
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_; }
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
};
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file KeyWords.h
|
|
||||||
** Colourise for particular languages.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A LexerModule is responsible for lexing and folding a particular language.
|
|
||||||
* The class maintains a list of LexerModules which can be searched to find a
|
|
||||||
* module appropriate to a particular language.
|
|
||||||
*/
|
|
||||||
class LexerModule {
|
|
||||||
protected:
|
|
||||||
const LexerModule *next;
|
|
||||||
int language;
|
|
||||||
LexerFunction fnLexer;
|
|
||||||
LexerFunction fnFolder;
|
|
||||||
const char * const * wordListDescriptions;
|
|
||||||
|
|
||||||
static const LexerModule *base;
|
|
||||||
static int nextLanguage;
|
|
||||||
|
|
||||||
public:
|
|
||||||
const char *languageName;
|
|
||||||
LexerModule(int language_, LexerFunction fnLexer_,
|
|
||||||
const char *languageName_=0, LexerFunction fnFolder_=0,
|
|
||||||
const char * const wordListDescriptions_[] = NULL);
|
|
||||||
int GetLanguage() const { return language; }
|
|
||||||
|
|
||||||
// -1 is returned if no WordList information is available
|
|
||||||
int GetNumWordLists() const;
|
|
||||||
const char *GetWordListDescription(int index) const;
|
|
||||||
|
|
||||||
virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const;
|
|
||||||
virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle,
|
|
||||||
WordList *keywordlists[], Accessor &styler) const;
|
|
||||||
static const LexerModule *Find(int language);
|
|
||||||
static const LexerModule *Find(const char *languageName);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a character is a space.
|
|
||||||
* This is ASCII specific but is safe with chars >= 0x80.
|
|
||||||
*/
|
|
||||||
inline bool isspacechar(unsigned char ch) {
|
|
||||||
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool iswordchar(char ch) {
|
|
||||||
return isascii(ch) && (isalnum(ch) || ch == '.' || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool iswordstart(char ch) {
|
|
||||||
return isascii(ch) && (isalnum(ch) || ch == '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool isoperator(char ch) {
|
|
||||||
if (isascii(ch) && isalnum(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;
|
|
||||||
}
|
|
||||||
@@ -1,514 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Platform.h
|
|
||||||
** Interface to platform facilities. Also includes some basic utilities.
|
|
||||||
** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef PLATFORM_H
|
|
||||||
#define PLATFORM_H
|
|
||||||
|
|
||||||
// PLAT_GTK = GTK+ on Linux or Win32
|
|
||||||
// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32
|
|
||||||
// PLAT_WIN = Win32 API on Win32 OS
|
|
||||||
// PLAT_WX is wxWindows on any supported platform
|
|
||||||
|
|
||||||
#define PLAT_GTK 0
|
|
||||||
#define PLAT_GTK_WIN32 0
|
|
||||||
#define PLAT_WIN 0
|
|
||||||
#define PLAT_WX 0
|
|
||||||
#define PLAT_FOX 0
|
|
||||||
|
|
||||||
#if defined(FOX)
|
|
||||||
#undef PLAT_FOX
|
|
||||||
#define PLAT_FOX 1
|
|
||||||
|
|
||||||
#elif defined(__WX__)
|
|
||||||
#undef PLAT_WX
|
|
||||||
#define PLAT_WX 1
|
|
||||||
|
|
||||||
#elif defined(GTK)
|
|
||||||
#undef PLAT_GTK
|
|
||||||
#define PLAT_GTK 1
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#undef PLAT_GTK_WIN32
|
|
||||||
#define PLAT_GTK_WIN32 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
#undef PLAT_WIN
|
|
||||||
#define PLAT_WIN 1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if PLAT_WX
|
|
||||||
#include <wx/object.h> // For the global memory operators, if needed.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Underlying the implementation of the platform classes are platform specific types.
|
|
||||||
// Sometimes these need to be passed around by client code so they are defined here
|
|
||||||
|
|
||||||
typedef void *FontID;
|
|
||||||
typedef void *SurfaceID;
|
|
||||||
typedef void *WindowID;
|
|
||||||
typedef void *MenuID;
|
|
||||||
typedef void *TickerID;
|
|
||||||
typedef void *Function;
|
|
||||||
typedef void *IdlerID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A geometric point class.
|
|
||||||
* Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably.
|
|
||||||
*/
|
|
||||||
class Point {
|
|
||||||
public:
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
|
|
||||||
Point(int x_=0, int y_=0) : x(x_), y(y_) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Other automatically defined methods (assignment, copy constructor, destructor) are fine
|
|
||||||
|
|
||||||
static Point FromLong(long lpoint);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A geometric rectangle class.
|
|
||||||
* PRectangle is exactly the same as the Win32 RECT so can be used interchangeably.
|
|
||||||
* PRectangles contain their top and left sides, but not their right and bottom sides.
|
|
||||||
*/
|
|
||||||
class PRectangle {
|
|
||||||
public:
|
|
||||||
int left;
|
|
||||||
int top;
|
|
||||||
int right;
|
|
||||||
int bottom;
|
|
||||||
|
|
||||||
PRectangle(int left_=0, int top_=0, int right_=0, int bottom_ = 0) :
|
|
||||||
left(left_), top(top_), right(right_), bottom(bottom_) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Other automatically defined methods (assignment, copy constructor, destructor) are fine
|
|
||||||
|
|
||||||
bool operator==(PRectangle &rc) {
|
|
||||||
return (rc.left == left) && (rc.right == right) &&
|
|
||||||
(rc.top == top) && (rc.bottom == bottom);
|
|
||||||
}
|
|
||||||
bool Contains(Point pt) {
|
|
||||||
return (pt.x >= left) && (pt.x <= right) &&
|
|
||||||
(pt.y >= top) && (pt.y <= bottom);
|
|
||||||
}
|
|
||||||
bool Contains(PRectangle rc) {
|
|
||||||
return (rc.left >= left) && (rc.right <= right) &&
|
|
||||||
(rc.top >= top) && (rc.bottom <= bottom);
|
|
||||||
}
|
|
||||||
bool Intersects(PRectangle other) {
|
|
||||||
return (right > other.left) && (left < other.right) &&
|
|
||||||
(bottom > other.top) && (top < other.bottom);
|
|
||||||
}
|
|
||||||
void Move(int xDelta, int yDelta) {
|
|
||||||
left += xDelta;
|
|
||||||
top += yDelta;
|
|
||||||
right += xDelta;
|
|
||||||
bottom += yDelta;
|
|
||||||
}
|
|
||||||
int Width() { return right - left; }
|
|
||||||
int Height() { return bottom - top; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In some circumstances, including Win32 in paletted mode and GTK+, each colour
|
|
||||||
* must be allocated before use. The desired colours are held in the ColourDesired class,
|
|
||||||
* and after allocation the allocation entry is stored in the ColourAllocated class. In other
|
|
||||||
* circumstances, such as Win32 in true colour mode, the allocation process just copies
|
|
||||||
* the RGB values from the desired to the allocated class.
|
|
||||||
* As each desired colour requires allocation before it can be used, the ColourPair class
|
|
||||||
* holds both a ColourDesired and a ColourAllocated
|
|
||||||
* The Palette class is responsible for managing the palette of colours which contains a
|
|
||||||
* list of ColourPair objects and performs the allocation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds a desired RGB colour.
|
|
||||||
*/
|
|
||||||
class ColourDesired {
|
|
||||||
long co;
|
|
||||||
public:
|
|
||||||
ColourDesired(long lcol=0) {
|
|
||||||
co = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
ColourDesired(unsigned int red, unsigned int green, unsigned int blue) {
|
|
||||||
Set(red, green, blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const ColourDesired &other) const {
|
|
||||||
return co == other.co;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(long lcol) {
|
|
||||||
co = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(unsigned int red, unsigned int green, unsigned int blue) {
|
|
||||||
co = red | (green << 8) | (blue << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned int ValueOfHex(const char ch) {
|
|
||||||
if (ch >= '0' && ch <= '9')
|
|
||||||
return ch - '0';
|
|
||||||
else if (ch >= 'A' && ch <= 'F')
|
|
||||||
return ch - 'A' + 10;
|
|
||||||
else if (ch >= 'a' && ch <= 'f')
|
|
||||||
return ch - 'a' + 10;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(const char *val) {
|
|
||||||
if (*val == '#') {
|
|
||||||
val++;
|
|
||||||
}
|
|
||||||
unsigned int r = ValueOfHex(val[0]) * 16 + ValueOfHex(val[1]);
|
|
||||||
unsigned int g = ValueOfHex(val[2]) * 16 + ValueOfHex(val[3]);
|
|
||||||
unsigned int b = ValueOfHex(val[4]) * 16 + ValueOfHex(val[5]);
|
|
||||||
Set(r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsLong() const {
|
|
||||||
return co;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetRed() {
|
|
||||||
return co & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetGreen() {
|
|
||||||
return (co >> 8) & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetBlue() {
|
|
||||||
return (co >> 16) & 0xff;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds an allocated RGB colour which may be an approximation to the desired colour.
|
|
||||||
*/
|
|
||||||
class ColourAllocated {
|
|
||||||
long coAllocated;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
ColourAllocated(long lcol=0) {
|
|
||||||
coAllocated = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(long lcol) {
|
|
||||||
coAllocated = lcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsLong() const {
|
|
||||||
return coAllocated;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Colour pairs hold a desired colour and an allocated colour.
|
|
||||||
*/
|
|
||||||
struct ColourPair {
|
|
||||||
ColourDesired desired;
|
|
||||||
ColourAllocated allocated;
|
|
||||||
|
|
||||||
ColourPair(ColourDesired desired_=ColourDesired(0,0,0)) {
|
|
||||||
desired = desired_;
|
|
||||||
allocated.Set(desired.AsLong());
|
|
||||||
}
|
|
||||||
void Copy() {
|
|
||||||
allocated.Set(desired.AsLong());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class Window; // Forward declaration for Palette
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Colour palette management.
|
|
||||||
*/
|
|
||||||
class Palette {
|
|
||||||
int used;
|
|
||||||
enum {numEntries = 100};
|
|
||||||
ColourPair entries[numEntries];
|
|
||||||
#if PLAT_GTK
|
|
||||||
void *allocatedPalette; // GdkColor *
|
|
||||||
int allocatedLen;
|
|
||||||
#endif
|
|
||||||
public:
|
|
||||||
#if PLAT_WIN
|
|
||||||
void *hpal;
|
|
||||||
#endif
|
|
||||||
bool allowRealization;
|
|
||||||
|
|
||||||
Palette();
|
|
||||||
~Palette();
|
|
||||||
|
|
||||||
void Release();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method either adds a colour to the list of wanted colours (want==true)
|
|
||||||
* or retrieves the allocated colour back to the ColourPair.
|
|
||||||
* This is one method to make it easier to keep the code for wanting and retrieving in sync.
|
|
||||||
*/
|
|
||||||
void WantFind(ColourPair &cp, bool want);
|
|
||||||
|
|
||||||
void Allocate(Window &w);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Font management.
|
|
||||||
*/
|
|
||||||
class Font {
|
|
||||||
protected:
|
|
||||||
FontID id;
|
|
||||||
#if PLAT_WX
|
|
||||||
int ascent;
|
|
||||||
#endif
|
|
||||||
// Private so Font objects can not be copied
|
|
||||||
Font(const Font &) {}
|
|
||||||
Font &operator=(const Font &) { id=0; return *this; }
|
|
||||||
public:
|
|
||||||
Font();
|
|
||||||
virtual ~Font();
|
|
||||||
|
|
||||||
virtual void Create(const char *faceName, int characterSet, int size, bool bold, bool italic);
|
|
||||||
virtual void Release();
|
|
||||||
|
|
||||||
FontID GetID() { return id; }
|
|
||||||
// Alias another font - caller guarantees not to Release
|
|
||||||
void SetID(FontID id_) { id = id_; }
|
|
||||||
friend class Surface;
|
|
||||||
friend class SurfaceImpl;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A surface abstracts a place to draw.
|
|
||||||
*/
|
|
||||||
class Surface {
|
|
||||||
private:
|
|
||||||
// Private so Surface objects can not be copied
|
|
||||||
Surface(const Surface &) {}
|
|
||||||
Surface &operator=(const Surface &) { return *this; }
|
|
||||||
public:
|
|
||||||
Surface() {};
|
|
||||||
virtual ~Surface() {};
|
|
||||||
static Surface *Allocate();
|
|
||||||
|
|
||||||
virtual void Init(WindowID wid)=0;
|
|
||||||
virtual void Init(SurfaceID sid, WindowID wid)=0;
|
|
||||||
virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0;
|
|
||||||
|
|
||||||
virtual void Release()=0;
|
|
||||||
virtual bool Initialised()=0;
|
|
||||||
virtual void PenColour(ColourAllocated fore)=0;
|
|
||||||
virtual int LogPixelsY()=0;
|
|
||||||
virtual int DeviceHeightFont(int points)=0;
|
|
||||||
virtual void MoveTo(int x_, int y_)=0;
|
|
||||||
virtual void LineTo(int x_, int y_)=0;
|
|
||||||
virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void FillRectangle(PRectangle rc, ColourAllocated back)=0;
|
|
||||||
virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0;
|
|
||||||
virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0;
|
|
||||||
|
|
||||||
virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0;
|
|
||||||
virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore)=0;
|
|
||||||
virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions)=0;
|
|
||||||
virtual int WidthText(Font &font_, const char *s, int len)=0;
|
|
||||||
virtual int WidthChar(Font &font_, char ch)=0;
|
|
||||||
virtual int Ascent(Font &font_)=0;
|
|
||||||
virtual int Descent(Font &font_)=0;
|
|
||||||
virtual int InternalLeading(Font &font_)=0;
|
|
||||||
virtual int ExternalLeading(Font &font_)=0;
|
|
||||||
virtual int Height(Font &font_)=0;
|
|
||||||
virtual int AverageCharWidth(Font &font_)=0;
|
|
||||||
|
|
||||||
virtual int SetPalette(Palette *pal, bool inBackGround)=0;
|
|
||||||
virtual void SetClip(PRectangle rc)=0;
|
|
||||||
virtual void FlushCachedState()=0;
|
|
||||||
|
|
||||||
virtual void SetUnicodeMode(bool unicodeMode_)=0;
|
|
||||||
virtual void SetDBCSMode(int codePage)=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple callback action passing one piece of untyped user data.
|
|
||||||
*/
|
|
||||||
typedef void (*CallBackAction)(void*);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class to hide the details of window manipulation.
|
|
||||||
* Does not own the window which will normally have a longer life than this object.
|
|
||||||
*/
|
|
||||||
class Window {
|
|
||||||
protected:
|
|
||||||
WindowID id;
|
|
||||||
public:
|
|
||||||
Window() : id(0), cursorLast(cursorInvalid) {}
|
|
||||||
Window(const Window &source) : id(source.id), cursorLast(cursorInvalid) {}
|
|
||||||
virtual ~Window();
|
|
||||||
Window &operator=(WindowID id_) {
|
|
||||||
id = id_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
WindowID GetID() const { return id; }
|
|
||||||
bool Created() const { return id != 0; }
|
|
||||||
void Destroy();
|
|
||||||
bool HasFocus();
|
|
||||||
PRectangle GetPosition();
|
|
||||||
void SetPosition(PRectangle rc);
|
|
||||||
void SetPositionRelative(PRectangle rc, Window relativeTo);
|
|
||||||
PRectangle GetClientPosition();
|
|
||||||
void Show(bool show=true);
|
|
||||||
void InvalidateAll();
|
|
||||||
void InvalidateRectangle(PRectangle rc);
|
|
||||||
virtual void SetFont(Font &font);
|
|
||||||
enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand };
|
|
||||||
void SetCursor(Cursor curs);
|
|
||||||
void SetTitle(const char *s);
|
|
||||||
private:
|
|
||||||
Cursor cursorLast;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Listbox management.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ListBox : public Window {
|
|
||||||
public:
|
|
||||||
ListBox();
|
|
||||||
virtual ~ListBox();
|
|
||||||
static ListBox *Allocate();
|
|
||||||
|
|
||||||
virtual void SetFont(Font &font)=0;
|
|
||||||
virtual void Create(Window &parent, int ctrlID, int lineHeight_, bool unicodeMode_)=0;
|
|
||||||
virtual void SetAverageCharWidth(int width)=0;
|
|
||||||
virtual void SetVisibleRows(int rows)=0;
|
|
||||||
virtual PRectangle GetDesiredRect()=0;
|
|
||||||
virtual int CaretFromEdge()=0;
|
|
||||||
virtual void Clear()=0;
|
|
||||||
virtual void Append(char *s, int type = -1)=0;
|
|
||||||
virtual int Length()=0;
|
|
||||||
virtual void Select(int n)=0;
|
|
||||||
virtual int GetSelection()=0;
|
|
||||||
virtual int Find(const char *prefix)=0;
|
|
||||||
virtual void GetValue(int n, char *value, int len)=0;
|
|
||||||
virtual void RegisterImage(int type, const char *xpm_data)=0;
|
|
||||||
virtual void ClearRegisteredImages()=0;
|
|
||||||
virtual void SetDoubleClickAction(CallBackAction, void *)=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Menu management.
|
|
||||||
*/
|
|
||||||
class Menu {
|
|
||||||
MenuID id;
|
|
||||||
public:
|
|
||||||
Menu();
|
|
||||||
MenuID GetID() { return id; }
|
|
||||||
void CreatePopUp();
|
|
||||||
void Destroy();
|
|
||||||
void Show(Point pt, Window &w);
|
|
||||||
};
|
|
||||||
|
|
||||||
class ElapsedTime {
|
|
||||||
long bigBit;
|
|
||||||
long littleBit;
|
|
||||||
public:
|
|
||||||
ElapsedTime();
|
|
||||||
double Duration(bool reset=false);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dynamic Library (DLL/SO/...) loading
|
|
||||||
*/
|
|
||||||
class DynamicLibrary {
|
|
||||||
public:
|
|
||||||
virtual ~DynamicLibrary() {};
|
|
||||||
|
|
||||||
/// @return Pointer to function "name", or NULL on failure.
|
|
||||||
virtual Function FindFunction(const char *name) = 0;
|
|
||||||
|
|
||||||
/// @return true if the library was loaded successfully.
|
|
||||||
virtual bool IsValid() = 0;
|
|
||||||
|
|
||||||
/// @return An instance of a DynamicLibrary subclass with "modulePath" loaded.
|
|
||||||
static DynamicLibrary *Load(const char *modulePath);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Platform class used to retrieve system wide parameters such as double click speed
|
|
||||||
* and chrome colour. Not a creatable object, more of a module with several functions.
|
|
||||||
*/
|
|
||||||
class Platform {
|
|
||||||
// Private so Platform objects can not be copied
|
|
||||||
Platform(const Platform &) {}
|
|
||||||
Platform &operator=(const Platform &) { return *this; }
|
|
||||||
public:
|
|
||||||
// Should be private because no new Platforms are ever created
|
|
||||||
// but gcc warns about this
|
|
||||||
Platform() {}
|
|
||||||
~Platform() {}
|
|
||||||
static ColourDesired Chrome();
|
|
||||||
static ColourDesired ChromeHighlight();
|
|
||||||
static const char *DefaultFont();
|
|
||||||
static int DefaultFontSize();
|
|
||||||
static unsigned int DoubleClickTime();
|
|
||||||
static bool MouseButtonBounce();
|
|
||||||
static void DebugDisplay(const char *s);
|
|
||||||
static bool IsKeyDown(int key);
|
|
||||||
static long SendScintilla(
|
|
||||||
WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0);
|
|
||||||
static long SendScintillaPointer(
|
|
||||||
WindowID w, unsigned int msg, unsigned long wParam=0, void *lParam=0);
|
|
||||||
static bool IsDBCSLeadByte(int codePage, char ch);
|
|
||||||
static int DBCSCharLength(int codePage, const char *s);
|
|
||||||
static int DBCSCharMaxLength();
|
|
||||||
|
|
||||||
// These are utility functions not really tied to a platform
|
|
||||||
static int Minimum(int a, int b);
|
|
||||||
static int Maximum(int a, int b);
|
|
||||||
// Next three assume 16 bit shorts and 32 bit longs
|
|
||||||
static long LongFromTwoShorts(short a,short b) {
|
|
||||||
return (a) | ((b) << 16);
|
|
||||||
}
|
|
||||||
static short HighShortFromLong(long x) {
|
|
||||||
return static_cast<short>(x >> 16);
|
|
||||||
}
|
|
||||||
static short LowShortFromLong(long x) {
|
|
||||||
return static_cast<short>(x & 0xffff);
|
|
||||||
}
|
|
||||||
static void DebugPrintf(const char *format, ...);
|
|
||||||
static bool ShowAssertionPopUps(bool assertionPopUps_);
|
|
||||||
static void Assert(const char *c, const char *file, int line);
|
|
||||||
static int Clamp(int val, int minVal, int maxVal);
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef NDEBUG
|
|
||||||
#define PLATFORM_ASSERT(c) ((void)0)
|
|
||||||
#else
|
|
||||||
#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Shut up annoying Visual C++ warnings:
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable: 4244 4309 4514 4710)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file PropSet.h
|
|
||||||
** A Java style properties file module.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef PROPSET_H
|
|
||||||
#define PROPSET_H
|
|
||||||
#include "SString.h"
|
|
||||||
|
|
||||||
bool EqualCaseInsensitive(const char *a, const char *b);
|
|
||||||
|
|
||||||
bool isprefix(const char *target, const char *prefix);
|
|
||||||
|
|
||||||
struct Property {
|
|
||||||
unsigned int hash;
|
|
||||||
char *key;
|
|
||||||
char *val;
|
|
||||||
Property *next;
|
|
||||||
Property() : hash(0), key(0), val(0), next(0) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class PropSet {
|
|
||||||
protected:
|
|
||||||
enum { hashRoots=31 };
|
|
||||||
Property *props[hashRoots];
|
|
||||||
Property *enumnext;
|
|
||||||
int enumhash;
|
|
||||||
static unsigned int HashString(const char *s, size_t len) {
|
|
||||||
unsigned int ret = 0;
|
|
||||||
while (len--) {
|
|
||||||
ret <<= 4;
|
|
||||||
ret ^= *s;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
static bool IncludesVar(const char *value, const char *key);
|
|
||||||
public:
|
|
||||||
PropSet *superPS;
|
|
||||||
PropSet();
|
|
||||||
~PropSet();
|
|
||||||
void Set(const char *key, const char *val, int lenKey=-1, int lenVal=-1);
|
|
||||||
void Set(const char *keyVal);
|
|
||||||
void SetMultiple(const char *s);
|
|
||||||
SString Get(const char *key);
|
|
||||||
SString GetExpanded(const char *key);
|
|
||||||
SString Expand(const char *withVars, int maxExpands=100);
|
|
||||||
int GetInt(const char *key, int defaultValue=0);
|
|
||||||
SString GetWild(const char *keybase, const char *filename);
|
|
||||||
SString GetNewExpand(const char *keybase, const char *filename="");
|
|
||||||
void Clear();
|
|
||||||
char *ToString(); // Caller must delete[] the return value
|
|
||||||
bool GetFirst(char **key, char **val);
|
|
||||||
bool GetNext(char **key, char **val);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class WordList {
|
|
||||||
public:
|
|
||||||
// Each word contains at least one character - a empty word acts as sentinel at the end.
|
|
||||||
char **words;
|
|
||||||
char **wordsNoCase;
|
|
||||||
char *list;
|
|
||||||
int len;
|
|
||||||
bool onlyLineEnds; ///< Delimited by any white space or only line ends
|
|
||||||
bool sorted;
|
|
||||||
int starts[256];
|
|
||||||
WordList(bool onlyLineEnds_ = false) :
|
|
||||||
words(0), wordsNoCase(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), sorted(false) {}
|
|
||||||
~WordList() { Clear(); }
|
|
||||||
operator bool() { return len ? true : false; }
|
|
||||||
char *operator[](int ind) { return words[ind]; }
|
|
||||||
void Clear();
|
|
||||||
void Set(const char *s);
|
|
||||||
char *Allocate(int size);
|
|
||||||
void SetFromAllocated();
|
|
||||||
bool InList(const char *s);
|
|
||||||
const char *GetNearestWord(const char *wordStart, int searchLen = -1,
|
|
||||||
bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
|
|
||||||
char *GetNearestWords(const char *wordStart, int searchLen=-1,
|
|
||||||
bool ignoreCase=false, char otherSeparator='\0');
|
|
||||||
};
|
|
||||||
|
|
||||||
inline bool IsAlphabetic(unsigned int ch) {
|
|
||||||
return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,377 +0,0 @@
|
|||||||
// SciTE - Scintilla based Text Editor
|
|
||||||
/** @file SString.h
|
|
||||||
** A simple string class.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef SSTRING_H
|
|
||||||
#define SSTRING_H
|
|
||||||
|
|
||||||
// These functions are implemented because each platform calls them something different.
|
|
||||||
int CompareCaseInsensitive(const char *a, const char *b);
|
|
||||||
int CompareNCaseInsensitive(const char *a, const char *b, size_t len);
|
|
||||||
bool EqualCaseInsensitive(const char *a, const char *b);
|
|
||||||
|
|
||||||
// Define another string class.
|
|
||||||
// While it would be 'better' to use std::string, that doubles the executable size.
|
|
||||||
// An SString may contain embedded nul characters.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief A simple string class.
|
|
||||||
*
|
|
||||||
* Hold the length of the string for quick operations,
|
|
||||||
* can have a buffer bigger than the string to avoid too many memory allocations and copies.
|
|
||||||
* May have embedded zeroes as a result of @a substitute, but relies too heavily on C string
|
|
||||||
* functions to allow reliable manipulations of these strings, other than simple appends, etc.
|
|
||||||
**/
|
|
||||||
class SString {
|
|
||||||
public:
|
|
||||||
/** Type of string lengths (sizes) and positions (indexes). */
|
|
||||||
typedef size_t lenpos_t;
|
|
||||||
/** Out of bounds value indicating that the string argument should be measured. */
|
|
||||||
enum { measure_length=0xffffffffU};
|
|
||||||
|
|
||||||
private:
|
|
||||||
char *s; ///< The C string
|
|
||||||
lenpos_t sSize; ///< The size of the buffer, less 1: ie. the maximum size of the string
|
|
||||||
lenpos_t sLen; ///< The size of the string in s
|
|
||||||
lenpos_t sizeGrowth; ///< Minimum growth size when appending strings
|
|
||||||
enum { sizeGrowthDefault = 64 };
|
|
||||||
bool grow(lenpos_t lenNew) {
|
|
||||||
while (sizeGrowth * 6 < lenNew) {
|
|
||||||
sizeGrowth *= 2;
|
|
||||||
}
|
|
||||||
char *sNew = new char[lenNew + sizeGrowth + 1];
|
|
||||||
if (sNew) {
|
|
||||||
if (s) {
|
|
||||||
memcpy(sNew, s, sLen);
|
|
||||||
delete []s;
|
|
||||||
}
|
|
||||||
s = sNew;
|
|
||||||
s[sLen] = '\0';
|
|
||||||
sSize = lenNew + sizeGrowth;
|
|
||||||
}
|
|
||||||
return sNew != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SString &assign(const char *sOther, lenpos_t sSize_=measure_length) {
|
|
||||||
if (!sOther) {
|
|
||||||
sSize_ = 0;
|
|
||||||
} else if (sSize_ == measure_length) {
|
|
||||||
sSize_ = strlen(sOther);
|
|
||||||
}
|
|
||||||
if (sSize > 0 && sSize_ <= sSize) { // Does not allocate new buffer if the current is big enough
|
|
||||||
if (s && sSize_) {
|
|
||||||
memcpy(s, sOther, sSize_);
|
|
||||||
}
|
|
||||||
s[sSize_] = '\0';
|
|
||||||
sLen = sSize_;
|
|
||||||
} else {
|
|
||||||
delete []s;
|
|
||||||
s = StringAllocate(sOther, sSize_);
|
|
||||||
if (s) {
|
|
||||||
sSize = sSize_; // Allow buffer bigger than real string, thus providing space to grow
|
|
||||||
sLen = strlen(s);
|
|
||||||
} else {
|
|
||||||
sSize = sLen = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
SString() : s(0), sSize(0), sLen(0), sizeGrowth(sizeGrowthDefault) {
|
|
||||||
}
|
|
||||||
SString(const SString &source) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
s = StringAllocate(source.s);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
s = StringAllocate(s_);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
// note: expects the "last" argument to point one beyond the range end (a la STL iterators)
|
|
||||||
s = StringAllocate(s_ + first, last - first);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(int i) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
char number[32];
|
|
||||||
sprintf(number, "%0d", i);
|
|
||||||
s = StringAllocate(number);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
SString(double d, int precision) : sizeGrowth(sizeGrowthDefault) {
|
|
||||||
char number[32];
|
|
||||||
sprintf(number, "%.*f", precision, d);
|
|
||||||
s = StringAllocate(number);
|
|
||||||
sSize = sLen = (s) ? strlen(s) : 0;
|
|
||||||
}
|
|
||||||
~SString() {
|
|
||||||
delete []s;
|
|
||||||
s = 0;
|
|
||||||
sSize = 0;
|
|
||||||
sLen = 0;
|
|
||||||
}
|
|
||||||
void clear() {
|
|
||||||
if (s) {
|
|
||||||
*s = '\0';
|
|
||||||
}
|
|
||||||
sLen = 0;
|
|
||||||
}
|
|
||||||
/** Size of buffer. */
|
|
||||||
lenpos_t size() const {
|
|
||||||
if (s)
|
|
||||||
return sSize;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/** Size of string in buffer. */
|
|
||||||
lenpos_t length() const {
|
|
||||||
return sLen;
|
|
||||||
}
|
|
||||||
SString &operator=(const char *source) {
|
|
||||||
return assign(source);
|
|
||||||
}
|
|
||||||
SString &operator=(const SString &source) {
|
|
||||||
if (this != &source) {
|
|
||||||
assign(source.c_str());
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
bool operator==(const SString &sOther) const {
|
|
||||||
if ((s == 0) && (sOther.s == 0))
|
|
||||||
return true;
|
|
||||||
if ((s == 0) || (sOther.s == 0))
|
|
||||||
return false;
|
|
||||||
return strcmp(s, sOther.s) == 0;
|
|
||||||
}
|
|
||||||
bool operator!=(const SString &sOther) const {
|
|
||||||
return !operator==(sOther);
|
|
||||||
}
|
|
||||||
bool operator==(const char *sOther) const {
|
|
||||||
if ((s == 0) && (sOther == 0))
|
|
||||||
return true;
|
|
||||||
if ((s == 0) || (sOther == 0))
|
|
||||||
return false;
|
|
||||||
return strcmp(s, sOther) == 0;
|
|
||||||
}
|
|
||||||
bool operator!=(const char *sOther) const {
|
|
||||||
return !operator==(sOther);
|
|
||||||
}
|
|
||||||
bool contains(char ch) {
|
|
||||||
if (s && *s)
|
|
||||||
return strchr(s, ch) != 0;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
void setsizegrowth(lenpos_t sizeGrowth_) {
|
|
||||||
sizeGrowth = sizeGrowth_;
|
|
||||||
}
|
|
||||||
const char *c_str() const {
|
|
||||||
if (s)
|
|
||||||
return s;
|
|
||||||
else
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
/** Give ownership of buffer to caller which must use delete[] to free buffer. */
|
|
||||||
char *detach() {
|
|
||||||
char *sRet = s;
|
|
||||||
s = 0;
|
|
||||||
sSize = 0;
|
|
||||||
sLen = 0;
|
|
||||||
return sRet;
|
|
||||||
}
|
|
||||||
char operator[](lenpos_t i) const {
|
|
||||||
if (s && i < sSize) // Or < sLen? Depends on the use, both are OK
|
|
||||||
return s[i];
|
|
||||||
else
|
|
||||||
return '\0';
|
|
||||||
}
|
|
||||||
SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const {
|
|
||||||
if (subPos >= sLen) {
|
|
||||||
return SString(); // return a null string if start index is out of bounds
|
|
||||||
}
|
|
||||||
if ((subLen == measure_length) || (subPos + subLen > sLen)) {
|
|
||||||
subLen = sLen - subPos; // can't substr past end of source string
|
|
||||||
}
|
|
||||||
return SString(s, subPos, subPos + subLen);
|
|
||||||
}
|
|
||||||
SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length) {
|
|
||||||
if ((subLen == measure_length) || (subPos + subLen > sLen)) {
|
|
||||||
subLen = sLen - subPos; // don't apply past end of string
|
|
||||||
}
|
|
||||||
for (lenpos_t i = subPos; i < subPos + subLen; i++) {
|
|
||||||
if (s[i] < 'A' || s[i] > 'Z')
|
|
||||||
continue;
|
|
||||||
else
|
|
||||||
s[i] = static_cast<char>(s[i] - 'A' + 'a');
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0') {
|
|
||||||
if (!sOther) {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
if (sLenOther == measure_length) {
|
|
||||||
sLenOther = strlen(sOther);
|
|
||||||
}
|
|
||||||
int lenSep = 0;
|
|
||||||
if (sLen && sep) { // Only add a separator if not empty
|
|
||||||
lenSep = 1;
|
|
||||||
}
|
|
||||||
lenpos_t lenNew = sLen + sLenOther + lenSep;
|
|
||||||
// Conservative about growing the buffer: don't do it, unless really needed
|
|
||||||
if ((lenNew + 1 < sSize) || (grow(lenNew))) {
|
|
||||||
if (lenSep) {
|
|
||||||
s[sLen] = sep;
|
|
||||||
sLen++;
|
|
||||||
}
|
|
||||||
memcpy(&s[sLen], sOther, sLenOther);
|
|
||||||
sLen += sLenOther;
|
|
||||||
s[sLen] = '\0';
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
SString &operator+=(const char *sOther) {
|
|
||||||
return append(sOther, static_cast<lenpos_t>(measure_length));
|
|
||||||
}
|
|
||||||
SString &operator+=(const SString &sOther) {
|
|
||||||
return append(sOther.s, sOther.sLen);
|
|
||||||
}
|
|
||||||
SString &operator+=(char ch) {
|
|
||||||
return append(&ch, 1);
|
|
||||||
}
|
|
||||||
SString &appendwithseparator(const char *sOther, char sep) {
|
|
||||||
return append(sOther, strlen(sOther), sep);
|
|
||||||
}
|
|
||||||
SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length) {
|
|
||||||
if (!sOther) {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
if (sLenOther == measure_length) {
|
|
||||||
sLenOther = strlen(sOther);
|
|
||||||
}
|
|
||||||
lenpos_t lenNew = sLen + sLenOther;
|
|
||||||
// Conservative about growing the buffer: don't do it, unless really needed
|
|
||||||
if ((lenNew + 1 < sSize) || grow(lenNew)) {
|
|
||||||
lenpos_t moveChars = sLen - pos + 1;
|
|
||||||
for (lenpos_t i = moveChars; i > 0; i--) {
|
|
||||||
s[pos + sLenOther + i - 1] = s[pos + i - 1];
|
|
||||||
}
|
|
||||||
memcpy(s + pos, sOther, sLenOther);
|
|
||||||
sLen = lenNew;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/** Remove @a len characters from the @a pos position, included.
|
|
||||||
* Characters at pos + len and beyond replace characters at pos.
|
|
||||||
* If @a len is 0, or greater than the length of the string
|
|
||||||
* starting at @a pos, the string is just truncated at @a pos.
|
|
||||||
*/
|
|
||||||
void remove(lenpos_t pos, lenpos_t len) {
|
|
||||||
if (len < 1 || pos + len >= sLen) {
|
|
||||||
s[pos] = '\0';
|
|
||||||
sLen = pos;
|
|
||||||
} else {
|
|
||||||
for (lenpos_t i = pos; i < sLen - len + 1; i++) {
|
|
||||||
s[i] = s[i+len];
|
|
||||||
}
|
|
||||||
sLen -= len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SString &change(lenpos_t pos, char ch) {
|
|
||||||
if (pos >= sLen) { // character changed must be in string bounds
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
*(s + pos) = ch;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/** Read an integral numeric value from the string. */
|
|
||||||
int value() const {
|
|
||||||
if (s)
|
|
||||||
return atoi(s);
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int search(const char *sFind, lenpos_t start=0) const {
|
|
||||||
if (start < sLen) {
|
|
||||||
const char *sFound = strstr(s + start, sFind);
|
|
||||||
if (sFound) {
|
|
||||||
return sFound - s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
bool contains(const char *sFind) {
|
|
||||||
return search(sFind) >= 0;
|
|
||||||
}
|
|
||||||
int substitute(char chFind, char chReplace) {
|
|
||||||
int c = 0;
|
|
||||||
char *t = s;
|
|
||||||
while (t) {
|
|
||||||
t = strchr(t, chFind);
|
|
||||||
if (t) {
|
|
||||||
*t = chReplace;
|
|
||||||
t++;
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
int substitute(const char *sFind, const char *sReplace) {
|
|
||||||
int c = 0;
|
|
||||||
lenpos_t lenFind = strlen(sFind);
|
|
||||||
lenpos_t lenReplace = strlen(sReplace);
|
|
||||||
int posFound = search(sFind);
|
|
||||||
while (posFound >= 0) {
|
|
||||||
remove(posFound, lenFind);
|
|
||||||
insert(posFound, sReplace, lenReplace);
|
|
||||||
posFound = search(sFind, posFound + lenReplace);
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
int remove(const char *sFind) {
|
|
||||||
return substitute(sFind, "");
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Duplicate a C string.
|
|
||||||
* Allocate memory of the given size, or big enough to fit the string if length isn't given;
|
|
||||||
* then copy the given string in the allocated memory.
|
|
||||||
* @return the pointer to the new string
|
|
||||||
*/
|
|
||||||
static char *StringAllocate(
|
|
||||||
const char *s, ///< The string to duplicate
|
|
||||||
lenpos_t len=measure_length) ///< The length of memory to allocate. Optional.
|
|
||||||
{
|
|
||||||
if (s == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (len == measure_length) {
|
|
||||||
len = strlen(s);
|
|
||||||
}
|
|
||||||
char *sNew = new char[len + 1];
|
|
||||||
if (sNew) {
|
|
||||||
memcpy(sNew, s, len);
|
|
||||||
sNew[len] = '\0';
|
|
||||||
}
|
|
||||||
return sNew;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Duplicate a C string.
|
|
||||||
* Allocate memory of the given size, or big enough to fit the string if length isn't given;
|
|
||||||
* then copy the given string in the allocated memory.
|
|
||||||
* @return the pointer to the new string
|
|
||||||
*/
|
|
||||||
inline char *StringDup(
|
|
||||||
const char *s, ///< The string to duplicate
|
|
||||||
SString::lenpos_t len=SString::measure_length) ///< The length of memory to allocate. Optional.
|
|
||||||
{
|
|
||||||
return SString::StringAllocate(s, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,638 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file SciLexer.h
|
|
||||||
** Interface to the added lexer functions in the SciLexer version of the edit control.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
// Most of this file is automatically generated from the Scintilla.iface interface definition
|
|
||||||
// file which contains any comments about the definitions. HFacer.py does the generation.
|
|
||||||
|
|
||||||
#ifndef SCILEXER_H
|
|
||||||
#define SCILEXER_H
|
|
||||||
|
|
||||||
// SciLexer features - not in standard Scintilla
|
|
||||||
|
|
||||||
//++Autogenerated -- start of section automatically generated from Scintilla.iface
|
|
||||||
#define SCLEX_CONTAINER 0
|
|
||||||
#define SCLEX_NULL 1
|
|
||||||
#define SCLEX_PYTHON 2
|
|
||||||
#define SCLEX_CPP 3
|
|
||||||
#define SCLEX_HTML 4
|
|
||||||
#define SCLEX_XML 5
|
|
||||||
#define SCLEX_PERL 6
|
|
||||||
#define SCLEX_SQL 7
|
|
||||||
#define SCLEX_VB 8
|
|
||||||
#define SCLEX_PROPERTIES 9
|
|
||||||
#define SCLEX_ERRORLIST 10
|
|
||||||
#define SCLEX_MAKEFILE 11
|
|
||||||
#define SCLEX_BATCH 12
|
|
||||||
#define SCLEX_XCODE 13
|
|
||||||
#define SCLEX_LATEX 14
|
|
||||||
#define SCLEX_LUA 15
|
|
||||||
#define SCLEX_DIFF 16
|
|
||||||
#define SCLEX_CONF 17
|
|
||||||
#define SCLEX_PASCAL 18
|
|
||||||
#define SCLEX_AVE 19
|
|
||||||
#define SCLEX_ADA 20
|
|
||||||
#define SCLEX_LISP 21
|
|
||||||
#define SCLEX_RUBY 22
|
|
||||||
#define SCLEX_EIFFEL 23
|
|
||||||
#define SCLEX_EIFFELKW 24
|
|
||||||
#define SCLEX_TCL 25
|
|
||||||
#define SCLEX_NNCRONTAB 26
|
|
||||||
#define SCLEX_BULLANT 27
|
|
||||||
#define SCLEX_VBSCRIPT 28
|
|
||||||
#define SCLEX_ASP 29
|
|
||||||
#define SCLEX_PHP 30
|
|
||||||
#define SCLEX_BAAN 31
|
|
||||||
#define SCLEX_MATLAB 32
|
|
||||||
#define SCLEX_SCRIPTOL 33
|
|
||||||
#define SCLEX_ASM 34
|
|
||||||
#define SCLEX_CPPNOCASE 35
|
|
||||||
#define SCLEX_FORTRAN 36
|
|
||||||
#define SCLEX_F77 37
|
|
||||||
#define SCLEX_CSS 38
|
|
||||||
#define SCLEX_POV 39
|
|
||||||
#define SCLEX_LOUT 40
|
|
||||||
#define SCLEX_ESCRIPT 41
|
|
||||||
#define SCLEX_PS 42
|
|
||||||
#define SCLEX_NSIS 43
|
|
||||||
#define SCLEX_MMIXAL 44
|
|
||||||
#define SCLEX_CLW 45
|
|
||||||
#define SCLEX_CLWNOCASE 46
|
|
||||||
#define SCLEX_LOT 47
|
|
||||||
#define SCLEX_YAML 48
|
|
||||||
#define SCLEX_TEX 49
|
|
||||||
#define SCLEX_METAPOST 50
|
|
||||||
#define SCLEX_POWERBASIC 51
|
|
||||||
#define SCLEX_FORTH 52
|
|
||||||
#define SCLEX_ERLANG 53
|
|
||||||
#define SCLEX_OCTAVE 54
|
|
||||||
#define SCLEX_AUTOMATIC 1000
|
|
||||||
#define SCE_P_DEFAULT 0
|
|
||||||
#define SCE_P_COMMENTLINE 1
|
|
||||||
#define SCE_P_NUMBER 2
|
|
||||||
#define SCE_P_STRING 3
|
|
||||||
#define SCE_P_CHARACTER 4
|
|
||||||
#define SCE_P_WORD 5
|
|
||||||
#define SCE_P_TRIPLE 6
|
|
||||||
#define SCE_P_TRIPLEDOUBLE 7
|
|
||||||
#define SCE_P_CLASSNAME 8
|
|
||||||
#define SCE_P_DEFNAME 9
|
|
||||||
#define SCE_P_OPERATOR 10
|
|
||||||
#define SCE_P_IDENTIFIER 11
|
|
||||||
#define SCE_P_COMMENTBLOCK 12
|
|
||||||
#define SCE_P_STRINGEOL 13
|
|
||||||
#define SCE_C_DEFAULT 0
|
|
||||||
#define SCE_C_COMMENT 1
|
|
||||||
#define SCE_C_COMMENTLINE 2
|
|
||||||
#define SCE_C_COMMENTDOC 3
|
|
||||||
#define SCE_C_NUMBER 4
|
|
||||||
#define SCE_C_WORD 5
|
|
||||||
#define SCE_C_STRING 6
|
|
||||||
#define SCE_C_CHARACTER 7
|
|
||||||
#define SCE_C_UUID 8
|
|
||||||
#define SCE_C_PREPROCESSOR 9
|
|
||||||
#define SCE_C_OPERATOR 10
|
|
||||||
#define SCE_C_IDENTIFIER 11
|
|
||||||
#define SCE_C_STRINGEOL 12
|
|
||||||
#define SCE_C_VERBATIM 13
|
|
||||||
#define SCE_C_REGEX 14
|
|
||||||
#define SCE_C_COMMENTLINEDOC 15
|
|
||||||
#define SCE_C_WORD2 16
|
|
||||||
#define SCE_C_COMMENTDOCKEYWORD 17
|
|
||||||
#define SCE_C_COMMENTDOCKEYWORDERROR 18
|
|
||||||
#define SCE_C_GLOBALCLASS 19
|
|
||||||
#define SCE_H_DEFAULT 0
|
|
||||||
#define SCE_H_TAG 1
|
|
||||||
#define SCE_H_TAGUNKNOWN 2
|
|
||||||
#define SCE_H_ATTRIBUTE 3
|
|
||||||
#define SCE_H_ATTRIBUTEUNKNOWN 4
|
|
||||||
#define SCE_H_NUMBER 5
|
|
||||||
#define SCE_H_DOUBLESTRING 6
|
|
||||||
#define SCE_H_SINGLESTRING 7
|
|
||||||
#define SCE_H_OTHER 8
|
|
||||||
#define SCE_H_COMMENT 9
|
|
||||||
#define SCE_H_ENTITY 10
|
|
||||||
#define SCE_H_TAGEND 11
|
|
||||||
#define SCE_H_XMLSTART 12
|
|
||||||
#define SCE_H_XMLEND 13
|
|
||||||
#define SCE_H_SCRIPT 14
|
|
||||||
#define SCE_H_ASP 15
|
|
||||||
#define SCE_H_ASPAT 16
|
|
||||||
#define SCE_H_CDATA 17
|
|
||||||
#define SCE_H_QUESTION 18
|
|
||||||
#define SCE_H_VALUE 19
|
|
||||||
#define SCE_H_XCCOMMENT 20
|
|
||||||
#define SCE_H_SGML_DEFAULT 21
|
|
||||||
#define SCE_H_SGML_COMMAND 22
|
|
||||||
#define SCE_H_SGML_1ST_PARAM 23
|
|
||||||
#define SCE_H_SGML_DOUBLESTRING 24
|
|
||||||
#define SCE_H_SGML_SIMPLESTRING 25
|
|
||||||
#define SCE_H_SGML_ERROR 26
|
|
||||||
#define SCE_H_SGML_SPECIAL 27
|
|
||||||
#define SCE_H_SGML_ENTITY 28
|
|
||||||
#define SCE_H_SGML_COMMENT 29
|
|
||||||
#define SCE_H_SGML_1ST_PARAM_COMMENT 30
|
|
||||||
#define SCE_H_SGML_BLOCK_DEFAULT 31
|
|
||||||
#define SCE_HJ_START 40
|
|
||||||
#define SCE_HJ_DEFAULT 41
|
|
||||||
#define SCE_HJ_COMMENT 42
|
|
||||||
#define SCE_HJ_COMMENTLINE 43
|
|
||||||
#define SCE_HJ_COMMENTDOC 44
|
|
||||||
#define SCE_HJ_NUMBER 45
|
|
||||||
#define SCE_HJ_WORD 46
|
|
||||||
#define SCE_HJ_KEYWORD 47
|
|
||||||
#define SCE_HJ_DOUBLESTRING 48
|
|
||||||
#define SCE_HJ_SINGLESTRING 49
|
|
||||||
#define SCE_HJ_SYMBOLS 50
|
|
||||||
#define SCE_HJ_STRINGEOL 51
|
|
||||||
#define SCE_HJ_REGEX 52
|
|
||||||
#define SCE_HJA_START 55
|
|
||||||
#define SCE_HJA_DEFAULT 56
|
|
||||||
#define SCE_HJA_COMMENT 57
|
|
||||||
#define SCE_HJA_COMMENTLINE 58
|
|
||||||
#define SCE_HJA_COMMENTDOC 59
|
|
||||||
#define SCE_HJA_NUMBER 60
|
|
||||||
#define SCE_HJA_WORD 61
|
|
||||||
#define SCE_HJA_KEYWORD 62
|
|
||||||
#define SCE_HJA_DOUBLESTRING 63
|
|
||||||
#define SCE_HJA_SINGLESTRING 64
|
|
||||||
#define SCE_HJA_SYMBOLS 65
|
|
||||||
#define SCE_HJA_STRINGEOL 66
|
|
||||||
#define SCE_HJA_REGEX 67
|
|
||||||
#define SCE_HB_START 70
|
|
||||||
#define SCE_HB_DEFAULT 71
|
|
||||||
#define SCE_HB_COMMENTLINE 72
|
|
||||||
#define SCE_HB_NUMBER 73
|
|
||||||
#define SCE_HB_WORD 74
|
|
||||||
#define SCE_HB_STRING 75
|
|
||||||
#define SCE_HB_IDENTIFIER 76
|
|
||||||
#define SCE_HB_STRINGEOL 77
|
|
||||||
#define SCE_HBA_START 80
|
|
||||||
#define SCE_HBA_DEFAULT 81
|
|
||||||
#define SCE_HBA_COMMENTLINE 82
|
|
||||||
#define SCE_HBA_NUMBER 83
|
|
||||||
#define SCE_HBA_WORD 84
|
|
||||||
#define SCE_HBA_STRING 85
|
|
||||||
#define SCE_HBA_IDENTIFIER 86
|
|
||||||
#define SCE_HBA_STRINGEOL 87
|
|
||||||
#define SCE_HP_START 90
|
|
||||||
#define SCE_HP_DEFAULT 91
|
|
||||||
#define SCE_HP_COMMENTLINE 92
|
|
||||||
#define SCE_HP_NUMBER 93
|
|
||||||
#define SCE_HP_STRING 94
|
|
||||||
#define SCE_HP_CHARACTER 95
|
|
||||||
#define SCE_HP_WORD 96
|
|
||||||
#define SCE_HP_TRIPLE 97
|
|
||||||
#define SCE_HP_TRIPLEDOUBLE 98
|
|
||||||
#define SCE_HP_CLASSNAME 99
|
|
||||||
#define SCE_HP_DEFNAME 100
|
|
||||||
#define SCE_HP_OPERATOR 101
|
|
||||||
#define SCE_HP_IDENTIFIER 102
|
|
||||||
#define SCE_HPA_START 105
|
|
||||||
#define SCE_HPA_DEFAULT 106
|
|
||||||
#define SCE_HPA_COMMENTLINE 107
|
|
||||||
#define SCE_HPA_NUMBER 108
|
|
||||||
#define SCE_HPA_STRING 109
|
|
||||||
#define SCE_HPA_CHARACTER 110
|
|
||||||
#define SCE_HPA_WORD 111
|
|
||||||
#define SCE_HPA_TRIPLE 112
|
|
||||||
#define SCE_HPA_TRIPLEDOUBLE 113
|
|
||||||
#define SCE_HPA_CLASSNAME 114
|
|
||||||
#define SCE_HPA_DEFNAME 115
|
|
||||||
#define SCE_HPA_OPERATOR 116
|
|
||||||
#define SCE_HPA_IDENTIFIER 117
|
|
||||||
#define SCE_HPHP_DEFAULT 118
|
|
||||||
#define SCE_HPHP_HSTRING 119
|
|
||||||
#define SCE_HPHP_SIMPLESTRING 120
|
|
||||||
#define SCE_HPHP_WORD 121
|
|
||||||
#define SCE_HPHP_NUMBER 122
|
|
||||||
#define SCE_HPHP_VARIABLE 123
|
|
||||||
#define SCE_HPHP_COMMENT 124
|
|
||||||
#define SCE_HPHP_COMMENTLINE 125
|
|
||||||
#define SCE_HPHP_HSTRING_VARIABLE 126
|
|
||||||
#define SCE_HPHP_OPERATOR 127
|
|
||||||
#define SCE_PL_DEFAULT 0
|
|
||||||
#define SCE_PL_ERROR 1
|
|
||||||
#define SCE_PL_COMMENTLINE 2
|
|
||||||
#define SCE_PL_POD 3
|
|
||||||
#define SCE_PL_NUMBER 4
|
|
||||||
#define SCE_PL_WORD 5
|
|
||||||
#define SCE_PL_STRING 6
|
|
||||||
#define SCE_PL_CHARACTER 7
|
|
||||||
#define SCE_PL_PUNCTUATION 8
|
|
||||||
#define SCE_PL_PREPROCESSOR 9
|
|
||||||
#define SCE_PL_OPERATOR 10
|
|
||||||
#define SCE_PL_IDENTIFIER 11
|
|
||||||
#define SCE_PL_SCALAR 12
|
|
||||||
#define SCE_PL_ARRAY 13
|
|
||||||
#define SCE_PL_HASH 14
|
|
||||||
#define SCE_PL_SYMBOLTABLE 15
|
|
||||||
#define SCE_PL_REGEX 17
|
|
||||||
#define SCE_PL_REGSUBST 18
|
|
||||||
#define SCE_PL_LONGQUOTE 19
|
|
||||||
#define SCE_PL_BACKTICKS 20
|
|
||||||
#define SCE_PL_DATASECTION 21
|
|
||||||
#define SCE_PL_HERE_DELIM 22
|
|
||||||
#define SCE_PL_HERE_Q 23
|
|
||||||
#define SCE_PL_HERE_QQ 24
|
|
||||||
#define SCE_PL_HERE_QX 25
|
|
||||||
#define SCE_PL_STRING_Q 26
|
|
||||||
#define SCE_PL_STRING_QQ 27
|
|
||||||
#define SCE_PL_STRING_QX 28
|
|
||||||
#define SCE_PL_STRING_QR 29
|
|
||||||
#define SCE_PL_STRING_QW 30
|
|
||||||
#define SCE_B_DEFAULT 0
|
|
||||||
#define SCE_B_COMMENT 1
|
|
||||||
#define SCE_B_NUMBER 2
|
|
||||||
#define SCE_B_KEYWORD 3
|
|
||||||
#define SCE_B_STRING 4
|
|
||||||
#define SCE_B_PREPROCESSOR 5
|
|
||||||
#define SCE_B_OPERATOR 6
|
|
||||||
#define SCE_B_IDENTIFIER 7
|
|
||||||
#define SCE_B_DATE 8
|
|
||||||
#define SCE_B_STRINGEOL 9
|
|
||||||
#define SCE_B_KEYWORD2 10
|
|
||||||
#define SCE_B_KEYWORD3 11
|
|
||||||
#define SCE_B_KEYWORD4 12
|
|
||||||
#define SCE_PROPS_DEFAULT 0
|
|
||||||
#define SCE_PROPS_COMMENT 1
|
|
||||||
#define SCE_PROPS_SECTION 2
|
|
||||||
#define SCE_PROPS_ASSIGNMENT 3
|
|
||||||
#define SCE_PROPS_DEFVAL 4
|
|
||||||
#define SCE_L_DEFAULT 0
|
|
||||||
#define SCE_L_COMMAND 1
|
|
||||||
#define SCE_L_TAG 2
|
|
||||||
#define SCE_L_MATH 3
|
|
||||||
#define SCE_L_COMMENT 4
|
|
||||||
#define SCE_LUA_DEFAULT 0
|
|
||||||
#define SCE_LUA_COMMENT 1
|
|
||||||
#define SCE_LUA_COMMENTLINE 2
|
|
||||||
#define SCE_LUA_COMMENTDOC 3
|
|
||||||
#define SCE_LUA_NUMBER 4
|
|
||||||
#define SCE_LUA_WORD 5
|
|
||||||
#define SCE_LUA_STRING 6
|
|
||||||
#define SCE_LUA_CHARACTER 7
|
|
||||||
#define SCE_LUA_LITERALSTRING 8
|
|
||||||
#define SCE_LUA_PREPROCESSOR 9
|
|
||||||
#define SCE_LUA_OPERATOR 10
|
|
||||||
#define SCE_LUA_IDENTIFIER 11
|
|
||||||
#define SCE_LUA_STRINGEOL 12
|
|
||||||
#define SCE_LUA_WORD2 13
|
|
||||||
#define SCE_LUA_WORD3 14
|
|
||||||
#define SCE_LUA_WORD4 15
|
|
||||||
#define SCE_LUA_WORD5 16
|
|
||||||
#define SCE_LUA_WORD6 17
|
|
||||||
#define SCE_LUA_WORD7 18
|
|
||||||
#define SCE_LUA_WORD8 19
|
|
||||||
#define SCE_ERR_DEFAULT 0
|
|
||||||
#define SCE_ERR_PYTHON 1
|
|
||||||
#define SCE_ERR_GCC 2
|
|
||||||
#define SCE_ERR_MS 3
|
|
||||||
#define SCE_ERR_CMD 4
|
|
||||||
#define SCE_ERR_BORLAND 5
|
|
||||||
#define SCE_ERR_PERL 6
|
|
||||||
#define SCE_ERR_NET 7
|
|
||||||
#define SCE_ERR_LUA 8
|
|
||||||
#define SCE_ERR_CTAG 9
|
|
||||||
#define SCE_ERR_DIFF_CHANGED 10
|
|
||||||
#define SCE_ERR_DIFF_ADDITION 11
|
|
||||||
#define SCE_ERR_DIFF_DELETION 12
|
|
||||||
#define SCE_ERR_DIFF_MESSAGE 13
|
|
||||||
#define SCE_ERR_PHP 14
|
|
||||||
#define SCE_ERR_ELF 15
|
|
||||||
#define SCE_ERR_IFC 16
|
|
||||||
#define SCE_ERR_IFORT 17
|
|
||||||
#define SCE_ERR_ABSF 18
|
|
||||||
#define SCE_BAT_DEFAULT 0
|
|
||||||
#define SCE_BAT_COMMENT 1
|
|
||||||
#define SCE_BAT_WORD 2
|
|
||||||
#define SCE_BAT_LABEL 3
|
|
||||||
#define SCE_BAT_HIDE 4
|
|
||||||
#define SCE_BAT_COMMAND 5
|
|
||||||
#define SCE_BAT_IDENTIFIER 6
|
|
||||||
#define SCE_BAT_OPERATOR 7
|
|
||||||
#define SCE_MAKE_DEFAULT 0
|
|
||||||
#define SCE_MAKE_COMMENT 1
|
|
||||||
#define SCE_MAKE_PREPROCESSOR 2
|
|
||||||
#define SCE_MAKE_IDENTIFIER 3
|
|
||||||
#define SCE_MAKE_OPERATOR 4
|
|
||||||
#define SCE_MAKE_TARGET 5
|
|
||||||
#define SCE_MAKE_IDEOL 9
|
|
||||||
#define SCE_DIFF_DEFAULT 0
|
|
||||||
#define SCE_DIFF_COMMENT 1
|
|
||||||
#define SCE_DIFF_COMMAND 2
|
|
||||||
#define SCE_DIFF_HEADER 3
|
|
||||||
#define SCE_DIFF_POSITION 4
|
|
||||||
#define SCE_DIFF_DELETED 5
|
|
||||||
#define SCE_DIFF_ADDED 6
|
|
||||||
#define SCE_CONF_DEFAULT 0
|
|
||||||
#define SCE_CONF_COMMENT 1
|
|
||||||
#define SCE_CONF_NUMBER 2
|
|
||||||
#define SCE_CONF_IDENTIFIER 3
|
|
||||||
#define SCE_CONF_EXTENSION 4
|
|
||||||
#define SCE_CONF_PARAMETER 5
|
|
||||||
#define SCE_CONF_STRING 6
|
|
||||||
#define SCE_CONF_OPERATOR 7
|
|
||||||
#define SCE_CONF_IP 8
|
|
||||||
#define SCE_CONF_DIRECTIVE 9
|
|
||||||
#define SCE_AVE_DEFAULT 0
|
|
||||||
#define SCE_AVE_COMMENT 1
|
|
||||||
#define SCE_AVE_NUMBER 2
|
|
||||||
#define SCE_AVE_WORD 3
|
|
||||||
#define SCE_AVE_STRING 6
|
|
||||||
#define SCE_AVE_ENUM 7
|
|
||||||
#define SCE_AVE_STRINGEOL 8
|
|
||||||
#define SCE_AVE_IDENTIFIER 9
|
|
||||||
#define SCE_AVE_OPERATOR 10
|
|
||||||
#define SCE_AVE_WORD1 11
|
|
||||||
#define SCE_AVE_WORD2 12
|
|
||||||
#define SCE_AVE_WORD3 13
|
|
||||||
#define SCE_AVE_WORD4 14
|
|
||||||
#define SCE_AVE_WORD5 15
|
|
||||||
#define SCE_AVE_WORD6 16
|
|
||||||
#define SCE_ADA_DEFAULT 0
|
|
||||||
#define SCE_ADA_WORD 1
|
|
||||||
#define SCE_ADA_IDENTIFIER 2
|
|
||||||
#define SCE_ADA_NUMBER 3
|
|
||||||
#define SCE_ADA_DELIMITER 4
|
|
||||||
#define SCE_ADA_CHARACTER 5
|
|
||||||
#define SCE_ADA_CHARACTEREOL 6
|
|
||||||
#define SCE_ADA_STRING 7
|
|
||||||
#define SCE_ADA_STRINGEOL 8
|
|
||||||
#define SCE_ADA_LABEL 9
|
|
||||||
#define SCE_ADA_COMMENTLINE 10
|
|
||||||
#define SCE_ADA_ILLEGAL 11
|
|
||||||
#define SCE_BAAN_DEFAULT 0
|
|
||||||
#define SCE_BAAN_COMMENT 1
|
|
||||||
#define SCE_BAAN_COMMENTDOC 2
|
|
||||||
#define SCE_BAAN_NUMBER 3
|
|
||||||
#define SCE_BAAN_WORD 4
|
|
||||||
#define SCE_BAAN_STRING 5
|
|
||||||
#define SCE_BAAN_PREPROCESSOR 6
|
|
||||||
#define SCE_BAAN_OPERATOR 7
|
|
||||||
#define SCE_BAAN_IDENTIFIER 8
|
|
||||||
#define SCE_BAAN_STRINGEOL 9
|
|
||||||
#define SCE_BAAN_WORD2 10
|
|
||||||
#define SCE_LISP_DEFAULT 0
|
|
||||||
#define SCE_LISP_COMMENT 1
|
|
||||||
#define SCE_LISP_NUMBER 2
|
|
||||||
#define SCE_LISP_KEYWORD 3
|
|
||||||
#define SCE_LISP_STRING 6
|
|
||||||
#define SCE_LISP_STRINGEOL 8
|
|
||||||
#define SCE_LISP_IDENTIFIER 9
|
|
||||||
#define SCE_LISP_OPERATOR 10
|
|
||||||
#define SCE_EIFFEL_DEFAULT 0
|
|
||||||
#define SCE_EIFFEL_COMMENTLINE 1
|
|
||||||
#define SCE_EIFFEL_NUMBER 2
|
|
||||||
#define SCE_EIFFEL_WORD 3
|
|
||||||
#define SCE_EIFFEL_STRING 4
|
|
||||||
#define SCE_EIFFEL_CHARACTER 5
|
|
||||||
#define SCE_EIFFEL_OPERATOR 6
|
|
||||||
#define SCE_EIFFEL_IDENTIFIER 7
|
|
||||||
#define SCE_EIFFEL_STRINGEOL 8
|
|
||||||
#define SCE_NNCRONTAB_DEFAULT 0
|
|
||||||
#define SCE_NNCRONTAB_COMMENT 1
|
|
||||||
#define SCE_NNCRONTAB_TASK 2
|
|
||||||
#define SCE_NNCRONTAB_SECTION 3
|
|
||||||
#define SCE_NNCRONTAB_KEYWORD 4
|
|
||||||
#define SCE_NNCRONTAB_MODIFIER 5
|
|
||||||
#define SCE_NNCRONTAB_ASTERISK 6
|
|
||||||
#define SCE_NNCRONTAB_NUMBER 7
|
|
||||||
#define SCE_NNCRONTAB_STRING 8
|
|
||||||
#define SCE_NNCRONTAB_ENVIRONMENT 9
|
|
||||||
#define SCE_NNCRONTAB_IDENTIFIER 10
|
|
||||||
#define SCE_FORTH_DEFAULT 0
|
|
||||||
#define SCE_FORTH_COMMENT 1
|
|
||||||
#define SCE_FORTH_COMMENT_ML 2
|
|
||||||
#define SCE_FORTH_IDENTIFIER 3
|
|
||||||
#define SCE_FORTH_CONTROL 4
|
|
||||||
#define SCE_FORTH_KEYWORD 5
|
|
||||||
#define SCE_FORTH_DEFWORD 6
|
|
||||||
#define SCE_FORTH_PREWORD1 7
|
|
||||||
#define SCE_FORTH_PREWORD2 8
|
|
||||||
#define SCE_FORTH_NUMBER 9
|
|
||||||
#define SCE_FORTH_STRING 10
|
|
||||||
#define SCE_FORTH_LOCALE 11
|
|
||||||
#define SCE_MATLAB_DEFAULT 0
|
|
||||||
#define SCE_MATLAB_COMMENT 1
|
|
||||||
#define SCE_MATLAB_COMMAND 2
|
|
||||||
#define SCE_MATLAB_NUMBER 3
|
|
||||||
#define SCE_MATLAB_KEYWORD 4
|
|
||||||
#define SCE_MATLAB_STRING 5
|
|
||||||
#define SCE_MATLAB_OPERATOR 6
|
|
||||||
#define SCE_MATLAB_IDENTIFIER 7
|
|
||||||
#define SCE_MATLAB_DOUBLEQUOTESTRING 8
|
|
||||||
#define SCE_SCRIPTOL_DEFAULT 0
|
|
||||||
#define SCE_SCRIPTOL_WHITE 1
|
|
||||||
#define SCE_SCRIPTOL_COMMENTLINE 2
|
|
||||||
#define SCE_SCRIPTOL_PERSISTENT 3
|
|
||||||
#define SCE_SCRIPTOL_CSTYLE 4
|
|
||||||
#define SCE_SCRIPTOL_COMMENTBLOCK 5
|
|
||||||
#define SCE_SCRIPTOL_NUMBER 6
|
|
||||||
#define SCE_SCRIPTOL_STRING 7
|
|
||||||
#define SCE_SCRIPTOL_CHARACTER 8
|
|
||||||
#define SCE_SCRIPTOL_STRINGEOL 9
|
|
||||||
#define SCE_SCRIPTOL_KEYWORD 10
|
|
||||||
#define SCE_SCRIPTOL_OPERATOR 11
|
|
||||||
#define SCE_SCRIPTOL_IDENTIFIER 12
|
|
||||||
#define SCE_SCRIPTOL_TRIPLE 13
|
|
||||||
#define SCE_SCRIPTOL_CLASSNAME 14
|
|
||||||
#define SCE_SCRIPTOL_PREPROCESSOR 15
|
|
||||||
#define SCE_ASM_DEFAULT 0
|
|
||||||
#define SCE_ASM_COMMENT 1
|
|
||||||
#define SCE_ASM_NUMBER 2
|
|
||||||
#define SCE_ASM_STRING 3
|
|
||||||
#define SCE_ASM_OPERATOR 4
|
|
||||||
#define SCE_ASM_IDENTIFIER 5
|
|
||||||
#define SCE_ASM_CPUINSTRUCTION 6
|
|
||||||
#define SCE_ASM_MATHINSTRUCTION 7
|
|
||||||
#define SCE_ASM_REGISTER 8
|
|
||||||
#define SCE_ASM_DIRECTIVE 9
|
|
||||||
#define SCE_ASM_DIRECTIVEOPERAND 10
|
|
||||||
#define SCE_ASM_COMMENTBLOCK 11
|
|
||||||
#define SCE_ASM_CHARACTER 12
|
|
||||||
#define SCE_ASM_STRINGEOL 13
|
|
||||||
#define SCE_ASM_EXTINSTRUCTION 14
|
|
||||||
#define SCE_F_DEFAULT 0
|
|
||||||
#define SCE_F_COMMENT 1
|
|
||||||
#define SCE_F_NUMBER 2
|
|
||||||
#define SCE_F_STRING1 3
|
|
||||||
#define SCE_F_STRING2 4
|
|
||||||
#define SCE_F_STRINGEOL 5
|
|
||||||
#define SCE_F_OPERATOR 6
|
|
||||||
#define SCE_F_IDENTIFIER 7
|
|
||||||
#define SCE_F_WORD 8
|
|
||||||
#define SCE_F_WORD2 9
|
|
||||||
#define SCE_F_WORD3 10
|
|
||||||
#define SCE_F_PREPROCESSOR 11
|
|
||||||
#define SCE_F_OPERATOR2 12
|
|
||||||
#define SCE_F_LABEL 13
|
|
||||||
#define SCE_F_CONTINUATION 14
|
|
||||||
#define SCE_CSS_DEFAULT 0
|
|
||||||
#define SCE_CSS_TAG 1
|
|
||||||
#define SCE_CSS_CLASS 2
|
|
||||||
#define SCE_CSS_PSEUDOCLASS 3
|
|
||||||
#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4
|
|
||||||
#define SCE_CSS_OPERATOR 5
|
|
||||||
#define SCE_CSS_IDENTIFIER 6
|
|
||||||
#define SCE_CSS_UNKNOWN_IDENTIFIER 7
|
|
||||||
#define SCE_CSS_VALUE 8
|
|
||||||
#define SCE_CSS_COMMENT 9
|
|
||||||
#define SCE_CSS_ID 10
|
|
||||||
#define SCE_CSS_IMPORTANT 11
|
|
||||||
#define SCE_CSS_DIRECTIVE 12
|
|
||||||
#define SCE_CSS_DOUBLESTRING 13
|
|
||||||
#define SCE_CSS_SINGLESTRING 14
|
|
||||||
#define SCE_POV_DEFAULT 0
|
|
||||||
#define SCE_POV_COMMENT 1
|
|
||||||
#define SCE_POV_COMMENTLINE 2
|
|
||||||
#define SCE_POV_NUMBER 3
|
|
||||||
#define SCE_POV_OPERATOR 4
|
|
||||||
#define SCE_POV_IDENTIFIER 5
|
|
||||||
#define SCE_POV_STRING 6
|
|
||||||
#define SCE_POV_STRINGEOL 7
|
|
||||||
#define SCE_POV_DIRECTIVE 8
|
|
||||||
#define SCE_POV_BADDIRECTIVE 9
|
|
||||||
#define SCE_POV_WORD2 10
|
|
||||||
#define SCE_POV_WORD3 11
|
|
||||||
#define SCE_POV_WORD4 12
|
|
||||||
#define SCE_POV_WORD5 13
|
|
||||||
#define SCE_POV_WORD6 14
|
|
||||||
#define SCE_POV_WORD7 15
|
|
||||||
#define SCE_POV_WORD8 16
|
|
||||||
#define SCE_LOUT_DEFAULT 0
|
|
||||||
#define SCE_LOUT_COMMENT 1
|
|
||||||
#define SCE_LOUT_NUMBER 2
|
|
||||||
#define SCE_LOUT_WORD 3
|
|
||||||
#define SCE_LOUT_WORD2 4
|
|
||||||
#define SCE_LOUT_WORD3 5
|
|
||||||
#define SCE_LOUT_WORD4 6
|
|
||||||
#define SCE_LOUT_STRING 7
|
|
||||||
#define SCE_LOUT_OPERATOR 8
|
|
||||||
#define SCE_LOUT_IDENTIFIER 9
|
|
||||||
#define SCE_LOUT_STRINGEOL 10
|
|
||||||
#define SCE_ESCRIPT_DEFAULT 0
|
|
||||||
#define SCE_ESCRIPT_COMMENT 1
|
|
||||||
#define SCE_ESCRIPT_COMMENTLINE 2
|
|
||||||
#define SCE_ESCRIPT_COMMENTDOC 3
|
|
||||||
#define SCE_ESCRIPT_NUMBER 4
|
|
||||||
#define SCE_ESCRIPT_WORD 5
|
|
||||||
#define SCE_ESCRIPT_STRING 6
|
|
||||||
#define SCE_ESCRIPT_OPERATOR 7
|
|
||||||
#define SCE_ESCRIPT_IDENTIFIER 8
|
|
||||||
#define SCE_ESCRIPT_BRACE 9
|
|
||||||
#define SCE_ESCRIPT_WORD2 10
|
|
||||||
#define SCE_ESCRIPT_WORD3 11
|
|
||||||
#define SCE_PS_DEFAULT 0
|
|
||||||
#define SCE_PS_COMMENT 1
|
|
||||||
#define SCE_PS_DSC_COMMENT 2
|
|
||||||
#define SCE_PS_DSC_VALUE 3
|
|
||||||
#define SCE_PS_NUMBER 4
|
|
||||||
#define SCE_PS_NAME 5
|
|
||||||
#define SCE_PS_KEYWORD 6
|
|
||||||
#define SCE_PS_LITERAL 7
|
|
||||||
#define SCE_PS_IMMEVAL 8
|
|
||||||
#define SCE_PS_PAREN_ARRAY 9
|
|
||||||
#define SCE_PS_PAREN_DICT 10
|
|
||||||
#define SCE_PS_PAREN_PROC 11
|
|
||||||
#define SCE_PS_TEXT 12
|
|
||||||
#define SCE_PS_HEXSTRING 13
|
|
||||||
#define SCE_PS_BASE85STRING 14
|
|
||||||
#define SCE_PS_BADSTRINGCHAR 15
|
|
||||||
#define SCE_NSIS_DEFAULT 0
|
|
||||||
#define SCE_NSIS_COMMENT 1
|
|
||||||
#define SCE_NSIS_STRINGDQ 2
|
|
||||||
#define SCE_NSIS_STRINGLQ 3
|
|
||||||
#define SCE_NSIS_STRINGRQ 4
|
|
||||||
#define SCE_NSIS_FUNCTION 5
|
|
||||||
#define SCE_NSIS_VARIABLE 6
|
|
||||||
#define SCE_NSIS_LABEL 7
|
|
||||||
#define SCE_NSIS_USERDEFINED 8
|
|
||||||
#define SCE_NSIS_SECTIONDEF 9
|
|
||||||
#define SCE_NSIS_SUBSECTIONDEF 10
|
|
||||||
#define SCE_NSIS_IFDEFINEDEF 11
|
|
||||||
#define SCE_NSIS_MACRODEF 12
|
|
||||||
#define SCE_NSIS_STRINGVAR 13
|
|
||||||
#define SCE_MMIXAL_LEADWS 0
|
|
||||||
#define SCE_MMIXAL_COMMENT 1
|
|
||||||
#define SCE_MMIXAL_LABEL 2
|
|
||||||
#define SCE_MMIXAL_OPCODE 3
|
|
||||||
#define SCE_MMIXAL_OPCODE_PRE 4
|
|
||||||
#define SCE_MMIXAL_OPCODE_VALID 5
|
|
||||||
#define SCE_MMIXAL_OPCODE_UNKNOWN 6
|
|
||||||
#define SCE_MMIXAL_OPCODE_POST 7
|
|
||||||
#define SCE_MMIXAL_OPERANDS 8
|
|
||||||
#define SCE_MMIXAL_NUMBER 9
|
|
||||||
#define SCE_MMIXAL_REF 10
|
|
||||||
#define SCE_MMIXAL_CHAR 11
|
|
||||||
#define SCE_MMIXAL_STRING 12
|
|
||||||
#define SCE_MMIXAL_REGISTER 13
|
|
||||||
#define SCE_MMIXAL_HEX 14
|
|
||||||
#define SCE_MMIXAL_OPERATOR 15
|
|
||||||
#define SCE_MMIXAL_SYMBOL 16
|
|
||||||
#define SCE_MMIXAL_INCLUDE 17
|
|
||||||
#define SCE_CLW_DEFAULT 0
|
|
||||||
#define SCE_CLW_LABEL 1
|
|
||||||
#define SCE_CLW_COMMENT 2
|
|
||||||
#define SCE_CLW_STRING 3
|
|
||||||
#define SCE_CLW_USER_IDENTIFIER 4
|
|
||||||
#define SCE_CLW_INTEGER_CONSTANT 5
|
|
||||||
#define SCE_CLW_REAL_CONSTANT 6
|
|
||||||
#define SCE_CLW_PICTURE_STRING 7
|
|
||||||
#define SCE_CLW_KEYWORD 8
|
|
||||||
#define SCE_CLW_COMPILER_DIRECTIVE 9
|
|
||||||
#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 10
|
|
||||||
#define SCE_CLW_STRUCTURE_DATA_TYPE 11
|
|
||||||
#define SCE_CLW_ATTRIBUTE 12
|
|
||||||
#define SCE_CLW_STANDARD_EQUATE 13
|
|
||||||
#define SCE_CLW_ERROR 14
|
|
||||||
#define SCE_LOT_DEFAULT 0
|
|
||||||
#define SCE_LOT_HEADER 1
|
|
||||||
#define SCE_LOT_BREAK 2
|
|
||||||
#define SCE_LOT_SET 3
|
|
||||||
#define SCE_LOT_PASS 4
|
|
||||||
#define SCE_LOT_FAIL 5
|
|
||||||
#define SCE_LOT_ABORT 6
|
|
||||||
#define SCE_YAML_DEFAULT 0
|
|
||||||
#define SCE_YAML_COMMENT 1
|
|
||||||
#define SCE_YAML_IDENTIFIER 2
|
|
||||||
#define SCE_YAML_KEYWORD 3
|
|
||||||
#define SCE_YAML_NUMBER 4
|
|
||||||
#define SCE_YAML_REFERENCE 5
|
|
||||||
#define SCE_YAML_DOCUMENT 6
|
|
||||||
#define SCE_YAML_TEXT 7
|
|
||||||
#define SCE_YAML_ERROR 8
|
|
||||||
#define SCE_TEX_DEFAULT 0
|
|
||||||
#define SCE_TEX_SPECIAL 1
|
|
||||||
#define SCE_TEX_GROUP 2
|
|
||||||
#define SCE_TEX_SYMBOL 3
|
|
||||||
#define SCE_TEX_COMMAND 4
|
|
||||||
#define SCE_TEX_TEXT 5
|
|
||||||
#define SCE_METAPOST_DEFAULT 0
|
|
||||||
#define SCE_METAPOST_SPECIAL 1
|
|
||||||
#define SCE_METAPOST_GROUP 2
|
|
||||||
#define SCE_METAPOST_SYMBOL 3
|
|
||||||
#define SCE_METAPOST_COMMAND 4
|
|
||||||
#define SCE_METAPOST_TEXT 5
|
|
||||||
#define SCE_METAPOST_EXTRA 6
|
|
||||||
#define SCE_ERLANG_DEFAULT 0
|
|
||||||
#define SCE_ERLANG_COMMENT 1
|
|
||||||
#define SCE_ERLANG_VARIABLE 2
|
|
||||||
#define SCE_ERLANG_NUMBER 3
|
|
||||||
#define SCE_ERLANG_KEYWORD 4
|
|
||||||
#define SCE_ERLANG_STRING 5
|
|
||||||
#define SCE_ERLANG_OPERATOR 6
|
|
||||||
#define SCE_ERLANG_ATOM 7
|
|
||||||
#define SCE_ERLANG_FUNCTION_NAME 8
|
|
||||||
#define SCE_ERLANG_CHARACTER 9
|
|
||||||
#define SCE_ERLANG_MACRO 10
|
|
||||||
#define SCE_ERLANG_RECORD 11
|
|
||||||
#define SCE_ERLANG_SEPARATOR 12
|
|
||||||
#define SCE_ERLANG_NODE_NAME 13
|
|
||||||
#define SCE_ERLANG_UNKNOWN 31
|
|
||||||
//--Autogenerated -- end of section automatically generated from Scintilla.iface
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,722 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file Scintilla.h
|
|
||||||
** Interface to the edit control.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
// Most of this file is automatically generated from the Scintilla.iface interface definition
|
|
||||||
// file which contains any comments about the definitions. HFacer.py does the generation.
|
|
||||||
|
|
||||||
#ifndef SCINTILLA_H
|
|
||||||
#define SCINTILLA_H
|
|
||||||
|
|
||||||
#if PLAT_WIN
|
|
||||||
// Return false on failure:
|
|
||||||
bool Scintilla_RegisterClasses(void *hInstance);
|
|
||||||
bool Scintilla_ReleaseResources();
|
|
||||||
#endif
|
|
||||||
int Scintilla_LinkLexers();
|
|
||||||
|
|
||||||
// Here should be placed typedefs for uptr_t, an unsigned integer type large enough to
|
|
||||||
// hold a pointer and sptr_t, a signed integer large enough to hold a pointer.
|
|
||||||
// May need to be changed for 64 bit platforms.
|
|
||||||
#if _MSC_VER >= 1300
|
|
||||||
#include <BaseTsd.h>
|
|
||||||
#endif
|
|
||||||
#ifdef MAXULONG_PTR
|
|
||||||
typedef ULONG_PTR uptr_t;
|
|
||||||
typedef LONG_PTR sptr_t;
|
|
||||||
#else
|
|
||||||
typedef unsigned long uptr_t;
|
|
||||||
typedef long sptr_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
|
|
||||||
//++Autogenerated -- start of section automatically generated from Scintilla.iface
|
|
||||||
#define INVALID_POSITION -1
|
|
||||||
#define SCI_START 2000
|
|
||||||
#define SCI_OPTIONAL_START 3000
|
|
||||||
#define SCI_LEXER_START 4000
|
|
||||||
#define SCI_ADDTEXT 2001
|
|
||||||
#define SCI_ADDSTYLEDTEXT 2002
|
|
||||||
#define SCI_INSERTTEXT 2003
|
|
||||||
#define SCI_CLEARALL 2004
|
|
||||||
#define SCI_CLEARDOCUMENTSTYLE 2005
|
|
||||||
#define SCI_GETLENGTH 2006
|
|
||||||
#define SCI_GETCHARAT 2007
|
|
||||||
#define SCI_GETCURRENTPOS 2008
|
|
||||||
#define SCI_GETANCHOR 2009
|
|
||||||
#define SCI_GETSTYLEAT 2010
|
|
||||||
#define SCI_REDO 2011
|
|
||||||
#define SCI_SETUNDOCOLLECTION 2012
|
|
||||||
#define SCI_SELECTALL 2013
|
|
||||||
#define SCI_SETSAVEPOINT 2014
|
|
||||||
#define SCI_GETSTYLEDTEXT 2015
|
|
||||||
#define SCI_CANREDO 2016
|
|
||||||
#define SCI_MARKERLINEFROMHANDLE 2017
|
|
||||||
#define SCI_MARKERDELETEHANDLE 2018
|
|
||||||
#define SCI_GETUNDOCOLLECTION 2019
|
|
||||||
#define SCWS_INVISIBLE 0
|
|
||||||
#define SCWS_VISIBLEALWAYS 1
|
|
||||||
#define SCWS_VISIBLEAFTERINDENT 2
|
|
||||||
#define SCI_GETVIEWWS 2020
|
|
||||||
#define SCI_SETVIEWWS 2021
|
|
||||||
#define SCI_POSITIONFROMPOINT 2022
|
|
||||||
#define SCI_POSITIONFROMPOINTCLOSE 2023
|
|
||||||
#define SCI_GOTOLINE 2024
|
|
||||||
#define SCI_GOTOPOS 2025
|
|
||||||
#define SCI_SETANCHOR 2026
|
|
||||||
#define SCI_GETCURLINE 2027
|
|
||||||
#define SCI_GETENDSTYLED 2028
|
|
||||||
#define SC_EOL_CRLF 0
|
|
||||||
#define SC_EOL_CR 1
|
|
||||||
#define SC_EOL_LF 2
|
|
||||||
#define SCI_CONVERTEOLS 2029
|
|
||||||
#define SCI_GETEOLMODE 2030
|
|
||||||
#define SCI_SETEOLMODE 2031
|
|
||||||
#define SCI_STARTSTYLING 2032
|
|
||||||
#define SCI_SETSTYLING 2033
|
|
||||||
#define SCI_GETBUFFEREDDRAW 2034
|
|
||||||
#define SCI_SETBUFFEREDDRAW 2035
|
|
||||||
#define SCI_SETTABWIDTH 2036
|
|
||||||
#define SCI_GETTABWIDTH 2121
|
|
||||||
#define SC_CP_UTF8 65001
|
|
||||||
#define SC_CP_DBCS 1
|
|
||||||
#define SCI_SETCODEPAGE 2037
|
|
||||||
#define SCI_SETUSEPALETTE 2039
|
|
||||||
#define MARKER_MAX 31
|
|
||||||
#define SC_MARK_CIRCLE 0
|
|
||||||
#define SC_MARK_ROUNDRECT 1
|
|
||||||
#define SC_MARK_ARROW 2
|
|
||||||
#define SC_MARK_SMALLRECT 3
|
|
||||||
#define SC_MARK_SHORTARROW 4
|
|
||||||
#define SC_MARK_EMPTY 5
|
|
||||||
#define SC_MARK_ARROWDOWN 6
|
|
||||||
#define SC_MARK_MINUS 7
|
|
||||||
#define SC_MARK_PLUS 8
|
|
||||||
#define SC_MARK_VLINE 9
|
|
||||||
#define SC_MARK_LCORNER 10
|
|
||||||
#define SC_MARK_TCORNER 11
|
|
||||||
#define SC_MARK_BOXPLUS 12
|
|
||||||
#define SC_MARK_BOXPLUSCONNECTED 13
|
|
||||||
#define SC_MARK_BOXMINUS 14
|
|
||||||
#define SC_MARK_BOXMINUSCONNECTED 15
|
|
||||||
#define SC_MARK_LCORNERCURVE 16
|
|
||||||
#define SC_MARK_TCORNERCURVE 17
|
|
||||||
#define SC_MARK_CIRCLEPLUS 18
|
|
||||||
#define SC_MARK_CIRCLEPLUSCONNECTED 19
|
|
||||||
#define SC_MARK_CIRCLEMINUS 20
|
|
||||||
#define SC_MARK_CIRCLEMINUSCONNECTED 21
|
|
||||||
#define SC_MARK_BACKGROUND 22
|
|
||||||
#define SC_MARK_DOTDOTDOT 23
|
|
||||||
#define SC_MARK_ARROWS 24
|
|
||||||
#define SC_MARK_PIXMAP 25
|
|
||||||
#define SC_MARK_CHARACTER 10000
|
|
||||||
#define SC_MARKNUM_FOLDEREND 25
|
|
||||||
#define SC_MARKNUM_FOLDEROPENMID 26
|
|
||||||
#define SC_MARKNUM_FOLDERMIDTAIL 27
|
|
||||||
#define SC_MARKNUM_FOLDERTAIL 28
|
|
||||||
#define SC_MARKNUM_FOLDERSUB 29
|
|
||||||
#define SC_MARKNUM_FOLDER 30
|
|
||||||
#define SC_MARKNUM_FOLDEROPEN 31
|
|
||||||
#define SC_MASK_FOLDERS 0xFE000000
|
|
||||||
#define SCI_MARKERDEFINE 2040
|
|
||||||
#define SCI_MARKERSETFORE 2041
|
|
||||||
#define SCI_MARKERSETBACK 2042
|
|
||||||
#define SCI_MARKERADD 2043
|
|
||||||
#define SCI_MARKERDELETE 2044
|
|
||||||
#define SCI_MARKERDELETEALL 2045
|
|
||||||
#define SCI_MARKERGET 2046
|
|
||||||
#define SCI_MARKERNEXT 2047
|
|
||||||
#define SCI_MARKERPREVIOUS 2048
|
|
||||||
#define SCI_MARKERDEFINEPIXMAP 2049
|
|
||||||
#define SC_MARGIN_SYMBOL 0
|
|
||||||
#define SC_MARGIN_NUMBER 1
|
|
||||||
#define SCI_SETMARGINTYPEN 2240
|
|
||||||
#define SCI_GETMARGINTYPEN 2241
|
|
||||||
#define SCI_SETMARGINWIDTHN 2242
|
|
||||||
#define SCI_GETMARGINWIDTHN 2243
|
|
||||||
#define SCI_SETMARGINMASKN 2244
|
|
||||||
#define SCI_GETMARGINMASKN 2245
|
|
||||||
#define SCI_SETMARGINSENSITIVEN 2246
|
|
||||||
#define SCI_GETMARGINSENSITIVEN 2247
|
|
||||||
#define STYLE_DEFAULT 32
|
|
||||||
#define STYLE_LINENUMBER 33
|
|
||||||
#define STYLE_BRACELIGHT 34
|
|
||||||
#define STYLE_BRACEBAD 35
|
|
||||||
#define STYLE_CONTROLCHAR 36
|
|
||||||
#define STYLE_INDENTGUIDE 37
|
|
||||||
#define STYLE_LASTPREDEFINED 39
|
|
||||||
#define STYLE_MAX 127
|
|
||||||
#define SC_CHARSET_ANSI 0
|
|
||||||
#define SC_CHARSET_DEFAULT 1
|
|
||||||
#define SC_CHARSET_BALTIC 186
|
|
||||||
#define SC_CHARSET_CHINESEBIG5 136
|
|
||||||
#define SC_CHARSET_EASTEUROPE 238
|
|
||||||
#define SC_CHARSET_GB2312 134
|
|
||||||
#define SC_CHARSET_GREEK 161
|
|
||||||
#define SC_CHARSET_HANGUL 129
|
|
||||||
#define SC_CHARSET_MAC 77
|
|
||||||
#define SC_CHARSET_OEM 255
|
|
||||||
#define SC_CHARSET_RUSSIAN 204
|
|
||||||
#define SC_CHARSET_SHIFTJIS 128
|
|
||||||
#define SC_CHARSET_SYMBOL 2
|
|
||||||
#define SC_CHARSET_TURKISH 162
|
|
||||||
#define SC_CHARSET_JOHAB 130
|
|
||||||
#define SC_CHARSET_HEBREW 177
|
|
||||||
#define SC_CHARSET_ARABIC 178
|
|
||||||
#define SC_CHARSET_VIETNAMESE 163
|
|
||||||
#define SC_CHARSET_THAI 222
|
|
||||||
#define SCI_STYLECLEARALL 2050
|
|
||||||
#define SCI_STYLESETFORE 2051
|
|
||||||
#define SCI_STYLESETBACK 2052
|
|
||||||
#define SCI_STYLESETBOLD 2053
|
|
||||||
#define SCI_STYLESETITALIC 2054
|
|
||||||
#define SCI_STYLESETSIZE 2055
|
|
||||||
#define SCI_STYLESETFONT 2056
|
|
||||||
#define SCI_STYLESETEOLFILLED 2057
|
|
||||||
#define SCI_STYLERESETDEFAULT 2058
|
|
||||||
#define SCI_STYLESETUNDERLINE 2059
|
|
||||||
#define SC_CASE_MIXED 0
|
|
||||||
#define SC_CASE_UPPER 1
|
|
||||||
#define SC_CASE_LOWER 2
|
|
||||||
#define SCI_STYLESETCASE 2060
|
|
||||||
#define SCI_STYLESETCHARACTERSET 2066
|
|
||||||
#define SCI_STYLESETHOTSPOT 2409
|
|
||||||
#define SCI_SETSELFORE 2067
|
|
||||||
#define SCI_SETSELBACK 2068
|
|
||||||
#define SCI_SETCARETFORE 2069
|
|
||||||
#define SCI_ASSIGNCMDKEY 2070
|
|
||||||
#define SCI_CLEARCMDKEY 2071
|
|
||||||
#define SCI_CLEARALLCMDKEYS 2072
|
|
||||||
#define SCI_SETSTYLINGEX 2073
|
|
||||||
#define SCI_STYLESETVISIBLE 2074
|
|
||||||
#define SCI_GETCARETPERIOD 2075
|
|
||||||
#define SCI_SETCARETPERIOD 2076
|
|
||||||
#define SCI_SETWORDCHARS 2077
|
|
||||||
#define SCI_BEGINUNDOACTION 2078
|
|
||||||
#define SCI_ENDUNDOACTION 2079
|
|
||||||
#define INDIC_MAX 7
|
|
||||||
#define INDIC_PLAIN 0
|
|
||||||
#define INDIC_SQUIGGLE 1
|
|
||||||
#define INDIC_TT 2
|
|
||||||
#define INDIC_DIAGONAL 3
|
|
||||||
#define INDIC_STRIKE 4
|
|
||||||
#define INDIC_HIDDEN 5
|
|
||||||
#define INDIC_BOX 6
|
|
||||||
#define INDIC0_MASK 0x20
|
|
||||||
#define INDIC1_MASK 0x40
|
|
||||||
#define INDIC2_MASK 0x80
|
|
||||||
#define INDICS_MASK 0xE0
|
|
||||||
#define SCI_INDICSETSTYLE 2080
|
|
||||||
#define SCI_INDICGETSTYLE 2081
|
|
||||||
#define SCI_INDICSETFORE 2082
|
|
||||||
#define SCI_INDICGETFORE 2083
|
|
||||||
#define SCI_SETWHITESPACEFORE 2084
|
|
||||||
#define SCI_SETWHITESPACEBACK 2085
|
|
||||||
#define SCI_SETSTYLEBITS 2090
|
|
||||||
#define SCI_GETSTYLEBITS 2091
|
|
||||||
#define SCI_SETLINESTATE 2092
|
|
||||||
#define SCI_GETLINESTATE 2093
|
|
||||||
#define SCI_GETMAXLINESTATE 2094
|
|
||||||
#define SCI_GETCARETLINEVISIBLE 2095
|
|
||||||
#define SCI_SETCARETLINEVISIBLE 2096
|
|
||||||
#define SCI_GETCARETLINEBACK 2097
|
|
||||||
#define SCI_SETCARETLINEBACK 2098
|
|
||||||
#define SCI_STYLESETCHANGEABLE 2099
|
|
||||||
#define SCI_AUTOCSHOW 2100
|
|
||||||
#define SCI_AUTOCCANCEL 2101
|
|
||||||
#define SCI_AUTOCACTIVE 2102
|
|
||||||
#define SCI_AUTOCPOSSTART 2103
|
|
||||||
#define SCI_AUTOCCOMPLETE 2104
|
|
||||||
#define SCI_AUTOCSTOPS 2105
|
|
||||||
#define SCI_AUTOCSETSEPARATOR 2106
|
|
||||||
#define SCI_AUTOCGETSEPARATOR 2107
|
|
||||||
#define SCI_AUTOCSELECT 2108
|
|
||||||
#define SCI_AUTOCSETCANCELATSTART 2110
|
|
||||||
#define SCI_AUTOCGETCANCELATSTART 2111
|
|
||||||
#define SCI_AUTOCSETFILLUPS 2112
|
|
||||||
#define SCI_AUTOCSETCHOOSESINGLE 2113
|
|
||||||
#define SCI_AUTOCGETCHOOSESINGLE 2114
|
|
||||||
#define SCI_AUTOCSETIGNORECASE 2115
|
|
||||||
#define SCI_AUTOCGETIGNORECASE 2116
|
|
||||||
#define SCI_USERLISTSHOW 2117
|
|
||||||
#define SCI_AUTOCSETAUTOHIDE 2118
|
|
||||||
#define SCI_AUTOCGETAUTOHIDE 2119
|
|
||||||
#define SCI_AUTOCSETDROPRESTOFWORD 2270
|
|
||||||
#define SCI_AUTOCGETDROPRESTOFWORD 2271
|
|
||||||
#define SCI_REGISTERIMAGE 2405
|
|
||||||
#define SCI_CLEARREGISTEREDIMAGES 2408
|
|
||||||
#define SCI_AUTOCGETTYPESEPARATOR 2285
|
|
||||||
#define SCI_AUTOCSETTYPESEPARATOR 2286
|
|
||||||
#define SCI_SETINDENT 2122
|
|
||||||
#define SCI_GETINDENT 2123
|
|
||||||
#define SCI_SETUSETABS 2124
|
|
||||||
#define SCI_GETUSETABS 2125
|
|
||||||
#define SCI_SETLINEINDENTATION 2126
|
|
||||||
#define SCI_GETLINEINDENTATION 2127
|
|
||||||
#define SCI_GETLINEINDENTPOSITION 2128
|
|
||||||
#define SCI_GETCOLUMN 2129
|
|
||||||
#define SCI_SETHSCROLLBAR 2130
|
|
||||||
#define SCI_GETHSCROLLBAR 2131
|
|
||||||
#define SCI_SETINDENTATIONGUIDES 2132
|
|
||||||
#define SCI_GETINDENTATIONGUIDES 2133
|
|
||||||
#define SCI_SETHIGHLIGHTGUIDE 2134
|
|
||||||
#define SCI_GETHIGHLIGHTGUIDE 2135
|
|
||||||
#define SCI_GETLINEENDPOSITION 2136
|
|
||||||
#define SCI_GETCODEPAGE 2137
|
|
||||||
#define SCI_GETCARETFORE 2138
|
|
||||||
#define SCI_GETUSEPALETTE 2139
|
|
||||||
#define SCI_GETREADONLY 2140
|
|
||||||
#define SCI_SETCURRENTPOS 2141
|
|
||||||
#define SCI_SETSELECTIONSTART 2142
|
|
||||||
#define SCI_GETSELECTIONSTART 2143
|
|
||||||
#define SCI_SETSELECTIONEND 2144
|
|
||||||
#define SCI_GETSELECTIONEND 2145
|
|
||||||
#define SCI_SETPRINTMAGNIFICATION 2146
|
|
||||||
#define SCI_GETPRINTMAGNIFICATION 2147
|
|
||||||
#define SC_PRINT_NORMAL 0
|
|
||||||
#define SC_PRINT_INVERTLIGHT 1
|
|
||||||
#define SC_PRINT_BLACKONWHITE 2
|
|
||||||
#define SC_PRINT_COLOURONWHITE 3
|
|
||||||
#define SC_PRINT_COLOURONWHITEDEFAULTBG 4
|
|
||||||
#define SCI_SETPRINTCOLOURMODE 2148
|
|
||||||
#define SCI_GETPRINTCOLOURMODE 2149
|
|
||||||
#define SCFIND_WHOLEWORD 2
|
|
||||||
#define SCFIND_MATCHCASE 4
|
|
||||||
#define SCFIND_WORDSTART 0x00100000
|
|
||||||
#define SCFIND_REGEXP 0x00200000
|
|
||||||
#define SCFIND_POSIX 0x00400000
|
|
||||||
#define SCI_FINDTEXT 2150
|
|
||||||
#define SCI_FORMATRANGE 2151
|
|
||||||
#define SCI_GETFIRSTVISIBLELINE 2152
|
|
||||||
#define SCI_GETLINE 2153
|
|
||||||
#define SCI_GETLINECOUNT 2154
|
|
||||||
#define SCI_SETMARGINLEFT 2155
|
|
||||||
#define SCI_GETMARGINLEFT 2156
|
|
||||||
#define SCI_SETMARGINRIGHT 2157
|
|
||||||
#define SCI_GETMARGINRIGHT 2158
|
|
||||||
#define SCI_GETMODIFY 2159
|
|
||||||
#define SCI_SETSEL 2160
|
|
||||||
#define SCI_GETSELTEXT 2161
|
|
||||||
#define SCI_GETTEXTRANGE 2162
|
|
||||||
#define SCI_HIDESELECTION 2163
|
|
||||||
#define SCI_POINTXFROMPOSITION 2164
|
|
||||||
#define SCI_POINTYFROMPOSITION 2165
|
|
||||||
#define SCI_LINEFROMPOSITION 2166
|
|
||||||
#define SCI_POSITIONFROMLINE 2167
|
|
||||||
#define SCI_LINESCROLL 2168
|
|
||||||
#define SCI_SCROLLCARET 2169
|
|
||||||
#define SCI_REPLACESEL 2170
|
|
||||||
#define SCI_SETREADONLY 2171
|
|
||||||
#define SCI_NULL 2172
|
|
||||||
#define SCI_CANPASTE 2173
|
|
||||||
#define SCI_CANUNDO 2174
|
|
||||||
#define SCI_EMPTYUNDOBUFFER 2175
|
|
||||||
#define SCI_UNDO 2176
|
|
||||||
#define SCI_CUT 2177
|
|
||||||
#define SCI_COPY 2178
|
|
||||||
#define SCI_PASTE 2179
|
|
||||||
#define SCI_CLEAR 2180
|
|
||||||
#define SCI_SETTEXT 2181
|
|
||||||
#define SCI_GETTEXT 2182
|
|
||||||
#define SCI_GETTEXTLENGTH 2183
|
|
||||||
#define SCI_GETDIRECTFUNCTION 2184
|
|
||||||
#define SCI_GETDIRECTPOINTER 2185
|
|
||||||
#define SCI_SETOVERTYPE 2186
|
|
||||||
#define SCI_GETOVERTYPE 2187
|
|
||||||
#define SCI_SETCARETWIDTH 2188
|
|
||||||
#define SCI_GETCARETWIDTH 2189
|
|
||||||
#define SCI_SETTARGETSTART 2190
|
|
||||||
#define SCI_GETTARGETSTART 2191
|
|
||||||
#define SCI_SETTARGETEND 2192
|
|
||||||
#define SCI_GETTARGETEND 2193
|
|
||||||
#define SCI_REPLACETARGET 2194
|
|
||||||
#define SCI_REPLACETARGETRE 2195
|
|
||||||
#define SCI_SEARCHINTARGET 2197
|
|
||||||
#define SCI_SETSEARCHFLAGS 2198
|
|
||||||
#define SCI_GETSEARCHFLAGS 2199
|
|
||||||
#define SCI_CALLTIPSHOW 2200
|
|
||||||
#define SCI_CALLTIPCANCEL 2201
|
|
||||||
#define SCI_CALLTIPACTIVE 2202
|
|
||||||
#define SCI_CALLTIPPOSSTART 2203
|
|
||||||
#define SCI_CALLTIPSETHLT 2204
|
|
||||||
#define SCI_CALLTIPSETBACK 2205
|
|
||||||
#define SCI_CALLTIPSETFORE 2206
|
|
||||||
#define SCI_CALLTIPSETFOREHLT 2207
|
|
||||||
#define SCI_VISIBLEFROMDOCLINE 2220
|
|
||||||
#define SCI_DOCLINEFROMVISIBLE 2221
|
|
||||||
#define SC_FOLDLEVELBASE 0x400
|
|
||||||
#define SC_FOLDLEVELWHITEFLAG 0x1000
|
|
||||||
#define SC_FOLDLEVELHEADERFLAG 0x2000
|
|
||||||
#define SC_FOLDLEVELBOXHEADERFLAG 0x4000
|
|
||||||
#define SC_FOLDLEVELBOXFOOTERFLAG 0x8000
|
|
||||||
#define SC_FOLDLEVELCONTRACTED 0x10000
|
|
||||||
#define SC_FOLDLEVELUNINDENT 0x20000
|
|
||||||
#define SC_FOLDLEVELNUMBERMASK 0x0FFF
|
|
||||||
#define SCI_SETFOLDLEVEL 2222
|
|
||||||
#define SCI_GETFOLDLEVEL 2223
|
|
||||||
#define SCI_GETLASTCHILD 2224
|
|
||||||
#define SCI_GETFOLDPARENT 2225
|
|
||||||
#define SCI_SHOWLINES 2226
|
|
||||||
#define SCI_HIDELINES 2227
|
|
||||||
#define SCI_GETLINEVISIBLE 2228
|
|
||||||
#define SCI_SETFOLDEXPANDED 2229
|
|
||||||
#define SCI_GETFOLDEXPANDED 2230
|
|
||||||
#define SCI_TOGGLEFOLD 2231
|
|
||||||
#define SCI_ENSUREVISIBLE 2232
|
|
||||||
#define SC_FOLDFLAG_LINEBEFORE_EXPANDED 0x0002
|
|
||||||
#define SC_FOLDFLAG_LINEBEFORE_CONTRACTED 0x0004
|
|
||||||
#define SC_FOLDFLAG_LINEAFTER_EXPANDED 0x0008
|
|
||||||
#define SC_FOLDFLAG_LINEAFTER_CONTRACTED 0x0010
|
|
||||||
#define SC_FOLDFLAG_LEVELNUMBERS 0x0040
|
|
||||||
#define SC_FOLDFLAG_BOX 0x0001
|
|
||||||
#define SCI_SETFOLDFLAGS 2233
|
|
||||||
#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234
|
|
||||||
#define SCI_SETTABINDENTS 2260
|
|
||||||
#define SCI_GETTABINDENTS 2261
|
|
||||||
#define SCI_SETBACKSPACEUNINDENTS 2262
|
|
||||||
#define SCI_GETBACKSPACEUNINDENTS 2263
|
|
||||||
#define SC_TIME_FOREVER 10000000
|
|
||||||
#define SCI_SETMOUSEDWELLTIME 2264
|
|
||||||
#define SCI_GETMOUSEDWELLTIME 2265
|
|
||||||
#define SCI_WORDSTARTPOSITION 2266
|
|
||||||
#define SCI_WORDENDPOSITION 2267
|
|
||||||
#define SC_WRAP_NONE 0
|
|
||||||
#define SC_WRAP_WORD 1
|
|
||||||
#define SCI_SETWRAPMODE 2268
|
|
||||||
#define SCI_GETWRAPMODE 2269
|
|
||||||
#define SC_CACHE_NONE 0
|
|
||||||
#define SC_CACHE_CARET 1
|
|
||||||
#define SC_CACHE_PAGE 2
|
|
||||||
#define SC_CACHE_DOCUMENT 3
|
|
||||||
#define SCI_SETLAYOUTCACHE 2272
|
|
||||||
#define SCI_GETLAYOUTCACHE 2273
|
|
||||||
#define SCI_SETSCROLLWIDTH 2274
|
|
||||||
#define SCI_GETSCROLLWIDTH 2275
|
|
||||||
#define SCI_TEXTWIDTH 2276
|
|
||||||
#define SCI_SETENDATLASTLINE 2277
|
|
||||||
#define SCI_GETENDATLASTLINE 2278
|
|
||||||
#define SCI_TEXTHEIGHT 2279
|
|
||||||
#define SCI_SETVSCROLLBAR 2280
|
|
||||||
#define SCI_GETVSCROLLBAR 2281
|
|
||||||
#define SCI_APPENDTEXT 2282
|
|
||||||
#define SCI_GETTWOPHASEDRAW 2283
|
|
||||||
#define SCI_SETTWOPHASEDRAW 2284
|
|
||||||
#define SCI_TARGETFROMSELECTION 2287
|
|
||||||
#define SCI_LINESJOIN 2288
|
|
||||||
#define SCI_LINESSPLIT 2289
|
|
||||||
#define SCI_SETFOLDMARGINCOLOUR 2290
|
|
||||||
#define SCI_SETFOLDMARGINHICOLOUR 2291
|
|
||||||
#define SCI_LINEDOWN 2300
|
|
||||||
#define SCI_LINEDOWNEXTEND 2301
|
|
||||||
#define SCI_LINEUP 2302
|
|
||||||
#define SCI_LINEUPEXTEND 2303
|
|
||||||
#define SCI_CHARLEFT 2304
|
|
||||||
#define SCI_CHARLEFTEXTEND 2305
|
|
||||||
#define SCI_CHARRIGHT 2306
|
|
||||||
#define SCI_CHARRIGHTEXTEND 2307
|
|
||||||
#define SCI_WORDLEFT 2308
|
|
||||||
#define SCI_WORDLEFTEXTEND 2309
|
|
||||||
#define SCI_WORDRIGHT 2310
|
|
||||||
#define SCI_WORDRIGHTEXTEND 2311
|
|
||||||
#define SCI_HOME 2312
|
|
||||||
#define SCI_HOMEEXTEND 2313
|
|
||||||
#define SCI_LINEEND 2314
|
|
||||||
#define SCI_LINEENDEXTEND 2315
|
|
||||||
#define SCI_DOCUMENTSTART 2316
|
|
||||||
#define SCI_DOCUMENTSTARTEXTEND 2317
|
|
||||||
#define SCI_DOCUMENTEND 2318
|
|
||||||
#define SCI_DOCUMENTENDEXTEND 2319
|
|
||||||
#define SCI_PAGEUP 2320
|
|
||||||
#define SCI_PAGEUPEXTEND 2321
|
|
||||||
#define SCI_PAGEDOWN 2322
|
|
||||||
#define SCI_PAGEDOWNEXTEND 2323
|
|
||||||
#define SCI_EDITTOGGLEOVERTYPE 2324
|
|
||||||
#define SCI_CANCEL 2325
|
|
||||||
#define SCI_DELETEBACK 2326
|
|
||||||
#define SCI_TAB 2327
|
|
||||||
#define SCI_BACKTAB 2328
|
|
||||||
#define SCI_NEWLINE 2329
|
|
||||||
#define SCI_FORMFEED 2330
|
|
||||||
#define SCI_VCHOME 2331
|
|
||||||
#define SCI_VCHOMEEXTEND 2332
|
|
||||||
#define SCI_ZOOMIN 2333
|
|
||||||
#define SCI_ZOOMOUT 2334
|
|
||||||
#define SCI_DELWORDLEFT 2335
|
|
||||||
#define SCI_DELWORDRIGHT 2336
|
|
||||||
#define SCI_LINECUT 2337
|
|
||||||
#define SCI_LINEDELETE 2338
|
|
||||||
#define SCI_LINETRANSPOSE 2339
|
|
||||||
#define SCI_LINEDUPLICATE 2404
|
|
||||||
#define SCI_LOWERCASE 2340
|
|
||||||
#define SCI_UPPERCASE 2341
|
|
||||||
#define SCI_LINESCROLLDOWN 2342
|
|
||||||
#define SCI_LINESCROLLUP 2343
|
|
||||||
#define SCI_DELETEBACKNOTLINE 2344
|
|
||||||
#define SCI_HOMEDISPLAY 2345
|
|
||||||
#define SCI_HOMEDISPLAYEXTEND 2346
|
|
||||||
#define SCI_LINEENDDISPLAY 2347
|
|
||||||
#define SCI_LINEENDDISPLAYEXTEND 2348
|
|
||||||
#define SCI_HOMEWRAP 2349
|
|
||||||
#define SCI_HOMEWRAPEXTEND 2450
|
|
||||||
#define SCI_LINEENDWRAP 2451
|
|
||||||
#define SCI_LINEENDWRAPEXTEND 2452
|
|
||||||
#define SCI_VCHOMEWRAP 2453
|
|
||||||
#define SCI_VCHOMEWRAPEXTEND 2454
|
|
||||||
#define SCI_LINECOPY 2455
|
|
||||||
#define SCI_MOVECARETINSIDEVIEW 2401
|
|
||||||
#define SCI_LINELENGTH 2350
|
|
||||||
#define SCI_BRACEHIGHLIGHT 2351
|
|
||||||
#define SCI_BRACEBADLIGHT 2352
|
|
||||||
#define SCI_BRACEMATCH 2353
|
|
||||||
#define SCI_GETVIEWEOL 2355
|
|
||||||
#define SCI_SETVIEWEOL 2356
|
|
||||||
#define SCI_GETDOCPOINTER 2357
|
|
||||||
#define SCI_SETDOCPOINTER 2358
|
|
||||||
#define SCI_SETMODEVENTMASK 2359
|
|
||||||
#define EDGE_NONE 0
|
|
||||||
#define EDGE_LINE 1
|
|
||||||
#define EDGE_BACKGROUND 2
|
|
||||||
#define SCI_GETEDGECOLUMN 2360
|
|
||||||
#define SCI_SETEDGECOLUMN 2361
|
|
||||||
#define SCI_GETEDGEMODE 2362
|
|
||||||
#define SCI_SETEDGEMODE 2363
|
|
||||||
#define SCI_GETEDGECOLOUR 2364
|
|
||||||
#define SCI_SETEDGECOLOUR 2365
|
|
||||||
#define SCI_SEARCHANCHOR 2366
|
|
||||||
#define SCI_SEARCHNEXT 2367
|
|
||||||
#define SCI_SEARCHPREV 2368
|
|
||||||
#define SCI_LINESONSCREEN 2370
|
|
||||||
#define SCI_USEPOPUP 2371
|
|
||||||
#define SCI_SELECTIONISRECTANGLE 2372
|
|
||||||
#define SCI_SETZOOM 2373
|
|
||||||
#define SCI_GETZOOM 2374
|
|
||||||
#define SCI_CREATEDOCUMENT 2375
|
|
||||||
#define SCI_ADDREFDOCUMENT 2376
|
|
||||||
#define SCI_RELEASEDOCUMENT 2377
|
|
||||||
#define SCI_GETMODEVENTMASK 2378
|
|
||||||
#define SCI_SETFOCUS 2380
|
|
||||||
#define SCI_GETFOCUS 2381
|
|
||||||
#define SCI_SETSTATUS 2382
|
|
||||||
#define SCI_GETSTATUS 2383
|
|
||||||
#define SCI_SETMOUSEDOWNCAPTURES 2384
|
|
||||||
#define SCI_GETMOUSEDOWNCAPTURES 2385
|
|
||||||
#define SC_CURSORNORMAL -1
|
|
||||||
#define SC_CURSORWAIT 4
|
|
||||||
#define SCI_SETCURSOR 2386
|
|
||||||
#define SCI_GETCURSOR 2387
|
|
||||||
#define SCI_SETCONTROLCHARSYMBOL 2388
|
|
||||||
#define SCI_GETCONTROLCHARSYMBOL 2389
|
|
||||||
#define SCI_WORDPARTLEFT 2390
|
|
||||||
#define SCI_WORDPARTLEFTEXTEND 2391
|
|
||||||
#define SCI_WORDPARTRIGHT 2392
|
|
||||||
#define SCI_WORDPARTRIGHTEXTEND 2393
|
|
||||||
#define VISIBLE_SLOP 0x01
|
|
||||||
#define VISIBLE_STRICT 0x04
|
|
||||||
#define SCI_SETVISIBLEPOLICY 2394
|
|
||||||
#define SCI_DELLINELEFT 2395
|
|
||||||
#define SCI_DELLINERIGHT 2396
|
|
||||||
#define SCI_SETXOFFSET 2397
|
|
||||||
#define SCI_GETXOFFSET 2398
|
|
||||||
#define SCI_CHOOSECARETX 2399
|
|
||||||
#define SCI_GRABFOCUS 2400
|
|
||||||
#define CARET_SLOP 0x01
|
|
||||||
#define CARET_STRICT 0x04
|
|
||||||
#define CARET_JUMPS 0x10
|
|
||||||
#define CARET_EVEN 0x08
|
|
||||||
#define SCI_SETXCARETPOLICY 2402
|
|
||||||
#define SCI_SETYCARETPOLICY 2403
|
|
||||||
#define SCI_SETPRINTWRAPMODE 2406
|
|
||||||
#define SCI_GETPRINTWRAPMODE 2407
|
|
||||||
#define SCI_SETHOTSPOTACTIVEFORE 2410
|
|
||||||
#define SCI_SETHOTSPOTACTIVEBACK 2411
|
|
||||||
#define SCI_SETHOTSPOTACTIVEUNDERLINE 2412
|
|
||||||
#define SCI_SETHOTSPOTSINGLELINE 2421
|
|
||||||
#define SCI_PARADOWN 2413
|
|
||||||
#define SCI_PARADOWNEXTEND 2414
|
|
||||||
#define SCI_PARAUP 2415
|
|
||||||
#define SCI_PARAUPEXTEND 2416
|
|
||||||
#define SCI_POSITIONBEFORE 2417
|
|
||||||
#define SCI_POSITIONAFTER 2418
|
|
||||||
#define SCI_COPYRANGE 2419
|
|
||||||
#define SCI_COPYTEXT 2420
|
|
||||||
#define SC_SEL_STREAM 0
|
|
||||||
#define SC_SEL_RECTANGLE 1
|
|
||||||
#define SC_SEL_LINES 2
|
|
||||||
#define SCI_SETSELECTIONMODE 2422
|
|
||||||
#define SCI_GETSELECTIONMODE 2423
|
|
||||||
#define SCI_GETLINESELSTARTPOSITION 2424
|
|
||||||
#define SCI_GETLINESELENDPOSITION 2425
|
|
||||||
#define SCI_LINEDOWNRECTEXTEND 2426
|
|
||||||
#define SCI_LINEUPRECTEXTEND 2427
|
|
||||||
#define SCI_CHARLEFTRECTEXTEND 2428
|
|
||||||
#define SCI_CHARRIGHTRECTEXTEND 2429
|
|
||||||
#define SCI_HOMERECTEXTEND 2430
|
|
||||||
#define SCI_VCHOMERECTEXTEND 2431
|
|
||||||
#define SCI_LINEENDRECTEXTEND 2432
|
|
||||||
#define SCI_PAGEUPRECTEXTEND 2433
|
|
||||||
#define SCI_PAGEDOWNRECTEXTEND 2434
|
|
||||||
#define SCI_STUTTEREDPAGEUP 2435
|
|
||||||
#define SCI_STUTTEREDPAGEUPEXTEND 2436
|
|
||||||
#define SCI_STUTTEREDPAGEDOWN 2437
|
|
||||||
#define SCI_STUTTEREDPAGEDOWNEXTEND 2438
|
|
||||||
#define SCI_WORDLEFTEND 2439
|
|
||||||
#define SCI_WORDLEFTENDEXTEND 2440
|
|
||||||
#define SCI_WORDRIGHTEND 2441
|
|
||||||
#define SCI_WORDRIGHTENDEXTEND 2442
|
|
||||||
#define SCI_SETWHITESPACECHARS 2443
|
|
||||||
#define SCI_SETCHARSDEFAULT 2444
|
|
||||||
#define SCI_AUTOCGETCURRENT 2445
|
|
||||||
#define SCI_STARTRECORD 3001
|
|
||||||
#define SCI_STOPRECORD 3002
|
|
||||||
#define SCI_SETLEXER 4001
|
|
||||||
#define SCI_GETLEXER 4002
|
|
||||||
#define SCI_COLOURISE 4003
|
|
||||||
#define SCI_SETPROPERTY 4004
|
|
||||||
#define KEYWORDSET_MAX 8
|
|
||||||
#define SCI_SETKEYWORDS 4005
|
|
||||||
#define SCI_SETLEXERLANGUAGE 4006
|
|
||||||
#define SCI_LOADLEXERLIBRARY 4007
|
|
||||||
#define SC_MOD_INSERTTEXT 0x1
|
|
||||||
#define SC_MOD_DELETETEXT 0x2
|
|
||||||
#define SC_MOD_CHANGESTYLE 0x4
|
|
||||||
#define SC_MOD_CHANGEFOLD 0x8
|
|
||||||
#define SC_PERFORMED_USER 0x10
|
|
||||||
#define SC_PERFORMED_UNDO 0x20
|
|
||||||
#define SC_PERFORMED_REDO 0x40
|
|
||||||
#define SC_LASTSTEPINUNDOREDO 0x100
|
|
||||||
#define SC_MOD_CHANGEMARKER 0x200
|
|
||||||
#define SC_MOD_BEFOREINSERT 0x400
|
|
||||||
#define SC_MOD_BEFOREDELETE 0x800
|
|
||||||
#define SC_MODEVENTMASKALL 0xF77
|
|
||||||
#define SCEN_CHANGE 768
|
|
||||||
#define SCEN_SETFOCUS 512
|
|
||||||
#define SCEN_KILLFOCUS 256
|
|
||||||
#define SCK_DOWN 300
|
|
||||||
#define SCK_UP 301
|
|
||||||
#define SCK_LEFT 302
|
|
||||||
#define SCK_RIGHT 303
|
|
||||||
#define SCK_HOME 304
|
|
||||||
#define SCK_END 305
|
|
||||||
#define SCK_PRIOR 306
|
|
||||||
#define SCK_NEXT 307
|
|
||||||
#define SCK_DELETE 308
|
|
||||||
#define SCK_INSERT 309
|
|
||||||
#define SCK_ESCAPE 7
|
|
||||||
#define SCK_BACK 8
|
|
||||||
#define SCK_TAB 9
|
|
||||||
#define SCK_RETURN 13
|
|
||||||
#define SCK_ADD 310
|
|
||||||
#define SCK_SUBTRACT 311
|
|
||||||
#define SCK_DIVIDE 312
|
|
||||||
#define SCMOD_SHIFT 1
|
|
||||||
#define SCMOD_CTRL 2
|
|
||||||
#define SCMOD_ALT 4
|
|
||||||
#define SCN_STYLENEEDED 2000
|
|
||||||
#define SCN_CHARADDED 2001
|
|
||||||
#define SCN_SAVEPOINTREACHED 2002
|
|
||||||
#define SCN_SAVEPOINTLEFT 2003
|
|
||||||
#define SCN_MODIFYATTEMPTRO 2004
|
|
||||||
#define SCN_KEY 2005
|
|
||||||
#define SCN_DOUBLECLICK 2006
|
|
||||||
#define SCN_UPDATEUI 2007
|
|
||||||
#define SCN_MODIFIED 2008
|
|
||||||
#define SCN_MACRORECORD 2009
|
|
||||||
#define SCN_MARGINCLICK 2010
|
|
||||||
#define SCN_NEEDSHOWN 2011
|
|
||||||
#define SCN_PAINTED 2013
|
|
||||||
#define SCN_USERLISTSELECTION 2014
|
|
||||||
#define SCN_URIDROPPED 2015
|
|
||||||
#define SCN_DWELLSTART 2016
|
|
||||||
#define SCN_DWELLEND 2017
|
|
||||||
#define SCN_ZOOM 2018
|
|
||||||
#define SCN_HOTSPOTCLICK 2019
|
|
||||||
#define SCN_HOTSPOTDOUBLECLICK 2020
|
|
||||||
#define SCN_CALLTIPCLICK 2021
|
|
||||||
//--Autogenerated -- end of section automatically generated from Scintilla.iface
|
|
||||||
|
|
||||||
// These structures are defined to be exactly the same shape as the Win32
|
|
||||||
// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs.
|
|
||||||
// So older code that treats Scintilla as a RichEdit will work.
|
|
||||||
|
|
||||||
struct CharacterRange {
|
|
||||||
long cpMin;
|
|
||||||
long cpMax;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TextRange {
|
|
||||||
struct CharacterRange chrg;
|
|
||||||
char *lpstrText;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TextToFind {
|
|
||||||
struct CharacterRange chrg;
|
|
||||||
char *lpstrText;
|
|
||||||
struct CharacterRange chrgText;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef PLATFORM_H
|
|
||||||
|
|
||||||
// This structure is used in printing and requires some of the graphics types
|
|
||||||
// from Platform.h. Not needed by most client code.
|
|
||||||
|
|
||||||
struct RangeToFormat {
|
|
||||||
SurfaceID hdc;
|
|
||||||
SurfaceID hdcTarget;
|
|
||||||
PRectangle rc;
|
|
||||||
PRectangle rcPage;
|
|
||||||
CharacterRange chrg;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct NotifyHeader {
|
|
||||||
// hwndFrom is really an environment specifc window handle or pointer
|
|
||||||
// but most clients of Scintilla.h do not have this type visible.
|
|
||||||
//WindowID hwndFrom;
|
|
||||||
void *hwndFrom;
|
|
||||||
unsigned int idFrom;
|
|
||||||
unsigned int code;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SCNotification {
|
|
||||||
struct NotifyHeader nmhdr;
|
|
||||||
int position; // SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND
|
|
||||||
int ch; // SCN_CHARADDED, SCN_KEY
|
|
||||||
int modifiers; // SCN_KEY
|
|
||||||
int modificationType; // SCN_MODIFIED
|
|
||||||
const char *text; // SCN_MODIFIED
|
|
||||||
int length; // SCN_MODIFIED
|
|
||||||
int linesAdded; // SCN_MODIFIED
|
|
||||||
int message; // SCN_MACRORECORD
|
|
||||||
uptr_t wParam; // SCN_MACRORECORD
|
|
||||||
sptr_t lParam; // SCN_MACRORECORD
|
|
||||||
int line; // SCN_MODIFIED
|
|
||||||
int foldLevelNow; // SCN_MODIFIED
|
|
||||||
int foldLevelPrev; // SCN_MODIFIED
|
|
||||||
int margin; // SCN_MARGINCLICK
|
|
||||||
int listType; // SCN_USERLISTSELECTION
|
|
||||||
int x; // SCN_DWELLSTART, SCN_DWELLEND
|
|
||||||
int y; // SCN_DWELLSTART, SCN_DWELLEND
|
|
||||||
};
|
|
||||||
|
|
||||||
// Deprecation section listing all API features that are deprecated and will
|
|
||||||
// will be removed completely in a future version.
|
|
||||||
// To enable these features define INCLUDE_DEPRECATED_FEATURES
|
|
||||||
|
|
||||||
#ifdef INCLUDE_DEPRECATED_FEATURES
|
|
||||||
|
|
||||||
#define SCI_SETCARETPOLICY 2369
|
|
||||||
#define CARET_CENTER 0x02
|
|
||||||
#define CARET_XEVEN 0x08
|
|
||||||
#define CARET_XJUMPS 0x10
|
|
||||||
|
|
||||||
#define SCN_POSCHANGED 2012
|
|
||||||
#define SCN_CHECKBRACE 2007
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,55 +0,0 @@
|
|||||||
// Scintilla source code edit control
|
|
||||||
/** @file ScintillaWidget.h
|
|
||||||
** Definition of Scintilla widget for GTK+.
|
|
||||||
** Only needed by GTK+ code but is harmless on other platforms.
|
|
||||||
**/
|
|
||||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
||||||
// The License.txt file describes the conditions under which this software may be distributed.
|
|
||||||
|
|
||||||
#ifndef SCINTILLAWIDGET_H
|
|
||||||
#define SCINTILLAWIDGET_H
|
|
||||||
|
|
||||||
#if PLAT_GTK
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SCINTILLA(obj) GTK_CHECK_CAST (obj, scintilla_get_type (), ScintillaObject)
|
|
||||||
#define SCINTILLA_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, scintilla_get_type (), ScintillaClass)
|
|
||||||
#define IS_SCINTILLA(obj) GTK_CHECK_TYPE (obj, scintilla_get_type ())
|
|
||||||
|
|
||||||
typedef struct _ScintillaObject ScintillaObject;
|
|
||||||
typedef struct _ScintillaClass ScintillaClass;
|
|
||||||
|
|
||||||
struct _ScintillaObject {
|
|
||||||
GtkContainer cont;
|
|
||||||
void *pscin;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _ScintillaClass {
|
|
||||||
GtkContainerClass parent_class;
|
|
||||||
|
|
||||||
void (* command) (ScintillaObject *ttt);
|
|
||||||
void (* notify) (ScintillaObject *ttt);
|
|
||||||
};
|
|
||||||
|
|
||||||
guint scintilla_get_type (void);
|
|
||||||
GtkWidget* scintilla_new (void);
|
|
||||||
void scintilla_set_id (ScintillaObject *sci,int id);
|
|
||||||
sptr_t scintilla_send_message (ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
|
||||||
void scintilla_release_resources(void);
|
|
||||||
|
|
||||||
#if GTK_MAJOR_VERSION < 2
|
|
||||||
#define SCINTILLA_NOTIFY "notify"
|
|
||||||
#else
|
|
||||||
#define SCINTILLA_NOTIFY "sci-notify"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user