awips2/nativeLib/rary.cots.g2clib/g2_unpack7.c

170 lines
5.9 KiB
C
Raw Normal View History

2017-04-21 18:33:55 -06:00
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include "grib2.h"
g2int simunpack(unsigned char *,g2int *, g2int,g2float *);
int comunpack(unsigned char *,g2int,g2int,g2int *,g2int,g2float *);
g2int specunpack(unsigned char *,g2int *,g2int,g2int,g2int, g2int, g2float *);
#ifdef USE_PNG
g2int pngunpack(unsigned char *,g2int,g2int *,g2int, g2float *);
#endif /* USE_PNG */
#ifdef USE_JPEG2000
g2int jpcunpack(unsigned char *,g2int,g2int *,g2int, g2float *);
#endif /* USE_JPEG2000 */
g2int g2_unpack7(unsigned char *cgrib,g2int *iofst,g2int igdsnum,g2int *igdstmpl,
g2int idrsnum,g2int *idrstmpl,g2int ndpts,g2float **fld)
//$$$ SUBPROGRAM DOCUMENTATION BLOCK
// . . . .
// SUBPROGRAM: g2_unpack7
// PRGMMR: Gilbert ORG: W/NP11 DATE: 2002-10-31
//
// ABSTRACT: This subroutine unpacks Section 7 (Data Section)
// as defined in GRIB Edition 2.
//
// PROGRAM HISTORY LOG:
// 2002-10-31 Gilbert
// 2002-12-20 Gilbert - Added GDT info to arguments
// and added 5.51 processing.
// 2003-08-29 Gilbert - Added support for new templates using
// PNG and JPEG2000 algorithms/templates.
// 2004-11-29 Gilbert - JPEG2000 now allowed to use WMO Template no. 5.40
// PNG now allowed to use WMO Template no. 5.41
// 2004-12-16 Taylor - Added check on comunpack return code.
// 2008-12-23 Wesley - Initialize Number of data points unpacked
// 2014-07-29 vkorolev - Added processing Template no. 5.4
//
// USAGE: int g2_unpack7(unsigned char *cgrib,g2int *iofst,g2int igdsnum,
// g2int *igdstmpl, g2int idrsnum,
// g2int *idrstmpl, g2int ndpts,g2float **fld)
// INPUT ARGUMENTS:
// cgrib - char array containing Section 7 of the GRIB2 message
// iofst - Bit offset of the beginning of Section 7 in cgrib.
// igdsnum - Grid Definition Template Number ( see Code Table 3.0)
// ( Only used for DRS Template 5.51 )
// igdstmpl - Pointer to an integer array containing the data values for
// the specified Grid Definition
// Template ( N=igdsnum ). Each element of this integer
// array contains an entry (in the order specified) of Grid
// Definition Template 3.N
// ( Only used for DRS Template 5.51 )
// idrsnum - Data Representation Template Number ( see Code Table 5.0)
// idrstmpl - Pointer to an integer array containing the data values for
// the specified Data Representation
// Template ( N=idrsnum ). Each element of this integer
// array contains an entry (in the order specified) of Data
// Representation Template 5.N
// ndpts - Number of data points unpacked and returned.
//
// OUTPUT ARGUMENTS:
// iofst - Bit offset at the end of Section 7, returned.
// fld - Pointer to a float array containing the unpacked data field.
//
// RETURN VALUES:
// ierr - Error return code.
// 0 = no error
// 2 = Not section 7
// 4 = Unrecognized Data Representation Template
// 5 = need one of GDT 3.50 through 3.53 to decode DRT 5.51
// 6 = memory allocation error
// 7 = corrupt section 7.
//
// REMARKS: None
//
// ATTRIBUTES:
// LANGUAGE: C
// MACHINE:
//
//$$$//
{
g2int ierr,isecnum;
g2int ipos,lensec;
g2float *lfld;
g2int *ifld;
ierr=0;
*fld=0; //NULL
gbit(cgrib,&lensec,*iofst,32); // Get Length of Section
*iofst=*iofst+32;
gbit(cgrib,&isecnum,*iofst,8); // Get Section Number
*iofst=*iofst+8;
if ( isecnum != 7 ) {
ierr=2;
//fprintf(stderr,"g2_unpack7: Not Section 7 data.\n");
return(ierr);
}
ipos=(*iofst/8);
lfld=(g2float *)calloc(ndpts ? ndpts : 1,sizeof(g2float));
if (lfld == 0) {
ierr=6;
return(ierr);
}
else {
*fld=lfld;
}
if (idrsnum == 0)
simunpack(cgrib+ipos,idrstmpl,ndpts,lfld);
else if (idrsnum == 2 || idrsnum == 3) {
if (comunpack(cgrib+ipos,lensec,idrsnum,idrstmpl,ndpts,lfld) != 0) {
return 7;
}
}
else if(idrsnum == 4) {
ifld=(g2int *)calloc(ndpts ? ndpts : 1, sizeof(g2int));
if(ifld != 0){
gbits(cgrib+ipos,ifld,0,32,0,ndpts);
rdieee(ifld,*fld,ndpts);
free(ifld);
}
else {
ierr=6;
return(ierr);
}
}
else if (idrsnum == 50) { // Spectral Simple
simunpack(cgrib+ipos,idrstmpl,ndpts-1,lfld+1);
rdieee(idrstmpl+4,lfld+0,1);
}
else if (idrsnum == 51) // Spectral complex
if ( igdsnum>=50 && igdsnum <=53 )
specunpack(cgrib+ipos,idrstmpl,ndpts,igdstmpl[0],igdstmpl[2],igdstmpl[2],lfld);
else {
fprintf(stderr,"g2_unpack7: Cannot use GDT 3.%d to unpack Data Section 5.51.\n",(int)igdsnum);
ierr=5;
if ( lfld != 0 ) free(lfld);
*fld=0; //NULL
return(ierr);
}
#ifdef USE_JPEG2000
else if (idrsnum == 40 || idrsnum == 40000) {
jpcunpack(cgrib+ipos,lensec-5,idrstmpl,ndpts,lfld);
}
#endif /* USE_JPEG2000 */
#ifdef USE_PNG
else if (idrsnum == 41 || idrsnum == 40010) {
pngunpack(cgrib+ipos,lensec-5,idrstmpl,ndpts,lfld);
}
#endif /* USE_PNG */
else {
fprintf(stderr,"g2_unpack7: Data Representation Template 5.%d not yet implemented.\n",(int)idrsnum);
ierr=4;
if ( lfld != 0 ) free(lfld);
*fld=0; //NULL
return(ierr);
}
*iofst=*iofst+(8*lensec);
return(ierr); // End of Section 7 processing
}