/*
c
c ##################################################################
c ##################################################################
c ###### ######
c ###### GRIBIO (C Functions) ######
c ###### ######
c ###### Developed by ######
c ###### Center for Analysis and Prediction of Storms ######
c ###### University of Oklahoma ######
c ###### ######
c ##################################################################
c ##################################################################
c
c#######################################################################
c
c PURPOSE:
c
c C programs will be called by Fortran program, GRIBREAD and
c GRIBDUMP.
c
c#######################################################################
c
c AUTHOR: Yuhe Liu
c 11/01/1995
c
c MODIFICATION HISTORY:
c 08/23/2004 Add GSIZE function. Kevin W. Thomas
C
c#######################################################################
c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/file.h>
#ifdef CRAY
#include <fortran.h>
#elif UNDERSCORE
#define GSIZE gsize_
#define GOPEN gopen_
#define GREAD gread_
#define GWRITE gwrite_
#define GSEEK gseek_
#define GCLOSE gclose_
#else
#define GSIZE gsize
#define GOPEN gopen
#define GREAD gread
#define GWRITE gwrite
#define GSEEK gseek
#define GCLOSE gclose
#endif
/*
c
c ##################################################################
c ##################################################################
c ###### ######
c ###### SUBROUTINE GSIZE ######
c ###### ######
c ###### Developed by ######
c ###### Center for Analysis and Prediction of Storms ######
c ###### University of Oklahoma ######
c ###### ######
c ##################################################################
c ##################################################################
c
*/
void GSIZE( int *size )
/*
c
c#######################################################################
c
c PURPOSE:
c
c Return the size of STDIO file pointer. This will allow the caller
c to allocate enough space for the "grbunit" variable used by the
c GOPEN and other routines.
c
c#######################################################################
c
c AUTHOR: Kevin W. Thomas
c 08/23/2004
c
c MODIFICATION HISTORY:
C
c#######################################################################
c
c ARGUMENTS:
c
c size Size of the stdio FILE structure.
c
c#######################################################################
c
*/
{
*size = sizeof( FILE );
return;
}
/*
c
c ##################################################################
c ##################################################################
c ###### ######
c ###### SUBROUTINE GOPEN ######
c ###### ######
c ###### Developed by ######
c ###### Center for Analysis and Prediction of Storms ######
c ###### University of Oklahoma ######
c ###### ######
c ##################################################################
c ##################################################################
c
*/
void GOPEN( FILE **funit, char *fname, int *len, char *modes, int *ireturn )
/*
c
c#######################################################################
c
c PURPOSE:
c
c Open GRIB file.
c
c#######################################################################
c
c AUTHOR: Yuhe Liu
c 11/01/1995
c
c MODIFICATION HISTORY:
C
c#######################################################################
c
c ARGUMENTS:
c
c funit I/O unit of GRIB file opened by gopen
c fname File name being opened
c modes Open modes
c ireturn Return flag
c = 0, no error
c = -1, error: invalid open mode
c = -2, error: can't open the file
c
c#######################################################################
c
*/
{
char mflag[4];
int lennam = *len;
int lenmod = strlen( modes );
*funit = NULL;
*ireturn = 0;
if ( lennam )
while( fname[--lennam] == ' ' );
fname[++lennam] = '\0';
/* if ( lenmod )
* while( modes[--lenmod] == ' ' );
* modes[++lenmod] = '\0'; */
mflag[0] = '\0';
while( *modes && ( strlen(mflag) < 3 ) )
{
switch( *modes )
{
case 'a':
case 'A':
strcat( mflag, "a" );
break;
case 'r':
case 'R':
strcat( mflag, "r" );
break;
case 'w':
case 'W':
strcat( mflag, "w" );
break;
case '+':
strcat( mflag, "+" );
break;
}
modes++;
}
if ( !strcmp( mflag, "r" ) && !strcmp( mflag, "w" ) )
strcpy( mflag, "r+w" );
*funit = fopen( fname, mflag );
if ( *funit == NULL ) {
perror( fname );
*ireturn = -2;
return;
}
return;
}
/*
c
c ##################################################################
c ##################################################################
c ###### ######
c ###### SUBROUTINE GREAD ######
c ###### ######
c ###### Developed by ######
c ###### Center for Analysis and Prediction of Storms ######
c ###### University of Oklahoma ######
c ###### ######
c ##################################################################
c ##################################################################
c
*/
void GREAD( FILE **funit, void *message, int *nbytes, int *ireturn )
/*
c
c#######################################################################
c
c PURPOSE:
c
c Read a block of bytes, nbytes, starting from the current position
c in GRIB file.
c
c#######################################################################
c
c AUTHOR: Yuhe Liu
c 11/01/1995
c
c MODIFICATION HISTORY:
C
c#######################################################################
c
c ARGUMENTS:
c
c funit I/O unit of GRIB file opened by gopen
c message Buffer of the message read in by this subroutine.
c nbytes Number of bytes of the message
c ireturn Return flag
c = 0, no error
c = -1, read error occurs
c
c#######################################################################
c
*/
{
int iret;
*ireturn = 0;
iret = fread( message, 1, *nbytes, *funit );
if ( iret != *nbytes ) {
*ireturn = -1;
perror( "gread" );
return;
}
else *ireturn = iret;
return;
}
/*
c
c ##################################################################
c ##################################################################
c ###### ######
c ###### SUBROUTINE GWRITE ######
c ###### ######
c ###### Developed by ######
c ###### Center for Analysis and Prediction of Storms ######
c ###### University of Oklahoma ######
c ###### ######
c ##################################################################
c ##################################################################
c
*/
void GWRITE( FILE **funit, void *message, int *nbytes, int *ireturn )
/*
c
c#######################################################################
c
c PURPOSE:
c
c Write a block of bytes, nbytes, beginning at the position at
c nbstrt into GRIB file.
c
c#######################################################################
c
c AUTHOR: Yuhe Liu
c 11/01/1995
c
c MODIFICATION HISTORY:
C
c#######################################################################
c
c ARGUMENTS:
c
c funit I/O unit of GRIB file opened by gopen
c message Buffer of the message write in by this subroutine.
c nbytes Number of bytes of the message
c ireturn Return flag
c = 0, no error
c = -1, write error occurs
c
c#######################################################################
c
*/
{
int iret;
*ireturn = 0;
iret = fwrite( message, 1, *nbytes, *funit );
if ( iret != *nbytes ) {
*ireturn = -1;
perror( "gwrite" );
return;
}
else
*ireturn = iret;
return;
}
/*
c
c ##################################################################
c ##################################################################
c ###### ######
c ###### SUBROUTINE GSEEK ######
c ###### ######
c ###### Developed by ######
c ###### Center for Analysis and Prediction of Storms ######
c ###### University of Oklahoma ######
c ###### ######
c ##################################################################
c ##################################################################
c
*/
void GSEEK( FILE **funit, int *offset, int *whence, int *ireturn )
/*
c
c#######################################################################
c
c PURPOSE:
c
c Seek the position of the GRIB file pointer at offset
c
c#######################################################################
c
c AUTHOR: Yuhe Liu
c 11/01/1995
c
c MODIFICATION HISTORY:
C
c#######################################################################
c
c ARGUMENTS:
c
c funit I/O unit of GRIB file opened by gopen
c offset The number of offset bytes to be set to GRIB file
c whence Flag to set the offset
c = 0, pointer set to offset
c = 1, pointer set to current location plus offset
c = 2, pointer set to the size of the file
c ireturn Return flag
c = 0, no error
c = -1, error: Invalid seek operation
c = -2, error in fseek
c
c#######################################################################
c
*/
{
int iret;
*ireturn = 0;
if ( *whence < 0 || *whence > 2 ) {
perror( "Invalid seek operation in gseek" );
*ireturn = -1;
return;
}
else if ( *whence < 2 )
iret = fseek( *funit, *offset, *whence );
else {
iret = fseek( *funit, 0, 2 );
*offset = ftell( *funit );
}
if ( iret != 0 ) {
perror( "fseek" );
*ireturn = -2;
return;
}
else *ireturn = iret;
return;
}
/*
c
c ##################################################################
c ##################################################################
c ###### ######
c ###### SUBROUTINE GCLOSE ######
c ###### ######
c ###### Developed by ######
c ###### Center for Analysis and Prediction of Storms ######
c ###### University of Oklahoma ######
c ###### ######
c ##################################################################
c ##################################################################
c
*/
void GCLOSE( FILE **funit, int *ireturn )
/*
c
c#######################################################################
c
c PURPOSE:
c
c Close GRIB file.
c
c#######################################################################
c
c AUTHOR: Yuhe Liu
c 11/01/1995
c
c MODIFICATION HISTORY:
C
c#######################################################################
c
c ARGUMENTS:
c
c funit I/O unit of GRIB file opened by gopen
c ireturn Return flag
c = 0, no error
c = -1, error in file close
c
c#######################################################################
c
*/
{
*ireturn = fclose( *funit );
}