perm filename EEDIT1.2[EAL,HE]2 blob sn#704724 filedate 1983-03-26 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	{$NOMAIN	Editor:  Part of the statement-editor routine }
C00005 00003	procedure eEdit1 (s: statementp l,indent,e0,elen: integer 
C00010 ENDMK
C⊗;
{$NOMAIN	Editor:  Part of the statement-editor routine }

%include eedit.hdr;

{ Externally defined routines from elsewhere: }

	(* From EAUX1B *)
function checkArg(n: nodep; d: datatypes): nodep;		external;

	(* From EAUX1C *)
procedure relExpr(n: nodep);					external;
function evalOrder(what,last: nodep; pcons: boolean): 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 EPAR3A *)
procedure assignParse(st: statementp);				external;
procedure forParse(st: statementp);				external;

	(* From EPAR3B *)
function idGet(st: statementp; indent,l: integer): ascii;	external;

	(* From EPAR3F *)
procedure returnParse(st: statementp);				external;

	(* From EEDITS *)
procedure echarDo (echar: ascii; var again: boolean);		external;
function editExpr(n: nodep; l,e0,elen: integer; 
	echar: ascii; var again: boolean): nodep;		external;
procedure downLine (var again:boolean; var ocur: integer);	external;

	(* From PP *)
procedure pp20L(ch: c20str; length: integer); 			external;
procedure pp10(ch: cstring; length: integer); 			external;
procedure ppOutNow; 						external;

procedure eEdit1 (s: statementp; l,indent,e0,elen: integer; 
	var echar: ascii; var again: boolean; var ocur: integer); external;
procedure eEdit1;
 var i: integer;

 procedure goEd;
  begin
  with lines[l]↑ do			(* go edit it *)
   echar := exprEditor(l-firstDline+1,start,length,e0,elen,0);
  end;

 begin
 with s↑ do
  case stype of

blocktype,
coblocktype,
endtype,
coendtype:	begin
		echar := idGet(s,indent,l);
		echardo(echar,again);
		end;
fortype:	begin
		e0 := indent + 4;
		with lines[l]↑ do
		 begin					(* go edit it *)
		 i := length - 1;
		 while listing[start+i] <> 'd' do i := i - 1;
		 elen := i - e0;
		 end;
		goEd;
		relExpr(forvar);
		relExpr(initial);
		relExpr(step);
		relExpr(final);
		forParse(s);
		echardo(echar,again);
		end;
iftype:		begin
		if fieldNum = 1 then
		  begin		(* edit <cond> *)
		  e0 := indent + 3;
		  icond := checkArg(editExpr(icond,l,e0,elen,echar,again),svaltype);
		  exprs := evalOrder(icond,nil,true);
		  end
		 else downLine(again,ocur);	(* just move on to ELSE statement *)
		end;
whiletype:	begin				(* edit <cond> *)
		e0 := indent + 6;
		cond := checkArg(editExpr(cond,l,e0,elen,echar,again),svaltype);
		exprs := evalOrder(cond,nil,true);
		end;
untiltype:	begin
		if fieldNum = 2 then
		  begin				(* edit <cond> *)
		  e0 := indent + 6;
		  cond := checkArg(editExpr(cond,l,e0,elen,echar,again),svaltype);
		  exprs := evalOrder(cond,nil,true);
		  end
		 else downLine(again,ocur);	(* just move on to body *)
		end;
casetype:	begin
		if fieldNum = 1 then
		  begin		(* edit <index> *)
		  e0 := indent + 5;
		  index := checkArg(editExpr(index,l,e0,elen,echar,again),svaltype);
		  exprs := evalOrder(index,nil,true);
		  end
		 else downLine(again,ocur);	(* just move on to first case *)
		end;

calltype,
assigntype:	begin
		e0 := indent;
		elen := getExprLength(what);
		if stype = assigntype then
		  elen := elen + getExprLength(aval) + 4;
		relExpr(what);
		relExpr(aval);
		goEd;
		assignParse(s);
		echardo(echar,again);
		end;
returntype:	begin
		e0 := indent + 7;
		if retval = nil then begin e0 := e0 - 1; elen := 0 end
		 else elen := getExprLength(retval);
		goEd;
		returnParse(s);
		echarDo(echar,again);
		end;

otherwise	begin pp20L('Oh no! Bad ovly call',20); pp10(': Edits 1 ',9); 
		ppOutNow; end;
		
  end;
 end;