<HTML> <BODY BGCOLOR=#ccccdd LINK=#0000aa VLINK=#0000ff ALINK=#ff0000 ><BASE TARGET="bottom_target"><PRE>
<A NAME='BLOCKS'><A href='../../html_code/bufr/blocks.f.html#BLOCKS' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>
SUBROUTINE BLOCKS(MBAY,MWRD) 2,1
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