perm filename EEDIT3.2[EAL,HE]1 blob sn#676502 filedate 1982-09-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	{$NOMAIN	Editor: part of editStmnt }
C00005 00003	procedure eEdit3 (s: statementp l,indent,e0,elen: integer 
C00011 ENDMK
C⊗;
{$NOMAIN	Editor: part of editStmnt }

%include eedit.hdr;

{ Externally defined routines from elsewhere: }

	(* From ALLOC *)
procedure relStrng(n: strngp);					external;

	(* From PAUX2 *)
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 ETOKEN *)
procedure eGetToken;						external;

	(* From EPAR3A *)
procedure eAffixParse(st: statementp);				external;

	(* From EPAR3C *)
function eVarParse(st: statementp; indent,l: integer): ascii;	external;

	(* From EPAR3F *)
procedure eMoveParse(st: statementp; bp: boolean);		external;
procedure eStopParse(st: statementp);				external;
procedure eWristParse(st: statementp);				external;

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

	(* From PP *)
procedure ppLine; 						external;
procedure ppOutNow; 						external;
procedure ppChar(ch: ascii); 					external;
procedure pp5(ch: c5str; length: integer); 			external;
procedure pp10(ch: cstring; length: integer); 			external;
procedure pp10L(ch: cstring; length: integer);			external;
procedure pp20(ch: c20str; length: integer); 			external;
procedure pp20L(ch: c20str; length: integer); 			external;

procedure eEdit3 (s: statementp; l,indent,e0,elen: integer; 
	var echar: ascii; var again: boolean; var ocur: integer); external;
procedure eEdit3;
 var i,j: integer; strp: strngp;
 begin
 with s↑ do
  case stype of
affixtype:	begin
		if fieldnum = 1 then
		  begin
		  e0 := indent + 6;
		  elen := getExprLength(frame1) + getExprLength(frame2) + 4;
		  relExpr(frame1);
		  relExpr(frame2);
		  if byvar <> nil then elen := elen + 4 + getExprLength(byvar);
		  relExpr(byvar);
		  if rigid then elen := elen + 8 else elen := elen + 11;
		    if byvar <> nil then elen := elen + 4 + getExprLength(byvar);
		    relExpr(byvar);
		  end
		 else begin e0 := indent + 5; elen := -4 end;
		if (fieldnum = 5) or (nlines = 1) then
		  begin
		  if atexp <> nil then elen := elen + 4 + getExprLength(atexp);
		  relExpr(atexp);
		  end;
		with lines[l]↑ do
		 echar := exprEditor(l-firstDline+1,start,length,e0,elen,0);
		eAffixParse(s);
		echarDo(echar,again);
		end;
movetype,
operatetype,
opentype,
closetype,
centertype,
stoptype:	begin
		if stype = operatetype then e0 := 8
		 else if stype = centertype then e0 := 7
		 else if stype = closetype then e0 := 6
		 else e0 := 5;
		e0 := e0 + indent;
		with lines[l]↑ do
		 begin					(* go edit it *)
		 elen := length - e0 + 1;
		 if listing[start+length-1] = ';' then elen := elen - 1;
		 echar := exprEditor(l-firstDline+1,start,length,e0,elen,0);
		 end;
		relExpr(cf);
		if stype = stoptype then eStopParse(s) else eMoveParse(s,false);
		echarDo(echar,again);
		end;
commenttype:	begin		(* *** only good for single line comments *** *)
		ch := str↑.ch[1];
		if (ch = 'C') or (ch = 'c') then
		  begin			(* comment ... ; *)
		  e0 := indent + 8;
		  elen := len - 9;
		  end
		 else
		  begin			(* "{" "(*" or "/*" *)
		  if ch = '{' then e0 := indent + 1	
		   else e0 := indent + 2;
		  elen := len + indent - e0 - 2;
		  j := (len-1) MOD 10 + 1;
		  strp := str;
		  for i := 1 to (len-1) DIV 10 do strp := strp↑.next;
           	  if strp↑.ch[j] = '}' then elen := elen + 1; 
		  end;
		while str <> nil do		(* release old comment string *)
		 begin strp := str↑.next; relStrng(str); str := strp end;
		with lines[l]↑ do		(* edit new one *)
		 echar := exprEditor(l-firstDline+1,start,length,e0,elen,0);
		curChar := indent;
		maxChar := indent + elen + 9;
		flushComments := false;
		eGetToken;			(* get the comment *)
		flushComments := true;
		len := eCurToken.len;	(* don't even need to check it?!? *)
		str := eCurToken.str;
		echarDo(echar,again);
		end;
wristtype:	begin
		e0 := indent + 6;
		elen := getExprLength(fvec) + getExprLength(tvec) + 1;
		relExpr(fvec);
		relExpr(tvec);
		with lines[l]↑ do
		 echar := exprEditor(l-firstDline+1,start,length,e0,elen,0);
		eWristParse(s);
		echarDo(echar,again);
		end;
setbasetype,
retrytype:	downLine(again,ocur);	(* nothing to edit here *)

declaretype:	begin
		echar := eVarParse(s,indent,l);
		echarDo(echar,again);
		end;

(* requiretype, definetype, dimdeftype *)

otherwise	begin
		pp20L(' Don''t know how to e',20); pp20('dit this type yet.  ',18);
		ppLine;
		ocur := 0;
		end;
  end;
 end;