! 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=255
!

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

{\V10IMP %externalstring(255)%fnspec CLIPARAM
{V10IMP} externalstring (255)fnspec  CLIPARAM alias  "IMP_CLI_PARAM"
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

{%externalstring(255)%fnspec CLIPARAM
{%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

  if  main_flag!32 = 'i' start 
     Print string ("IMP Syntax checker is not available")
     Newline
  finish 
!$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 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