INTEGER FUNCTION ICBFMS ( STR, LSTR )

C$$$  SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM:    ICBFMS
C   PRGMMR: J. ATOR          ORG: NP12       DATE: 2012-06-07
C
C ABSTRACT: THIS FUNCTION TESTS WHETHER THE INPUT CHARACTER STRING
C   IS "MISSING" BY CHECKING IF ALL OF THE EQUIVALENT BITS ARE SET TO 1.
C   IT IS SIMILAR TO BUFR ARCHIVE LIBRARY FUNCTION IBFMS, EXCEPT THAT
C   IBFMS TESTS REAL*8 VALUES FOR EQUIVALENCE TO THE PARAMETER BMISS,
C   WHEREAS ICBFMS CHECKS THAT ALL EQUIVALENT BITS ARE SET TO 1 AND IS
C   THEREFORE A MORE PORTABLE AND RELIABLE TEST FOR USE WITH CHARACTER
C   STRINGS.
C
C PROGRAM HISTORY LOG:
C 2012-06-07  J. ATOR    -- ORIGINAL AUTHOR
C
C USAGE:    ICBFMS ( STR, LSTR )
C   INPUT ARGUMENT LIST:
C     STR      - CHARACTER*(*): STRING TO BE TESTED
C     LSTR     - INTEGER: NUMBER OF CHARACTERS TO BE TESTED WITHIN STR
C
C   OUTPUT ARGUMENT LIST:
C     ICBFMS   - INTEGER: RETURN CODE:
C                0 - STR IS NOT "MISSING"
C                1 - STR IS "MISSING"
C
C REMARKS:
C    THIS ROUTINE CALLS:        IUPM
C    THIS ROUTINE IS CALLED BY: RDCMPS   RDTREE   UFDUMP
C                               Also called by application programs.
C
C ATTRIBUTES:
C   LANGUAGE: FORTRAN 77
C   MACHINE:  PORTABLE TO ALL PLATFORMS
C
C$$$

        INCLUDE 'bufrlib.prm'

	CHARACTER*(*)	STR

C-----------------------------------------------------------------------

	ICBFMS = 0

	NUMCHR = MIN(LSTR,LEN(STR))

C*	Beginning with version 10.2.0 of the BUFRLIB, "missing" strings
C*	are explicitly encoded with all bits set to 1.  However, this
C*	wasn't the case for strings encoded with earlier versions of
C*	BUFRLIB, so the following block can help identify "missing"
C*	strings encoded with these earlier versions.

	IF ( (NUMCHR.GE.4) .AND. ( STR(1:4).EQ.'B7Hv')) THEN
	    ICBFMS = 1
	    RETURN
	END IF

C*	Otherwise, the logic below will handle cases encoded using
C*	BUFRLIB version 10.2.0 or later.

	DO I=1,NUMCHR
	   IF ( IUPM(STR(I:I),8).NE.255 ) RETURN
	ENDDO

	ICBFMS = 1

	RETURN
	END