editor: faster keyword recognition
- use indexed search in keywords array, also add missing keywords
This commit is contained in:
parent
9a0aa7a431
commit
347b57cae3
1 changed files with 60 additions and 32 deletions
|
|
@ -8,7 +8,7 @@ const COMPILERPROG = '#SYSTEM:pcomp.prog';
|
||||||
const MAX_LENGTH = 512;
|
const MAX_LENGTH = 512;
|
||||||
MAX_LINES = 10000;
|
MAX_LINES = 10000;
|
||||||
MAX_SCREENH = 256;
|
MAX_SCREENH = 256;
|
||||||
MAX_KEYWORD = 31;
|
MAX_KEYWORD = 33;
|
||||||
|
|
||||||
MAX_CLIPB_SIZE = 300;
|
MAX_CLIPB_SIZE = 300;
|
||||||
|
|
||||||
|
|
@ -94,14 +94,14 @@ var lines: array [1..MAX_LINES] of ^linestr;
|
||||||
catColors: array [Unknown..StrLit] of integer =
|
catColors: array [Unknown..StrLit] of integer =
|
||||||
( TEXT_FG, 0, KEYWORD_FG, IDENT_FG, NUM_FG, PUNCT_FG, COMMENT_FG, STRLIT_FG );
|
( TEXT_FG, 0, KEYWORD_FG, IDENT_FG, NUM_FG, PUNCT_FG, COMMENT_FG, STRLIT_FG );
|
||||||
|
|
||||||
keywords: array [0..MAX_KEYWORD] of string[20] = (
|
keywords: array [0..MAX_KEYWORD] of string[12] = (
|
||||||
'VAR', 'IF', 'THEN', 'ELSE', 'BEGIN', 'END', 'PROCEDURE', 'FUNCTION',
|
'AND', 'ARRAY', 'BEGIN', 'BOOLEAN', 'CASE', 'CHAR', 'CONST',
|
||||||
'WHILE', 'FOR', 'DO', 'IN', 'OF', 'CASE', 'TO', 'REPEAT', 'UNTIL',
|
'DIV', 'DO', 'ELSE', 'END', 'FOR', 'FUNCTION', 'IF', 'IN', 'INTEGER',
|
||||||
'CHAR', 'INTEGER', 'REAL', 'BOOLEAN', 'ARRAY', 'RECORD', 'STRING',
|
'MOD', 'NOT', 'OF', 'OR', 'PROCEDURE', 'PROGRAM',
|
||||||
'MOD', 'DIV', 'AND', 'OR', 'NOT',
|
'REAL', 'RECORD', 'REPEAT', 'STRING', 'THEN', 'TO', 'TYPE',
|
||||||
'TYPE', 'CONST',
|
'UNIT', 'UNTIL', 'USES', 'VAR', 'WHILE'
|
||||||
'PROGRAM'
|
|
||||||
);
|
);
|
||||||
|
keywordIdx: array ['A'..'Z'] of integer;
|
||||||
paramPos:integer;
|
paramPos:integer;
|
||||||
errorLine:integer;
|
errorLine:integer;
|
||||||
errorMsg:string;
|
errorMsg:string;
|
||||||
|
|
@ -677,30 +677,6 @@ begin
|
||||||
hscroll;
|
hscroll;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function isKeyword(var s:string):boolean;
|
|
||||||
var i:integer;
|
|
||||||
c:char;
|
|
||||||
upBuf:string[MAX_LENGTH];
|
|
||||||
begin
|
|
||||||
isKeyword := false;
|
|
||||||
|
|
||||||
if highlight then
|
|
||||||
begin
|
|
||||||
upBuf := '';
|
|
||||||
for c in s do appendchar(upBuf,upcase(c));
|
|
||||||
|
|
||||||
|
|
||||||
for i := 0 to MAX_KEYWORD do
|
|
||||||
begin
|
|
||||||
if keywords[i] = upBuf then
|
|
||||||
begin
|
|
||||||
isKeyword := true;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function isalpha(c:char):boolean;
|
function isalpha(c:char):boolean;
|
||||||
begin
|
begin
|
||||||
isalpha := ((ord(c) >= ord('A')) and (ord(c) <= ord('Z'))) or
|
isalpha := ((ord(c) >= ord('A')) and (ord(c) <= ord('Z'))) or
|
||||||
|
|
@ -715,6 +691,39 @@ begin
|
||||||
((ord(c) >= ord('[')) and (ord(c) <= ord('^')));
|
((ord(c) >= ord('[')) and (ord(c) <= ord('^')));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function isKeyword(var s:string):boolean;
|
||||||
|
var i:integer;
|
||||||
|
start:integer;
|
||||||
|
c,f:char;
|
||||||
|
upBuf:string[MAX_LENGTH];
|
||||||
|
begin
|
||||||
|
isKeyword := false;
|
||||||
|
|
||||||
|
if highlight then
|
||||||
|
begin
|
||||||
|
upBuf := '';
|
||||||
|
for c in s do appendchar(upBuf,upcase(c));
|
||||||
|
|
||||||
|
(* use the first letter of the search string
|
||||||
|
for our starting index *)
|
||||||
|
c := upBuf[1];
|
||||||
|
if isalpha(c) then
|
||||||
|
begin
|
||||||
|
start := keywordIdx[c];
|
||||||
|
for i := start to MAX_KEYWORD do
|
||||||
|
begin
|
||||||
|
f := keywords[i][1];
|
||||||
|
if c <> f then break;
|
||||||
|
if keywords[i] = upBuf then
|
||||||
|
begin
|
||||||
|
isKeyword := true;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function getCat(c:char):HiliteCat;
|
function getCat(c:char):HiliteCat;
|
||||||
begin
|
begin
|
||||||
if isalpha(c) then
|
if isalpha(c) then
|
||||||
|
|
@ -2417,6 +2426,23 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure initKeywordIdx;
|
||||||
|
var i:integer;
|
||||||
|
ch, lastCh:char;
|
||||||
|
begin
|
||||||
|
lastCh := #0;
|
||||||
|
|
||||||
|
for i := 0 to MAX_KEYWORD do
|
||||||
|
begin
|
||||||
|
ch := keywords[i][1];
|
||||||
|
if ch <> lastCh then
|
||||||
|
begin
|
||||||
|
keywordIdx[ch] := i;
|
||||||
|
lastCh := ch;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
errorLine := 0;
|
errorLine := 0;
|
||||||
paramPos := 1;
|
paramPos := 1;
|
||||||
|
|
@ -2424,6 +2450,8 @@ begin
|
||||||
autoindent := true;
|
autoindent := true;
|
||||||
keepClips := false;
|
keepClips := false;
|
||||||
|
|
||||||
|
initKeywordIdx;
|
||||||
|
|
||||||
while paramPos <= ParamCount do
|
while paramPos <= ParamCount do
|
||||||
begin
|
begin
|
||||||
if paramStr(paramPos) = '-l' then
|
if paramStr(paramPos) = '-l' then
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue