diff --git a/progs/editor.pas b/progs/editor.pas index 4997bcc..070aaed 100644 --- a/progs/editor.pas +++ b/progs/editor.pas @@ -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