ECC-875: bufr_copy -g not implemented

This commit is contained in:
Shahram Najm 2019-01-24 17:30:19 +00:00
parent 0e50ae329c
commit 0d47729d29
3 changed files with 88 additions and 3 deletions

View File

@ -782,7 +782,9 @@ static grib_handle* grib_handle_new_from_file_multi ( grib_context* c, FILE* f,i
gl->gts_header_len=gtslen;
grib_context_free ( c,save_gts_header );
gtslen=0;
} else gl->gts_header=NULL;
} else {
gl->gts_header=NULL;
}
return gl;
}
@ -934,11 +936,16 @@ grib_handle* bufr_new_from_file( grib_context* c, FILE* f,int *error )
void *data = NULL;
size_t olen = 0;
grib_handle *gl = NULL;
off_t offset=0;
off_t gts_header_offset=0;
off_t offset=0, end_msg_offset=0;
char *gts_header=0,*save_gts_header=0;
int gtslen=0;
if ( c == NULL ) c = grib_context_get_default();
gts_header_offset=grib_context_tell( c,f);
data = wmo_read_bufr_from_file_malloc ( f, 0,&olen,&offset,error );
end_msg_offset=grib_context_tell ( c,f );
if ( *error != GRIB_SUCCESS )
{
@ -948,6 +955,26 @@ grib_handle* bufr_new_from_file( grib_context* c, FILE* f,int *error )
return NULL;
}
if ( c->gts_header_on )
{
int g=0;
grib_context_seek ( c,gts_header_offset,SEEK_SET,f );
gtslen=offset-gts_header_offset;
gts_header=(char*)grib_context_malloc ( c,sizeof ( unsigned char ) *gtslen );
save_gts_header=gts_header;
grib_context_read ( c,gts_header,gtslen,f );
g=gtslen;
while ( gts_header!=NULL && g != 0 && *gts_header != '\03' )
{
/*printf("--------%d %X \n",gtslen,*gts_header);*/
gts_header++;
g--;
}
if ( g>8 ) {gts_header++;gtslen=g-1;}
else gts_header=save_gts_header;
grib_context_seek ( c,end_msg_offset,SEEK_SET,f );
}
gl = grib_handle_new_from_message ( c, data, olen );
if ( !gl )
@ -965,6 +992,17 @@ grib_handle* bufr_new_from_file( grib_context* c, FILE* f,int *error )
grib_context_increment_handle_total_count(c);
if (gl->offset == 0) grib_context_set_handle_file_count(c,1);
if ( c->gts_header_on && gtslen >=8 )
{
gl->gts_header=(char*)grib_context_malloc ( c,sizeof ( unsigned char ) *gtslen );
memcpy ( gl->gts_header,gts_header,gtslen );
gl->gts_header_len=gtslen;
grib_context_free ( c,save_gts_header );
gtslen=0;
} else {
gl->gts_header=NULL;
}
return gl;
}
@ -1018,8 +1056,10 @@ static grib_handle* grib_handle_new_from_file_no_multi ( grib_context* c,FILE* f
int gtslen=0;
if ( c == NULL ) c = grib_context_get_default();
gts_header_offset=grib_context_tell( c,f);
data = wmo_read_grib_from_file_malloc ( f, headers_only,&olen,&offset,error );
end_msg_offset=offset+olen;
end_msg_offset=grib_context_tell ( c,f );
if ( *error != GRIB_SUCCESS )
{
@ -1076,6 +1116,8 @@ static grib_handle* grib_handle_new_from_file_no_multi ( grib_context* c,FILE* f
gl->gts_header_len=gtslen;
grib_context_free ( c,save_gts_header );
gtslen=0;
} else {
gl->gts_header=NULL;
}
return gl;

View File

@ -93,6 +93,7 @@ list( APPEND tests_data_reqd
bufr_ecc-393
bufr_ecc-433
bufr_ecc-750
bufr_ecc-875
grib_ecc-490
grib_ecc-756
grib_ecc-873

42
tests/bufr_ecc-875.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/sh
# Copyright 2005-2018 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#
. ./include.sh
# ---------------------------------------------------------
# This is the test for the JIRA issue ECC-875
# bufr_copy with -g option to copy the GTS header
# ---------------------------------------------------------
label="bufr_ecc-875-test"
tempOut=temp.${label}.out
tempRef=temp.${label}.ref
tempBufr=temp.${label}.bufr
# Case 1:
# --------------------------------
input=${data_dir}/gts/EGRR20150317121020_00493212.DAT
${tools_dir}/bufr_copy -g -w numberOfSubsets=9 $input $tempBufr
${tools_dir}/gts_ls $tempBufr | sed 1d | head -n -3 > $tempOut
cat > $tempRef <<EOF
TT AA II CCCC YY GG gg BBB identifier
IU SZ 41 KWBC 17 12 10 NNN GTS
IU SZ 42 KWBC 17 12 10 NNN GTS
IU SV 41 KWBC 17 12 10 NNN GTS
IU SV 42 KWBC 17 12 10 NNN GTS
IU KN 80 KWBC 17 12 09 NNN GTS
IU KN 50 KWBC 17 12 00 RRA GTS
IU KN 50 KWBC 17 12 00 RRB GTS
EOF
diff $tempRef $tempOut
# Clean up
rm -f $tempOut $tempRef $tempBufr