static int pack_string(grib_accessor* a, const char* val, size_t *len) { grib_accessor_g2_mars_labeling* self = (grib_accessor_g2_mars_labeling*)a; char* key=NULL; int ret=0; long lval=0; switch (self->index) { case 0: key=(char*)self->the_class; break; case 1: key=(char*)self->type; break; case 2: key=(char*)self->stream; break; default : grib_context_log(a->parent->h->context,GRIB_LOG_ERROR, "invalid first argument of g2_mars_labeling in %s",a->name); return GRIB_INTERNAL_ERROR; break; } ret=grib_set_string(a->parent->h, key,val,len); if (ret) return ret; /* failed */ ret=grib_get_long(a->parent->h, key,&lval); if (ret) return ret; /* failed */ return extra_set(a,lval); }
static int pack_double(grib_accessor* a, const double* cval, size_t *len) { char type[]="grid_second_order"; size_t size=strlen(type); grib_set_string(a->parent->h,"packingType",type,&size); return grib_set_double_array(a->parent->h,"values",cval,*len); }
static int pack_double(grib_accessor* a, const double* cval, size_t *len) { grib_accessor_data_g1simple_packing* self = (grib_accessor_data_g1simple_packing*)a; grib_accessor_class* super = *(a->cclass->super); size_t n_vals = *len; long half_byte = 0; int ret = 0; long offsetdata = 0; long offsetsection = 0; double reference_value = 0; long binary_scale_factor = 0; long bits_per_value = 0; long decimal_scale_factor = 0; double decimal = 1; size_t buflen = 0; unsigned char* buf = NULL; unsigned char* encoded = NULL; double divisor = 1; int i; long off = 0; grib_context* c=a->parent->h->context; grib_handle* h=a->parent->h; char* ieee_packing_s=NULL; char* packingType_s=NULL; char* precision_s=NULL; double units_factor=1.0; double units_bias=0.0; double* val=(double*)cval; double missingValue=9999.0; long constantFieldHalfByte=0; int err=0; if(*len != 0) { if(self->units_factor && (grib_get_double_internal(a->parent->h,self->units_factor,&units_factor)== GRIB_SUCCESS)) { grib_set_double_internal(a->parent->h,self->units_factor,1.0); } if(self->units_bias && (grib_get_double_internal(a->parent->h,self->units_bias,&units_bias)== GRIB_SUCCESS)) { grib_set_double_internal(a->parent->h,self->units_bias,0.0); } if (units_factor != 1.0) { if (units_bias != 0.0) for (i=0;i<n_vals;i++) val[i]=val[i]*units_factor+units_bias; else for (i=0;i<n_vals;i++) val[i]*=units_factor; } else if (units_bias != 0.0) for (i=0;i<n_vals;i++) val[i]+=units_bias; if (c->ieee_packing && self->ieee_packing) { long precision=c->ieee_packing==32 ? 1 : 2; size_t lenstr=strlen(self->ieee_packing); packingType_s=grib_context_strdup(c,self->packingType); ieee_packing_s=grib_context_strdup(c,self->ieee_packing); precision_s=grib_context_strdup(c,self->precision); grib_set_string(h,packingType_s,ieee_packing_s,&lenstr); grib_set_long(h,precision_s,precision); grib_context_free(c,packingType_s); grib_context_free(c,ieee_packing_s); grib_context_free(c,precision_s); return grib_set_double_array(h,"values",val,*len); } } ret = super->pack_double(a,val,len); switch (ret) { case GRIB_CONSTANT_FIELD: ret=grib_get_long(a->parent->h,"constantFieldHalfByte",&constantFieldHalfByte); if (ret) constantFieldHalfByte=0; if((ret = grib_set_long_internal(a->parent->h,self->half_byte, constantFieldHalfByte)) != GRIB_SUCCESS) return ret; grib_buffer_replace(a, NULL, 0,1,1); return GRIB_SUCCESS; break; case GRIB_NO_VALUES: ret=grib_get_long(a->parent->h,"constantFieldHalfByte",&constantFieldHalfByte); if (ret) constantFieldHalfByte=0; /* TODO move to def file */ grib_get_double(a->parent->h,"missingValue", &missingValue); if((err = grib_set_double_internal(a->parent->h,self->reference_value, missingValue)) != GRIB_SUCCESS) return err; if((ret = grib_set_long_internal(a->parent->h,self->binary_scale_factor, binary_scale_factor)) != GRIB_SUCCESS) return ret; if((ret = grib_set_long_internal(a->parent->h,self->half_byte, constantFieldHalfByte)) != GRIB_SUCCESS) return ret; grib_buffer_replace(a, NULL, 0,1,1); return GRIB_SUCCESS; break; case GRIB_INVALID_BPV: grib_context_log(a->parent->h->context,GRIB_LOG_ERROR,"unable to compute packing parameters\n"); return ret; case GRIB_SUCCESS: break; default: grib_context_log(a->parent->h->context,GRIB_LOG_FATAL,"unable to compute packing parameters\n"); return ret; } if((ret = grib_get_double_internal(a->parent->h,self->reference_value, &reference_value)) != GRIB_SUCCESS) return ret; if((ret = grib_get_long_internal(a->parent->h,self->binary_scale_factor, &binary_scale_factor)) != GRIB_SUCCESS) return ret; if((ret = grib_get_long_internal(a->parent->h,self->bits_per_value,&bits_per_value)) != GRIB_SUCCESS) return ret; if((ret = grib_get_long_internal(a->parent->h,self->decimal_scale_factor, &decimal_scale_factor)) != GRIB_SUCCESS) return ret; if((ret = grib_get_long_internal(a->parent->h,self->offsetdata,&offsetdata)) != GRIB_SUCCESS) return ret; if((ret = grib_get_long_internal(a->parent->h,self->offsetsection,&offsetsection)) != GRIB_SUCCESS) return ret; decimal = grib_power(decimal_scale_factor,10) ; divisor = grib_power(-binary_scale_factor,2); buflen = (((bits_per_value*n_vals)+7)/8)*sizeof(unsigned char); if((buflen + (offsetdata-offsetsection)) %2) { buflen++; /* a->length++; a->parent->h->buffer->ulength++; */ } half_byte = (buflen*8)-((*len)*bits_per_value); grib_context_log(a->parent->h->context,GRIB_LOG_DEBUG, "HALF byte: buflen=%d bits_per_value=%ld len=%d half_byte=%ld\n", buflen,bits_per_value,*len,half_byte); Assert(half_byte <= 0x0f); if((ret = grib_set_long_internal(a->parent->h,self->half_byte, half_byte)) != GRIB_SUCCESS) return ret; buf = (unsigned char*)grib_context_buffer_malloc_clear(a->parent->h->context,buflen); encoded = buf; grib_encode_double_array(n_vals,val,bits_per_value,reference_value,decimal,divisor,encoded,&off); grib_context_log(a->parent->h->context, GRIB_LOG_DEBUG, "grib_accessor_data_g1simple_packing : pack_double : packing %s, %d values", a->name, n_vals); grib_buffer_replace(a, buf, buflen,1,1); grib_context_buffer_free(a->parent->h->context,buf); return GRIB_SUCCESS; }
int codes_set_string(grib_handle* h, const char* key , const char* mesg, size_t *length) { return grib_set_string(h,key,mesg,length); }
int main(int argc, char* argv[]) { int i; grib_handle *h=NULL; grib_handle *hso=NULL; grib_context* c=NULL; FILE* fin=NULL; FILE* fout=NULL; char* finname; char* ofilename; char defofilename[]="so_perf.out"; double *values=NULL; double gvalues[1000000]={0,}; double sovalues[1000000]={0,}; int append=0; size_t nvalues=0; int count,e=0; int repeatso=1; int repeatsimple=1; grib_timer *tes,*tds,*teso,*tdso; char grid_simple[]="grid_simple"; size_t grid_simple_l=strlen(grid_simple); char packingType[50]={0,}; size_t len=50; char param[50]={0,}; char gridType[50]={0,}; char outfilename[255]={0,}; size_t filesize_so=0; size_t filesize_simple=0; double perc=0; long bitsPerValue=0; int iarg=1; char grid[20]={0,}; char shortName[20]={0,}; long level; char levelType[20]={0,}; char buffer[BUFF_SIZE]={0,}; char buf[BUFF_SIZE]={0,}; size_t length; int sec4len; flong ksec0[ISECTION_0]; flong ksec1[ISECTION_1]; flong ksec2[ISECTION_2]; flong ksec3[ISECTION_3]; flong ksec4[ISECTION_4]; flong miss=0; const void *msg; flong gribex_msg_len=0; double packingError=0; double rsec2[RSECTION_2]; double rsec3[RSECTION_3]; tes=grib_get_timer(0,"encoding simple", 0, 0); tds=grib_get_timer(0,"decoding simple", 0, 0); teso=grib_get_timer(0,"encoding so", 0, 0); tdso=grib_get_timer(0,"decoding so", 0, 0); if (argc != 4 && argc != 6 ) usage(argv[0]); if (!strcmp(argv[iarg],"-w")) { append=0; iarg++; ofilename=argv[iarg]; iarg++; } else if (!strcmp(argv[iarg],"-a")) { append=1; iarg++; ofilename=argv[iarg]; iarg++; } else { append=0; ofilename=defofilename; } finname=argv[iarg++]; repeatsimple=atoi(argv[iarg++]); bitsPerValue=atoi(argv[iarg++]); fin = fopen(finname,"r"); if(!fin) {perror(finname);exit(1);} c=grib_context_get_default(); length=BUFF_SIZE; GRIB_CHECK(grib_read_any_from_file(c,fin,buffer,&length),0); fclose(fin); if (append) fout = fopen(ofilename,"a"); else fout = fopen(ofilename,"w"); if(!fout) {perror(ofilename);exit(1);} c=grib_context_get_default(); e=0; h=grib_handle_new_from_message_copy(c,buffer,length); GRIB_CHECK(e,0); len=50; grib_get_string(h,"shortName",param,&len); len=20; grib_get_string(h,"levelType",levelType,&len); if (!strcmp(levelType,"pl")) { GRIB_CHECK(grib_get_long(h,"level",&level),0); sprintf(shortName,"%s%ld",param,level); } else { sprintf(shortName,"%s",param); } /* grib_set_long(h,"editionNumber",2); */ GRIB_CHECK(grib_get_size(h,"values",&nvalues),0); values=(double*)grib_context_malloc_clear(c,sizeof(double)*nvalues); if (!values) { printf("%s: memory allocation error\n",argv[0]); exit(1); } len=50; grib_get_string(h,"gridType",gridType,&len); len=50; grib_get_string(h,"packingType",packingType,&len); GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); grib_set_long(h,"bitsPerValue",bitsPerValue); GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); GRIB_CHECK(grib_get_double(h,"packingError",&packingError),0); printf("--------------------------------\n"); printf("- %s - gridType=%s packingType=%s numberOfValues=%ld bitsPerValue=%ld\n", param,gridType,packingType,(long)nvalues,bitsPerValue); if (!strcmp(packingType,"spectral_complex") || !strcmp(packingType,"spectral_simple")) { printf("unable to process spectral data\n"); exit(1); } if (!strcmp(gridType,"reduced_gg") || !strcmp(gridType,"regular_gg")) { long N; grib_get_long(h,"N",&N); printf(" N=%ld\n",N); sprintf(grid,"%ld",N); } if (!strcmp(gridType,"regular_ll")) { double Di,Dj; grib_get_double(h,"DiInDegrees",&Di); grib_get_double(h,"DjInDegrees",&Dj); printf(" Di=%g Dj=%g\n",Di,Dj); sprintf(grid,"%g/%g",Di,Dj); } if (!append) fprintf(fout, "shortName gridType numberOfValues bitsPerValue grid sizeSimple sizeso encodeso encodeSimple decodeso decodeSimple\n"); sec4len=nvalues+100000; /* decode values grid_simple */ if (strcmp(packingType,grid_simple)) grib_set_string(h,"packingType",grid_simple,&grid_simple_l); grib_timer_start(tds); for (count=0;count<repeatsimple;count++) GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); grib_timer_stop(tds,0); *outfilename='\0'; sprintf(outfilename,"%s_%s_%ld_%ld_simple.grib1",param,gridType,bitsPerValue,(long)nvalues); filesize_simple=grib_handle_write(h,outfilename); printf("file size simple = %ld\n",(long)filesize_simple); /* encode values grid_simple*/ grib_timer_start(tes); for (count=0;count<repeatsimple;count++) GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); grib_timer_stop(tes,0); /* decode with gribex*/ msg=(char*)buffer; gribex_msg_len=BUFF_SIZE; sec4len=nvalues+100000; gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,sec4len, (char*)msg,&gribex_msg_len,"D")); /* encode values second order with gribex*/ ksec4[1] = bitsPerValue; /* to indicate complex packing. */ ksec4[3] = 64; /* to indicate extended flags are present. */ ksec4[5] = 16; ksec4[9] = 16; ksec4[11] = 8; ksec4[12] = 4; ksec4[13] = 0; ksec4[14] = -1; gribex_msg_len=BUFF_SIZE; grib_timer_start(teso); gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,nvalues, buf,&gribex_msg_len,"K")); grib_timer_stop(teso,0); hso=grib_handle_new_from_message_copy(c,buf,gribex_msg_len); GRIB_CHECK(grib_get_double_array(h,"values",sovalues,&nvalues),0); *outfilename='\0'; sprintf(outfilename,"%s_%s_%ld_%ld_so.grib1",param,gridType,bitsPerValue,(long)nvalues); filesize_so=grib_handle_write(hso,outfilename); printf("file size so = %ld\n",(long)filesize_so); perc=(double)filesize_simple/(double)filesize_so; printf("compression ratio = %g \n",perc); printf("space savings = %g \n",(1.0-1.0/perc)*100); grib_handle_delete(h); /* decode values second order */ /* decode with gribex*/ msg=(char*)buf; gribex_msg_len=BUFF_SIZE; sec4len=nvalues+100000; grib_timer_start(tdso); gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,sec4len, (char*)msg,&gribex_msg_len,"D")); grib_timer_stop(tdso,0); for (i=0;i<nvalues;i++) { if (fabs(gvalues[i]-values[i])>packingError) { printf("++++++++ Wrong coding\n"); printf("packingError=%g gvalues[%d]=%.20e values[%d]=%.20e abs. err=%g \n",packingError,i, gvalues[i],i,values[i],gvalues[i]-values[i]); } } for (i=0;i<nvalues;i++) { if (fabs(gvalues[i]-sovalues[i])>packingError) { printf("++++++++ Wrong coding\n"); printf("packingError=%g gvalues[%d]=%.20e sovalues[%d]=%.20e abs. err=%g \n",packingError,i, gvalues[i],i,sovalues[i],gvalues[i]-sovalues[i]); } } grib_handle_delete(hso); grib_context_free(c,values); print_timer(teso,repeatso); print_timer(tdso,repeatso); print_timer(tes,repeatsimple); print_timer(tds,repeatsimple); fprintf(fout,"%s %s %ld %ld %s %ld %ld %g %g %g %g\n", shortName,gridType,(long)nvalues,bitsPerValue, grid,(long)filesize_simple,(long)filesize_so,teso->timer_/repeatso,tes->timer_/repeatsimple,tdso->timer_/repeatso,tds->timer_/repeatsimple); fclose(fout); return 0; }
int main(int argc, char* argv[]) { grib_handle *h=NULL; grib_context* c=NULL; FILE* fin=NULL; FILE* fout=NULL; char* finname; char* ofilename; char defofilename[]="ccsds_perf.out"; double *values=NULL; int append=0; size_t nvalues=0; int count,e=0; int repeatccsds=1; int repeatsimple=1; grib_timer *tes,*tds,*tej,*tdj; char grid_ccsds[]="grid_ccsds"; size_t grid_ccsds_l=strlen(grid_ccsds); char grid_simple[]="grid_simple"; size_t grid_simple_l=strlen(grid_simple); char packingType[50]={0,}; size_t len=50; char param[50]={0,}; char gridType[50]={0,}; char outfilename[255]={0,}; size_t filesize_ccsds=0; size_t filesize_simple=0; double perc=0; long bitsPerValue=0; int iarg=1; char grid[20]={0,}; char shortName[20]={0,}; long level; char levelType[20]={0,}; tes=grib_get_timer(0,"encoding simple", 0, 0); tds=grib_get_timer(0,"decoding simple", 0, 0); tej=grib_get_timer(0,"encoding ccsds", 0, 0); tdj=grib_get_timer(0,"decoding ccsds", 0, 0); if (argc != 4 && argc != 6 ) usage(argv[0]); if (!strcmp(argv[iarg],"-w")) { append=0; iarg++; ofilename=argv[iarg]; iarg++; } else if (!strcmp(argv[iarg],"-a")) { append=1; iarg++; ofilename=argv[iarg]; iarg++; } else { append=0; ofilename=defofilename; } finname=argv[iarg++]; repeatsimple=atoi(argv[iarg++]); bitsPerValue=atoi(argv[iarg++]); fin = fopen(finname,"r"); if(!fin) {perror(finname);exit(1);} if (append) fout = fopen(ofilename,"a"); else fout = fopen(ofilename,"w"); if(!fout) {perror(ofilename);exit(1);} c=grib_context_get_default(); e=0; h=grib_handle_new_from_file(c,fin,&e); fclose(fin); GRIB_CHECK(e,0); len=50; grib_get_string(h,"shortName",param,&len); len=20; grib_get_string(h,"levelType",levelType,&len); if (!strcmp(levelType,"pl")) { GRIB_CHECK(grib_get_long(h,"level",&level),0); sprintf(shortName,"%s%ld",param,level); } else { sprintf(shortName,"%s",param); } grib_set_long(h,"editionNumber",2); GRIB_CHECK(grib_get_size(h,"values",&nvalues),0); values=(double*)grib_context_malloc(c,sizeof(double)*nvalues); if (!values) { printf("%s: memory allocation error\n",argv[0]); exit(1); } len=50; grib_get_string(h,"gridType",gridType,&len); len=50; grib_get_string(h,"packingType",packingType,&len); GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); grib_set_long(h,"bitsPerValue",bitsPerValue); GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); printf("--------------------------------\n"); printf("- %s - gridType=%s packingType=%s numberOfValues=%ld bitsPerValue=%ld\n", param,gridType,packingType,(long)nvalues,bitsPerValue); if (!strcmp(packingType,"spectral_complex") || !strcmp(packingType,"spectral_simple")) { printf("unable to process spectral data\n"); exit(1); } if (!strcmp(gridType,"reduced_gg") || !strcmp(gridType,"regular_gg")) { long N; grib_get_long(h,"N",&N); printf(" N=%ld\n",N); sprintf(grid,"%ld",N); } if (!strcmp(gridType,"regular_ll")) { double Di,Dj; grib_get_double(h,"DiInDegrees",&Di); grib_get_double(h,"DjInDegrees",&Dj); printf(" Di=%g Dj=%g\n",Di,Dj); sprintf(grid,"%g/%g",Di,Dj); } if (!append) fprintf(fout, "shortName gridType numberOfValues bitsPerValue grid sizeSimple sizeccsds encodeccsds encodeSimple decodeccsds decodeSimple\n"); /* decode values grid_simple */ if (strcmp(packingType,grid_simple)) grib_set_string(h,"packingType",grid_simple,&grid_simple_l); /* printf("decoding simple\n"); */ grib_timer_start(tds); for (count=0;count<repeatsimple;count++) GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); grib_timer_stop(tds,0); /* printf("%d messages decoded\n\n",count); */ *outfilename='\0'; sprintf(outfilename,"%s_%s_%ld_simple.grib2",param,gridType,bitsPerValue); filesize_simple=grib_handle_write(h,outfilename); printf("file size simple = %ld\n",(long)filesize_simple); /* encode values grid_simple*/ /* printf("encoding simple\n"); */ grib_timer_start(tes); for (count=0;count<repeatsimple;count++) GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); grib_timer_stop(tes,0); /* printf("%d messages encoded \n\n",count); */ /* decode values grid_ccsds */ grib_set_string(h,"packingType",grid_ccsds,&grid_ccsds_l); /* printf("decoding ccsds\n"); */ grib_timer_start(tdj); for (count=0;count<repeatccsds;count++) GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); grib_timer_stop(tdj,0); /* printf("%d messages decoded\n\n",count); */ *outfilename='\0'; sprintf(outfilename,"%s_%s_%ld_ccsds.grib2",param,gridType,bitsPerValue); filesize_ccsds=grib_handle_write(h,outfilename); printf("file size ccsds = %ld\n",(long)filesize_ccsds); perc=(double)filesize_simple/(double)filesize_ccsds; printf("compression ratio = %g \n",perc); printf("space savings = %g \n",(1.0-1.0/perc)*100); /* encode values grid_ccsds*/ /* printf("encoding ccsds\n"); */ grib_timer_start(tej); for (count=0;count<repeatccsds;count++) GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); grib_timer_stop(tej,0); /* printf("%d messages encoded \n\n",count); */ grib_handle_delete(h); grib_context_free(c,values); print_timer(tej,repeatccsds); print_timer(tdj,repeatccsds); print_timer(tes,repeatsimple); print_timer(tds,repeatsimple); printf("--------------------------------\n\n"); fprintf(fout,"%s %s %ld %ld %s %ld %ld %g %g %g %g\n", shortName,gridType,(long)nvalues,bitsPerValue, grid,(long)filesize_simple,(long)filesize_ccsds,tej->timer_/repeatccsds,tes->timer_/repeatsimple,tdj->timer_/repeatccsds,tds->timer_/repeatsimple); return 0; }
static int pack_double(grib_accessor* a, const double* val, size_t *len) { grib_accessor_data_g1complex_packing* self = (grib_accessor_data_g1complex_packing*)a; int ret = GRIB_SUCCESS; long seclen=0; long sub_j= 0; long sub_k= 0; long sub_m= 0; long n= 0; long half_byte= 0; long bits_per_value =0; size_t buflen =0; grib_context* c=a->parent->h->context; grib_handle* h=a->parent->h; char* ieee_packing_s=NULL; char* packingType_s=NULL; char* precision_s=NULL; grib_accessor_class* super = *(a->cclass->super); if (*len ==0) return GRIB_NO_VALUES; if (c->ieee_packing && self->ieee_packing) { long precision=c->ieee_packing==32 ? 1 : 2; size_t lenstr=strlen(self->ieee_packing); packingType_s=grib_context_strdup(c,self->packingType); ieee_packing_s=grib_context_strdup(c,self->ieee_packing); precision_s=grib_context_strdup(c,self->precision); grib_set_string(h,packingType_s,ieee_packing_s,&lenstr); grib_set_long(h,precision_s,precision); grib_context_free(c,packingType_s); grib_context_free(c,ieee_packing_s); grib_context_free(c,precision_s); return grib_set_double_array(h,"values",val,*len); } if((ret = grib_get_long_internal(a->parent->h,self->sub_j,&sub_j)) != GRIB_SUCCESS) return ret; if((ret = grib_get_long_internal(a->parent->h,self->sub_k,&sub_k)) != GRIB_SUCCESS) return ret; if((ret = grib_get_long_internal(a->parent->h,self->sub_m,&sub_m)) != GRIB_SUCCESS) return ret; self->dirty=1; Assert ((sub_j== sub_k) && (sub_m== sub_j)); ret = super->pack_double(a,val,len); if(ret == GRIB_SUCCESS){ n = a->offset + 4*((sub_k+1)*(sub_k+2)); #if 1 /* Octet number starts from beginning of message but shouldn't */ if((ret = grib_set_long_internal(a->parent->h,self->N,n)) != GRIB_SUCCESS) return ret; #else ret = grib_get_long_internal(a->parent->h,self->offsetsection,&offsetsection); if(ret != GRIB_SUCCESS) return ret; if((ret = grib_set_long_internal(a->parent->h,self->N,n-offsetsection)) != GRIB_SUCCESS) return ret; #endif ret = grib_get_long_internal(a->parent->h,self->bits_per_value,&bits_per_value); if(ret != GRIB_SUCCESS) return ret; ret = grib_get_long_internal(a->parent->h,self->seclen,&seclen); if(ret != GRIB_SUCCESS) return ret; buflen = 32*(sub_k+1)*(sub_k+2)+(*len-(sub_k+1)*(sub_k+2))*bits_per_value+18*8; half_byte = seclen*8-buflen; if (a->parent->h->context->debug==-1) { printf("GRIB_API DEBUG: half_byte=%ld\n",half_byte); } ret = grib_set_long_internal(a->parent->h,self->half_byte, half_byte); if(ret != GRIB_SUCCESS) return ret; } return ret; }
static int pack_string(grib_accessor* a, const char* buffer, size_t *len) { grib_accessor_codetable* self = (grib_accessor_codetable*)a; grib_codetable* table ; long i; size_t size = 1; typedef int (*cmpproc)(const char*, const char*); cmpproc cmp = a->flags | GRIB_ACCESSOR_FLAG_LOWERCASE ? strcasecmp : strcmp; if(!self->table) self->table = load_table(self); table=self->table; if(!table) return GRIB_ENCODING_ERROR; if (a->set) { int err=grib_set_string(a->parent->h,a->set,buffer,len); if (err!=0) return err; } for(i = 0 ; i < table->size; i++) if(table->entries[i].abbreviation) if(cmp(table->entries[i].abbreviation,buffer) == 0) return grib_pack_long(a,&i,&size); if (a->flags & GRIB_ACCESSOR_FLAG_NO_FAIL) { grib_action* act=(grib_action*)(a->creator); if (act->default_value!=NULL) { const char* p = 0; size_t len = 1; long l; int ret=0; double d; char tmp[1024]; grib_expression* expression=grib_arguments_get_expression(a->parent->h,act->default_value,0); int type = grib_expression_native_type(a->parent->h,expression); switch(type) { case GRIB_TYPE_DOUBLE: grib_expression_evaluate_double(a->parent->h,expression,&d); grib_pack_double(a,&d,&len); break; case GRIB_TYPE_LONG: grib_expression_evaluate_long(a->parent->h,expression,&l); grib_pack_long(a,&l,&len); break; default: len = sizeof(tmp); p = grib_expression_evaluate_string(a->parent->h,expression,tmp,&len,&ret); if (ret != GRIB_SUCCESS) { grib_context_log(a->parent->h->context,GRIB_LOG_FATAL, "unable to evaluate %s as string",a->name); return ret; } len = strlen(p)+1; pack_string(a,p,&len); break; } return GRIB_SUCCESS; } } return GRIB_ENCODING_ERROR; }