/usr/include/wreport/opcode.h is in libwreport-dev 2.14-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 | /*
* Copyright (C) 2005--2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Author: Enrico Zini <enrico@enricozini.com>
*/
#ifndef WREPORT_OPCODE_H
#define WREPORT_OPCODE_H
/** @file
* @ingroup wreport
* Implementation of opcode chains, that are used to drive the encoding and
* decoding process.
*/
#include <wreport/varinfo.h>
#include <vector>
#include <cstdio>
namespace wreport {
namespace opcode {
struct Visitor;
}
struct Vartable;
struct DTable;
/**
* Sequence of opcodes, as a slice of a Varcode vector.
*
* This is used for BUFR and CREX encoding and decoding.
*
* It can be considered as a sort of subroutine to be interpreted by the
* encoders/decoders.
*/
struct Opcodes
{
/// Reference to the vector with all the expanded varcodes
const std::vector<Varcode>& vals;
/// First element of the varcode sequence in Opcodes::vals
unsigned begin;
/// One-past-the-last element of the varcode sequence in Opcodes::vals
unsigned end;
/// Sequence spanning the whole vector
Opcodes(const std::vector<Varcode>& vals) : vals(vals), begin(0), end(vals.size()) {}
/// Sequence from begin (inclusive) to end (excluded)
Opcodes(const std::vector<Varcode>& vals, unsigned begin, unsigned end)
: vals(vals), begin(begin), end(end) {}
/// Copy constructor
Opcodes(const Opcodes& o) : vals(o.vals), begin(o.begin), end(o.end) {}
/**
* Assignment only works if the Opcodes share the same vector.
*
* @warning: for efficiency reasons, we do not check for it
*/
Opcodes& operator=(const Opcodes& o)
{
begin = o.begin;
end = o.end;
return *this;
}
/// Return the i-th varcode in the chain
Varcode operator[](unsigned i) const
{
if (begin + i > end)
return 0;
else
return vals[begin + i];
}
/// Number of items in this opcode list
unsigned size() const { return end - begin; }
/// True if there are no opcodes
bool empty() const { return begin == end; }
/// First opcode in the list (0 if the list is empty)
Varcode head() const
{
if (begin == end)
return 0;
return vals[begin];
}
/**
* List of all opcodes after the first one
*
* If the list is empty, return the empty list
*/
Opcodes next() const
{
if (begin == end)
return *this;
else
return Opcodes(vals, begin+1, end);
}
/// Return the opcodes from \a skip until the end
Opcodes sub(unsigned skip) const
{
if (begin + skip > end)
return Opcodes(vals, end, end);
else
return Opcodes(vals, begin + skip, end);
}
/// Return \a len opcodes starting from \a skip
Opcodes sub(unsigned skip, unsigned len) const
{
if (begin + skip > end)
return Opcodes(vals, end, end);
else if (begin + skip + len > end)
return Opcodes(vals, begin + skip, end);
else
return Opcodes(vals, begin + skip, begin + skip + len);
}
/**
* Walk the structure of the opcodes sending events to an opcode::Visitor.
*
* Initialise e.dtable with \a dtable.
*/
void visit(opcode::Visitor& e, const DTable& dtable) const;
/**
* Walk the structure of the opcodes sending events to an opcode::Visitor
*
* Assume that e.dtable is already initialised.
*/
void visit(opcode::Visitor& e) const;
/// Print the contents of this opcode list
void print(FILE* out) const;
};
namespace opcode
{
/**
* Visitor-style interface for scanning the contents of a data descriptor
* section.
*
* This supports scanning the DDS without looking at the data, so it cannot be
* used for encoding/decoding, as it cannot access the data that controls
* decoding such as delayed replicator factors or data descriptor bitmaps.
*
* All interface methods have a default implementations that do nothing, so you
* can override only what you need.
*/
struct Visitor
{
/**
* D table to use to expand D groups.
*
* This must be provided by the caller
*/
const DTable* dtable;
Visitor();
virtual ~Visitor();
/**
* Notify of a B variable entry
*
* @param code
* The B variable code
*/
virtual void b_variable(Varcode code);
/**
* Notify of a C modifier
*
* Whenever the modifier is a supported one, this is followed by an
* invocation of one of the specific c_* methods.
*
* @param code
* The C modifier code
*/
virtual void c_modifier(Varcode code);
/**
* Notify a change of data width
*
* @param code
* The C modifier code
* @param change
* The width change (positive or negative)
*/
virtual void c_change_data_width(Varcode code, int change);
/**
* Notify a change of data scale
*
* @param code
* The C modifier code
* @param change
* The scale change (positive or negative)
*/
virtual void c_change_data_scale(Varcode code, int change);
/**
* Notify the declaration of an associated field for the next values.
*
* @param code
* The C modifier code
* @param sig_code
* The B code of the associated field significance opcode (or 0 to mark
* the end of the associated field encoding)
* @param nbits
* The number of bits used for the associated field.
*/
virtual void c_associated_field(Varcode code, Varcode sig_code, unsigned nbits);
/**
* Notify raw character data encoded via a C modifier
*
* @param code
* The C modifier code
*/
virtual void c_char_data(Varcode code);
/**
* Notify an override of character data length
*
* @param code
* The C modifier code
* @param new_length
* New length of all following character data (or 0 to reset to default)
*/
virtual void c_char_data_override(Varcode code, unsigned new_length);
/**
* Notify a bitmap for quality information data
*
* @param code
* The C modifier code
*/
virtual void c_quality_information_bitmap(Varcode code);
/**
* Notify a bitmap for substituted values
*
* @param code
* The C modifier code
*/
virtual void c_substituted_value_bitmap(Varcode code);
/**
* Notify a substituted value
*
* @param code
* The C modifier code
*/
virtual void c_substituted_value(Varcode code);
/**
* Notify the length of the following local descriptor
*
* @param code
* The C modifier code
* @param desc_code
* Local descriptor for which the length is provided
* @param nbits
* Bit size of the data described by \a desc_code
*/
virtual void c_local_descriptor(Varcode code, Varcode desc_code, unsigned nbits);
/**
* Notify a replicated section
*
* @param code
* The R replication code
* @param delayed_code
* The delayed replication B code, or 0 if delayed replication is not
* used
* @param ops
* The replicated operators
*/
virtual void r_replication(Varcode code, Varcode delayed_code, const Opcodes& ops);
/**
* Notify the start of a D group
*
* @param code
* The D code that is being expanded
*/
virtual void d_group_begin(Varcode code);
/**
* Notify the end of a D group
*
* @param code
* The D code that has just been expanded
*/
virtual void d_group_end(Varcode code);
/**
* Notify an increase of scale, reference value and data width
*
* @param code
* The C modifier code
* @param change
* The increase, to be handled according to table C, X=7
*/
virtual void c_increase_scale_ref_width(Varcode code, int change);
};
/**
* opcode::Visitor that pretty-prints the opcodes using indentation to show
* structure
*/
class Printer : public Visitor
{
protected:
/**
* Print line lead (indentation and formatted code)
*
* @param code
* Code to format in the line lead
*/
void print_lead(Varcode code);
public:
/**
* Output stream.
*
* It defaults to stdout, but it can be set to any FILE* stream
*/
FILE* out;
/**
* Table used to get variable descriptions (optional).
*
* It defaults to NULL, but if it is set, the output will contain
* descriptions of B variable entries
*/
const Vartable* btable;
/**
* Current indent level
*
* It defaults to 0 in a newly created Printer. You can set it to some
* other value to indent all the output by the given amount of spaces
*/
unsigned indent;
/// How many spaces in an indentation level
unsigned indent_step;
Printer();
virtual void b_variable(Varcode code);
virtual void c_modifier(Varcode code);
virtual void c_change_data_width(Varcode code, int change);
virtual void c_change_data_scale(Varcode code, int change);
virtual void c_associated_field(Varcode code, Varcode sig_code, unsigned nbits);
virtual void c_char_data(Varcode code);
virtual void c_char_data_override(Varcode code, unsigned new_length);
virtual void c_quality_information_bitmap(Varcode code);
virtual void c_substituted_value_bitmap(Varcode code);
virtual void c_substituted_value(Varcode code);
virtual void c_local_descriptor(Varcode code, Varcode desc_code, unsigned nbits);
virtual void r_replication(Varcode code, Varcode delayed_code, const Opcodes& ops);
virtual void d_group_begin(Varcode code);
virtual void d_group_end(Varcode code);
};
}
}
#endif
|