.PROC,GETFILE*I,
LFN "- Local File Name"                = (*F),
PFN "- Permanent File Name"            = (*N=,*F),
UN "- User Name of permanent file"     = (*N=,*F),
M "- Mode of file access"              = (*N=W,W=W,R=R,WRITE=W,READ=R),
A "- Abort if file is NOT FOUND"       = (*N=NO,YES,NO),
.
.HELP
 The GETFILE procedure GETs either INDIRECT or DIRECT access FILEs.

 Parameter   Default   Description
   Name       Value

   lfn                 local file name by which the file is accessed
  [pfn]       lfn      permanent file name of the stored file
  [un]                 user name in which file resides
  [m]          w       access mode of the file
  [a]          no      abort if the file is NOT FOUND

.HELP,LFN
 The LFN parameter selects the name by which the file is accessed.
.HELP,PFN
 The PFN parameter selects the name by which the file was stored.
 The default is the value specified for the LFN parameter.
.HELP,UN
 The UN parameter specifies the User Name location of the file. On NOS,
 the default value is the User Name in which this procedure executes.
 On NOS/BE, the UN parameter specifies a permanent file ID and must be
 supplied.
.HELP,M
 The M parameter selects the Mode of access for the file.
 Options are:  W | WRITE  - for write access (default value)
               R | READ   - for read access
.HELP,A
 The A parameter value selects whether to Abort if the file is NOT FOUND.
 Options are:  NO   - do not abort if file is NOT FOUND (default value)
               YES  - abort if file is NOT FOUND
.ENDHELP
.IFE,$PFN$.EQ.$$,NAMEPFN.
  REVERT,EX.GETFILE,LFN,LFN,UN,M,A.
.ENDIF,NAMEPFN.
.IFE,FILE(LFN,WR),WRITEFILE.
  REWIND,LFN.
  REVERT. FILE LFN ALREADY LOCAL
.ENDIF,WRITEFILE.
.IFE,SYS=NOS,NOSSYS.
  .IFE,FILE(LFN,PM),FILEPRM.
    .IFE,FILE(LFN,RD),COPYLOCAL.
      $REWIND,LFN.
      .IFE,$M$.EQ.$W$,MAKECOPY.
        $COPYEI,LFN,YYYYTMP.
        $RENAME,LFN=YYYYTMP.
        $REWIND,LFN.
      .ENDIF,MAKECOPY.
    .ELSE,COPYLOCAL.
      $REVERT,ABORT. CANNOT COPY FILE LFN
    .ENDIF,COPYLOCAL.
  .ELSE,FILEPRM.
    $GET,LFN=PFN/#UN=UN,NA.
    $IFE,FILE(LFN,AS),FILEIND.
      $REVERT. PFN(INDIRECT) --> LFN
    $ENDIF,FILEIND.
    $ATTACH,LFN=PFN/#UN=UN,#M=M,NA.
    $IFE,FILE(LFN,AS),FILEDIR.
      $IFE,FILE(LFN,WR),WRITEFILE.
        $REWIND,LFN.
        $REVERT. PFN(DIRECT) --> LFN
      $ELSE,WRITEFILE.
        $IFE,FILE(LFN,RD),COPYLOCAL.
          .IFE,$M$.EQ.$W$,MAKECOPY.
            $COPYEI,LFN,YYYYTMP.
            $RENAME,LFN=YYYYTMP.
          .ENDIF,MAKECOPY.
          $REWIND,LFN.
        $ELSE,COPYLOCAL.
          $REVERT,ABORT. CANNOT COPY FILE LFN
        $ENDIF,COPYLOCAL.
      $ENDIF,WRITEFILE.
    $ELSE,FILEDIR.
      .IFE,$M$.EQ.$W$,GETCOPY.
        $REVERT,EX.GETFILE,LFN,PFN,UN,READ,A.
      .ENDIF,GETCOPY.
      .IFE,$A$.NE.$NO$,ABORT.
        $REVERT,ABORT. FILE PFN NOT FOUND
      .ELSE,ABORT.
        $REVERT. FILE PFN NOT FOUND
      .ENDIF,ABORT.
    $ENDIF,FILEDIR.
  .ENDIF,FILEPRM.
  $REVERT. PFN(DIRECT) --> LFN
EXIT.
IFE(EF.EQ.TIE).OR.(EF.EQ.TAE),TERMINATED.
  EXIT. GETFILE *TERMINATED*
ELSE,TERMINATED.
  REVERT,ABORT. GETFILE FAILED
ENDIF,TERMINATED.
.ELSE,NOSSYS.
  .IFE,$UN$.EQ.$$,NOUSER.
    NOTE(OUTPUT,NR)+ NO USERNAME WITH GETFILE
    REVERT,ABORT. NO USERNAME WITH GETFILE
  .ELSE,NOUSER.
    .IFE,OT.EQ.TXO.DFLIST,OFF.
    .IFE,$M$.EQ.$W$,WRITEPERM.
      RETURN,LFN.
      ATTACH,LFN,PFN,ID=UN.
    .ELSE,WRITEPERM.
      .IFE,FILE(LFN,AS),READPERM.
        .IFE,OT.EQ.TXO.DFLIST,ON.
        REVERT. LFN ALREADY ATTACHED (READ-ONLY)
      .ELSE,READPERM.
        ATTACH,LFN,PFN,ID=UN,MR=1.
      .ENDIF,READPERM.
    .ENDIF,WRITEPERM.
      .IFE,OT.EQ.TXO.DFLIST,ON.
      REVERT. ATTACHED #LFN=LFN #PFN=PFN ID=UN
  .ENDIF,NOUSER.
    EXIT(U)
    .IFE,OT.EQ.TXO.DFLIST,ON.
  .IFE,$A$.NE.$NO$,ABORT.
    NOTE(OUTPUT,NR)+ FILE PFN NOT FOUND
    REVERT,ABORT. FILE PFN NOT FOUND
  .ELSE,ABORT.
    DISCONT,OUTPUT.
    BKSP(OUTPUT)
    SET(EF=0)
    REVERT. FILE PFN NOT FOUND
  .ENDIF,ABORT.
EXIT.
  .IFE,OT.EQ.TXO.DFLIST,ON.
  REVERT,ABORT. GETFILE FAILED
.ENDIF,NOSSYS.
/EOR
