! Steering program: Set parameters, open files, call EDI, close files
!ECCExx:    Implementation of ECCE for 2900/EMAS, VAX/VMS and APM
!  Revised specification (1981/82) including video support.
!  Hamish Dewar   Edinburgh University Computer Science Department
!
%constinteger MAXNAME=127
!
%recordformat EDFILE(%integer START1,LIM1, {part 1}
                              START2,LIM2, {part 2}
                              LIM, {VMLIM}
                              LBEG,FP,CHANGE,FLAG,
                              LINE  {line number of current pos},
                              DIFF  {diff between LINE and ROW},
                     %byte    TOP  {top row of sub_window},
                              WIN  {floating top},
                              BOT  {bottom row of sub_window},
                              MIN  {minimum window size},
                              ROW  {last row position},
                              COL  {last col position},
             %string(maxname) NAME)
!
%external%routine%spec EDI(%record(edfile)%name main,sec,
                         %string(255) message)
%external%routine%spec CONNECT EDFILE(%record(edfile)%name f)
%external%routine%spec DISCONNECT EDFILE(%record(edfile)%name f)
%externalroutinespec SET PARAMETERS(%string(maxname)%name in,sec,out,
                                    %string(255) parm)
!
!$IF VAX or EMAS
{!IMP syntax checking routine:
{%externalroutinespec ECCECI(%record(edfile)%name main)
!$FINISH

%ownrecord(edfile) MAIN=0,SEC=0
%ownstring(maxname) OUTNAME=""
!
!$IF EMAS
{%systemroutinespec PSYSMES(%integer root, flag)
{%systemintegermapspec COMREG(%integer i)
{%systemroutinespec OUTFILE(%string(31) s, %integer l,m,p, %c
{                       %integername c,f)
{%external%integerfnspec CHECKOUTPUTFILE(%string (31) s, %integer default)
{%externalroutine VECCE(%string(255) parm)
{%integer f,i,same,holesize,tempsize,outhead
{%string(255) heading
{  main = 0;  sec = 0
{  set parameters(main_name,sec_name,outname,parm)
{  main_name = "" %if main_name = ".N"
{  outname = main_name %if outname = ""
{  outname = "" %if outname = ".N"
{  same = 0;  same = 1 %if outname = main_name
{  %if outname # "" %start
{    f = checkoutputfile(outname,same)
{    -> errstop %if f # 0
{  %finish
{  connect edfile(main)
{  f = main_flag
{   -> stop %if f # 0
{  connect edfile(sec)
{  f = sec_flag
{  -> stop %if f # 0
{  %if outname # "" %start
{    holesize = 262144
{    %cycle
{        tempsize = main_lim2-main_start2 + sec_lim2-sec_start2 + holesize
{        outfile("T#ETEMP",-tempsize,tempsize,0,outhead,f)
{        %exit %if f=0
{        ->errstop %if holesize = 16384; ! 16k - minimum reasonable
{        holesize = holesize>>1
{    %repeat
{    integer(outhead+12) = 3;             !type = character
{    main_start1 = outhead+32
{    main_lim = main_start1+integer(outhead+8)-32
{  %finish
!$IF VAX
{%begin
{%integer f,i,same
{%string(255) heading
{  set parameters(main_name,sec_name,outname,cliparam)
{  main_name = "" %if main_name = ".N"
{  outname = main_name %if outname = ""
{  outname = "" %if outname = ".N"
{  same = 0;  same = 1 %if outname = main_name
{  %if outname = "" %start;  !ie was /.N
{    connect edfile(main);                  !without extra
{    -> stop %if main_flag # 0
{  %finish %else %start
{    %if sec_name # "" %start
{      connect edfile(sec)
{      -> stop %if sec_flag # 0
{      main_flag = sec_lim2-sec_start2; !size of sec file
{    %finish
{    main_flag = main_flag+16384;           !extra space
{    connect edfile(main)
{    -> stop %if main_flag # 0
{  %finish
!$IF APM
%begin
%integer i,same
%string(255) heading
  set parameters(main_name,sec_name,outname,cliparam)
  main_name = "" %if main_name = ":N"
  outname = main_name %if outname = ""
  outname = "" %if outname = ":N"
  same = 0;  same = 1 %if outname = main_name
  main_flag = 32768;  !plus extra
  connect edfile(main)
  -> stop %if main_flag # 0
  %if sec_name # "" %start
    connect edfile(sec)
    -> stop %if sec_flag # 0
  %finish
!$FINISH
  %if outname # "" %start
    %if main_name # "" %start 
      heading = "Editing  ".main_name
      heading = heading." with ".sec_name %if sec_name # ""
      heading = heading."  to  ".outname %if same = 0
    %finish %else %start
      heading = "Creating  ".outname
    %finish
    main_change = 16_7FFFFFFF
  %finish %else %start
    heading = "Showing  ".main_name
    main_change = -1
  %finish
!
  main_lim1 = main_start1;  sec_lim1 = sec_start1
  main_fp = main_start2
  edi(main,sec,heading)
!$IF VAX or EMAS
{  ecceci(main) %if main_flag!32 = 'i'
!$FINISH
!
!MAIN_FLAG is negative if edit abandoned
!MAIN_CHANGE is untouched (neg or inf) if no changes
  %if main_flag < 0 %or (main_change = 16_7FFFFFFF %and same # 0) %start
    print string(" File ".main_name." unchanged")
    main_change = -1
  %finish
!$IF EMAS
{  %if main_change >= 0 %start;  !file to be written
{    sec_name = main_name;  main_name = outname
{    disconnect edfile(main)
{    f = main_flag
{    %if f # 0 %then printstring(" Edited file left in T#ETEMP") %c
{    %else printstring(sec_name."  edited to  ".main_name)
{  %finish
{  -> stop
{errstop:
{  psysmes(73,f) %if f > 0
{stop:
{  newline
{  comreg(24) = f;  !return code
{%end;                                   !OF VECCE
{
{%externalroutine VSHOW(%string(255) parm)
{  vecce(parm."/.N")
{%end
{
{%externalroutine VRECAP(%string(255) parm)
{%systemroutinespec GET JOURNAL(%string(31)%name file, %integername flag)
{%string(31) file
{%integer flag
{  get journal(file,flag)
{  %if flag = 0 %start
{    %if parm = "" %then vshow(file) %c
{    %else %if charno(parm,1) = '/' %then vecce(file.parm) %c
{    %else vecce(file."/".parm)
{  %finish
{  %if flag > 0 %then psysmes(75,flag)
{  comreg(24) = flag;                    !set return code
{%end
{
{%ENDOFFILE
!$IF VAX or APM
  sec_name = main_name;  main_name = outname
  disconnect edfile(main)
  %if main_change >= 0 %start;  !file written
    printstring(sec_name."  edited to ")
    newline %if length(sec_name) > 30
    printstring(main_name)
  %finish
  %if sec_start1 # 0 %start
    sec_change = -1
    disconnect edfile(sec)
  %finish
stop:
  newline
%ENDOFPROGRAM
!$FINISH
