(* Procedure *******************************************************) (* KeyWord Turbo Pascal v. 0653am, sat, 20.Sep.86, Glen Ellis *) (* (* parameters sent: (* (* (SysOutLine, SysIndentPos, SysIndentNum , SysLenMax, SysMarkWrite ); (* SOLL SIP SIN SLM SMW (* (* System Enable Begin Flag (* SEB (* (* System Level Counters (* SLI, SLC, SLW, SLB, SLR. (* *) procedure pKEYTP( var KLine : THEstr ; var KIPos : nbr ; KINum , KLenMax : nbr; var KMwrite, KEB : lgc ; KLI, KLC, KLW, KLB, KLR : nbr); (* also, uses SysComment (* (* requires STRING.INC library of string functions (* all are var in order to allow sending back altered values (* kLINE := OutLine (* kIPOS := indentpos = current indent position (* kINUM := indentnum = length of indent group (* KMwrite := KMwrite = controls write to disk *) var (* local memvars *) trimcnt : nbr; leftmgn : nbr; wkLINE : THEstr; KMark : lgc; x,y,z : nbr; (*========================================================*) begin (* Proc *) trimcnt := 0; leftmgn := 0; (*--- trim left spaces, count them, prep for pad left *) pTrimLCnt(kLINE,trimcnt);(**) (* trimcnt used by KEB controller *) (*--- Blank filler *) IF (SysVertiate) and (length(kLine) = 0) then kLine := ';'; (*--- create working line *) wkLINE := kLINE; (*--- init *) KMark := false; KMwrite := true; (*--- convert working line to all caps *) (* pAllCaps(wkLINE); (**) pUpCaseFirst(wKLine); (**) (*--- check for pos() of pKEYWORDs *) (* priority #2 *) (*--------------------------------------------------*) (* detect first occurence of 'begin', then set flag *) IF not KEB (* not started YET ! *) then begin IF (pos('BEGIN',wkLINE)=1) (* time to Start , NOW ! *) then begin TrimCnt := 0; KEB := true; (* start normal indent now ! *) (* will not pass through here again ! *) end; (* hold on to the current trim left margin counter *) KIPOS := trimcnt; end; (*-----*) IF KEB (* then enable line parse routines *) then begin (*---------*) (* Comment *) IF ( pos('{',wkLINE) = 1 ) or ( pos('(*',wkLINE) = 1 ) or ( pos(';',wkLINE) = 1 ) or (length(wkLINE)=0) then begin IF SysComment then pINDENT(kLINE,kIPOS,kLenMax) ELSE KMwrite := false; KMark := true; end; (*>*) (*-----------------------------------*) (* developmental (* IF, possibly without begin (* flag set method (* (* IF (pos('IF ',wkLINE)=1) then (* KIflag := true; (* do not set KMark flag. (* Allow following module to detect keywords (*<*) (*-----------------------*) (* BEGIN / CASE / REPEAT *) IF (pos('BEGIN',wkLINE)=1) or (pos('CASE',wkLINE)=1) or (pos('REPEAT',wkLINE)=1) then begin (* check for KeyIF flag set *) (* IF KIflag then clear flag *) pINDENT(kLINE,kIPOS,kLenMax); kIPOS := kIPOS + kINUM; KLB := KLB + 1; KMark := true; KEB := true; end; (*----------*) (* Trailers *) IF (pos('THEN ',wkLINE)=1) or (pos('DO ' ,wkLine)=1) or (pos('AND ',wkLine)=1) or (pos('OR ' ,wkLine)=1) then begin (* check for KeyIF flag set *) kIPOS := kIPOS + kINUM; pINDENT(kLINE,kIPOS,kLenMax); kIPOS := kIPOS - kINUM; KMark := true; end; (*-----------------------------*) (* END (begin) (case) (repeat) *) IF (pos('END',wkLINE)=1) or (pos('UNTIL',wkLINE)=1) then begin (* developmental *) (* detect KIflag and bump indent out extra *) (* IF KIflag then kIPOS := kIPOS + kINUM; *) (* else clear KIflag and allow normal indent *) (* KEY line *) kIPOS := kIPOS - kINUM; (* Position *) pINDENT(kLINE,kIPOS,kLenMax); KLB := KLB -1; (* BeginFlag *) KMark := true; end; end; (* KEB *) (* bottom of IF Key Enable Begin *) (*-----------------*) (* NONE of ABOVE *) IF not(KMark) then begin IF (pos('(*>*)',wkLine)=1) (* margin move right *) then kIPOS := kIPOS + kINUM; (* normal common line *) (* left pad current kIPOS count *) pINDENT(kLINE,kIPOS,kLenMax); IF (pos('(*<*)',wkLine)=1) (* margin move left *) then kIPOS := kIPOS + kINUM; end; end; (* Proc *) (********************************************************************) (*:B:0*) (*:B:0*) (*:B:0*) (*:B:0*) (*:B:0*) (*:B:0*)