From 24e4d005f9b1f51b795a024c4a48f45f6a1eb217 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 4 Apr 2016 16:24:28 +0100 Subject: [PATCH] ECC-239: Provide missing tools: misc --- tests/CMakeLists.txt | 1 + tests/metar_get.sh | 38 ++++ tools/bufr_copy.c | 21 +- tools/gts_copy.c | 10 +- tools/taf_dump.c | 244 ++++++++++----------- tools/taf_filter.c | 143 +++++++------ tools/taf_get.c | 325 ++++++++++++++-------------- tools/taf_ls.c | 498 ++++++++++++++++++------------------------- 8 files changed, 616 insertions(+), 664 deletions(-) create mode 100755 tests/metar_get.sh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7e468a115..e704995a6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -55,6 +55,7 @@ list( APPEND tests2 gts_ls gts_compare metar_ls + metar_get metar_dump metar_compare bufr_set diff --git a/tests/metar_get.sh b/tests/metar_get.sh new file mode 100755 index 000000000..88d43bdee --- /dev/null +++ b/tests/metar_get.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Copyright 2005-2016 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 + +#Enter data dir +cd ${data_dir}/metar + +#Define a common label for all the tmp files +label="metar_get_test" + +#Create log file +fLog=${label}".log" +rm -f $fLog +touch $fLog + +#Define tmp file +fTmp=${label}".tmp.txt" +rm -f $fTmp + +#---------------------------------------------- +# Test default "ls" on all the metar data files +#---------------------------------------------- +metar_file=metar.txt +export METAR_YEAR=2015 +export METAR_MONTH=4 + +${tools_dir}metar_get -n ls $metar_file >/dev/null +${tools_dir}metar_get -w count=1/2/3 -p CCCC,latitude,longitude,dateTime,elevation,temperature,dewPointTemperature,qnh $metar_file + +rm -f $fLog diff --git a/tools/bufr_copy.c b/tools/bufr_copy.c index 06c6c86a5..d9582364c 100644 --- a/tools/bufr_copy.c +++ b/tools/bufr_copy.c @@ -34,17 +34,16 @@ grib_option grib_options[]={ "copied to the\n\t\toutput_bufr_file.\n\t\tFor each key a string (key:s), a " "double (key:d) or an integer (key:i)\n\t\ttype can be defined. Default type " "is string.\n",0,1,0}, - {"B:",0,0,0,1,0}, - {"V",0,0,0,1,0}, - {"W:",0,0,0,1,0}, - {"U",0,0,1,0,0}, - {"H",0,0,1,0,0}, - {"T:",0,0,1,0,"B"}, - {"S",0,0,1,0,0}, - {"g",0,0,0,1,0}, - /* {"G",0,0,0,1,0}, */ - {"7",0,0,0,1,0}, - {"v",0,0,0,1,0} + {"B:",0,0,0,1,0}, + {"V",0,0,0,1,0}, + {"W:",0,0,0,1,0}, + {"U",0,0,1,0,0}, + {"H",0,0,1,0,0}, + {"T:",0,0,1,0,"B"}, + {"S",0,0,1,0,0}, + {"g",0,0,0,1,0}, + {"7",0,0,0,1,0}, + {"v",0,0,0,1,0} }; int grib_options_count=sizeof(grib_options)/sizeof(grib_option); diff --git a/tools/gts_copy.c b/tools/gts_copy.c index c92c4623a..8c101a1a8 100644 --- a/tools/gts_copy.c +++ b/tools/gts_copy.c @@ -19,7 +19,6 @@ grib_option grib_options[]={ /* {id, args, help}, on, command_line, value */ {"f",0,0,0,1,0}, {"c",0,0,1,0,0}, - {"r",0,0,0,1,0}, {"q",0,0,1,0,0}, {"p:",0,0,1,1,0}, {"P:",0,0,0,1,0}, @@ -42,16 +41,19 @@ grib_option grib_options[]={ int grib_options_count=sizeof(grib_options)/sizeof(grib_option); -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ int ret=grib_tool(argc,argv); return ret; } -int grib_tool_before_getopt(grib_runtime_options* options) { +int grib_tool_before_getopt(grib_runtime_options* options) +{ return 0; } -int grib_tool_init(grib_runtime_options* options) { +int grib_tool_init(grib_runtime_options* options) +{ #if 0 if (options->outfile && options->outfile->name) { options->outfile->file = fopen(options->outfile->name,"w"); diff --git a/tools/taf_dump.c b/tools/taf_dump.c index dc70f4a70..00381614e 100644 --- a/tools/taf_dump.c +++ b/tools/taf_dump.c @@ -8,168 +8,158 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/* - * C Implementation: grib_dump - * - * Author: Enrico Fucile - * - * - */ - #include "grib_tools.h" grib_option grib_options[]={ -/* {id, args, help}, on, command_line, value*/ - {"S",0,0,1,0,0}, - {"O",0,"Octet mode. WMO documentation style dump.\n",0,1,0}, - {"D",0,0,0,1,0}, - {"d",0,"Print all data values.\n",0,1,0}, - {"C",0,0,0,1,0}, - {"t",0,0,0,1,0}, - {"H",0,0,0,1,0}, - {"a",0,0,0,1,0}, - {"w:",0,0,0,1,0}, - {"M",0,0,0,1,0}, - {"T:",0,0,1,0,"F"}, - {"7",0,0,0,1,0}, - {"V",0,0,0,1,0}, - {"q",0,0,1,0,0}, - {"x",0,0,0,1,0} + /* {id, args, help}, on, command_line, value*/ + {"S",0,0,1,0,0}, + {"O",0,"Octet mode. WMO documentation style dump.\n",0,1,0}, + {"D",0,0,0,1,0}, + {"d",0,"Print all data values.\n",0,1,0}, + {"C",0,0,0,1,0}, + {"t",0,0,0,1,0}, + {"H",0,0,0,1,0}, + {"a",0,0,0,1,0}, + {"w:",0,0,0,1,0}, + {"M",0,0,0,1,0}, + {"T:",0,0,1,0,"F"}, + {"7",0,0,0,1,0}, + {"V",0,0,0,1,0}, + {"q",0,0,1,0,0}, + {"x",0,0,0,1,0} }; -char* grib_tool_description="Dump the content of a grib file in different formats."; +char* grib_tool_description="Dump the content of a TAF file in different formats."; char* grib_tool_name="taf_dump"; char* grib_tool_usage="[options] file file ..."; int grib_options_count=sizeof(grib_options)/sizeof(grib_option); -/** -*grib_dump -*Dump the content of a grib file -* -*/ -int main(int argc, char *argv[]) { return grib_tool(argc,argv);} - -int grib_tool_before_getopt(grib_runtime_options* options) { - return 0; +int main(int argc, char *argv[]) +{ + return grib_tool(argc,argv); } -int grib_tool_init(grib_runtime_options* options) { +int grib_tool_before_getopt(grib_runtime_options* options) +{ + return 0; +} - int opt=grib_options_on("C")+grib_options_on("O")+grib_options_on("D"); +int grib_tool_init(grib_runtime_options* options) +{ - options->dump_mode = "default"; + int opt=grib_options_on("C")+grib_options_on("O")+grib_options_on("D"); + + options->dump_mode = "default"; - if (opt > 1) { - printf("%s: simultaneous C/O/D options not allowed\n",grib_tool_name); - exit(1); - } + if (opt > 1) { + printf("%s: simultaneous C/O/D options not allowed\n",grib_tool_name); + exit(1); + } + + if (grib_options_on("O")) { + options->dump_mode = "wmo"; + options->dump_flags = GRIB_DUMP_FLAG_CODED + | GRIB_DUMP_FLAG_OCTECT + | GRIB_DUMP_FLAG_VALUES + | GRIB_DUMP_FLAG_READ_ONLY; + } + + if (grib_options_on("D")) { + options->dump_mode = "debug"; + options->dump_flags = GRIB_DUMP_FLAG_VALUES + | GRIB_DUMP_FLAG_READ_ONLY; + } + + if (grib_options_on("J")) { + options->dump_mode = "json"; + options->dump_flags = GRIB_DUMP_FLAG_VALUES + | GRIB_DUMP_FLAG_READ_ONLY; + } + + if (grib_options_on("X")) { + options->dump_mode = "xml"; + options->dump_flags = GRIB_DUMP_FLAG_VALUES + | GRIB_DUMP_FLAG_READ_ONLY; + } + + if (grib_options_on("a")) + options->dump_flags |= GRIB_DUMP_FLAG_ALIASES; + + if (grib_options_on("t")) + options->dump_flags |= GRIB_DUMP_FLAG_TYPE; + + if (grib_options_on("H")) + options->dump_flags |= GRIB_DUMP_FLAG_HEXADECIMAL; - if (grib_options_on("C")) { - options->dump_mode = "c_code"; if (grib_options_on("d")) - options->dump_flags = 0; - else - options->dump_flags = GRIB_DUMP_FLAG_NO_DATA; - } + options->dump_flags |= GRIB_DUMP_FLAG_ALL_DATA; - if (grib_options_on("O")) { - options->dump_mode = "wmo"; - options->dump_flags = GRIB_DUMP_FLAG_CODED - | GRIB_DUMP_FLAG_OCTECT - | GRIB_DUMP_FLAG_VALUES - | GRIB_DUMP_FLAG_READ_ONLY; - } - - if (grib_options_on("D")) { - options->dump_mode = "debug"; - options->dump_flags = GRIB_DUMP_FLAG_VALUES - | GRIB_DUMP_FLAG_READ_ONLY; - } - - if (grib_options_on("J")) { - options->dump_mode = "json"; - options->dump_flags = GRIB_DUMP_FLAG_VALUES - | GRIB_DUMP_FLAG_READ_ONLY; - } - - if (grib_options_on("X")) { - options->dump_mode = "xml"; - options->dump_flags = GRIB_DUMP_FLAG_VALUES - | GRIB_DUMP_FLAG_READ_ONLY; - } - - if (grib_options_on("a")) - options->dump_flags |= GRIB_DUMP_FLAG_ALIASES; - - if (grib_options_on("t")) - options->dump_flags |= GRIB_DUMP_FLAG_TYPE; - - if (grib_options_on("H")) - options->dump_flags |= GRIB_DUMP_FLAG_HEXADECIMAL; - - if (grib_options_on("d")) - options->dump_flags |= GRIB_DUMP_FLAG_ALL_DATA; - - return 0; + return 0; } -int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) { - return 0; +int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) +{ + return 0; } -int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) { - char tmp[1024]; - if (!options->current_infile->name) return 0; - sprintf(tmp,"FILE: %s ",options->current_infile->name); - if (!grib_options_on("C") && !grib_options_on("J") && !grib_options_on("X") ) - fprintf(stdout,"***** %s\n",tmp); - return 0; +int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) +{ + char tmp[1024]; + if (!options->current_infile->name) return 0; + sprintf(tmp,"FILE: %s ",options->current_infile->name); + if (!grib_options_on("C") && !grib_options_on("J") && !grib_options_on("X") ) + fprintf(stdout,"***** %s\n",tmp); + return 0; } -int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) { - long length=0; - char tmp[1024]; - char identifier[100]; - size_t idlen=100; - int i; - if (grib_get_long(h,"totalLength",&length) != GRIB_SUCCESS) - length=-9999; +int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) +{ + long length=0; + char tmp[1024]; + char identifier[100]; + size_t idlen=100; + int i; + if (grib_get_long(h,"totalLength",&length) != GRIB_SUCCESS) + length=-9999; - for (i=0;iprint_keys_count;i++) - grib_set_flag(h,options->print_keys[i].name,GRIB_ACCESSOR_FLAG_DUMP); + for (i=0;iprint_keys_count;i++) + grib_set_flag(h,options->print_keys[i].name,GRIB_ACCESSOR_FLAG_DUMP); - sprintf(tmp,"MESSAGE %d ( length=%ld )",options->handle_count,length); - if (!grib_options_on("C") && !grib_options_on("X") && !grib_options_on("J") ) - fprintf(stdout,"#============== %-38s ==============\n",tmp); - if (!strcmp(options->dump_mode,"default")) { - GRIB_CHECK_NOLINE(grib_get_string(h,"identifier",identifier,&idlen),0); - printf("%s {\n",identifier); - } + sprintf(tmp,"MESSAGE %d ( length=%ld )",options->handle_count,length); + if (!grib_options_on("C") && !grib_options_on("X") && !grib_options_on("J") ) + fprintf(stdout,"#============== %-38s ==============\n",tmp); + if (!strcmp(options->dump_mode,"default")) { + GRIB_CHECK_NOLINE(grib_get_string(h,"identifier",identifier,&idlen),0); + printf("%s {\n",identifier); + } - grib_dump_content(h,stdout,options->dump_mode,options->dump_flags,0); + grib_dump_content(h,stdout,options->dump_mode,options->dump_flags,0); - if (!strcmp(options->dump_mode,"default")) - printf("}\n"); - return 0; + if (!strcmp(options->dump_mode,"default")) + printf("}\n"); + return 0; } -int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) { - grib_handle_delete(h); - return 0; +int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) +{ + grib_handle_delete(h); + return 0; } -void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) { - grib_print_key_values(options,h); +void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) +{ + grib_print_key_values(options,h); } -int grib_tool_finalise_action(grib_runtime_options* options) { - return 0; +int grib_tool_finalise_action(grib_runtime_options* options) +{ + return 0; } -int grib_no_handle_action(int err) { - fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); - return 0; +int grib_no_handle_action(int err) +{ + fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); + return 0; } - diff --git a/tools/taf_filter.c b/tools/taf_filter.c index 0a240bd26..39c177344 100644 --- a/tools/taf_filter.c +++ b/tools/taf_filter.c @@ -8,101 +8,102 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/* - * C Implementation: grib_filter - * - * Author: Enrico Fucile - * - * - */ - #include "grib_tools.h" - grib_option grib_options[]={ -/* {id, args, help}, on, command_line, value */ - {"f",0,0,0,1,0}, - {"f",0,0,1,0,0}, - {"F",0,0,1,0,0}, - {"o:",0,0,1,1,"filter.out"}, - {"q",0,0,1,0,0}, - {"M",0,0,0,1,0}, - {"I",0,0,1,0,0}, - {"V",0,0,0,1,0}, - {"g",0,0,0,1,0}, - {"G",0,0,0,1,0}, - {"T:",0,0,1,0,"F"}, - {"7",0,0,0,1,0}, - {"v",0,0,0,1,0} + /* {id, args, help}, on, command_line, value */ + {"f",0,0,0,1,0}, + {"f",0,0,1,0,0}, + {"F",0,0,1,0,0}, + {"o:",0,0,1,1,"filter.out"}, + {"q",0,0,1,0,0}, + {"M",0,0,0,1,0}, + {"I",0,0,1,0,0}, + {"V",0,0,0,1,0}, + {"g",0,0,0,1,0}, + {"G",0,0,0,1,0}, + {"T:",0,0,1,0,"F"}, + {"7",0,0,0,1,0}, + {"v",0,0,0,1,0} }; -char* grib_tool_description="Apply the rules defined in rules_file to each taf " - "message\n\tin the files provided as arguments."; +char* grib_tool_description="Apply the rules defined in rules_file to each TAF " + "message\n\tin the files provided as arguments."; char* grib_tool_name="taf_filter"; char* grib_tool_usage="[options] rules_file " - "file file ..."; + "file file ..."; int fail=0; int grib_options_count=sizeof(grib_options)/sizeof(grib_option); -int main(int argc, char *argv[]) { return grib_tool(argc,argv);} - -int grib_tool_before_getopt(grib_runtime_options* options) { - return 0; +int main(int argc, char *argv[]) +{ + return grib_tool(argc,argv); } -int grib_tool_init(grib_runtime_options* options) { - - options->action = grib_action_from_filter(options->infile_extra->name); - if (!options->action) { - fprintf(stderr,"%s: error unable to create action\n",options->infile_extra->name); - exit(1); - } - - if ( options->outfile && options->outfile->name ) - options->action->context->outfilename=options->outfile->name; - - return 0; +int grib_tool_before_getopt(grib_runtime_options* options) +{ + return 0; } -int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) { - return 0; +int grib_tool_init(grib_runtime_options* options) +{ + options->action = grib_action_from_filter(options->infile_extra->name); + if (!options->action) { + fprintf(stderr,"%s: error unable to create action\n",options->infile_extra->name); + exit(1); + } + + if ( options->outfile && options->outfile->name ) + options->action->context->outfilename=options->outfile->name; + + return 0; +} + +int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) +{ + return 0; } -int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) { - return 0; +int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) +{ + return 0; } -int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) { - int err=0; - - if (options->current_infile->name) { - size_t len=strlen(options->current_infile->name); - grib_set_string(h,"file",options->current_infile->name,&len); - } +int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) +{ + int err=0; - err=grib_handle_apply_action(h,options->action); - if (err != GRIB_SUCCESS && options->fail && err!=GRIB_NOT_FOUND) { - printf("ERROR: %s\n",grib_get_error_message(err)); - exit(err); - } - return 0; + if (options->current_infile->name) { + size_t len=strlen(options->current_infile->name); + grib_set_string(h,"file",options->current_infile->name,&len); + } + + err=grib_handle_apply_action(h,options->action); + if (err != GRIB_SUCCESS && options->fail && err!=GRIB_NOT_FOUND) { + printf("ERROR: %s\n",grib_get_error_message(err)); + exit(err); + } + return 0; } -int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) { - grib_handle_delete(h); - return 0; +int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) +{ + grib_handle_delete(h); + return 0; } -void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) { - grib_print_key_values(options,h); +void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) +{ + grib_print_key_values(options,h); } -int grib_tool_finalise_action(grib_runtime_options* options) { - grib_file_pool_clean(); - return 0; +int grib_tool_finalise_action(grib_runtime_options* options) +{ + grib_file_pool_clean(); + return 0; } -int grib_no_handle_action(int err) { - fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); - return 0; +int grib_no_handle_action(int err) +{ + fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); + return 0; } - diff --git a/tools/taf_get.c b/tools/taf_get.c index 47a01b57b..d9b738a4e 100644 --- a/tools/taf_get.c +++ b/tools/taf_get.c @@ -8,42 +8,34 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/* - * C Implementation: grib_get - * - * Author: Enrico Fucile - * - * - */ - #include "grib_tools.h" grib_option grib_options[]={ -/* {id, args, help}, on, command_line, value*/ - {"f",0,0,0,1,0}, - {"p:",0,0,0,1,0}, - {"F:",0,0,1,1,"%g"}, - {"l:",0,0,0,1,0}, - {"P:",0,0,0,1,0}, - {"w:",0,0,0,1,0}, - {"n:",0,0,1,1,0}, - {"s:",0,0,0,1,0}, - {"V",0,0,0,1,0}, - {"W:",0,0,1,1,"8"}, - {"m",0,0,0,1,0}, - {"M",0,0,0,1,0}, - {"S",0,0,1,0,0}, - {"g",0,0,0,1,0}, - {"G",0,0,0,1,0}, - {"T:",0,0,1,0,"F"}, - {"7",0,0,0,1,0}, - {"v",0,0,1,0,0}, - {"i:",0,0,0,1,0} + /* {id, args, help}, on, command_line, value*/ + {"f",0,0,0,1,0}, + {"p:",0,0,0,1,0}, + {"F:",0,0,1,1,"%g"}, + {"l:",0,0,0,1,0}, + {"P:",0,0,0,1,0}, + {"w:",0,0,0,1,0}, + {"n:",0,0,1,1,0}, + {"s:",0,0,0,1,0}, + {"V",0,0,0,1,0}, + {"W:",0,0,1,1,"8"}, + {"m",0,0,0,1,0}, + {"M",0,0,0,1,0}, + {"S",0,0,1,0,0}, + {"g",0,0,0,1,0}, + {"G",0,0,0,1,0}, + {"T:",0,0,1,0,"F"}, + {"7",0,0,0,1,0}, + {"v",0,0,1,0,0}, + {"i:",0,0,0,1,0} }; -char* grib_tool_description="Get values of some keys from a taf file." - "\n\tIt is similar to taf_ls, but fails returning an error code " - "\n\twhen an error occurs (e.g. key not found)."; +char* grib_tool_description="Get values of some keys from a TAF file." + "\n\tIt is similar to taf_ls, but fails returning an error code " + "\n\twhen an error occurs (e.g. key not found)."; char* grib_tool_name="taf_get"; char* grib_tool_usage="[options] file file ..."; @@ -55,164 +47,173 @@ grib_nearest* n=NULL; int main(int argc, char *argv[]) { return grib_tool(argc,argv);} -int grib_tool_before_getopt(grib_runtime_options* options) { - options->print_keys_count=-1; - return 0; +int grib_tool_before_getopt(grib_runtime_options* options) +{ + options->print_keys_count=-1; + return 0; } -int grib_tool_init(grib_runtime_options* options) { - char *end = NULL, *end1=NULL; - size_t size=4; - int ret=0; - double min=0,max=0; - int i=0,idx=0; - char* p=NULL; - - options->print_header=0; - options->print_statistics=0; - options->default_print_width=-1; +int grib_tool_init(grib_runtime_options* options) +{ + char *end = NULL, *end1=NULL; + size_t size=4; + int ret=0; + double min=0,max=0; + int i=0; + char* p=NULL; - if (options->latlon) { + options->print_header=0; + options->print_statistics=0; + options->default_print_width=-1; - lat = strtod(options->latlon,&end); - if (*end != ',') { - printf("ERROR: wrong latitude value\n"); - exit(1); - } - lon= strtod(++end,&end1); - - mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID; + if (options->latlon) { - if (end1 && *end1 == ',') { - end1++; - if (*end1 != '0') { - p=end1; - while (*p != ',' && *p !='\0') p++; - if (*end1 == '4') { - options->latlon_mode=4; - } else if (*end1 == '1') { - options->latlon_mode=1; - } else { - printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name); - exit(1); + lat = strtod(options->latlon,&end); + if (*end != ',') { + printf("ERROR: wrong latitude value\n"); + exit(1); } - } - if (*p == ',') { - p++; - options->latlon_mask=strdup(p); - } + lon= strtod(++end,&end1); + + mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID; + + if (end1 && *end1 == ',') { + end1++; + if (*end1 != '0') { + p=end1; + while (*p != ',' && *p !='\0') p++; + if (*end1 == '4') { + options->latlon_mode=4; + } else if (*end1 == '1') { + options->latlon_mode=1; + } else { + printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name); + exit(1); + } + } + if (*p == ',') { + p++; + options->latlon_mask=strdup(p); + } + } + + } + if (options->latlon && options->latlon_mask) { + FILE* f=NULL; + grib_handle* hh; + f=fopen(options->latlon_mask,"r"); + if(!f) { + perror(options->latlon_mask); + exit(1); + } + hh=grib_handle_new_from_file(0,f,&ret); + fclose(f); + GRIB_CHECK_NOLINE(ret,0); + n=grib_nearest_new(hh,&ret); + GRIB_CHECK_NOLINE(ret,0); + GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode, + options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0); + grib_nearest_delete(n); + n=NULL; + grib_handle_delete( hh); - } + options->latlon_idx=-1; + max=options->distances[0]; + for (i=0;i<4;i++) + if (maxdistances[i]) {max=options->distances[i];} + min=max; + for (i=0;i<4;i++) { + if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) { + options->latlon_idx=i; + min = options->distances[i]; + } + } - if (options->latlon && options->latlon_mask) { - FILE* f=NULL; - grib_handle* hh; - f=fopen(options->latlon_mask,"r"); - if(!f) { - perror(options->latlon_mask); - exit(1); - } - hh=grib_handle_new_from_file(0,f,&ret); - fclose(f); - GRIB_CHECK_NOLINE(ret,0); - n=grib_nearest_new(hh,&ret); - GRIB_CHECK_NOLINE(ret,0); - GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode, - options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0); - grib_nearest_delete(n); - n=NULL; - grib_handle_delete( hh); - - options->latlon_idx=-1; - max=options->distances[0]; - for (i=0;i<4;i++) - if (maxdistances[i]) {max=options->distances[i];idx=i;} - min=max; - for (i=0;i<4;i++) { - if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) { - options->latlon_idx=i; - min = options->distances[i]; - } - } - - if (options->latlon_idx<0){ - min=0; - options->latlon_idx=0; - for (i=1;i<4;i++) - if (min>options->distances[i]) { - min = options->distances[i]; - options->latlon_idx=i; + if (options->latlon_idx<0){ + min=0; + options->latlon_idx=0; + for (i=1;i<4;i++) + if (min>options->distances[i]) { + min = options->distances[i]; + options->latlon_idx=i; + } } } - } - - return 0; -} -int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) { - return 0; - } - -int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) { - return 0; + return 0; } -int grib_tool_new_handle_action(grib_runtime_options* options,grib_handle* h) { - size_t size=4; - int err = 0; +int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) +{ + return 0; +} - if (!options->skip) { - if (options->set_values_count != 0) { - err=grib_set_values(h,options->set_values,options->set_values_count); + +int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) +{ + return 0; +} + +int grib_tool_new_handle_action(grib_runtime_options* options,grib_handle* h) +{ + size_t size=4; + int err = 0; + + if (!options->skip) { + if (options->set_values_count != 0) { + err=grib_set_values(h,options->set_values,options->set_values_count); + } + + if (err != GRIB_SUCCESS && options->fail) exit(err); } - if (err != GRIB_SUCCESS && options->fail) exit(err); - } + if (options->latlon) { + int err=0; + double min; + int i; + if (!n) n=grib_nearest_new(h,&err); + GRIB_CHECK_NOLINE(err,0); + GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,mode, + options->lats,options->lons,options->values, + options->distances,options->indexes,&size),0); + min=options->distances[0]; + options->latlon_idx=0; + i=0; + for (i=1;i<4;i++) { + if (min>options->distances[i]) { + min=options->distances[i]; + options->latlon_idx=i; + } + } - if (options->latlon) { - int err=0; - double min; - int i; - if (!n) n=grib_nearest_new(h,&err); - GRIB_CHECK_NOLINE(err,0); - GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,mode, - options->lats,options->lons,options->values, - options->distances,options->indexes,&size),0); - min=options->distances[0]; - options->latlon_idx=0; - i=0; - for (i=1;i<4;i++) { - if (min>options->distances[i]) { - min=options->distances[i]; - options->latlon_idx=i; - } - } + } - } - - return 0; + return 0; } -int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) { - grib_handle_delete(h); - return 0; +int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) +{ + grib_handle_delete(h); + return 0; } -void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) { - grib_print_key_values(options,h); +void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) +{ + grib_print_key_values(options,h); } -int grib_tool_finalise_action(grib_runtime_options* options) { +int grib_tool_finalise_action(grib_runtime_options* options) +{ - if (n) grib_nearest_delete(n); - - return 0; + if (n) grib_nearest_delete(n); + + return 0; } -int grib_no_handle_action(int err) { - fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); - return 0; +int grib_no_handle_action(int err) +{ + fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); + return 0; } - diff --git a/tools/taf_ls.c b/tools/taf_ls.c index d6eb3762a..f64bb8f10 100644 --- a/tools/taf_ls.c +++ b/tools/taf_ls.c @@ -8,44 +8,37 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/* - * C Implementation: grib_ls - * - * Author: Enrico Fucile - * - * - */ #include "grib_tools.h" grib_option grib_options[]={ -/* {id, args, help}, on, command_line, value*/ - {"f",0,0,1,0,0}, - {"p:",0,0,0,1,0}, - {"F:",0,0,1,1,"%g"}, - {"P:",0,0,0,1,0}, - {"w:",0,0,0,1,0}, - {"j",0,"json output\n",0,1,0}, - {"B:",0,0,0,1,0}, - {"l:",0,0,0,1,0}, - {"s:",0,0,0,1,0}, - {"i:",0,0,0,1,0}, - {"n:",0,0,1,1,"ls"}, - {"m",0,0,0,1,0}, - {"V",0,0,0,1,0}, - {"W:",0,0,1,1,"10"}, - {"S",0,0,1,0,0}, - {"M",0,0,0,1,0}, - {"H",0,0,1,0,0}, - {"g",0,0,0,1,0}, - {"P",0,0,1,0,0}, - {"T:",0,0,1,0,"F"}, - {"7",0,0,0,1,0}, - {"v",0,0,1,0,0}, - {"x",0,0,0,1,0} + /* {id, args, help}, on, command_line, value*/ + {"f",0,0,1,0,0}, + {"p:",0,0,0,1,0}, + {"F:",0,0,1,1,"%g"}, + {"P:",0,0,0,1,0}, + {"w:",0,0,0,1,0}, + {"j",0,"json output\n",0,1,0}, + {"B:",0,0,0,1,0}, + {"l:",0,0,0,1,0}, + {"s:",0,0,0,1,0}, + {"i:",0,0,0,1,0}, + {"n:",0,0,1,1,"ls"}, + {"m",0,0,0,1,0}, + {"V",0,0,0,1,0}, + {"W:",0,0,1,1,"10"}, + {"S",0,0,1,0,0}, + {"M",0,0,0,1,0}, + {"H",0,0,1,0,0}, + {"g",0,0,0,1,0}, + {"P",0,0,1,0,0}, + {"T:",0,0,1,0,"F"}, + {"7",0,0,0,1,0}, + {"v",0,0,1,0,0}, + {"x",0,0,0,1,0} }; -char* grib_tool_description="List content of taf files printing values of " - "some keys.\n\tIt does not fail when a key is not found."; +char* grib_tool_description="List content of TAF files printing values of " + "some keys.\n\tIt does not fail when a key is not found."; char* grib_tool_name="taf_ls"; char* grib_tool_usage="[options] file file ..."; static char* new_handle=""; @@ -56,301 +49,228 @@ double lon=0; int mode=0; static int json=0; -grib_nearest* n=NULL; -/*double *outlats,*outlons,*values,*lsm_values,*distances;*/ - -int main(int argc, char *argv[]) { return grib_tool(argc,argv);} +int main(int argc, char *argv[]) +{ + return grib_tool(argc,argv); +} /* -This is executed before processing the options with i -getopt and therfore it is the right place for hacking +This is executed before processing the options with +getopt and therefore it is the right place for hacking the arguments if needed -*/ -int grib_tool_before_getopt(grib_runtime_options* options) { - return 0; + */ +int grib_tool_before_getopt(grib_runtime_options* options) +{ + return 0; } /* The options have been parsed and the structure grib_runtime_options* options has been loaded. -Initialization and startup can be done here -*/ -int grib_tool_init(grib_runtime_options* options) { - char *end = NULL, *end1=NULL; - size_t size=4; - int ret=0; - double min=0,max=0; - int i=0,idx=0; - char* p=NULL; - if (grib_options_on("j")) { - options->verbose=0; - json=1; - } - - if (options->latlon) { - - lat = strtod(options->latlon,&end); - if (*end != ',') { - printf("ERROR: wrong latitude value\n"); - exit(1); +Initialisation and startup can be done here + */ +int grib_tool_init(grib_runtime_options* options) +{ + if (grib_options_on("j")) { + options->verbose=0; + json=1; } - lon= strtod(++end,&end1); - - mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID; + if (json) printf("[\n"); - if (end1 && *end1 == ',') { - end1++; - if (*end1 != '0') { - p=end1; - while (*p != ',' && *p !='\0') p++; - if (*end1 == '4') { - options->latlon_mode=4; - } else if (*end1 == '1') { - options->latlon_mode=1; - } else { - printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name); - exit(1); - } - } - if (*p == ',') { - p++; - options->latlon_mask=strdup(p); - } - } - - } - - if (options->latlon && options->latlon_mask) { - FILE* f=NULL; - grib_handle* hh; - f=fopen(options->latlon_mask,"r"); - if(!f) { - perror(options->latlon_mask); - exit(1); - } - hh=grib_handle_new_from_file(0,f,&ret); - fclose(f); - GRIB_CHECK_NOLINE(ret,0); - n=grib_nearest_new(hh,&ret); - GRIB_CHECK_NOLINE(ret,0); - GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode, - options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0); - grib_nearest_delete(n); - n=NULL; - grib_handle_delete( hh); - - options->latlon_idx=-1; - max=options->distances[0]; - for (i=0;i<4;i++) - if (maxdistances[i]) {max=options->distances[i];idx=i;} - min=max; - for (i=0;i<4;i++) { - if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) { - options->latlon_idx=i; - min = options->distances[i]; - } - } - - if (options->latlon_idx<0){ - min=0; - options->latlon_idx=0; - for (i=1;i<4;i++) - if (min>options->distances[i]) { - min = options->distances[i]; - options->latlon_idx=i; - } - } - } - if (json) printf("[\n"); - - return 0; + return 0; } /* A new file is being parsed. The file name is file. This function is called every time a new input file name is processed, before opening the file. -*/ -int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) { - return 0; - } - - -int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) { - return 0; + */ +int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) +{ + return 0; } -static void print_key_values(grib_runtime_options* options,grib_handle* h) { - int i; - int ret=0; - char* s="\"keys\" : {"; - double dvalue=0; - long lvalue=0; - char value[MAX_STRING_LEN]; - size_t len=MAX_STRING_LEN; - for (i=0;iprint_keys_count;i++) { - ret=GRIB_SUCCESS; - printf("%s",s); - len=MAX_STRING_LEN; - printf("\"%s\" : ",options->print_keys[i].name); - if (grib_is_missing(h,options->print_keys[i].name,&ret) && ret==GRIB_SUCCESS) - printf("\"missing\""); - else if ( ret == GRIB_SUCCESS ) { - if (options->print_keys[i].type == GRIB_TYPE_UNDEFINED) - grib_get_native_type(h,options->print_keys[i].name,&(options->print_keys[i].type)); - switch (options->print_keys[i].type) { - case GRIB_TYPE_STRING: - ret=grib_get_string( h,options->print_keys[i].name,value,&len); - printf("\"%s\"",value); - break; - case GRIB_TYPE_DOUBLE: - ret=grib_get_double( h,options->print_keys[i].name,&dvalue); - printf("%g",dvalue); - break; - case GRIB_TYPE_LONG: - ret=grib_get_long( h,options->print_keys[i].name,&lvalue); - printf("%ld",lvalue); - break; - default: - printf("invalid_type"); - } - } - if (ret == GRIB_NOT_FOUND) printf("null"); - s=", "; - } - printf("}"); +int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) +{ + return 0; +} + +static void print_key_values(grib_runtime_options* options,grib_handle* h) +{ + int i; + int ret=0; + char* s="\"keys\" : {"; + double dvalue=0; + long lvalue=0; + char value[MAX_STRING_LEN]; + size_t len=MAX_STRING_LEN; + for (i=0;iprint_keys_count;i++) { + ret=GRIB_SUCCESS; + printf("%s",s); + len=MAX_STRING_LEN; + printf("\"%s\" : ",options->print_keys[i].name); + if (grib_is_missing(h,options->print_keys[i].name,&ret) && ret==GRIB_SUCCESS) + printf("\"missing\""); + else if ( ret == GRIB_SUCCESS ) { + if (options->print_keys[i].type == GRIB_TYPE_UNDEFINED) + grib_get_native_type(h,options->print_keys[i].name,&(options->print_keys[i].type)); + switch (options->print_keys[i].type) { + case GRIB_TYPE_STRING: + ret=grib_get_string( h,options->print_keys[i].name,value,&len); + printf("\"%s\"",value); + break; + case GRIB_TYPE_DOUBLE: + ret=grib_get_double( h,options->print_keys[i].name,&dvalue); + printf("%g",dvalue); + break; + case GRIB_TYPE_LONG: + ret=grib_get_long( h,options->print_keys[i].name,&lvalue); + printf("%ld",lvalue); + break; + default: + printf("invalid_type"); + } + } + if (ret == GRIB_NOT_FOUND) printf("null"); + s=", "; + } + printf("}"); } /* A new handle is available from the current input file and can be processed here. -The handle available in this function is in the set of messages satisfying the constrant of the +The handle available in this function is in the set of messages satisfying the constraint of the -w option. They are not to be skipped. -*/ -int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) { - size_t size=4; - double v=0; - int err=0; - int i; - - if (!options->skip) { - - if (options->set_values_count != 0) - err=grib_set_values(h,options->set_values,options->set_values_count); - - if( err != GRIB_SUCCESS && options->fail) exit(err); - } - - if (options->latlon) { + */ +int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) +{ + size_t size=4; + double v=0; int err=0; - double min; - if (!n) n=grib_nearest_new(h,&err); - GRIB_CHECK_NOLINE(err,0); - GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,0, - options->lats,options->lons,options->values, - options->distances,options->indexes,&size),0); + int i; - if (!options->latlon_mask) { - min=options->distances[0]; - options->latlon_idx=0; - i=0; - for (i=1;i<4;i++) { - if (min>options->distances[i]) { - min=options->distances[i]; - options->latlon_idx=i; - } - } - } - - if (json) { - char* s="\n[\n"; - double missingValue=9999; - char value[MAX_STRING_LEN]; - size_t len=MAX_STRING_LEN; - printf("%s",new_handle); - printf( "{\n"); - print_key_values(options,h); - printf("\n, \"selected\" : %d",options->latlon_idx); - printf(", \"method\" : "); - if (options->latlon_mask) printf("\"nearest_land\""); - else printf("\"nearest\""); - printf("\n, \"neighbours\" : "); - for (i=0;i<4;i++) { - printf("%s",s); - len=MAX_STRING_LEN; - printf("{\"index\" : %d, \"latitude\" : %g, \"longitude\" : %g, \"distance\" : %g, " - "\"distance_unit\" : \"km\", ", - (int)options->indexes[i],options->lats[i],options->lons[i], - options->distances[i]); - if (grib_get_double_element(h,"values",options->indexes[i],&v) == GRIB_SUCCESS) { - if (v==missingValue) printf("\"value\" : null "); - else printf("\"value\" : %g ",v); - } + if (!options->skip) { - if (grib_get_string( h,"units",value,&len)==GRIB_SUCCESS) - printf(", \"unit\" : \"%s\"",value); - - if (options->latlon_mask) - printf(", \"mask_value\"=%.2f",options->mask_values[i]); - printf("}"); - s="\n,"; - } + if (options->set_values_count != 0) + err=grib_set_values(h,options->set_values,options->set_values_count); - printf("\n]"); - printf("\n}"); - } + if( err != GRIB_SUCCESS && options->fail) exit(err); + } - } - new_handle="\n,"; - return 0; + if (options->latlon) { + int err=0; + double min; + if (!n) n=grib_nearest_new(h,&err); + GRIB_CHECK_NOLINE(err,0); + GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,0, + options->lats,options->lons,options->values, + options->distances,options->indexes,&size),0); + + if (!options->latlon_mask) { + min=options->distances[0]; + options->latlon_idx=0; + i=0; + for (i=1;i<4;i++) { + if (min>options->distances[i]) { + min=options->distances[i]; + options->latlon_idx=i; + } + } + } + + if (json) { + char* s="\n[\n"; + double missingValue=9999; + char value[MAX_STRING_LEN]; + size_t len=MAX_STRING_LEN; + printf("%s",new_handle); + printf( "{\n"); + print_key_values(options,h); + printf("\n, \"selected\" : %d",options->latlon_idx); + printf(", \"method\" : "); + if (options->latlon_mask) printf("\"nearest_land\""); + else printf("\"nearest\""); + printf("\n, \"neighbours\" : "); + for (i=0;i<4;i++) { + printf("%s",s); + len=MAX_STRING_LEN; + printf("{\"index\" : %d, \"latitude\" : %g, \"longitude\" : %g, \"distance\" : %g, " + "\"distance_unit\" : \"km\", ", + (int)options->indexes[i],options->lats[i],options->lons[i], + options->distances[i]); + if (grib_get_double_element(h,"values",options->indexes[i],&v) == GRIB_SUCCESS) { + if (v==missingValue) printf("\"value\" : null "); + else printf("\"value\" : %g ",v); + } + + if (grib_get_string( h,"units",value,&len)==GRIB_SUCCESS) + printf(", \"unit\" : \"%s\"",value); + + if (options->latlon_mask) + printf(", \"mask_value\"=%.2f",options->mask_values[i]); + printf("}"); + s="\n,"; + } + + printf("\n]"); + printf("\n}"); + } + + } + new_handle="\n,"; + return 0; } /* A new handle to skip is available. At this point something can be done with the message to be skipped before deleting the handle. */ -int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) { - grib_handle_delete(h); - return 0; +int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) +{ + grib_handle_delete(h); + return 0; } /* key values can be printed in this function. Headers are already printed if requested.*/ -void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) { - grib_print_key_values(options,h); +void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) +{ + grib_print_key_values(options,h); } /* this is executed after the last message in the last file is processed */ -int grib_tool_finalise_action(grib_runtime_options* options) { - int i=0; - if (options->latlon && options->verbose) { - - printf("Input Point: latitude=%.2f longitude=%.2f\n",lat,lon); - printf("Grid Point chosen #%d index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n", - options->latlon_idx+1,(int)options->indexes[options->latlon_idx], - options->lats[options->latlon_idx], - options->lons[options->latlon_idx], - options->distances[options->latlon_idx]); +int grib_tool_finalise_action(grib_runtime_options* options) +{ + int i=0; + if (options->latlon && options->verbose) { - if (options->latlon_mask) { - printf("Mask values:\n"); - for (i=0;i<4;i++) { - printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km) value=%.2f\n", - i+1,(int)options->indexes[i],options->lats[i],options->lons[i], - options->distances[i],options->mask_values[i]); - } - } else { - printf("Other grid Points\n"); - for (i=0;i<4;i++) { - printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n", - i+1,(int)options->indexes[i],options->lats[i],options->lons[i], - options->distances[i]); - } - } - } + printf("Input Point: latitude=%.2f longitude=%.2f\n",lat,lon); + printf("Grid Point chosen #%d index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n", + options->latlon_idx+1,(int)options->indexes[options->latlon_idx], + options->lats[options->latlon_idx], + options->lons[options->latlon_idx], + options->distances[options->latlon_idx]); + + if (options->latlon_mask) { + printf("Mask values:\n"); + for (i=0;i<4;i++) { + printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km) value=%.2f\n", + i+1,(int)options->indexes[i],options->lats[i],options->lons[i], + options->distances[i],options->mask_values[i]); + } + } else { + printf("Other grid Points\n"); + for (i=0;i<4;i++) { + printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n", + i+1,(int)options->indexes[i],options->lats[i],options->lons[i], + options->distances[i]); + } + } + } if (n) grib_nearest_delete(n); - if (json) printf("\n]\n"); - - return 0; + if (json) printf("\n]\n"); + + return 0; } -int grib_no_handle_action(int err) { - fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); - return 0; +int grib_no_handle_action(int err) +{ + fprintf(dump_file,"\t\t\"ERROR: unreadable message\"\n"); + return 0; } -