grib_dec_heads.c

来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· C语言 代码 · 共 226 行

C
226
字号
#include <stdio.h>              /* standard I/O header file          */#include <stdlib.h>#include <string.h>#include "dprints.h"		/* for dprints & func prototype*/#include "gribfuncs.h"		/* prototypes *//* PROGRAMMER : Steve Lowe and Todd Kienitz, SAIC Monterey   DATE       : February 7, 1996                Oct. 1996 by Alice Nakajima, SAIC Monterey*********************************************************************** A.  FUNCTION:  grib_dec_heads*     decode a Gridded Binary (GRIB edition 1) format message**    INTERFACE:*      int grib_dec_heads (curr_ptr, pds, gds, bds_head, bms, ppgrib_data, errmsg)**    ARGUMENTS (I=input, O=output, I&O=input and output):*      (I)  char *curr_ptr;*           pointer to block containing GRIB message to decode;*      (O)  PDS_INPUT  *pds ;*           to be filled with decoded Product Defn Section info;*      (O)  grid_desc_sec  *gds;*           to be filled with decoded Binary Data Section info;*      (O)  BDS_HEAD_INPUT *bds_head;*           to be filled with decoded Binary Data Section info;*      (O)  BMS_INPUT *bms;*           to be filled with decoded Bitmap Section info;*      (O)  float **ppgrib_data;*           points to NULL upon entry; upon successful exit, points to newly*           malloced Float array filled with unpacked and restored data;*      (O)  char *errmsg;*           Empty array, Returned filled if error occurred;**     RETURN CODE:*        0> Success, **ppgrib_data now points to a block containing*           the unpacked & restored data (float);*        1> Fail: first 4 bytes of curr_ptr is not 'GRIB'*        2> Fail: last 4 bytes of curr_ptr is not '7777'*        3> Fail: not Grib Edition 1*        4> Fail: unknown projection type;************************************************************************/#if PROTOTYPE_NEEDEDint   grib_dec_heads (char *curr_ptr, PDS_INPUT  *pds, grid_desc_sec  *gds,        	BDS_HEAD_INPUT *bds_head, BMS_INPUT *bms,char *errmsg)#elseint grib_dec_heads (curr_ptr, pds, gds, bds_head, bms, errmsg)  char          *curr_ptr; /*input= ptr to 1st byte of GRIB message block*/  PDS_INPUT     *pds;      /* output=ptr to Internal PDS struct*/  grid_desc_sec *gds;      /* output=ptr to Internal GDS struct*/  BDS_HEAD_INPUT*bds_head; /*out=ptr to Internal BDS header struct*/  BMS_INPUT     *bms;      /*output=ptr to Internal bitmap section struct*/  char          *errmsg;   /* output= empty unless Error happens */#endif{  char *func="grib_dec_heads";  unsigned long lMessageSize;       /* message and section size */  long edition;                     /* GRIB edition number */  int flag;                         /* tests if a condition has happened */  int gds_flag;			    /* set if Gds present */  int nReturn = 0;  unsigned long skip;/*** A.0     DEBUG printing*/ DPRINT1 ("Entering %s\n", func); DPRINT5 (  "curr_ptr=%ld, pds=%ld, gds=%ld\nbds_head=%ld, bms=%ld\n",  curr_ptr, pds, gds, bds_head, bms);/*** A.1     IF (incoming pointer is not at 'GRIB') *            RETURN 1  !errmsg filled*         ENDIF*/if(strncmp(curr_ptr,"GRIB",4) != 0) {  sprintf (errmsg,"%s:  no 'GRIB' at beg. of this msg\n", func);  nReturn= (1);   /* GRIB not found */ }/*** A.2     FUNCTION gbyte   !get total message length from IDS */skip=32;gbyte(curr_ptr,&lMessageSize,&skip,24);DPRINT0 ("lMessageSize\n");/*** A.3     IF (Message does not end with '7777') *            RETURN 2  !errmsg filled*         ENDIF*/if(strncmp((curr_ptr + lMessageSize - 4),"7777",4)!=0) {  DPRINT1 ("%s:  no '7777' at end of this msg\n", func);  sprintf (errmsg,"%s:  no '7777' at end of this msg\n", func);  nReturn= 2; goto BYE;  }/*** A.4     EXTRACT the  GRIB edition out of Section 0*         IF (not GRIB edition 1)*            RETURN 3  !errmsg filled*         ENDIF*/edition = (long) curr_ptr[7];        /* get edition */pds->usEd_num = (unsigned short) edition;if(edition != 1) {  DPRINT1 ("%s:  error, not Grib Edition 1 \n", func);  sprintf (errmsg,"%s:  not Grib Edition 1 \n", func);  nReturn=(3);   goto BYE;  }/*** A.5     MOVE pointer to the Product Definition section*/curr_ptr = curr_ptr + 8;/* ** A.6     FUNCTION gribgetpds  !decode the PDS *         RETURN error code if fails  !errmsg filled*/if( nReturn= gribgetpds(curr_ptr, pds, errmsg)) {   DPRINT2 ("%s:  error=%d  in grib get pds;\n", func, nReturn);   upd_child_errmsg (func, errmsg);   goto BYE;  }/* ** A.7     MOVE pointer to the end of PDS*/curr_ptr += pds->uslength;/*** A.8     IF (GDS is present)*/gds_flag = pds->usGds_bms_id >> 7 & 1;if(gds_flag)  /* grid description section present */  {/** A.8.1      FUNCTION gribgetgds   !decode GDS*            RETURN error code if fails  !errmsg filled*/   if( nReturn=gribgetgds(curr_ptr, gds, errmsg)) {      DPRINT2 ("%s:  error=%d  in grib get GDS;\n", func, nReturn);      upd_child_errmsg (func, errmsg);      goto BYE;       }/* * A.8.2      MOVE the cursor to the next section (either BMS/BDS)*/   curr_ptr += gds->head.uslength;/* * A.8.3      SET the number of data points depending on Projection*/   switch(gds->head.usData_type)  {     case LATLON_PRJ:    	/* Lat/Lon Grid */     case GAUSS_PRJ:    	/* Gaussian Latitude/Longitude grid */     case ROT_LATLON_PRJ:   	/* Rotated Lat/Lon */     case ROT_GAUSS_PRJ:   	/* Rotated Gaussian */     case STR_LATLON_PRJ:   	/* Stretched Lat/Lon */     case STR_GAUSS_PRJ :   	/* Stretched Gaussian */     case STR_ROT_LATLON_PRJ :  /* Stretched and Rotated Lat/Lon */     case STR_ROT_GAUSS_PRJ :   /* Stretched and Rotated Gaussian */       	bds_head->ulGrid_size = gds->llg.usNi * gds->llg.usNj;       	break;     case MERC_PRJ:  		/* Mercator Grid */       	bds_head->ulGrid_size = gds->merc.cols * gds->merc.rows; 	break;     case LAMB_PRJ:  		/* Lambert Conformal */     case ALBERS_PRJ:  		/* Albers equal-area */     case OBLIQ_LAMB_PRJ: 	/* Oblique Lambert Conformal */       	bds_head->ulGrid_size = gds->lam.iNx * gds->lam.iNy; 	break;     case POLAR_PRJ:  		/* Polar Stereographic */       	bds_head->ulGrid_size = gds->pol.usNx * gds->pol.usNy; 	break;     default: /* unknown */       DPRINT2 ("%s: unknown usData_type=%d\n",func,gds->head.usData_type);       sprintf(errmsg,"%s: unknown usData_type=%d\n", 	func, gds->head.usData_type);       nReturn= (4); goto BYE;     }  }/** A.8     ENDIF (GDS is present)*//** * A.11    SET return code to 0  !no errors*/  nReturn = 0;/*** A.12    RETURN return code;*/BYE:  DPRINT2  ("Exit %s, Stat=%d\n", func, nReturn);  return(nReturn);/*** END OF FUNCTION***/} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?