This repository has been archived on 2023-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
fte/h_msg.cpp

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