Shearwater: extract log version from header

The earliest document I have references log version 6. There are
apparently older versions, but I don't know what the differences
are. Before version 7, the log version wasn't always reliably
stored, so we assume 6 is the minimum and use 7 (or later) if we
find it.

[Jef Driesen: Initialize and reset the cache correctly.]

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2017-07-07 07:03:13 -07:00 committed by Jef Driesen
parent 428704b538
commit 9f754dc563

View File

@ -60,6 +60,7 @@ struct shearwater_predator_parser_t {
unsigned int samplesize;
// Cached fields.
unsigned int cached;
unsigned int logversion;
unsigned int headersize;
unsigned int footersize;
unsigned int ngasmixes;
@ -139,6 +140,7 @@ shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsig
parser->petrel = petrel;
parser->samplesize = samplesize;
parser->cached = 0;
parser->logversion = 0;
parser->headersize = 0;
parser->footersize = 0;
parser->ngasmixes = 0;
@ -175,6 +177,7 @@ shearwater_predator_parser_set_data (dc_parser_t *abstract, const unsigned char
// Reset the cache.
parser->cached = 0;
parser->logversion = 0;
parser->headersize = 0;
parser->footersize = 0;
parser->ngasmixes = 0;
@ -226,6 +229,12 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
return DC_STATUS_DATAFORMAT;
}
// Log versions before 6 weren't reliably stored in the data, but
// 6 is also the oldest version that we assume in our code
unsigned int logversion = 6;
if (data[127] > 6)
logversion = data[127];
// Adjust the footersize for the final block.
if (parser->petrel || array_uint16_be (data + size - footersize) == 0xFFFD) {
footersize += SZ_BLOCK;
@ -304,6 +313,7 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
}
// Cache the data for later use.
parser->logversion = logversion;
parser->headersize = headersize;
parser->footersize = footersize;
parser->ngasmixes = ngasmixes;