.PROC,LINUTIL*I,
M "- Module name (or ALL or *)"          = (*N=*,ALL=*,*,EXTRACT),
*IF ($string($name(wev$target_operating_system))='NOSBE')
B "- Binary input file name"             = (*N=NVERELB,*F),
L "- Library name for linked output"     = (*N=NVELIBB,*F),
*ELSE
B "- Binary input file name"             = (*N=NVERELS,*F),
L "- Library name for linked output"     = (*N=NVELIB,*F),
*IFEND
MAP "- MAP file name"                    = (*N=LINKMAP,*F),
UN "- NOS/BE perm file ID"               = (*N=,*F),
.
.HELP
 The LINUTIL procedure links the dual state utility routines.
 Requires library CYBCLIB.

 Parameter   Default   Description
   Name       Value

  [m]          all     Module name being linked (or ALL or *).
*IF ($string($name(wev$target_operating_system))='NOSBE')
  [b]        nverelb   Binary relocatable input file name.
  [l]        nvelibb   Library name to which the linked module is written.
*ELSE
  [b]        nverels   Binary relocatable input file name.
  [l]        nvelib    Library name to which the linked module is written.
*IFEND
  [map]      linkmap   File name to which the linkmap is written.
  [un]                 Permanent file ID for NOS/BE version.

.HELP,M
 The M parameter selects the module name to be linked. Either EXTRACT or
 ALL may be specified. The default is ALL utility routines.
.HELP,B
 The B parameter specifies the binary file containing the relocatable
*IF ($string($name(wev$target_operating_system))='NOSBE')
 binaries.  The default value is NVERELB.
*ELSE
 binaries. The default value is NVERELS.
*IFEND
.HELP,L
 The L parameter specifies the library file to which the linked module is
*IF ($string($name(wev$target_operating_system))='NOSBE')
 written.  The default value is NVELIBB.
*ELSE
 written. The default value is NVELIB.
*IFEND
.HELP,MAP
 The MAP parameter specifies the file to which the link map is written.
 The default value is LINKMAP.
.HELP,UN
 The UN parameter specifies a permanent file ID on NOS/BE systems. This
 parameter must not be specified on NOS.
.ENDHELP
.IF,SYS.EQ.NOSB,CHECKUN.
  .IF,$UN$.EQ.$$,BADUN.
    NOTE(OUTPUT); THE #UN PARAMETER MUST BE SPECIFIED.
    REVERT,ABORT.
  .ENDIF,BADUN.
.ELSE,CHECKUN.
  .IF,$UN$.NE.$$,BADUN2.
    REVERT,ABORT. THE #UN PARAMETER MUST NOT BE SPECIFIED
  .ENDIF,BADUN2.
.ENDIF,CHECKUN.
.IFE(FILE(B,.NOT.AS),GETB)
  GETFILE(B,B,UN,READ,YES)
  SKIP(BINOK)
    EXIT.
    REVERT(ABORT) LINK FAILED - NO FILE B
  ENDIF(BINOK)
.ENDIF(GETB)
.IF,SYS.EQ.NOS,NOSSYS.
  $GTR(B,YYYYREL)REL/*
  $UNLOAD(B)
  $LIBEDIT(P=0,N=B,I=0,#B=YYYYREL,#L=0,U=B,NX=1)
  $UNLOAD(YYYYREL)
.ENDIF,NOSSYS.
.IFE(FILE(CYBCLIB,.NOT.AS),GETCYBCLIB)
  GETFILE(CYBCLIB,CYBCLIB,UN,READ)
  IFE(FILE(CYBCLIB,.NOT.AS),NOLIB)
    UNLOAD(B)
    REVERT(ABORT) LINK FAILED NO CYBCLIB
  ENDIF(NOLIB)
.ENDIF(GETCYBCLIB)
.IFE((($M$.EQ.$EXTRACT$).OR.($M$.EQ.$*$)),EXTRACT)
  NOTE(OUTPUT,NR)+ LINKING EXTRACT
  .IFE,SYS.EQ.NOS,NOSEXT.
    $LDSET(#MAP=SBEX/MAP,LIB=B/CYBCLIB,PRESET=ZERO)
  .ELSE,NOSEXT.
    LDSET(#MAP=SBEX/MAP,LIB=CYBCLIB,PRESET=ZERO)
  .ENDIF,NOSEXT
  SLOAD(B,EXTRACT,MEXTRAC)
  NOGO(YYYYABS,EXTRACT,$RFL=$,$SDM=$)
  REPLIB(YYYYABS,L,,UN)
  SKIP(EXTRACTOK)
    EXIT.
    UNLOAD(CYBCLIB,B,L)
    REVERT(ABORT) LINK FAILED B --> L SEE MAP
  ENDIF(EXTRACTOK)
.ENDIF(EXTRACT)
.IFE(FILE(B,.NOT.AS),RETB)
  UNLOAD(B)
.ENDIF(RETB)
.IFE(FILE(CYBCLIB,.NOT.AS),RETCYBCLIB)
  UNLOAD(CYBCLIB)
.ENDIF(RETCYBCLIB)
.IFE($M$.EQ.$*$,LINKALL)
  REVERT. LINKED UTILITIES --> L
.ELSE(LINKALL)
  REVERT. LINKED M --> L
.ENDIF(LINKALL)
/EOR
