224 lines
4.9 KiB
C++
224 lines
4.9 KiB
C++
/* c_hilit.h
|
|
*
|
|
* Copyright (c) 1994-1996, Marko Macek
|
|
*
|
|
* You may distribute under the terms of either the GNU General Public
|
|
* License or the Artistic License, as specified in the README file.
|
|
*
|
|
*/
|
|
|
|
#ifndef __HILIT_H__
|
|
#define __HILIT_H__
|
|
|
|
typedef unsigned short hlState;
|
|
typedef unsigned char hsState;
|
|
|
|
class EBuffer;
|
|
class ELine;
|
|
|
|
#define HILIT_P(proc) \
|
|
int proc(EBuffer *BF, int LN, PCell B, int Pos, int Width, ELine *Line, hlState &State, hsState *StateMap, int *ECol)
|
|
|
|
//typedef int (*SyntaxProc)(EBuffer *BF, int LN, PCell B, int Pos, int Width, ELine *Line, hlState &State, hsState *StateMap);
|
|
typedef HILIT_P((*SyntaxProc));
|
|
|
|
|
|
int Indent_Plain(EBuffer *B, int Line, int PosCursor);
|
|
HILIT_P(Hilit_Plain);
|
|
|
|
#ifdef CONFIG_SYNTAX_HILIT
|
|
/* highlighting state */
|
|
|
|
#ifdef CONFIG_HILIT_C
|
|
HILIT_P(Hilit_C);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_HTML
|
|
HILIT_P(Hilit_HTML);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_PERL
|
|
HILIT_P(Hilit_PERL);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_MAKE
|
|
HILIT_P(Hilit_MAKE);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_REXX
|
|
HILIT_P(Hilit_REXX);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_DIFF
|
|
HILIT_P(Hilit_DIFF);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_MERGE
|
|
HILIT_P(Hilit_MERGE);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_IPF
|
|
HILIT_P(Hilit_IPF);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_ADA
|
|
HILIT_P(Hilit_ADA);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_MSG
|
|
HILIT_P(Hilit_MSG);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_SH
|
|
HILIT_P(Hilit_SH);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_PASCAL
|
|
HILIT_P(Hilit_PASCAL);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_TEX
|
|
HILIT_P(Hilit_TEX);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_FTE
|
|
HILIT_P(Hilit_FTE);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_CATBS
|
|
HILIT_P(Hilit_CATBS);
|
|
#endif
|
|
#ifdef CONFIG_HILIT_SIMPLE
|
|
HILIT_P(Hilit_SIMPLE);
|
|
#endif
|
|
|
|
#ifdef CONFIG_INDENT_C
|
|
int Indent_C(EBuffer *B, int Line, int PosCursor);
|
|
#endif
|
|
#ifdef CONFIG_INDENT_REXX
|
|
int Indent_REXX(EBuffer *B, int Line, int PosCursor);
|
|
#endif
|
|
#ifdef CONFIG_INDENT_SIMPLE
|
|
int Indent_SIMPLE(EBuffer *B, int Line, int PosCursor);
|
|
#endif
|
|
|
|
/*
|
|
* NT has 2-byte charcode and attribute... Following is not portable to non-
|
|
* intel; should be replaced by formal TCell definition' usage instead of
|
|
* assumed array.. (Jal)
|
|
*/
|
|
#ifdef NTCONSOLE
|
|
# define PCLI unsigned short
|
|
#else
|
|
# define PCLI unsigned char
|
|
#endif
|
|
|
|
#define ColorChar() \
|
|
do {\
|
|
BPos = C - Pos; \
|
|
if (B) \
|
|
if (BPos >= 0 && BPos < Width) { \
|
|
BPtr = (PCLI *) (B + BPos); \
|
|
BPtr[0] = *p; \
|
|
BPtr[1] = Color; \
|
|
} \
|
|
if (StateMap) StateMap[i] = (hsState)(State & 0xFF); \
|
|
} while (0)
|
|
|
|
// MoveChar(B, C - Pos, Width, *p, Color, 1);
|
|
// if (StateMap) StateMap[i] = State; }
|
|
|
|
#define NextChar() do { i++; p++; len--; C++; } while (0)
|
|
#define ColorNext() do { ColorChar(); NextChar(); } while (0)
|
|
|
|
#define HILIT_VARS(ColorNormal, Line) \
|
|
PCLI *BPtr; \
|
|
int BPos; \
|
|
ChColor Color = ColorNormal; \
|
|
int i; \
|
|
int len = Line->Count; \
|
|
char *p = Line->Chars; \
|
|
int NC = 0, C = 0; \
|
|
int TabSize = BFI(BF, BFI_TabSize); \
|
|
int ExpandTabs = BFI(BF, BFI_ExpandTabs);
|
|
|
|
//#define HILIT_VARS2()
|
|
// int len1 = len;
|
|
// char *last = p + len1 - 1;
|
|
|
|
#define IF_TAB() \
|
|
if (*p == '\t' && ExpandTabs) { \
|
|
NC = NextTab(C, TabSize); \
|
|
if (StateMap) StateMap[i] = hsState(State);\
|
|
if (B) MoveChar(B, C - Pos, Width, ' ', Color, NC - C);\
|
|
if (BFI(BF, BFI_ShowTabs)) ColorChar();\
|
|
i++,len--,p++;\
|
|
C = NC;\
|
|
continue;\
|
|
}
|
|
|
|
#define CK_MAXLEN 32
|
|
|
|
typedef struct {
|
|
int TotalCount;
|
|
int count[CK_MAXLEN];
|
|
char *key[CK_MAXLEN];
|
|
} ColorKeywords;
|
|
|
|
struct HTrans {
|
|
char *match;
|
|
int matchLen;
|
|
long matchFlags;
|
|
int nextState;
|
|
int color;
|
|
|
|
void InitTrans();
|
|
};
|
|
|
|
struct HState {
|
|
int transCount;
|
|
int firstTrans;
|
|
int color;
|
|
|
|
ColorKeywords keywords;
|
|
char *wordChars;
|
|
long options;
|
|
int nextKwdMatchedState;
|
|
int nextKwdNotMatchedState;
|
|
int nextKwdNoCharState;
|
|
|
|
void InitState();
|
|
int GetHilitWord(int len, char *str, ChColor &clr);
|
|
};
|
|
|
|
class HMachine {
|
|
public:
|
|
int stateCount;
|
|
int transCount;
|
|
HState *state;
|
|
HTrans *trans;
|
|
|
|
HMachine();
|
|
~HMachine();
|
|
void AddState(HState &aState);
|
|
void AddTrans(HTrans &aTrans);
|
|
|
|
HState *LastState() { return state + stateCount - 1; }
|
|
};
|
|
|
|
class EColorize {
|
|
public:
|
|
char *Name;
|
|
EColorize *Next;
|
|
EColorize *Parent;
|
|
int SyntaxParser;
|
|
ColorKeywords Keywords; // keywords to highlight
|
|
HMachine *hm;
|
|
ChColor Colors[COUNT_CLR];
|
|
|
|
EColorize(const char *AName, const char *AParent);
|
|
~EColorize();
|
|
|
|
int SetColor(int clr, const char *value);
|
|
};
|
|
|
|
extern EColorize *Colorizers;
|
|
EColorize *FindColorizer(const char *AName);
|
|
|
|
SyntaxProc GetHilitProc(int id);
|
|
|
|
int IsState(hsState *Buf, hsState State, int Len);
|
|
int LookAt(EBuffer *B, int Row, unsigned int Pos, const char *What, hsState State, int NoWord = 1, int CaseInsensitive = 0);
|
|
inline int LookAtNoCase(EBuffer *B, int Row, unsigned int Pos, const char *What, hsState State, int NoWord = 1)
|
|
{ return LookAt(B, Row, Pos, What, State, NoWord, 1); }
|
|
|
|
#endif
|
|
|
|
#endif
|