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;
|
||||
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue