C  =====================================================================
C  pgm: SHDRIV .. Driver routine for parsing SHEF data files
C
C  use:     CALL SHDRIV(LUINP,LUOUT,LUPARM,LUERR,LUCPY)
C
C   in: LUINP ...... logical unit num opened for "shefin" file - INT
C   in: LUOUT ...... logical unit num opened for "shefout" file - INT
C   in: LUPARM ..... logical unit num opened for "shefparm" file - INT
C   in: LUERR ...... logical unit num opened for shef error msgs - INT
C   in: LUCPY ...... logical unit num opened for all shef msgs - INT
C
C  rqd: SHSAVU,SHDCOD,SHERR,SHVERN
C
C  cmt: Note, LUERR and LUCPY can be (and usually are) the same.  Either
C  cmt:   or both can be set to -1 for no error or message line output.
C  cmt:   LUINP, LUOUT, and LUPARM must be unique between 0 and 99.
C  =====================================================================
      SUBROUTINE SHDRIV(LUINP,LUOUT,LUPARM,LUERR,LUCPY)

      EXTERNAL       SHSAVU,SHDCOD,SHERR,SHVERN

      INTEGER        LUINP,LUOUT,LUPARM,LUERR,LUCPY,KFLAG
      INTEGER        LUNI,LUNO,LUNP,LUNE,LUNC
      CHARACTER      DMYCH1*1,DMYCH8*8
      INTEGER        DMYINT
C
C    ================================= RCS keyword statements ==========
      CHARACTER*68     RCSKW1,RCSKW2
      DATA             RCSKW1,RCSKW2 /                                 '
     .$Source: /fs/hseb/ob5/rfc/ofs/src/shefpars_driv/RCS/shdriv.f,v $
     . $',                                                             '
     .$Id: shdriv.f,v 1.4 1999/07/07 14:12:16 page Exp $
     . $' /
C    ===================================================================
C

C                   Set run flag

        KFLAG = 0

C                   Make arguments local variables

        LUNI = LUINP
        LUNO = LUOUT
        LUNP = LUPARM
        LUNE = LUERR
        LUNC = LUCPY

C                   Check for validity of unit numbers

        IF (LUNI.LT.0 .OR. LUNI.GT.99) KFLAG = 1
        IF (LUNO.LT.0 .OR. LUNO.GT.99) KFLAG = 1
        IF (LUNP.LT.0 .OR. LUNP.GT.99) KFLAG = 1
        IF (LUNI.EQ.LUNO .OR. LUNI.EQ.LUNP .OR. LUNP.EQ.LUNO) KFLAG=1
        IF (LUNE.EQ.LUNI .OR. LUNC.EQ.LUNI) KFLAG = 1
        IF (LUNE.EQ.LUNO .OR. LUNC.EQ.LUNO) KFLAG = 1
        IF (LUNE.EQ.LUNP .OR. LUNC.EQ.LUNP) KFLAG = 1

C                   If unit numbers are good:
C                     a) set unit number values
C                     b) run shef decode
C                     c) output warnings/errors in error message file
C                     d) output version number in error message file

        IF (KFLAG .EQ. 0) THEN

          CALL SHSAVU('P_SHEFIN    ',LUNI)
          CALL SHSAVU('P_SHEFOUT   ',LUNO)
          CALL SHSAVU('P_SHEFPARM  ',LUNP)
          CALL SHSAVU('P_SHEFERROR ',LUNE)
          CALL SHSAVU('P_SHEFCOPY  ',LUNC)

          CALL SHDCOD()

          CALL SHERR('S',0,DMYINT,DMYCH1)
          CALL SHVERN('WRITE_VERSION',13,DMYCH8,DMYINT)

        ENDIF

      RETURN
      END