init_gribhdr.c
来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· C语言 代码 · 共 290 行
C
290 行
/* File: init_gribhdr.c Alice T. Nakajima, SAIC, 10/96 funcs to make storage and free up storage for Grib header struct*/#include <stdio.h>#include "dprints.h" /* for dprints */#include "gribfuncs.h" /* prototypes *//******************************************************************************* A. FUNCTION init_gribhdr* Allocates storage for Grib Header and its entire_msg and initialize* every of its attributes.** INTERFACE:* int init_gribhdr (ppgrib_hdr, errmsg)** ARGUMENTS (I=input, O=output, I&O=input and output):* (O) GRIB_HDR **ppgrib_hdr;* Grib Header structure, Null upon entry; Returns pointing to a * newly created storage. Its attribute 'entire_msg' will point* to a block of size indicated in 'abs_size' (initially set to* DEF_MSG_LEN bytes, see grib.h). 'entire_msg' may later be * expanded by other functions if required, but 'abs_size' must* be updated to the expanded byte length.* (O) char *errmsg;* empty array, returned filled if error occurred;** RETURNS: * 0> no error; storage for grib header and its entire_msg array created* and cleared; msg_length and all section lengths are set to zero, * all section pointers are Null; abs_size is set to DEF_MSG_LEN;* 'shuffled' flag is set to zero;* 1> failed, see errmsg;*****************************************************************************/#if PROTOTYPE_NEEDEDint init_gribhdr ( GRIB_HDR **ppgrib_hdr, char *errmsg)#elseint init_gribhdr ( ppgrib_hdr, errmsg) GRIB_HDR **ppgrib_hdr; char *errmsg;#endif{/** A.0 DEFAULT to error status*/char *func= "init_gribhdr";int stat=1; DPRINT1 ("Entering %s\n", func);/*** A.1 ALLOCATE storage for struct GRIB_HDR* IF (fails) THEN* RETURN error* ELSE* CLEAR out struct GRIB_HDR* ENDIF*/ *ppgrib_hdr= (GRIB_HDR *)malloc(sizeof(GRIB_HDR)); if (*ppgrib_hdr == NULL) { DPRINT1 ("%s: failed to create storage for GRIB_HDR\n", func); sprintf (errmsg, "%s: failed to create storage for GRIB_HDR\n", func); goto BYE; } else memset ((void *)*ppgrib_hdr, '\0', sizeof(GRIB_HDR)); DPRINT2 ("Allocate storage of GRIB_HDR struct, addr=%ld (%ld bytes)\n", *ppgrib_hdr, sizeof(GRIB_HDR));/*** A.2 ALLOCATE storage for struct GRIB_HDR's Entire_Msg array* !size DEF_MSG_LEN bytes as defined in 'grib.h'* IF (fails) THEN* FREE Grib Header* RETURN error* ELSE* STORE absolute size of Entire_Msg in header's Abs_Size* CLEAR out array Entire_Msg of struct* SET status to good* ENDIF*/ (*ppgrib_hdr)->entire_msg= (void *)malloc(DEF_MSG_LEN); if ((*ppgrib_hdr)->entire_msg == NULL) { DPRINT1 ( "%s: failed to create storage for GRIB_HDR's Msg\n", func); sprintf (errmsg, "%s: failed to create storage for GRIB_HDR's Msg\n", func); free (*ppgrib_hdr); } else { (*ppgrib_hdr)->abs_size = (long)DEF_MSG_LEN; memset ((void *)(*ppgrib_hdr)->entire_msg, '\0', DEF_MSG_LEN); DPRINT2 ( "Allocate storage for GRIB_HDR->entire_msg, addr=%ld, sz= %ld bytes \n", (*ppgrib_hdr)->entire_msg, (*ppgrib_hdr)->abs_size); stat=0; }/*** A.3 RETURN status */BYE: DPRINT2 ("Leaving %s, stat=%d;\n", func,stat); return (stat);/*** END OF FUNCTION***/}/******************************************************************************* B. FUNCTION: free_gribhdr* to free up storage of Grib Header structure and all its attributes.** INTERFACE:* void free_gribhdr (ppgrib_hdr)** ARGUMENTS (I=input, O=output, I&O=input and output):* (O) GRIB_HDR **ppgrib_hdr;* Grib Header structure whose storage is released;** RETURN CODE: none;*****************************************************************************/#if PROTOTYPE_NEEDEDvoid free_gribhdr ( GRIB_HDR **ppgrib_hdr)#elsevoid free_gribhdr ( ppgrib_hdr) GRIB_HDR **ppgrib_hdr;#endif{ char *func="free_gribhdr"; DPRINT1 ("Entering %s\n", func);/*** B.1 IF (this struct is not null) {* IF (struct's entire_msg is not null)* FREE entire msg array* ENDIF* FREE struct itself* SET it to null* ENDIF*/ if (*ppgrib_hdr != NULL) { if ((*ppgrib_hdr)->entire_msg != NULL) free((*ppgrib_hdr)->entire_msg); free (*ppgrib_hdr); *ppgrib_hdr= NULL; } DPRINT1 ("Leaving %s, no return code\n", func);/*** END OF FUNCTION**/}/************************************************************************* C. FUNCTION: Expand_gribhdr* to make Grib Header structure 's entire_msg buffer larger* than its current abs_size.** INTERFACE:* int Expand_gribhdr (gh, newsize, errmsg)** ARGUMENTS (I=input, O=output, I&O=input and output):* (I&O) GRIB_HDR *gh;* Grib Header structure whose buffer is to be expanded;* (I) long newsize;* size to expand entire_msg to;* (O) char *errmsg;* empty array, returned filled if error occurred;** RETURN CODE: * 0> newsize is smaller or equal to current size and function* with return with GRIB header unchanged; OR,* successful, entire_msg now is larger & abs_size has* been updated; all of the section pointers are also * updated to point to correct location within the new* larger block.* 1> error occurred, Errmsg filled;*****************************************************************************/#if PROTOTYPE_NEEDEDint Expand_gribhdr (GRIB_HDR *gh, long newsize, char *errmsg)#elseint Expand_gribhdr (gh, newsize, errmsg)GRIB_HDR *gh;long newsize;char *errmsg;#endif{ char *func="Expand_gribhdr"; unsigned char *Buff; /* temp array */ DPRINT1 ("Entering %s\n", func);/** C.0 IF (grib hdr struct pointer or entire_msg is null) * RETURN with error* ENDIF*/ if (gh == (GRIB_HDR *)NULL || gh->entire_msg == (unsigned char *)NULL) { sprintf(errmsg,"%s: either GRIB_HDR or Entire_msg is Null\n", func); DPRINT1 ("Leaving %s, with error (NULL Grib Header)\n", func); return (1); }/** C.1 IF (new size is smaller than abs_size) THEN* PRINT warning* RETURN with no errors* ENDIF*/ if (newsize <= gh->abs_size) { fprintf(stdout, "%s: cannot expand to %ld bytes (must be bigger than abs_size= %ld)\n", func, newsize, gh->abs_size); return (0); } DPRINT2 ("Require %ld bytes and curr abs_size= %ld\n", newsize, gh->abs_size);/** C.2 ALLOCATE a new block of 'newsize' bytes* RETURN on error*/ Buff = (unsigned char *)malloc (newsize); if (Buff == NULL) { sprintf(errmsg,"%s: failed to create new array (%d bytes)\n", func, newsize); DPRINT1 ("Leaving %s, with Malloc error\n", func); return (1); } /** C.3 CLEAR new array out */ memset ((void*)Buff, '\0', newsize);/** C.4 COPY content of old buffer into new buffer*/ if (gh->msg_length > 0) { DPRINT1( "Copy %ld bytes of data from old buffer to new one\n", gh->msg_length); memcpy ((void*)Buff, (void*)gh->entire_msg, gh->msg_length); }/** C.6 UPDATE each Section that's present to point to* proper location within the new larger buffer*/ if (gh->ids_ptr !=NULL) gh->ids_ptr= Buff + (gh->ids_ptr - gh->entire_msg); if (gh->pds_ptr !=NULL) gh->pds_ptr= Buff + (gh->pds_ptr - gh->entire_msg); if (gh->gds_ptr !=NULL) gh->gds_ptr= Buff + (gh->gds_ptr - gh->entire_msg); if (gh->bms_ptr !=NULL) gh->bms_ptr= Buff + (gh->bms_ptr - gh->entire_msg); if (gh->bds_ptr !=NULL) gh->bds_ptr= Buff + (gh->bds_ptr - gh->entire_msg); if (gh->eds_ptr !=NULL) gh->eds_ptr= Buff + (gh->eds_ptr - gh->entire_msg);/** C.5 FREE the old buffer & assign the new one to GRIB_HDR*/ free ((void *) gh->entire_msg); gh->entire_msg = (unsigned char *)Buff; /** C.6 UPDATE alloc_size of GRIB_HDR*/ gh->abs_size = newsize; DPRINT1 ("expanded gh->abs_size = %ld\n", gh->abs_size); DPRINT1 ("Leaving %s, no errors\n", func); return (0);/** END OF FUNCTION*/}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?