@@ -889,6 +889,9 @@ static int ecc_read_any(reader* r, int no_alloc, int grib_ok, int bufr_ok, int h
889889 case BUFR:
890890 if (bufr_ok) {
891891 err = read_BUFR (r, no_alloc);
892+ if (r->offset == -5 ) {
893+ r->offset = offset - 4 ;
894+ }
892895 return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
893896 }
894897 break ;
@@ -910,18 +913,27 @@ static int ecc_read_any(reader* r, int no_alloc, int grib_ok, int bufr_ok, int h
910913 case BUDG:
911914 if (grib_ok) {
912915 err = read_PSEUDO (r, " BUDG" , no_alloc);
916+ if (r->offset == -5 ) {
917+ r->offset = offset - 4 ;
918+ }
913919 return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
914920 }
915921 break ;
916922 case DIAG:
917923 if (grib_ok) {
918924 err = read_PSEUDO (r, " DIAG" , no_alloc);
925+ if (r->offset == -5 ) {
926+ r->offset = offset - 4 ;
927+ }
919928 return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
920929 }
921930 break ;
922931 case TIDE:
923932 if (grib_ok) {
924933 err = read_PSEUDO (r, " TIDE" , no_alloc);
934+ if (r->offset == -5 ) {
935+ r->offset = offset - 4 ;
936+ }
925937 return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
926938 }
927939 break ;
@@ -964,8 +976,10 @@ static int read_any_gts(reader* r)
964976 size_t message_size = 0 ;
965977 size_t already_read = 0 ;
966978 int i = 0 ;
979+ off_t offset = r->offset ;
967980
968981 while (r->read (r->read_data , &c, 1 , &err) == 1 && err == 0 ) {
982+ offset++;
969983 magic <<= 8 ;
970984 magic |= c;
971985 magic &= 0xffffffff ;
@@ -976,7 +990,8 @@ static int read_any_gts(reader* r)
976990 tmp[i++] = 0x0d ;
977991 tmp[i++] = 0x0a ;
978992
979- r->offset = r->tell (r->read_data ) - 4 ;
993+ off_t rTell = r->tell (r->read_data );
994+ r->offset = (rTell != -1 ? rTell : offset) - 4 ;
980995
981996 if (r->read (r->read_data , &tmp[i], 6 , &err) != 6 || err)
982997 return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
@@ -1023,8 +1038,10 @@ static int read_any_taf(reader* r)
10231038 size_t message_size = 0 ;
10241039 size_t already_read = 0 ;
10251040 int i = 0 ;
1041+ off_t offset = r->offset ;
10261042
10271043 while (r->read (r->read_data , &c, 1 , &err) == 1 && err == 0 ) {
1044+ offset++;
10281045 magic <<= 8 ;
10291046 magic |= c;
10301047 magic &= 0xffffffff ;
@@ -1035,7 +1052,8 @@ static int read_any_taf(reader* r)
10351052 tmp[i++] = 0x46 ; // F
10361053 tmp[i++] = 0x20 ; // space
10371054
1038- r->offset = r->tell (r->read_data ) - 4 ;
1055+ off_t rTell = r->tell (r->read_data );
1056+ r->offset = (rTell != -1 ? rTell : offset) - 4 ;
10391057
10401058 already_read = 4 ;
10411059 message_size = already_read;
@@ -1071,8 +1089,10 @@ static int read_any_metar(reader* r)
10711089 size_t message_size = 0 ;
10721090 size_t already_read = 0 ;
10731091 int i = 0 ;
1092+ off_t offset = r->offset ;
10741093
10751094 while (r->read (r->read_data , &c, 1 , &err) == 1 && err == 0 ) {
1095+ offset++;
10761096 magic <<= 8 ;
10771097 magic |= c;
10781098 magic &= 0xffffffff ;
@@ -1087,9 +1107,10 @@ static int read_any_metar(reader* r)
10871107 tmp[i++] = 0x41 ; // A
10881108 tmp[i++] = ' R' ;
10891109
1090- r->offset = r->tell (r->read_data ) - 4 ;
1091-
10921110 already_read = 5 ;
1111+ off_t rTell = r->tell (r->read_data );
1112+ r->offset = (rTell != -1 ? rTell : offset) - already_read;
1113+
10931114 message_size = already_read;
10941115 while (r->read (r->read_data , &c, 1 , &err) == 1 && err == 0 ) {
10951116 message_size++;
0 commit comments