/* * (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 #include #include #include "grib_api_internal.h" #include "loady.h" #include "load.h" FILE* fout; extern FILE* load_in; extern int load_parse(); extern int yylineno; static grib_handle* h = 0; static double* double_value = 0; static size_t double_value_size = 0; static size_t double_value_count = 0; static long* long_value = 0; static size_t long_value_size = 0; static size_t long_value_count = 0; static int err; const char* out_file; static void check(int code, const char* name) { if (code) { printf("%s: cannot set %s: %s\n", prog, name, grib_get_error_message(code)); err++; } } static grib_handle* handle() { if (h == 0) h = grib_handle_new_from_samples(NULL, "GRIB1"); /* grib_dump_content(h,stdout,"debug",~0,NULL); */ return h; } void load_finish() { const void* buffer; size_t size; assert(h); GRIB_CHECK(grib_get_message(h, &buffer, &size), ""); printf("%s: writing %ld bytes message\n", prog, (long)size); if (fwrite(buffer, 1, size, fout) != size) { perror(out_file); exit(1); } grib_handle_delete(h); h = NULL; } void load_missing(const char* name) { printf("grib_set_missing(%s)\n", name); check(grib_set_missing(handle(), name), name); } void load_long(const char* name, long value) { printf("grib_set_long(%s,%ld)\n", name, value); check(grib_set_long(handle(), name, value), name); } void load_string(const char* name, const char* value) { size_t s = strlen(value); printf("grib_set_string(%s,%s)\n", name, value); check(grib_set_string(handle(), name, value, &s), name); } void load_double(const char* name, double value) { printf("grib_set_double(%s,%g)\n", name, value); check(grib_set_double(handle(), name, value), name); } void load_start_array() { if (double_value == NULL) { double_value_size = 100000; double_value = malloc(double_value_size * sizeof(double)); } if (long_value == NULL) { long_value_size = 100000; long_value = malloc(long_value_size * sizeof(long)); } double_value_count = 0; long_value_count = 0; } void load_end_array(const char* name) { if (double_value_count == long_value_count) { printf("grib_set_long_array(%s,%ld)\n", name, (long)long_value_count); check(grib_set_long_array(handle(), name, long_value, long_value_count), name); } else { printf("grib_set_double_array(%s,%ld)\n", name, (long)double_value_count); check(grib_set_double_array(handle(), name, double_value, double_value_count), name); } } void load_double_value(double value) { if (double_value_count == double_value_size) { double_value_size += 100000; double_value = realloc(double_value, double_value_size * sizeof(double)); } double_value[double_value_count++] = value; } void load_long_value(long value) { if (long_value_count == long_value_size) { long_value_size += 100000; long_value = realloc(long_value, long_value_size * sizeof(long)); } long_value[long_value_count++] = value; load_double_value(value); } int load_wrap() { return 1; } int load_error(const char* msg) { printf("%s line %d\n", msg, yylineno); err = 1; return 1; } int load_file(const char* in, const char* out) { err = 0; fout = fopen(out, "w"); if (!fout) { perror(out); return 1; } load_in = fopen(in, "r"); if (!load_in) { perror(in); return 1; } load_parse(); fclose(load_in); if (fclose(fout)) { perror(out); return 1; } return err; }