140 lines
4.6 KiB
C++
140 lines
4.6 KiB
C++
/* h_pascal.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_PASCAL
|
|
|
|
#define hsPas_Normal 0
|
|
#define hsPas_Comment1 1
|
|
#define hsPas_Comment2 2
|
|
#define hsPas_Keyword 3
|
|
#define hsPas_String1 4
|
|
#define hsPas_String2 5
|
|
|
|
int Hilit_PASCAL(EBuffer *BF, int /*LN*/, PCell B, int Pos, int Width, ELine *Line, hlState &State, hsState *StateMap, int *ECol) {
|
|
ChColor *Colors = BF->Mode->fColorize->Colors;
|
|
int j = 0;
|
|
int firstnw = 0;
|
|
HILIT_VARS(Colors[CLR_Normal], Line);
|
|
|
|
C = 0;
|
|
NC = 0;
|
|
for(i = 0; i < Line->Count;) {
|
|
if (*p != ' ' && *p != 9) firstnw++;
|
|
IF_TAB() else {
|
|
switch(State) {
|
|
default:
|
|
case hsPas_Normal:
|
|
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)) {
|
|
// Color = hcC_Keyword;
|
|
State = hsPas_Keyword;
|
|
} else {
|
|
Color = Colors[CLR_Normal];
|
|
State = hsPas_Normal;
|
|
}
|
|
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;
|
|
State = hsPas_Normal;
|
|
continue;
|
|
} else if ((len >= 2) && (*p == '(') && (*(p+1) == '*')) {
|
|
State = hsPas_Comment1;
|
|
Color = Colors[CLR_Comment];
|
|
ColorNext();
|
|
goto hilit;
|
|
} else if (*p == '{') {
|
|
State = hsPas_Comment2;
|
|
Color = Colors[CLR_Comment];
|
|
goto hilit;
|
|
} else if (*p == '$') {
|
|
Color = Colors[CLR_HexNumber];
|
|
ColorNext();
|
|
ColorNext();
|
|
while (len && isxdigit(*p)) ColorNext();
|
|
continue;
|
|
} else if (isdigit(*p)) {
|
|
Color = Colors[CLR_Number];
|
|
ColorNext();
|
|
while (len && (isdigit(*p) || *p == 'e' || *p == 'E' || *p == '.')) ColorNext();
|
|
continue;
|
|
} else if (*p == '\'') {
|
|
State = hsPas_String1;
|
|
Color = Colors[CLR_String];
|
|
goto hilit;
|
|
} else if (*p == '"') {
|
|
State = hsPas_String2;
|
|
Color = Colors[CLR_String];
|
|
goto hilit;
|
|
} else if (ispunct(*p) && *p != '_') {
|
|
Color = Colors[CLR_Punctuation];
|
|
goto hilit;
|
|
}
|
|
Color = Colors[CLR_Normal];
|
|
goto hilit;
|
|
case hsPas_Comment1:
|
|
Color = Colors[CLR_Comment];
|
|
if ((len >= 2) && (*p == '*') && (*(p+1) == ')')) {
|
|
ColorNext();
|
|
ColorNext();
|
|
State = hsPas_Normal;
|
|
continue;
|
|
}
|
|
goto hilit;
|
|
case hsPas_Comment2:
|
|
Color = Colors[CLR_Comment];
|
|
if (*p == '}') {
|
|
ColorNext();
|
|
State = hsPas_Normal;
|
|
continue;
|
|
}
|
|
goto hilit;
|
|
case hsPas_String1:
|
|
Color = Colors[CLR_String];
|
|
if (*p == '\'') {
|
|
ColorNext();
|
|
State = hsPas_Normal;
|
|
continue;
|
|
}
|
|
goto hilit;
|
|
case hsPas_String2:
|
|
Color = Colors[CLR_String];
|
|
if (*p == '"') {
|
|
ColorNext();
|
|
State = hsPas_Normal;
|
|
continue;
|
|
}
|
|
hilit:
|
|
ColorNext();
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
switch(State) {
|
|
case hsPas_String1:
|
|
case hsPas_String2:
|
|
State = hsPas_Normal;
|
|
break;
|
|
}
|
|
*ECol = C;
|
|
return 0;
|
|
}
|
|
#endif
|