SUBROUTINE BLOCKS(MBAY,MWRD)

C$$$  SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM: BLOCKS
C   PRGMMR: WOOLLEN          ORG: NP20       DATE: 2012-09-15
C
C ABSTRACT: BLOCKS WILL ADD IEEE FORTRAN TYPE RECORD CONTROL
C           WORDS TO A PURE BUFR RECORD PASSED FROM MSGWRT, IN
C           PREPARATION FOR OUTPUTING THE RECORD TO DISK.  THE
C           DEFAULT OUTPUT TYPE IS PURE (NO CONTROL WORDS), IN
C           WHICH CASE THIS ROUTINE DOES NOTHING.  AN APPLICATION
C           CAN SPECIFY THAT EITHER BIG OR LITTLE ENDIAN RECORD
C           CONTROL WORDS ARE TO BE APPENDED TO PURE BUFR RECORDS
C           VIA A PREVIOUS CALL TO SUBROUTINE SETBLOCK.
C
C THE FOLLOWING DIAGRAM ILLUSTRATES IEEE CONTROL WORDS FOUND
C IN AN UNFORMATTED FORTRAN RECORD CONRTAINING FOUR 4-BYTE WORDS
C
C     ctw1-wrd1-wrd2-wrd3-wrd4-ctw2
C     |    |    |    |    |    |
C     0016-aaaa-bbbb-cccc-dddd-0016
C
C CTW1 AND CTW2 CONTAIN A BYTE COUNT FOR THE DATA RECORD THAT 
C THEY ENCLOSE. THEY CAN BE STORED IN EITHER BIG OR LITTLE
C ENDIAN BYTE ORDERING (NOTE: CTWS ARE ALWAYS 4-BYTE WORDS)
C
C PROGRAM HISTORY LOG:
C 2012-09-15  J. WOOLLEN -- ORIGINAL AUTHOR
C
C USAGE:    CALL BLOCKS(MBAY,MWRD)
C   INPUT ARGUMENTS:
c     MBAY - INTEGER ARRAY CONTAINING PURE BUFR MESSAGE
c     MWRD - INTEGER WORD COUNT FOR MBAY
C
C   OUTPUT ARGUMENTS:
c     MBAY - INTEGER ARRAY CONTAINING INPUT BUFR MESSAGE, POSSIBLY
c            WITH CONTROL WORDS ADDED DEPENDING ON WHETHER SUBROUTINE
c            SETBLOCK WAS PREVIOUSLY CALLED
c     MWRD - INTEGER WORD COUNT FOR MBAY
C
C REMARKS:
C    THIS ROUTINE CALLS:   None 
C
C    THIS ROUTINE IS CALLED BY:  MSGWRT 
C
C ATTRIBUTES:
C   LANGUAGE: FORTRAN 77
C   MACHINE:  PORTABLE TO ALL PLATFORMS
C
C$$$

      COMMON /HRDWRD/ NBYTW,NBITW,IORD(8)
      COMMON /ENDORD/ IBLOCK,IORDBE(4),IORDLE(4)

      INTEGER*4 MBAY(MWRD),IINT,JINT

      CHARACTER*1 CINT(4),DINT(4)
      EQUIVALENCE(CINT,IINT)
      EQUIVALENCE(DINT,JINT)

      DATA IFIRST/0/
      SAVE IFIRST

c----------------------------------------------------------------------
c----------------------------------------------------------------------

      if(iblock.eq.0) return

      if(ifirst.eq.0) then

c        Initialize some arrays for later use.  Note that Fortran
c        record control words are always 4 bytes.

         iint=0; cint(1)=char(1)
         do i=1,4 
         if(cint(1).eq.char(01)) then 
            iordbe(i)=4-i+1
            iordle(i)=i 
         else
            iordle(i)=4-i+1
            iordbe(i)=i 
         endif
         enddo
         ifirst=1
      endif

c  make room in mbay for control words - one at each end of the record
c  -------------------------------------------------------------------

      if(nbytw.eq.8) mwrd=mwrd*2

      do m=mwrd,1,-1
      mbay(m+1) = mbay(m)  
      enddo

c  store the endianized control word in bytes in dint/jint
c  -------------------------------------------------------

      iint=mwrd*4        

      do i=1,4         
      if(iblock.eq.+1) dint(i)=cint(iordbe(i))
      if(iblock.eq.-1) dint(i)=cint(iordle(i))
      enddo

c  increment mrwd and install the control words in their proper places
c  -------------------------------------------------------------------

      mwrd = mwrd+2
      mbay(1) = jint
      mbay(mwrd) = jint

      if(nbytw.eq.8) mwrd=mwrd/2

      return
      end