! 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},
                              SHIFT {Amount of right shift of file window},
                     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 APM
{%externalstring(255)%fnspec CLIPARAM
{!
!$IF VAX or AMDAHL
!IMP syntax checking routine:
externalroutinespec  ECCECI(record (edfile)name  main)
!$FINISH

!
!$IF AMDAHL
{%externalroutinespec SETLINE %alias "S#SETLINE"(%string(255)s)
{%externalroutinespec LINE %alias "S#LINE"(%stringname parm)
{%externalroutinespec UCTRANSLATE %alias "S#UCTRANSLATE" (%integer addr, len)
{%externalroutinespec SET RETURN CODE %alias "S#SETRETURNCODE"(%integer flag)
{%externalstringfnspec FAILUREMESSAGE %alias "S#FAILUREMESSAGE" (%integer i)
{%externalroutinespec PROMPT %alias "S#PROMPT"(%string(255) p)
{%externalstring(127)%fnspec ITOS %alias "S#ITOS" (%integer i)
{%externalintegerfnspec CHECK OUTPUT FILE (%string(255)s,%integer default)
{%external %routine %spec MAKE OUTPUT FILE(%record(edfile)%name f)
{%external %routine %spec BACKUP EDFILE(%record(edfile)%name f)
{%external %integer %function %spec EXISTTYPE %alias "S#EXISTTYPE"(%string(255)f)
{! The next two specs added to allow vecce to be called from within a command
{! macro on emas-a - as per request of Tony Gibbons - I have no idea what they
{! do - Graham Rule 23/03/87
{%externalintegerfnspec INDEFAULT %alias "S#INDEFAULT"
{%externalroutinespec SETIODEFAULT %alias "S#SETIODEFAULT"(%integer d,c,b)
{%external %integer %spec tempid 
{
{%integerfn vecce inner
{%integer f,i,j,same,written
{%string(255) heading
{%record(edfile) MAIN,SEC
{%string(maxname) OUTNAME,MAINNAME
{
{  main = 0;  sec = 0
{  set parameters(mainname,sec_name,outname,"")
{  %if existtype(mainname)=0 %and (outname = "" %or outname = mainname) %start
{     outname = mainname
{     mainname = ""
{  %finish 
{  main_name = mainname
{  main_name = "" %if main_name = ".N" %or main_name = ".NULL"
{  outname = main_name %if outname = ""
{  outname = "" %if outname = ".N" %or outname = ".NULL"
{  same = 0;  same = 1 %if outname = main_name
{  %if outname # "" %start
{    f = checkoutputfile(outname,same)
{    %if f=219 %or f=287 %start
{      printstring(" There already is a file ".outname)
{      printstring(".  Are you happy to overwrite it?")
{      newline
{      prompt(" Y(es or N(o:")
{      readsymbol(i) %until i > ' '
{      readsymbol(j) %until j < ' '
{      -> errstop %unless i&95 = 'Y'
{      f=0
{    %finish
{    -> errstop %if f # 0
{  %finish
{  connect edfile(main)
{  f = main_flag
{  -> errstop %if f # 0
{  connect edfile(sec)
{  f = sec_flag
{  -> errstop %if f # 0
{!     Needed even for SHOW
{!  %if outname # "" %start
{    main_flag=main_lim2-main_start2+sec_lim2-sec_start2
{    make output file(main)
{    f = main_flag; -> errstop %if f#0
{!  %finish
!$IF VAX
externalintegerfnspec  SET FILE DEFAULT (string (127) DEF, integername  exists)
! Alias for lattice imp
! %externalstring(72)%fnspec SYSMESS %alias "IMP_GET_MESSAGE"(%integer i)
externalstring (72)fnspec  SYSMESS (integer  i)
begin 
integer  f,i,same,written, exists
string (255) heading
record (edfile) MAIN,SEC
string (maxname) OUTNAME,MAINNAME
  main = 0; sec = 0
  set parameters(mainname,sec_name,outname,"")
  main_name=mainname
  main_name = "" if  main_name = ".N" or  main_name = "NL:"
  i = set file default(main_name,exists)
  printstring(sysmess(i)) and  -> stop if  i # 0
  if  exists = 0 and  Out Name = "" start 
    Out Name = main_name;  main_name = "" 
  finish 
  same = 0;  same = 1 if  main_name = outname
  if  outname = "" start 
    same = 1
    outname = main_name unless  main_name -> outname.(";"); ! No version number neede in outname
  finish 
  outname = "" if  outname = ".N"
  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
!$IF APM
{%begin
{%integer i,same,written
{%string(255) heading
{%record(edfile) MAIN,SEC
{%string(maxname) OUTNAME,MAINNAME
{  main = 0; sec = 0
{  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 
!
  written=0
  main_lim1 = main_start1;  sec_lim1 = sec_start1
  main_fp = main_start2
again:
  main_name = outname
  main_flag=0
!  CALL editor
  edi(main,sec,heading)
!$IF AMDAHL
{  uctranslate(addr(main_name)+1,length(main_name))
{  same=0; same=1 %if main_name=mainname 
{  %if outname # "" %and same=0 %start; ! If new output file was specified
{    f = checkoutputfile(main_name,1);  ! Check for name and existence
{    %if f#0 %start
{      heading=failuremessage(f)
{      -> again
{    %finish
{  %finish
!$IF VAX
  same=0; same=1 if  main_name=mainname 
!$IF AMDAHL or VAX
  if  main_flag!32='b' start ;   !Backup file
    if  outname="" or  (main_change=16_7FFFFFFF and  same # 0 and  written=0) start 
      Heading= " File unchanged - not backed up"
      -> again
    finish 
    heading=""
!$IF AMDAHL
{    backup edfile(main);              ! Create backup file
{    %if main_flag#0 %start
{      heading=failuremessage(main_flag)." - "
{      main_name=":VECCE#SAVE"
{    %finish
!$IF VAX
    disconnect edfile(main)
    main_change=16_7FFFFFFF 
!$IF VAX OR AMDAHL
    heading=heading." Backed up to ".main_name
    written=0
    written=1 if  main_name#outname;       ! Flag for default output file backup
    -> again
  finish 
  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 and  outname # "") or  (main_change = 16_7FFFFFFF and  same # 0 and  written=0) start 
    print string(" File unchanged")
    main_change = -1
!$IF VAX OR APM
  finish 
!$IF AMDAHL
{  %finish
{  %if main_change >= 0 %start;  !file to be written
{    disconnect edfile(main)
{    f = main_flag
{    %if f # 0 %start
{      printstring(failuremessage(f)." - Edited file left in :VECCE#SAVE") 
{    %finishelse printstring(mainname."  edited to  ".main_name)
{  %else
{    tempid = tempid - 1;                       ! Discard current temporary file.
{  %finish
{  f=0
{errstop:
{  newline
!$IF AMDAHL
{   %result = f
{%end;                                   !OF VECCE
{
{%external %routine vecce %alias "C#VECCE"
{%integer save in default, flag
{  save in default = indefault
{  flag = vecce inner
{  set io default(0, save in default, 0)
{  set return code(flag)
{%end
{
{%externalroutine VSHOW %alias "C#VSHOW"
{%string(255)parm
{%integer flag
{%integer save in default
{  save in default = indefault
{  line(parm)
{  setline(parm.",OUTPUT=.NULL")
{  flag = vecce inner
{  set io default(0, save in default, 0)
{  set return code(flag)
{%end
{
{%externalroutine VRECAP %alias "C#VRECAP"
{%externalroutinespec emas3getjournal (%stringname file,%integername flag)
{%string(255)file, parm
{%integer flag, save in default
{   line(parm)
{   emas3 get journal(file,flag)
{   %if flag=0 %thenstart
{      %if parm="" %then setline(file) %c
{      %elseif charno(parm,1)=',' %then setline(file.parm) %c
{      %else setline(file.",".parm)
{      save in default = indefault
{      flag = vecce inner
{      set io default(0, save in default, 0)
{      set return code(flag)
{   %finishelse set return code(flag)
{%end
{
!$IF VAX or APM
  disconnect edfile(main)
  if  main_change >= 0 start ;  !file written
    printstring(mainname."  edited to ")
    newline if  length(mainname) > 30
    printstring(main_name)
  finish 
  if  sec_start1 # 0 start 
    sec_change = -1
    disconnect edfile(sec)
  finish 
stop:
  newline
ENDOFPROGRAM 
!$FINISH
ENDOFFILE