editor: faster keyword recognition

- use indexed search in keywords array, also
  add missing keywords
This commit is contained in:
slederer 2024-12-28 23:17:05 +01:00
parent 9a0aa7a431
commit 347b57cae3

View file

@ -8,7 +8,7 @@ const COMPILERPROG = '#SYSTEM:pcomp.prog';
const MAX_LENGTH = 512;
MAX_LINES = 10000;
MAX_SCREENH = 256;
MAX_KEYWORD = 31;
MAX_KEYWORD = 33;
MAX_CLIPB_SIZE = 300;
@ -94,14 +94,14 @@ var lines: array [1..MAX_LINES] of ^linestr;
catColors: array [Unknown..StrLit] of integer =
( TEXT_FG, 0, KEYWORD_FG, IDENT_FG, NUM_FG, PUNCT_FG, COMMENT_FG, STRLIT_FG );
keywords: array [0..MAX_KEYWORD] of string[20] = (
'VAR', 'IF', 'THEN', 'ELSE', 'BEGIN', 'END', 'PROCEDURE', 'FUNCTION',
'WHILE', 'FOR', 'DO', 'IN', 'OF', 'CASE', 'TO', 'REPEAT', 'UNTIL',
'CHAR', 'INTEGER', 'REAL', 'BOOLEAN', 'ARRAY', 'RECORD', 'STRING',
'MOD', 'DIV', 'AND', 'OR', 'NOT',
'TYPE', 'CONST',
'PROGRAM'
keywords: array [0..MAX_KEYWORD] of string[12] = (
'AND', 'ARRAY', 'BEGIN', 'BOOLEAN', 'CASE', 'CHAR', 'CONST',
'DIV', 'DO', 'ELSE', 'END', 'FOR', 'FUNCTION', 'IF', 'IN', 'INTEGER',
'MOD', 'NOT', 'OF', 'OR', 'PROCEDURE', 'PROGRAM',
'REAL', 'RECORD', 'REPEAT', 'STRING', 'THEN', 'TO', 'TYPE',
'UNIT', 'UNTIL', 'USES', 'VAR', 'WHILE'
);
keywordIdx: array ['A'..'Z'] of integer;
paramPos:integer;
errorLine:integer;
errorMsg:string;
@ -677,30 +677,6 @@ begin
hscroll;
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;
begin
isalpha := ((ord(c) >= ord('A')) and (ord(c) <= ord('Z'))) or
@ -715,6 +691,39 @@ begin
((ord(c) >= ord('[')) and (ord(c) <= ord('^')));
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;
begin
if isalpha(c) then
@ -2417,6 +2426,23 @@ begin
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
errorLine := 0;
paramPos := 1;
@ -2424,6 +2450,8 @@ begin
autoindent := true;
keepClips := false;
initKeywordIdx;
while paramPos <= ParamCount do
begin
if paramStr(paramPos) = '-l' then