perm filename EEDITS.2[EAL,HE] blob
sn#704709 filedate 1983-04-04 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 {$NOMAIN Editor: Routine to edit a statement }
C00005 00003 (* editStmnt: aux routines: echarDo, editExpr, downLine *)
C00007 00004 (* editStmnt: main body *)
C00011 ENDMK
C⊗;
{$NOMAIN Editor: Routine to edit a statement }
%include eedit.hdr;
{ Externally defined routines from elsewhere: }
(* From EAUX1A *)
procedure adjustDisplay; external;
(* From EAUX1C *)
procedure relExpr(n: nodep); external;
(* From EPUT *)
function getExprLength(n: nodep): integer; external;
(* From EEXPED *)
function exprEditor(line,lstart,llength,estart: integer;
var elength: integer; off: integer): ascii; external;
(* From EAUX2C *)
procedure displayLines(var pfrom: integer); external;
(* From EPUTST *)
procedure putstmnt(s: statementp; indent, plevel: integer); external;
(* From EEXPAR *)
function exprParse: nodep; external;
(* From EPAR3B *)
procedure labelParse; external;
(* From EPAR3D *)
function addNewDeclarations: integer; external;
(* From the EEDITn modules *)
procedure eEdit1 (s: statementp; l,indent,e0,elen: integer;
var echar: ascii; var again: boolean; var ocur: integer); external;
procedure eEdit2 (s: statementp; l,indent,e0,elen: integer;
var echar: ascii; var again: boolean; var ocur: integer); external;
procedure eEdit3 (s: statementp; l,indent,e0,elen: integer;
var echar: ascii; var again: boolean; var ocur: integer); external;
procedure eEditOther (n: nodep; l,indent,e0,elen: integer;
var echar: ascii; var again: boolean); external;
(* From PP *)
procedure relLine(l: linerecp); external;
(* editStmnt: aux routines: echarDo, editExpr, downLine *)
procedure echarDo (echar: ascii; var again: boolean); external;
procedure echarDo ;
begin
if ord(echar) >= 120B then cursorLine := cursorLine - 1 (* U or P *)
else cursorLine := cursorLine + 1; (* cr or N *)
again := not odd(ord(echar)); (* keep going if N or P *)
end;
function editExpr(n: nodep; l,e0,elen: integer;
echar: ascii; var again: boolean): nodep; external;
function editExpr;
begin
elen := getExprLength(n);
relExpr(n); (* flush the old expression *)
with lines[l]↑ do
echar := exprEditor(l-firstDline+1,start,length,e0,elen,0);
n := exprParse; (* parse the modified expression *)
echarDo(echar,again);
editExpr := n;
end;
procedure downLine (var again:boolean; var ocur: integer); external;
procedure downLine ;
begin
cursorLine := cursorLine + 1;
setCursor := true;
adjustDisplay;
displayLines(lineNum); (* shift display if necessary *)
again := true;
ocur := 0;
end;
(* editStmnt: main body *)
procedure editStmnt; external;
procedure editStmnt;
var l,ocur,indent,e0,elen: integer;
n: nodep; s: statementp; echar: ascii;
again: boolean;
begin
setExpr := true;
repeat
newDeclarations := nil;
l := cursorLine - topDline + 1; (* offset into line array *)
ocur := cursorLine;
again := false;
with cursorStack[cursor] do
begin
if stmntp then s := st else n := nd;
indent := ind + 1;
end;
if not cursorStack[cursor].stmntp then (* Is it a statement? *)
eEditOther(n,l,indent,e0,elen,echar,again) (* No - edit appropriately *)
else
if fieldNum = 0 then
begin (* modify statement label *)
with lines[l]↑ do
begin (* go edit it *)
elen := lines[l]↑.length;
echar := exprEditor(l-firstDline+1,start,length,1,elen,0);
end;
labelParse;
echarDo(echar,again);
end
else
with s↑ do (* Modify statement itself *)
if (stype <= returntype) or (stype = assigntype) then
eEdit1 (s,l,indent,e0,elen,echar,again,ocur)
else if (stype <= cmtype) or (stype = unfixtype) or (stype = saytype) then
eEdit2 (s,l,indent,e0,elen,echar,again,ocur)
else
eEdit3 (s,l,indent,e0,elen,echar,again,ocur);
l := addNewDeclarations;
if ocur > 0 then
begin (* unless told otherwise... *)
ocur := ocur + l;
firstLine := ocur;
lastLine := ocur;
l := ocur - topDline + 1; (* offset into line array *)
relLine(lines[l]); (* flush old line *)
lines[l] := nil;
curLine := 0;
putStmnt(dProg,0,99); (* write & display new line *)
end;
if (ocur <> cursorLine) or (newDeclarations <> nil) then
begin (* make sure new line is on screen *)
setCursor := true;
adjustDisplay;
displayLines(lineNum); (* shift display if necessary *)
end;
until not again;
setExpr := false;
end;