libwreport  3.15
decoder.h
1 #ifndef WREPORT_BUFR_DECODER_H
2 #define WREPORT_BUFR_DECODER_H
3 
4 #include <wreport/var.h>
5 #include <wreport/bulletin.h>
6 #include <wreport/bulletin/interpreter.h>
7 #include <wreport/bufr/input.h>
8 
9 namespace wreport {
10 namespace bufr {
11 struct DispatchToSubsets;
12 
13 struct Decoder
14 {
17  /* Output decoded variables */
18  BufrBulletin& out;
22  bool conf_add_undef_attrs = false;
26  FILE* verbose_output = nullptr;
27 
28  Decoder(const std::string& buf, const char* fname, size_t offset, BufrBulletin& out);
29 
30  void read_options(const BufrCodecOptions& opts);
31 
32  void decode_sec1ed3();
33  void decode_sec1ed4();
34 
35  /* Decode the message header only */
36  void decode_header();
37 
38  /* Decode message data section after the header has been decoded */
39  void decode_data();
40 };
41 
43 {
46 
47  DecoderTarget(Input& in) : in(in) {}
48  virtual ~DecoderTarget() {}
49 
57  virtual const Subset& reference_subset() const = 0;
58 
62  virtual Varinfo lookup_info(unsigned pos) const = 0;
63 
71  virtual Var decode_uniform_b_value(Varinfo info) = 0;
72 
77  virtual const Var& decode_and_add_to_all(Varinfo info) = 0;
78 
79  virtual const Var& decode_and_add_bitmap(const Tables& tables, Varcode code, unsigned bitmap_size) = 0;
80 
85  virtual void decode_and_set_attribute(Varinfo info, unsigned pos) = 0;
86 
90  virtual void decode_and_add_b_value(Varinfo info) = 0;
91 
96  virtual void decode_and_add_b_value_with_associated_field(Varinfo info, const bulletin::AssociatedField& field) = 0;
97 
102  virtual void decode_and_add_raw_character_data(Varinfo info) = 0;
103 
105  virtual void print_last_variable_added(FILE* out) = 0;
106 
108  virtual void print_last_attribute_added(FILE* out, Varcode code, unsigned pos) = 0;
109 };
110 
112 {
115 
117 
118  const Subset& reference_subset() const override;
119  Varinfo lookup_info(unsigned pos) const override;
120  Var decode_uniform_b_value(Varinfo info) override;
121  const Var& decode_and_add_to_all(Varinfo info) override;
122  const Var& decode_and_add_bitmap(const Tables& tables, Varcode code, unsigned bitmap_size) override;
123  void decode_and_set_attribute(Varinfo info, unsigned pos) override;
124  void decode_and_add_b_value(Varinfo info) override;
125  void decode_and_add_b_value_with_associated_field(Varinfo info, const bulletin::AssociatedField& field) override;
126  void decode_and_add_raw_character_data(Varinfo info) override;
127 
128  void print_last_variable_added(FILE* out) override;
129  void print_last_attribute_added(FILE* out, Varcode code, unsigned pos) override;
130 };
131 
133 {
136 
138  unsigned subset_count;
139 
141 
142  const Subset& reference_subset() const override;
143  Varinfo lookup_info(unsigned pos) const override;
144  Var decode_uniform_b_value(Varinfo info) override;
145  const Var& decode_and_add_to_all(Varinfo info) override;
146  const Var& decode_and_add_bitmap(const Tables& tables, Varcode code, unsigned bitmap_size) override;
147  void decode_and_set_attribute(Varinfo info, unsigned pos) override;
148  void decode_and_add_b_value(Varinfo info) override;
149  void decode_and_add_b_value_with_associated_field(Varinfo info, const bulletin::AssociatedField& field) override;
150  void decode_and_add_raw_character_data(Varinfo info) override;
151 
152  void print_last_variable_added(FILE* out) override;
153  void print_last_attribute_added(FILE* out, Varcode code, unsigned pos) override;
154 
155 protected:
156  void decode_b_value(Varinfo info, std::function<void(unsigned, Var&&)> dest);
157 };
158 
160 {
161  DecoderTarget& target;
162 
163  DataSectionDecoder(Bulletin& bulletin, DecoderTarget& target);
164 
165  unsigned define_delayed_replication_factor(Varinfo info) override;
166  unsigned define_associated_field_significance(Varinfo info) override;
167  unsigned define_bitmap_delayed_replication_factor(Varinfo info) override;
168  void define_bitmap(unsigned bitmap_size) override;
169  void define_attribute(Varinfo info, unsigned pos) override;
170  void define_substituted_value(unsigned pos) override;
171  void define_variable(Varinfo info) override;
172  void define_variable_with_associated_field(Varinfo info) override;
173  void define_raw_character_data(Varcode code) override;
174 };
175 
177 {
178 protected:
185  void print_lead(Varcode code);
186  void print_lead_continued();
187 
188 public:
189  FILE* out;
190 
197  unsigned indent = 0;
198 
200  unsigned indent_step = 2;
201 
202  VerboseDataSectionDecoder(Bulletin& bulletin, DecoderTarget& target, FILE* out);
203 
204  void b_variable(Varcode code) override;
205  void c_modifier(Varcode code, Opcodes& next) override;
206  void r_replication(Varcode code, Varcode delayed_code, const Opcodes& ops) override;
207  void run_d_expansion(Varcode code) override;
208  unsigned define_delayed_replication_factor(Varinfo info) override;
209  unsigned define_associated_field_significance(Varinfo info) override;
210  unsigned define_bitmap_delayed_replication_factor(Varinfo info) override;
211  void define_bitmap(unsigned bitmap_size) override;
212  void define_attribute(Varinfo info, unsigned pos) override;
213  void define_substituted_value(unsigned pos) override;
214  void define_variable(Varinfo info) override;
215  void define_variable_with_associated_field(Varinfo info) override;
216  void define_raw_character_data(Varcode code) override;
217 };
218 
219 }
220 }
221 #endif
Options used to configure BUFR decoding.
Definition: bulletin.h:200
Input & in
Input buffer.
Definition: decoder.h:45
Bulletin & out
Output bulletin.
Definition: decoder.h:135
A physical variable.
Definition: var.h:23
Subset & out
Subset where decoded variables go.
Definition: decoder.h:114
Collection of BUFR/CREX tables used to work on a bulletin.
Definition: tables.h:17
FILE * verbose_output
If set, be verbose and print a trace of decoding to the given file.
Definition: decoder.h:26
Storage for the decoded data of a BUFR or CREX message.
Definition: bulletin.h:29
Definition: decoder.h:42
uint16_t Varcode
Holds the WMO variable code of a variable.
Definition: varinfo.h:57
Information about a variable.
Definition: varinfo.h:135
Binary buffer with bit-level read operations.
Definition: input.h:45
Definition: decoder.h:13
Sequence of opcodes, as a slice of a Varcode vector.
Definition: opcodes.h:19
unsigned optional_section_length
Optional section length decoded from the message.
Definition: decoder.h:24
Input in
Input data.
Definition: decoder.h:16
String functions.
Definition: benchmark.h:13
Interpreter for data descriptor sections.
Definition: interpreter.h:25
Definition: associated_fields.h:12
unsigned subset_count
Number of subsets in data section.
Definition: decoder.h:138
size_t expected_subsets
Number of expected subsets (read in decode_header, used in decode_data)
Definition: decoder.h:20
Definition: decoder.h:159
Represent a BUFR/CREX data subset as a list of decoded variables.
Definition: subset.h:13
bool conf_add_undef_attrs
True if undefined attributes are added to the output, else false.
Definition: decoder.h:22
BUFR bulletin implementation.
Definition: bulletin.h:228