libwreport  3.23
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 
108  virtual int decode_c03_refval_override(unsigned bits) = 0;
109 
111  virtual void print_last_variable_added(FILE* out) = 0;
112 
114  virtual void print_last_attribute_added(FILE* out, Varcode code, unsigned pos) = 0;
115 };
116 
118 {
121 
123 
124  const Subset& reference_subset() const override;
125  Varinfo lookup_info(unsigned pos) const override;
126  Var decode_uniform_b_value(Varinfo info) override;
127  const Var& decode_and_add_to_all(Varinfo info) override;
128  const Var& decode_and_add_bitmap(const Tables& tables, Varcode code, unsigned bitmap_size) override;
129  void decode_and_set_attribute(Varinfo info, unsigned pos) override;
130  void decode_and_add_b_value(Varinfo info) override;
131  void decode_and_add_b_value_with_associated_field(Varinfo info, const bulletin::AssociatedField& field) override;
132  void decode_and_add_raw_character_data(Varinfo info) override;
133  int decode_c03_refval_override(unsigned bits) override;
134 
135  void print_last_variable_added(FILE* out) override;
136  void print_last_attribute_added(FILE* out, Varcode code, unsigned pos) override;
137 };
138 
140 {
143 
145  unsigned subset_count;
146 
148 
149  const Subset& reference_subset() const override;
150  Varinfo lookup_info(unsigned pos) const override;
151  Var decode_uniform_b_value(Varinfo info) override;
152  const Var& decode_and_add_to_all(Varinfo info) override;
153  const Var& decode_and_add_bitmap(const Tables& tables, Varcode code, unsigned bitmap_size) override;
154  void decode_and_set_attribute(Varinfo info, unsigned pos) override;
155  void decode_and_add_b_value(Varinfo info) override;
156  void decode_and_add_b_value_with_associated_field(Varinfo info, const bulletin::AssociatedField& field) override;
157  void decode_and_add_raw_character_data(Varinfo info) override;
158  int decode_c03_refval_override(unsigned bits) override;
159 
160  void print_last_variable_added(FILE* out) override;
161  void print_last_attribute_added(FILE* out, Varcode code, unsigned pos) override;
162 
163 protected:
164  void decode_b_value(Varinfo info, std::function<void(unsigned, Var&&)> dest);
165 };
166 
168 {
169  DecoderTarget& target;
170 
171  DataSectionDecoder(Bulletin& bulletin, DecoderTarget& target);
172 
173  unsigned define_delayed_replication_factor(Varinfo info) override;
174  unsigned define_associated_field_significance(Varinfo info) override;
175  unsigned define_bitmap_delayed_replication_factor(Varinfo info) override;
176  void define_c03_refval_override(Varcode code) override;
177  void define_bitmap(unsigned bitmap_size) override;
178  void define_attribute(Varinfo info, unsigned pos) override;
179  void define_substituted_value(unsigned pos) override;
180  void define_variable(Varinfo info) override;
181  void define_variable_with_associated_field(Varinfo info) override;
182  void define_raw_character_data(Varcode code) override;
183 };
184 
186 {
187 protected:
194  void print_lead(Varcode code);
195  void print_lead_continued();
196 
197 public:
198  FILE* out;
199 
206  unsigned indent = 0;
207 
209  unsigned indent_step = 2;
210 
211  VerboseDataSectionDecoder(Bulletin& bulletin, DecoderTarget& target, FILE* out);
212 
213  void b_variable(Varcode code) override;
214  void c_modifier(Varcode code, Opcodes& next) override;
215  void r_replication(Varcode code, Varcode delayed_code, const Opcodes& ops) override;
216  void run_d_expansion(Varcode code) override;
217  unsigned define_delayed_replication_factor(Varinfo info) override;
218  unsigned define_associated_field_significance(Varinfo info) override;
219  unsigned define_bitmap_delayed_replication_factor(Varinfo info) override;
220  void define_c03_refval_override(Varcode code) override;
221  void define_bitmap(unsigned bitmap_size) override;
222  void define_attribute(Varinfo info, unsigned pos) override;
223  void define_substituted_value(unsigned pos) override;
224  void define_variable(Varinfo info) override;
225  void define_variable_with_associated_field(Varinfo info) override;
226  void define_raw_character_data(Varcode code) override;
227 };
228 
229 }
230 }
231 #endif
Options used to configure BUFR decoding.
Definition: bulletin.h:201
Input & in
Input buffer.
Definition: decoder.h:45
Bulletin & out
Output bulletin.
Definition: decoder.h:142
A physical variable.
Definition: var.h:24
Subset & out
Subset where decoded variables go.
Definition: decoder.h:120
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:30
Definition: decoder.h:42
uint16_t Varcode
Holds the WMO variable code of a variable.
Definition: fwd.h:11
Information about a variable.
Definition: varinfo.h:136
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:145
size_t expected_subsets
Number of expected subsets (read in decode_header, used in decode_data)
Definition: decoder.h:20
Definition: decoder.h:167
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:229