/* * Copyright 2005-2017 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 "ecCodes_internal.h" void usage(char* prog) { printf("usage: %s infile outfile \n",prog); exit(1); } int main(int argc,char* argv[]) { FILE* infh; FILE* outfh; char* filename; char* ofilename; void* mesg=NULL; void* mesgo=NULL; size_t size=0; size_t osize=0; off_t offset=0; int write; int err=0; int error=0; int count=0; int edition=0; grib_context* c=grib_context_get_default(); if (argc !=3) usage(argv[0]); n=0; filename=argv[1]; infh=fopen(filename,"r"); if (!infh) { perror(filename); exit(1); } ofilename=argv[1]; outfh=fopen(ofilename,"w"); if (!outfh) { perror(ofilename); exit(1); } count=0; while ( (mesg=wmo_read_bufr_from_file_malloc ( infh,0, &size,&offset,&err))!=NULL ) { if (err && err!=GRIB_END_OF_FILE) { grib_context_log(c,GRIB_LOG_ERROR, "unable to decode message: %s \n",grib_get_error_message(err)); error=err; } edition=mesg[7]; write=1; switch (edition ) { case 3: omesg=grib_context_malloc_clear(c,size+4); memcpy(omesg,mesg,7); omesg[7]=4; osize=8; break; case 4: omesg=mesg; break; default : error=1; write=0; grib_context_log(c,GRIB_LOG_ERROR, "wrong edition %d, skipping message",edition); } if (write) { if(fwrite(omesg,1,osize,outfh) != osize) { perror(ofilename); exit(1); } } if (mesg) {grib_context_free(c,mesg);mesg=NULL;} if (omesg) {grib_context_free(c,omesg);omesg=NULL;} count++; } fclose(infh); fclose(outfh); return error; }