include  "RECORDS"
include  "VTINC"
externalstring (72)fnspec  SYSMESS (integer  i)
!
! Special routines from PMM to handle file referencing and i/o
externalintegerfnspec  READIN(string (maxname)name  file,
   integer  extra, integername  base,start,fend,limit)
externalintegerfnspec  WRITEOUT(string (maxname)name  file,
   integer  base,start,fend,limit)
externalroutinespec  MOVE(integer  length,from,to)
externalroutinespec  DELETEVM(integer  base,limit)
!

constinteger  RET=10
constinteger  CASEBIT=32;          !upper<->lower
conststring (13) HELPFILE="ECCE_HELP"
conststring (13) DICTFILE="ECCE_DICT"

record  format  desc fm(integer  len, addr)
external  integer  fn  spec  spawn alias  "LIB$SPAWN" (record (desc fm)name  com)
external  routine  call out(string (255) s)
  record (desc fm) comdesc
  integer  flag
  comdesc_len=length(s)
  comdesc_addr=addr(s)+1
  if  s # "" then  flag = spawn(comdesc) else  flag = spawn(nil)
  printstring(sysmess(flag)) if  flag&1=0
end 
  
external  routine  view(string (255) key)
  record (desc fm) comdesc
  integer  flag
  string (255) s
  s <- "HELP/LIBRARY=".helpfile." VECCE ".key
  comdesc_len=length(s)
  comdesc_addr=addr(s)+1
  flag = spawn(comdesc)
  return  if  flag&1#0 
  printstring(" * Help not available")
end 

external  routine  CONNECT EDFILE(record (edfile)name  f)
!  Reference file specified by F_NAME
!   allocate store to hold it + extra bytes specified by F_FLAG
!   place the file in store
!   Return store addresses in F_START1/F_LIM
!          file addresses in F_START2/F_LIM2
!              ( START1 <= START2 <= LIM2 <= LIM )
!   Update F_NAME to full file name
!
! Discard any previous input file
  deletevm(f_start1,f_lim) if  f_start1 # 0
! Read the file in
  f_flag = readin(f_name,f_flag>>9,f_start1,f_start2,f_lim2,f_lim)
  if  f_flag # 0 start 
    print string(" *".sysmess(f_flag).": ".f_name)
    newline
    f_start1 = 0;  f_start2 = 0;  f_lim2 = 0
  finish 
  f_lim1 = f_start1
!  Ensure that file does not end with partial line
  f_lim2 = f_lim2-1 while  f_lim2 # f_start2 and  byteinteger(f_lim2-1)#nl
end ;  !connect edfile

include  "IMP_INCLUDE:CONNECT.INC";  !dictionary connection
external  routine  CONNECT DICTIONARY(integername  base)
integer  f,s,l
  on  event  3,4,9,15 start 
    return 
  finish 
  connect file(DICTFILE,0,s,l)
  base = s {%if f&1 # 0
end 

endoflist 
include  "IMP_INCLUDE:RMSDEF.INC"
list 
external  routine  DISCONNECT EDFILE(record (edfile)name  out)
integer  i,k
  if  out_flag < 0 or  out_change < 0 start 
    deletevm(out_start1,out_lim)
    return 
  finish 
  i = out_lim1-out_start1;  !upper half
  out_start2=out_start2-i
  move(i,out_start1,out_start2);  ! concatenated to lower
  out_fp = out_fp + out_start2 - out_start1 if  out_start1 <= out_fp < out_lim1
    ! In case backup needs to re-enter
  out_lim1=out_start1
  cycle 
    i = writeout(out_name,out_start1,out_start2,out_lim2,out_lim)
    exit  if  i = 0
    print string(" *".sysmess(i).": ".out_name)
    newline
    if  i = rms cre or  i = rms ext or  i = rms ful start 
      print string(" * Insufficient disc space to write the output file *")
      newlines(2)
      print string(" Do you want a chance to delete some files?"); new line
      vt prompt("Y(es) or N(o)? ")
      read symbol(k) until  k!casebit = 'y' or  k!casebit = 'n'
      vt prompt("")
      if   k!casebit =  'y' start 
        print string("You will need at least ")
        write((out_lim2-out_start2)>>9+1,0)
        print string(" free blocks to write the file."); new line
        print string("LOGOUT will return control to VECCE"); newline
        set video mode(0); ! to flush
        call out("")
     else 
        print string(" Abandon complete edit? "); new line
        vt prompt("Y(es) or N(o)? ")
        read symbol(k) until  k!casebit = 'y' or  k!casebit = 'n'
        vt prompt("")
        out_change = -1 and  exit  if   k!casebit =  'y'
      finish 
    else 
      print string(" Please supply alternative file-name: ")
      select input(0);  prompt("")
      out_name = ""
      read symbol(k) until  k # ' '
      cycle 
        out_name = out_name.tostring(k);  read symbol(k)
      repeat  until  k < ' '
      newline
    finish 
  repeat 
end 

external  routine  BACKUP EDFILE(record (edfile)name  out)
   disconnect edfile(out)
end 

!!!!!!!!!!!!!!!!!!!  Editor parameters and options  !!!!!!!!!!!!!!!!!
external  record (opt fm) OPTIONS

include  "IMP_INCLUDE:CLIPARSE.INC"
externalroutine  SET PARAMETERS(string (maxname)name  in,sec,out,
                                string (255) parm)
  integer  t, save options
  constinteger  MINWIN0=24, MAXWIN0=99
  on  event  5 start  
    printstring(event_message);  newline
    stop 
  finish 
  !       Initialise the Editor Options to their default values
  options = 0;           ! Zero whole record
  OPTIONS_mapcase = 1
  OPTIONS_width   = 80
  OPTIONS_minwin  = minwin0
  OPTIONS_ttype   = -1
  OPTIONS_wrows   = 255
  OPTIONS_wcols   = 255
  OPTIONS_ctop    = 99
  OPTIONS_ccols   = 255
  OPTIONS_maxwin  = maxwin0
  OPTIONS_tabs(t) = 8*t for  t = 0,1,maxtab

  !NB QualifierI returns zero if the qualifier is not present.  Similarly,
  !   QualifierS returns the null string

  In       = Qualifier S("FILE")
  Out      = Qualifier S("OUTPUT")
  Sec      = Qualifier S("SECNAME")
  OPTIONS_Pre      = Qualifier S("PRE")
  OPTIONS_Logfile  = Qualifier S("LOG")
  OPTIONS_Map Case = 0 unless  Qualifier Present("MATCH")
  OPTIONS_Mark     = 0 if  Qualifier Present("HILIGHT")
  OPTIONS_Mark     = 1 if  Qualifier Present("MARK")
  OPTIONS_Early    = 0 if  Qualifier Present("LATE")
  OPTIONS_Early    = 1 if  Qualifier Present("EARLY")
  OPTIONS_Dmode    = 1 if  Qualifier Present("INSERT")
  OPTIONS_Emode    = 1 if  Qualifier Present("EMODE")
  OPTIONS_Exptabs  = 1 if  Qualifier Present("TAB_EXPAND")
  OPTIONS_Width    = Qualifier I("WIDTH")
  OPTIONS_Margin   = Qualifier I("MARGIN")
  OPTIONS_Min Win  = Qualifier I("MINWIN") if  Qualifier Present("MINWIN")
  OPTIONS_T Type   = Qualifier I("TTYPE")  if  Qualifier Present("TTYPE")
  OPTIONS_W Top    = Qualifier I("WTOP")
  OPTIONS_W Rows   = Qualifier I("WROWS")  if  Qualifier Present("WROWS")
  OPTIONS_W Left   = Qualifier I("WLEFT")
  OPTIONS_W Cols   = Qualifier I("WCOLS")  if  Qualifier Present("WCOLS")
  OPTIONS_C Top    = Qualifier I("CTOP")   if  Qualifier Present("CTOP")
  OPTIONS_C Left   = Qualifier I("CLEFT")
  OPTIONS_C Cols   = Qualifier I("CCOLS")  if  Qualifier Present("CCOLS")
  OPTIONS_Max Win  = Qualifier I("MAXWIN") if  Qualifier Present("MAXWIN")
  OPTIONS_Vmode    = Qualifier I("VMODE")
end 

external  integer  array  spec  INITDEF(0:255)

external  integer  map  DEF(integer  i)
  result  == initdef(i)
end 

const  integer  MACBOUND=8191

external  byte  map  MAC(integer  i)
  own  byte  array  M(0:MACBOUND)
  result  == m(i)
end 

end  of  file