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;