/*$$$  SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM:    RBYTES
C   PRGMMR: ATOR             ORG: NP12       DATE: 2005-11-29
C
C ABSTRACT:  THIS FUNCTION READS A SPECIFIED NUMBER OF BYTES FROM
C   THE SYSTEM FILE MOST RECENTLY OPENED FOR READING/INPUT VIA
C   BUFR ARCHIVE LIBRARY ROUTINE COBFL.
C
C PROGRAM HISTORY LOG:
C 2005-11-29  J. ATOR    -- ORIGINAL AUTHOR
C
C USAGE:    RBYTES( BMG, MXMB, ISLOC, NEWBYTES )
C   INPUT ARGUMENT LIST:
C     MXMB     - INTEGER: DIMENSIONED SIZE (IN BYTES) OF BMG; USED
C                BY THE FUNCTION TO ENSURE THAT IT DOES NOT OVERFLOW
C                THE BMG ARRAY
C     ISLOC    - INTEGER: STARTING BYTE NUMBER WITHIN BMG INTO
C                WHICH TO READ THE NEXT NEWBYTES BYTES
C     NEWBYTES - INTEGER: NUMBER OF BYTES TO READ FROM THE SYSTEM
C                FILE MOST RECENTLY OPENED FOR READING/INPUT VIA
C                BUFR ARCHIVE LIBRARY ROUTINE COBFL
C
C   OUTPUT ARGUMENT LIST:
C     BMG      - CHARACTER*1: ARRAY CONTAINING THE NEWBYTES BYTES
C                THAT WERE READ, BEGINNING AT BYTE NUMBER ISLOC
C     RBYTES   - INTEGER: RETURN CODE:
C                  0 = normal return
C                  1 = overflow of BMG array
C                 -1 = end-of-file encountered while reading
C                 -2 = I/O error encountered while reading
C
C REMARKS:
C    THIS ROUTINE CALLS:        None
C    THIS ROUTINE IS CALLED BY: CRBMG
C                               Normally not called by any application
C                               programs.
C
C ATTRIBUTES:
C   LANGUAGE: C
C   MACHINE:  PORTABLE TO ALL PLATFORMS
C
C$$$*/

#include "bufrlib.h"

f77int rbytes( char *bmg, f77int *mxmb, f77int isloc, f77int newbytes )
{
    short iret;

    if ( ( isloc + newbytes ) > *mxmb ) {
	iret = 1;
    }
    else if ( fread( &bmg[isloc], 1, newbytes, pbf[0] ) != newbytes ) {
	iret = ( feof(pbf[0]) ? -1 : -2 );
    }
    else {
	iret = 0;
    }

    return (f77int) iret;
}