2013-03-25 12:04:10 +00:00
|
|
|
/*
|
2020-01-28 14:32:34 +00:00
|
|
|
* (C) Copyright 2005- ECMWF.
|
2013-03-25 12:04:10 +00:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2017-01-12 18:17:58 +00:00
|
|
|
#ifdef __gnu_hurd__
|
|
|
|
#define _FILE_OFFSET_BITS 64 /* 64-bit offsets off_t not the default on Hurd/i386 */
|
|
|
|
#endif
|
|
|
|
|
2013-03-25 12:04:10 +00:00
|
|
|
#include "grib_api_internal.h"
|
|
|
|
#include <stdio.h>
|
2015-02-18 17:42:02 +00:00
|
|
|
#ifndef ECCODES_ON_WINDOWS
|
2013-03-25 14:23:07 +00:00
|
|
|
# include <unistd.h>
|
|
|
|
#endif
|
2013-03-25 12:04:10 +00:00
|
|
|
|
|
|
|
#ifndef GRIB_TOOLS_H
|
|
|
|
#define GRIB_TOOLS_H
|
|
|
|
|
|
|
|
#ifndef S_IFMT
|
|
|
|
#define S_IFMT 0170000 /* type of file */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef S_IFLNK
|
|
|
|
#define S_IFLNK 0120000 /* symbolic link */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef S_ISLNK
|
|
|
|
#define S_ISLNK(mode) (((mode) & (S_IFMT)) == (S_IFLNK))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define MAX_KEYS 1000
|
|
|
|
#define MAX_STRING_LEN 512
|
|
|
|
#define MAX_FAILED 1024
|
|
|
|
#define MAX_CONSTRAINT_VALUES 500
|
|
|
|
|
|
|
|
#define MODE_GRIB 0
|
2013-03-25 14:23:07 +00:00
|
|
|
#define MODE_GTS 1
|
|
|
|
#define MODE_BUFR 2
|
2014-07-07 20:55:19 +00:00
|
|
|
#define MODE_METAR 3
|
|
|
|
#define MODE_TAF 5
|
2014-12-16 18:21:56 +00:00
|
|
|
#define MODE_ANY 6
|
2013-03-25 12:04:10 +00:00
|
|
|
|
|
|
|
typedef union grib_typed_value {
|
|
|
|
long* long_value;
|
|
|
|
double* double_value;
|
|
|
|
const char* string_value;
|
|
|
|
} grib_typed_value;
|
|
|
|
|
|
|
|
/*
|
|
|
|
typedef struct grib_constraints {
|
|
|
|
const char* name;
|
|
|
|
int type;
|
|
|
|
grib_typed_value values[MAX_CONSTRAINT_VALUES];
|
|
|
|
int count;
|
|
|
|
int error;
|
|
|
|
int equal;
|
|
|
|
} grib_constraints;
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct grib_options_help {
|
2018-08-07 12:50:41 +00:00
|
|
|
const char* id;
|
|
|
|
const char* args;
|
|
|
|
const char* help;
|
2013-03-25 12:04:10 +00:00
|
|
|
} grib_options_help;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct grib_option {
|
|
|
|
char* id;
|
|
|
|
char* args;
|
|
|
|
char* help;
|
|
|
|
int on;
|
|
|
|
int command_line;
|
|
|
|
char* value;
|
|
|
|
} grib_option;
|
|
|
|
|
|
|
|
typedef struct grib_failed grib_failed;
|
|
|
|
|
|
|
|
struct grib_failed {
|
|
|
|
int count;
|
|
|
|
int error;
|
|
|
|
grib_failed* next;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct grib_tools_file grib_tools_file;
|
|
|
|
|
|
|
|
struct grib_tools_file {
|
|
|
|
FILE* file;
|
|
|
|
char* name;
|
|
|
|
int handle_count;
|
|
|
|
int filter_handle_count;
|
|
|
|
grib_failed* failed;
|
|
|
|
grib_tools_file* next;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct grib_runtime_options {
|
|
|
|
int verbose;
|
|
|
|
int fail;
|
|
|
|
int skip;
|
|
|
|
int default_print_width;
|
|
|
|
int print_header;
|
|
|
|
char* name_space;
|
|
|
|
int print_number;
|
|
|
|
int print_statistics;
|
|
|
|
grib_values requested_print_keys[MAX_KEYS];
|
|
|
|
int requested_print_keys_count;
|
|
|
|
grib_values print_keys[MAX_KEYS];
|
|
|
|
int print_keys_count;
|
|
|
|
int strict;
|
|
|
|
int multi_support;
|
|
|
|
int set_values_count;
|
|
|
|
grib_values set_values[MAX_KEYS];
|
|
|
|
grib_values constraints[MAX_KEYS];
|
|
|
|
int constraints_count;
|
|
|
|
grib_values compare[MAX_KEYS];
|
|
|
|
int compare_count;
|
|
|
|
int handle_count;
|
|
|
|
int filter_handle_count;
|
|
|
|
int file_count;
|
|
|
|
grib_tools_file* infile_extra;
|
|
|
|
grib_tools_file* current_infile;
|
|
|
|
grib_tools_file* infile;
|
|
|
|
grib_tools_file* outfile;
|
|
|
|
grib_action* action;
|
|
|
|
grib_rule* rules;
|
|
|
|
int dump_flags;
|
|
|
|
char* dump_mode;
|
|
|
|
int repack;
|
|
|
|
int error;
|
|
|
|
int gts;
|
|
|
|
char* orderby;
|
|
|
|
char* latlon;
|
|
|
|
double lats[4];
|
|
|
|
double lons[4];
|
|
|
|
double values[4];
|
|
|
|
double distances[4];
|
|
|
|
int indexes[4];
|
|
|
|
int latlon_mode;
|
|
|
|
char* latlon_mask;
|
|
|
|
int latlon_idx;
|
|
|
|
double mask_values[4];
|
|
|
|
int index;
|
|
|
|
int index_on;
|
|
|
|
double constant;
|
|
|
|
char* dump_filename;
|
|
|
|
grib_fieldset* idx;
|
|
|
|
int random;
|
|
|
|
char* format;
|
|
|
|
int onlyfiles;
|
|
|
|
int tolerance_count;
|
|
|
|
int through_index;
|
|
|
|
grib_index* index1;
|
|
|
|
grib_index* index2;
|
|
|
|
grib_context* context;
|
|
|
|
int stop;
|
|
|
|
int mode;
|
2013-03-25 14:23:07 +00:00
|
|
|
int headers_only;
|
2013-03-25 12:04:10 +00:00
|
|
|
int skip_all;
|
|
|
|
grib_values tolerance[MAX_KEYS];
|
2013-06-17 16:53:16 +00:00
|
|
|
off_t infile_offset;
|
2016-12-20 10:43:36 +00:00
|
|
|
int json_output;
|
2013-03-25 12:04:10 +00:00
|
|
|
} grib_runtime_options;
|
|
|
|
|
|
|
|
extern grib_option grib_options[];
|
|
|
|
extern int grib_options_count;
|
2018-08-07 12:50:41 +00:00
|
|
|
extern const char* grib_tool_name;
|
|
|
|
extern const char* grib_tool_description;
|
|
|
|
extern const char* grib_tool_usage;
|
2013-03-25 12:04:10 +00:00
|
|
|
|
|
|
|
extern FILE* dump_file;
|
|
|
|
|
|
|
|
char* grib_options_get_option(const char* id);
|
|
|
|
int grib_options_on(const char* id);
|
|
|
|
int grib_options_get(int argc,char** argv);
|
|
|
|
int grib_options_get_values(int argc,char** argv,int values_required,int default_type, grib_values values[],int* n,int* optind);
|
|
|
|
int grib_tool(int argc, char **argv);
|
|
|
|
char* grib_options_get_help(char* id);
|
|
|
|
char* grib_options_get_args(char* id);
|
|
|
|
int grib_options_command_line(const char* id);
|
2018-03-12 18:20:27 +00:00
|
|
|
void usage(void);
|
|
|
|
void usage_doxygen(void);
|
2013-03-25 12:04:10 +00:00
|
|
|
int grib_tool_before_getopt(grib_runtime_options* options);
|
|
|
|
int grib_tool_init(grib_runtime_options* options);
|
|
|
|
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file);
|
|
|
|
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h);
|
|
|
|
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h);
|
|
|
|
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h);
|
|
|
|
int grib_tool_finalise_action(grib_runtime_options* options);
|
|
|
|
void grib_skip_check(grib_runtime_options* options,grib_handle* h);
|
|
|
|
void grib_print_key_values(grib_runtime_options* options,grib_handle* h);
|
|
|
|
void grib_print_file_statistics(grib_runtime_options* options,grib_tools_file* file);
|
|
|
|
void grib_print_full_statistics(grib_runtime_options* options);
|
|
|
|
int grib_get_runtime_options(int argc,char** argv,grib_runtime_options* options);
|
|
|
|
int grib_process_runtime_options(grib_context* c,int argc,char** argv,grib_runtime_options* options);
|
|
|
|
void grib_tools_write_message(grib_runtime_options* options, grib_handle* h);
|
|
|
|
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file);
|
2016-08-30 12:45:02 +00:00
|
|
|
int grib_no_handle_action(grib_runtime_options* options,int err);
|
2018-09-07 16:12:24 +00:00
|
|
|
int exit_if_input_is_directory(const char* tool_name, const char* filename);
|
2013-03-25 12:04:10 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|