/* * (C) Copyright 2005- 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 "grib_api_internal.h" static void usage(const char* name) { fprintf(stderr, "Usage: %s in out [bad]\n", name); exit(1); } #define SIZE 50 * 1024 * 1024 char buffer[SIZE]; int main(int argc, char** argv) { FILE *in, *out, *bad; char *cout, *cbad; size_t data_len = SIZE; long count = 0; unsigned char* data; if (argc != 3 && argc != 4) usage(argv[0]); in = fopen(argv[1], "r"); if (!in) { perror(argv[1]); exit(1); } cout = argv[2]; out = fopen(argv[2], "w"); if (!out) { perror(argv[2]); exit(1); } if (argc == 4) { cbad = argv[3]; bad = fopen(argv[3], "w"); if (!bad) { perror(argv[3]); exit(1); } } else { bad = out; cbad = cout; } for (;;) { size_t len = SIZE; long ret = wmo_read_grib_from_file(in, buffer, &len); if (ret == GRIB_END_OF_FILE && len == 0) break; printf("GRIB %ld: size: %ld code: %ld (%s)\n", ++count, (long)len, ret, grib_get_error_message(ret)); switch (ret) { case 0: if (fwrite(buffer, 1, len, out) != len) { perror(cout); exit(1); } break; case GRIB_WRONG_LENGTH: case GRIB_PREMATURE_END_OF_FILE: fseek(in, -4, SEEK_CUR); memset(buffer + len - 4, '7', 4); /* add in 7777 at end */ len = data_len = SIZE; data = (unsigned char*)&buffer[0]; ret = grib_read_any_from_memory(NULL, &data, &data_len, buffer, &len); printf(" -> GRIB %ld: size: %ld code: %ld (%s)\n", count, (long)len, ret, grib_get_error_message(ret)); if (ret == 0) { if (fwrite(buffer, 1, len, bad) != len) { perror(cbad); exit(1); } } break; } } if (fclose(in)) { perror(argv[1]); exit(1); } if (fclose(out)) { perror(argv[2]); exit(1); } if (argc == 4) { if (fclose(bad)) { perror(argv[3]); exit(1); } } return 0; }