151 lines
5.1 KiB
C++
151 lines
5.1 KiB
C++
|
/* h_msg.cpp
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "fte.h"
|
||
|
|
||
|
#ifdef CONFIG_HILIT_MSG
|
||
|
|
||
|
#define hsMSG_Normal 0
|
||
|
#define hsMSG_Header 1
|
||
|
#define hsMSG_Quote 2
|
||
|
#define hsMSG_Tag 3
|
||
|
#define hsMSG_Control 4
|
||
|
|
||
|
int Hilit_MSG(EBuffer *BF, int /*LN*/, PCell B, int Pos, int Width, ELine* Line, hlState& State, hsState *StateMap, int *ECol) {
|
||
|
ChColor *Colors = BF->Mode->fColorize->Colors;
|
||
|
HILIT_VARS(Colors[CLR_Normal], Line);
|
||
|
int is_head = 0, is_quote = 0, is_space = 0, is_tag = 0, is_control = 0;
|
||
|
|
||
|
if (Line->Count > 0) {
|
||
|
if (State == hsMSG_Header) {
|
||
|
if (Line->Chars[0] == ' ' || Line->Chars[0] == '\t') is_head = 1;
|
||
|
else
|
||
|
State = hsMSG_Normal;
|
||
|
}
|
||
|
if (State == hsMSG_Normal) {
|
||
|
if (Line->Count >= 2 &&
|
||
|
Line->Chars[0] == '-' &&
|
||
|
Line->Chars[1] == '-' &&
|
||
|
(Line->Count == 2 || Line->Chars[2] == ' '))
|
||
|
is_tag = 1;
|
||
|
else if (Line->Count >= 2 &&
|
||
|
Line->Chars[0] == '.' &&
|
||
|
Line->Chars[1] == '.' &&
|
||
|
(Line->Count == 2 || Line->Chars[2] == ' '))
|
||
|
is_tag = 1;
|
||
|
else if (Line->Count >= 3 &&
|
||
|
Line->Chars[0] == '-' &&
|
||
|
Line->Chars[1] == '-' &&
|
||
|
Line->Chars[2] == '-' &&
|
||
|
(Line->Count == 3 || Line->Chars[3] == ' '))
|
||
|
is_tag = 1;
|
||
|
else if (Line->Count >= 3 &&
|
||
|
Line->Chars[0] == '.' &&
|
||
|
Line->Chars[1] == '.' &&
|
||
|
Line->Chars[2] == '.' &&
|
||
|
(Line->Count == 3 || Line->Chars[3] == ' '))
|
||
|
is_tag = 1;
|
||
|
else if (Line->Count > 10 && memcmp(Line->Chars, " * Origin:", 10) == 0)
|
||
|
is_control = 1;
|
||
|
else if (Line->Count > 0 && Line->Chars[0] == '\x01')
|
||
|
is_control = 1;
|
||
|
else for (i = 0; i < Line->Count; i++) {
|
||
|
if (i < 30 && Line->Chars[i] == ':' && i < Line->Count - 1 && Line->Chars[i+1] == ' ' && !is_space) { is_head = 1; break; }
|
||
|
else if (i < 5 && Line->Chars[i] == '>') { is_quote = 1; break; }
|
||
|
else if (Line->Chars[i] == '<' ||
|
||
|
(Line->Chars[i] == ' ' && i > 0) ||
|
||
|
Line->Chars[i] == '\t') break;
|
||
|
else if (Line->Chars[i] == ' ' || Line->Chars[i] == '\t')
|
||
|
is_space = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (is_head) {
|
||
|
State = hsMSG_Header;
|
||
|
Color = Colors[CLR_Header];
|
||
|
} else if (is_quote) {
|
||
|
State = hsMSG_Quote;
|
||
|
Color = Colors[CLR_Quotes];
|
||
|
} else if (is_tag) {
|
||
|
State = hsMSG_Tag;
|
||
|
Color = Colors[CLR_Tag];
|
||
|
} else if (is_control) {
|
||
|
State = hsMSG_Control;
|
||
|
Color = Colors[CLR_Control];
|
||
|
} else {
|
||
|
State = hsMSG_Normal;
|
||
|
Color = Colors[CLR_Normal];
|
||
|
}
|
||
|
|
||
|
ChColor DefColor = Color;
|
||
|
#ifdef CONFIG_WORD_HILIT
|
||
|
int j = 0;
|
||
|
|
||
|
if (BF->Mode->fColorize->Keywords.TotalCount > 0 ||
|
||
|
BF->WordCount > 0)
|
||
|
{ /* words have to be hilited, go slow */
|
||
|
for(i = 0; i < Line->Count;) {
|
||
|
IF_TAB() else {
|
||
|
if (isalpha(*p) || (*p == '_')) {
|
||
|
j = 0;
|
||
|
while (((i + j) < Line->Count) &&
|
||
|
(isalnum(Line->Chars[i+j]) ||
|
||
|
(Line->Chars[i + j] == '_'))
|
||
|
) j++;
|
||
|
if (BF->GetHilitWord(j, Line->Chars + i, Color, 1)) ;
|
||
|
else {
|
||
|
Color = DefColor;
|
||
|
}
|
||
|
if (StateMap)
|
||
|
memset(StateMap + i, State, j);
|
||
|
if (B)
|
||
|
MoveMem(B, C - Pos, Width, Line->Chars + i, Color, j);
|
||
|
i += j;
|
||
|
len -= j;
|
||
|
p += j;
|
||
|
C += j;
|
||
|
Color = DefColor;
|
||
|
continue;
|
||
|
}
|
||
|
ColorNext();
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
} else
|
||
|
#endif
|
||
|
if (ExpandTabs) { /* use slow mode */
|
||
|
for (i = 0; i < Line->Count;) {
|
||
|
IF_TAB() else {
|
||
|
ColorNext();
|
||
|
}
|
||
|
}
|
||
|
} else { /* fast mode */
|
||
|
if (Pos < Line->Count) {
|
||
|
if (Pos + Width < Line->Count) {
|
||
|
if (B)
|
||
|
MoveMem(B, 0, Width, Line->Chars + Pos, Color, Width);
|
||
|
if (StateMap)
|
||
|
memset(StateMap, State, Line->Count);
|
||
|
} else {
|
||
|
if (B)
|
||
|
MoveMem(B, 0, Width, Line->Chars + Pos, Color, Line->Count - Pos);
|
||
|
if (StateMap)
|
||
|
memset(StateMap, State, Line->Count);
|
||
|
}
|
||
|
}
|
||
|
C = Line->Count;
|
||
|
}
|
||
|
if (State != hsMSG_Header)
|
||
|
State = hsMSG_Normal;
|
||
|
*ECol = C;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#endif
|