From 63f5a4d652f9dcb96fbec6f5bf74ecc6b8b388ba Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Fri, 23 Apr 2021 22:02:25 +0200 Subject: [PATCH] Remove the dc_parser_set_data function The dc_parser_set_data() function allows to re-use a parser object for multiple dives. The advantages of this feature are actually very limited in practice. The reduction in memory consumption is almost negligible, because the amount of internal state in the parser is typically very small. But the implementation requires some additional complexity because each backend needs code to reset its internal state. Therefore, the function is removed and the data and size needs to be passed directly to the dc_parser_new() and dc_parser_new2() functions instead. Because keeping a reference to the data has also caused issues in the past, especially for applications implemented in a garbage collected language, the data will now also get copied internally. --- doc/man/Makefile.am | 1 - doc/man/dc_device_foreach.3 | 4 +- doc/man/dc_parser_get_datetime.3 | 4 +- doc/man/dc_parser_get_field.3 | 4 +- doc/man/dc_parser_new.3 | 4 - doc/man/dc_parser_samples_foreach.3 | 4 +- doc/man/dc_parser_set_data.3 | 65 ------------- doc/man/libdivecomputer.3 | 4 +- examples/dctool_download.c | 10 +- examples/dctool_parse.c | 10 +- include/libdivecomputer/parser.h | 7 +- src/atomics_cobalt.h | 2 +- src/atomics_cobalt_parser.c | 13 +-- src/citizen_aqualand.h | 2 +- src/citizen_aqualand_parser.c | 13 +-- src/cochran_commander.h | 2 +- src/cochran_commander_parser.c | 13 +-- src/cressi_edy.h | 2 +- src/cressi_edy_parser.c | 13 +-- src/cressi_goa.h | 2 +- src/cressi_goa_parser.c | 12 +-- src/cressi_leonardo.h | 2 +- src/cressi_leonardo_parser.c | 13 +-- src/deepblu_cosmiq.h | 2 +- src/deepblu_cosmiq_parser.c | 12 +-- src/deepsix_excursion.h | 2 +- src/deepsix_excursion_parser.c | 23 +---- src/diverite_nitekq.h | 2 +- src/diverite_nitekq_parser.c | 13 +-- src/divesoft_freedom.h | 2 +- src/divesoft_freedom_parser.c | 50 +--------- src/divesystem_idive.h | 2 +- src/divesystem_idive_parser.c | 35 +------ src/hw_ostc.h | 2 +- src/hw_ostc3.h | 2 +- src/hw_ostc_parser.c | 41 ++------ src/libdivecomputer.symbols | 1 - src/liquivision_lynx.h | 2 +- src/liquivision_lynx_parser.c | 29 +----- src/mares_darwin.h | 2 +- src/mares_darwin_parser.c | 13 +-- src/mares_iconhd.h | 2 +- src/mares_iconhd_parser.c | 41 +------- src/mares_nemo.h | 2 +- src/mares_nemo_parser.c | 83 ++++++---------- src/mclean_extreme.h | 2 +- src/mclean_extreme_parser.c | 21 +---- src/oceanic_atom2.h | 2 +- src/oceanic_atom2_parser.c | 28 +----- src/oceanic_veo250.h | 2 +- src/oceanic_veo250_parser.c | 20 +--- src/oceanic_vtpro.h | 2 +- src/oceanic_vtpro_parser.c | 20 +--- src/oceans_s1.h | 2 +- src/oceans_s1_parser.c | 23 +---- src/parser-private.h | 6 +- src/parser.c | 130 +++++++++++++------------- src/reefnet_sensus.h | 2 +- src/reefnet_sensus_parser.c | 20 +--- src/reefnet_sensuspro.h | 2 +- src/reefnet_sensuspro_parser.c | 20 +--- src/reefnet_sensusultra.h | 2 +- src/reefnet_sensusultra_parser.c | 20 +--- src/seac_screen.h | 2 +- src/seac_screen_parser.c | 23 +---- src/shearwater_petrel.h | 2 +- src/shearwater_predator.h | 2 +- src/shearwater_predator_parser.c | 63 ++----------- src/sporasub_sp2.h | 2 +- src/sporasub_sp2_parser.c | 13 +-- src/suunto_d9.h | 2 +- src/suunto_d9_parser.c | 28 +----- src/suunto_eon.h | 2 +- src/suunto_eon_parser.c | 22 +---- src/suunto_eonsteel.h | 2 +- src/suunto_eonsteel_parser.c | 20 +--- src/suunto_solution.h | 2 +- src/suunto_solution_parser.c | 20 +--- src/suunto_vyper.h | 2 +- src/suunto_vyper_parser.c | 25 +---- src/tecdiving_divecomputereu.h | 2 +- src/tecdiving_divecomputereu_parser.c | 13 +-- src/uwatec_memomouse.h | 2 +- src/uwatec_memomouse_parser.c | 13 +-- src/uwatec_smart.h | 2 +- src/uwatec_smart_parser.c | 31 +----- 86 files changed, 229 insertions(+), 959 deletions(-) delete mode 100644 doc/man/dc_parser_set_data.3 diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am index 63f9e85..4ea44de 100644 --- a/doc/man/Makefile.am +++ b/doc/man/Makefile.am @@ -32,7 +32,6 @@ MANPAGES = \ dc_parser_get_field.3 \ dc_parser_new.3 \ dc_parser_samples_foreach.3 \ - dc_parser_set_data.3 \ dc_bluetooth_open.3 \ dc_bluetooth_iterator_new.3 \ dc_bluetooth_device_get_address.3 \ diff --git a/doc/man/dc_device_foreach.3 b/doc/man/dc_device_foreach.3 index a349a72..86782f8 100644 --- a/doc/man/dc_device_foreach.3 +++ b/doc/man/dc_device_foreach.3 @@ -53,7 +53,7 @@ with Each dive invokes .Fa callback with the dive data, which should be parsed with -.Xr dc_parser_set_data 3 , +.Xr dc_parser_new 3 , and the binary fingerprint of the dive. The fingerprint can be used to record the newest dive and stop processing (on subsequent invocations) when the same dive fingerprint is @@ -72,7 +72,7 @@ If returns zero, this will not be reflected in the return value (usually .Dv DC_STATUS_SUCCESS ) . .Sh SEE ALSO -.Xr dc_parser_set_data 3 +.Xr dc_parser_new 3 .Sh AUTHORS The .Lb libdivecomputer diff --git a/doc/man/dc_parser_get_datetime.3 b/doc/man/dc_parser_get_datetime.3 index ba1f365..0b7b707 100644 --- a/doc/man/dc_parser_get_datetime.3 +++ b/doc/man/dc_parser_get_datetime.3 @@ -37,7 +37,7 @@ Extract the date and time of a dive, .Fa parser , previously initialised with -.Xr dc_parser_set_data 3 . +.Xr dc_parser_new 3 . This returns the broken-down time-stamp of the dive in the local time of the dive. .Pp @@ -57,7 +57,7 @@ messages on further failure. .Sh SEE ALSO .Xr dc_datetime_gmtime 3 , .Xr dc_datetime_localtime 3 , -.Xr dc_parser_set_data 3 +.Xr dc_parser_new 3 .Sh AUTHORS The .Lb libdivecomputer diff --git a/doc/man/dc_parser_get_field.3 b/doc/man/dc_parser_get_field.3 index a4c33f2..0f6455d 100644 --- a/doc/man/dc_parser_get_field.3 +++ b/doc/man/dc_parser_get_field.3 @@ -39,7 +39,7 @@ Extract a field from a dive, .Fa parser , previously initialised with -.Xr dc_parser_set_data 3 . +.Xr dc_parser_new 3 . The .Fa value field type depends upon the @@ -187,7 +187,7 @@ if the field was retrieved, if the field is not supported by the device, or other error messages on further failure. .Sh SEE ALSO -.Xr dc_parser_set_data 3 +.Xr dc_parser_new 3 .Sh AUTHORS The .Lb libdivecomputer diff --git a/doc/man/dc_parser_new.3 b/doc/man/dc_parser_new.3 index 4bfe451..e5340f0 100644 --- a/doc/man/dc_parser_new.3 +++ b/doc/man/dc_parser_new.3 @@ -53,10 +53,6 @@ parameter; and .Nm dc_parser_new2 , which is given device values (model, etc.) directly. .Pp -After filling in the -.Fa parser -parameter, one usually sets parser data with -.Xr dc_parser_set_data 3 . The pointer must later be freed with .Xr dc_parser_destroy 3 . .Sh RETURN VALUES diff --git a/doc/man/dc_parser_samples_foreach.3 b/doc/man/dc_parser_samples_foreach.3 index d741a43..69a637f 100644 --- a/doc/man/dc_parser_samples_foreach.3 +++ b/doc/man/dc_parser_samples_foreach.3 @@ -42,7 +42,7 @@ .Fc .Sh DESCRIPTION Extract the samples taken during a dive as previously initialised with -.Xr dc_parser_set_data 3 . +.Xr dc_parser_new 3 . Each sample is passed to .Fa callback with the @@ -184,7 +184,7 @@ Returns .Dv DC_STATUS_OK on success and another code on failure. .Sh SEE ALSO -.Xr dc_parser_set_data 3 +.Xr dc_parser_new 3 .Sh AUTHORS The .Lb libdivecomputer diff --git a/doc/man/dc_parser_set_data.3 b/doc/man/dc_parser_set_data.3 deleted file mode 100644 index 39af43b..0000000 --- a/doc/man/dc_parser_set_data.3 +++ /dev/null @@ -1,65 +0,0 @@ -.\" -.\" libdivecomputer -.\" -.\" Copyright (C) 2017 Kristaps Dzonsons -.\" -.\" This library is free software; you can redistribute it and/or -.\" modify it under the terms of the GNU Lesser General Public -.\" License as published by the Free Software Foundation; either -.\" version 2.1 of the License, or (at your option) any later version. -.\" -.\" This library 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 -.\" Lesser General Public License for more details. -.\" -.\" You should have received a copy of the GNU Lesser General Public -.\" License along with this library; if not, write to the Free Software -.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -.\" MA 02110-1301 USA -.\" -.Dd January 5, 2017 -.Dt DC_PARSER_SET_DATA 3 -.Os -.Sh NAME -.Nm dc_parser_set_data -.Nd assigns parse data to a dive parser -.Sh LIBRARY -.Lb libdivecomputer -.Sh SYNOPSIS -.In libdivecomputer/parser.h -.Ft dc_status_t -.Fo dc_parser_set_data -.Fa "dc_parser_t *parser" -.Fa "const unsigned char *data" -.Fa "unsigned int size" -.Fc -.Sh DESCRIPTION -Assigns the binary sequence -.Fa data -of length -.Fa size -bytes to -.Fa parser , -which was created with -.Xr dc_parser_new 3 . -How the data is parsed depends upon the values provided to -.Xr dc_parser_new 3 . -The data usually comes from the callback assigned to -.Xr dc_device_foreach 3 . -.Sh RETURN VALUES -Returns -.Dv DC_STATUS_OK -on success and another code on failure. -.Sh SEE ALSO -.Xr dc_device_foreach 3 , -.Xr dc_parser_new 3 -.Sh AUTHORS -The -.Lb libdivecomputer -library was written by -.An Jef Driesen , -.Mt jef@libdivecomputer.org . -The manpages were written by -.An Kristaps Dzonsons , -.Mt kristaps@bsd.lv . diff --git a/doc/man/libdivecomputer.3 b/doc/man/libdivecomputer.3 index 4e1f601..cbe22eb 100644 --- a/doc/man/libdivecomputer.3 +++ b/doc/man/libdivecomputer.3 @@ -82,9 +82,7 @@ Iterate over all dives with .Xr dc_device_foreach 3 . .It For each iterated dive, create a new parser with -.Xr dc_parser_new 3 -and set the parsed data with -.Xr dc_parser_set_data 3 . +.Xr dc_parser_new 3 . .It Get attributes of the parsed dive with .Xr dc_parser_get_field 3 . diff --git a/examples/dctool_download.c b/examples/dctool_download.c index 04aedcf..29742e0 100644 --- a/examples/dctool_download.c +++ b/examples/dctool_download.c @@ -80,20 +80,12 @@ dive_cb (const unsigned char *data, unsigned int size, const unsigned char *fing // Create the parser. message ("Creating the parser.\n"); - rc = dc_parser_new (&parser, divedata->device); + rc = dc_parser_new (&parser, divedata->device, data, size); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error creating the parser."); goto cleanup; } - // Register the data. - message ("Registering the data.\n"); - rc = dc_parser_set_data (parser, data, size); - if (rc != DC_STATUS_SUCCESS) { - ERROR ("Error registering the data."); - goto cleanup; - } - // Parse the dive data. message ("Parsing the dive data.\n"); rc = dctool_output_write (divedata->output, parser, data, size, fingerprint, fsize); diff --git a/examples/dctool_parse.c b/examples/dctool_parse.c index 5908d62..4ecf30e 100644 --- a/examples/dctool_parse.c +++ b/examples/dctool_parse.c @@ -54,7 +54,7 @@ parse (dc_buffer_t *buffer, dc_context_t *context, dc_descriptor_t *descriptor, // Create the parser. message ("Creating the parser.\n"); - rc = dc_parser_new2 (&parser, context, descriptor); + rc = dc_parser_new2 (&parser, context, descriptor, data, size); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error creating the parser."); goto cleanup; @@ -68,14 +68,6 @@ parse (dc_buffer_t *buffer, dc_context_t *context, dc_descriptor_t *descriptor, goto cleanup; } - // Register the data. - message ("Registering the data.\n"); - rc = dc_parser_set_data (parser, data, size); - if (rc != DC_STATUS_SUCCESS) { - ERROR ("Error registering the data."); - goto cleanup; - } - // Parse the dive data. message ("Parsing the dive data.\n"); rc = dctool_output_write (output, parser, data, size, NULL, 0); diff --git a/include/libdivecomputer/parser.h b/include/libdivecomputer/parser.h index 8662499..ee69e42 100644 --- a/include/libdivecomputer/parser.h +++ b/include/libdivecomputer/parser.h @@ -276,10 +276,10 @@ typedef struct dc_parser_t dc_parser_t; typedef void (*dc_sample_callback_t) (dc_sample_type_t type, const dc_sample_value_t *value, void *userdata); dc_status_t -dc_parser_new (dc_parser_t **parser, dc_device_t *device); +dc_parser_new (dc_parser_t **parser, dc_device_t *device, const unsigned char data[], size_t size); dc_status_t -dc_parser_new2 (dc_parser_t **parser, dc_context_t *context, dc_descriptor_t *descriptor); +dc_parser_new2 (dc_parser_t **parser, dc_context_t *context, dc_descriptor_t *descriptor, const unsigned char data[], size_t size); dc_family_t dc_parser_get_type (dc_parser_t *parser); @@ -293,9 +293,6 @@ dc_parser_set_atmospheric (dc_parser_t *parser, double atmospheric); dc_status_t dc_parser_set_density (dc_parser_t *parser, double density); -dc_status_t -dc_parser_set_data (dc_parser_t *parser, const unsigned char *data, unsigned int size); - dc_status_t dc_parser_get_datetime (dc_parser_t *parser, dc_datetime_t *datetime); diff --git a/src/atomics_cobalt.h b/src/atomics_cobalt.h index 09f0226..8c70641 100644 --- a/src/atomics_cobalt.h +++ b/src/atomics_cobalt.h @@ -36,7 +36,7 @@ dc_status_t atomics_cobalt_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -atomics_cobalt_parser_create (dc_parser_t **parser, dc_context_t *context); +atomics_cobalt_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/atomics_cobalt_parser.c b/src/atomics_cobalt_parser.c index f559b7b..7dc407a 100644 --- a/src/atomics_cobalt_parser.c +++ b/src/atomics_cobalt_parser.c @@ -43,7 +43,6 @@ struct atomics_cobalt_parser_t { double hydrostatic; }; -static dc_status_t atomics_cobalt_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t atomics_cobalt_parser_set_density (dc_parser_t *abstract, double density); static dc_status_t atomics_cobalt_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); @@ -52,7 +51,6 @@ static dc_status_t atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, static const dc_parser_vtable_t atomics_cobalt_parser_vtable = { sizeof(atomics_cobalt_parser_t), DC_FAMILY_ATOMICS_COBALT, - atomics_cobalt_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ atomics_cobalt_parser_set_density, /* set_density */ @@ -64,7 +62,7 @@ static const dc_parser_vtable_t atomics_cobalt_parser_vtable = { dc_status_t -atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context) +atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { atomics_cobalt_parser_t *parser = NULL; @@ -72,7 +70,7 @@ atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (atomics_cobalt_parser_t *) dc_parser_allocate (context, &atomics_cobalt_parser_vtable); + parser = (atomics_cobalt_parser_t *) dc_parser_allocate (context, &atomics_cobalt_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -87,13 +85,6 @@ atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -atomics_cobalt_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t atomics_cobalt_parser_set_density (dc_parser_t *abstract, double density) { diff --git a/src/citizen_aqualand.h b/src/citizen_aqualand.h index ac47cb6..bc23311 100644 --- a/src/citizen_aqualand.h +++ b/src/citizen_aqualand.h @@ -35,7 +35,7 @@ dc_status_t citizen_aqualand_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -citizen_aqualand_parser_create (dc_parser_t **parser, dc_context_t *context); +citizen_aqualand_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/citizen_aqualand_parser.c b/src/citizen_aqualand_parser.c index 32816b4..ff1ea9e 100644 --- a/src/citizen_aqualand_parser.c +++ b/src/citizen_aqualand_parser.c @@ -36,7 +36,6 @@ typedef struct citizen_aqualand_parser_t { dc_parser_t base; } citizen_aqualand_parser_t; -static dc_status_t citizen_aqualand_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t citizen_aqualand_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t citizen_aqualand_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t citizen_aqualand_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -44,7 +43,6 @@ static dc_status_t citizen_aqualand_parser_samples_foreach (dc_parser_t *abstrac static const dc_parser_vtable_t citizen_aqualand_parser_vtable = { sizeof(citizen_aqualand_parser_t), DC_FAMILY_CITIZEN_AQUALAND, - citizen_aqualand_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -56,7 +54,7 @@ static const dc_parser_vtable_t citizen_aqualand_parser_vtable = { dc_status_t -citizen_aqualand_parser_create (dc_parser_t **out, dc_context_t *context) +citizen_aqualand_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { citizen_aqualand_parser_t *parser = NULL; @@ -64,7 +62,7 @@ citizen_aqualand_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (citizen_aqualand_parser_t *) dc_parser_allocate (context, &citizen_aqualand_parser_vtable); + parser = (citizen_aqualand_parser_t *) dc_parser_allocate (context, &citizen_aqualand_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -76,13 +74,6 @@ citizen_aqualand_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -citizen_aqualand_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t citizen_aqualand_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/cochran_commander.h b/src/cochran_commander.h index 84a521e..1a36676 100644 --- a/src/cochran_commander.h +++ b/src/cochran_commander.h @@ -35,7 +35,7 @@ dc_status_t cochran_commander_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -cochran_commander_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +cochran_commander_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/cochran_commander_parser.c b/src/cochran_commander_parser.c index 5d2d9b7..aeaf25c 100644 --- a/src/cochran_commander_parser.c +++ b/src/cochran_commander_parser.c @@ -99,7 +99,6 @@ typedef struct cochran_commander_parser_t { unsigned int nevents; } cochran_commander_parser_t ; -static dc_status_t cochran_commander_parser_set_data (dc_parser_t *parser, const unsigned char *data, unsigned int size); static dc_status_t cochran_commander_parser_get_datetime (dc_parser_t *parser, dc_datetime_t *datetime); static dc_status_t cochran_commander_parser_get_field (dc_parser_t *parser, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t cochran_commander_parser_samples_foreach (dc_parser_t *parser, dc_sample_callback_t callback, void *userdata); @@ -107,7 +106,6 @@ static dc_status_t cochran_commander_parser_samples_foreach (dc_parser_t *parser static const dc_parser_vtable_t cochran_commander_parser_vtable = { sizeof(cochran_commander_parser_t), DC_FAMILY_COCHRAN_COMMANDER, - cochran_commander_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -352,7 +350,7 @@ cochran_commander_backparse(cochran_commander_parser_t *parser, const unsigned c dc_status_t -cochran_commander_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +cochran_commander_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { cochran_commander_parser_t *parser = NULL; dc_status_t status = DC_STATUS_SUCCESS; @@ -361,7 +359,7 @@ cochran_commander_parser_create (dc_parser_t **out, dc_context_t *context, unsig return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (cochran_commander_parser_t *) dc_parser_allocate (context, &cochran_commander_parser_vtable); + parser = (cochran_commander_parser_t *) dc_parser_allocate (context, &cochran_commander_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -407,13 +405,6 @@ error_free: } -static dc_status_t -cochran_commander_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t cochran_commander_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/cressi_edy.h b/src/cressi_edy.h index 7aa5a34..238e5df 100644 --- a/src/cressi_edy.h +++ b/src/cressi_edy.h @@ -35,7 +35,7 @@ dc_status_t cressi_edy_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -cressi_edy_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +cressi_edy_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/cressi_edy_parser.c b/src/cressi_edy_parser.c index 182fd11..6d46f63 100644 --- a/src/cressi_edy_parser.c +++ b/src/cressi_edy_parser.c @@ -38,7 +38,6 @@ struct cressi_edy_parser_t { unsigned int model; }; -static dc_status_t cressi_edy_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t cressi_edy_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t cressi_edy_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t cressi_edy_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -46,7 +45,6 @@ static dc_status_t cressi_edy_parser_samples_foreach (dc_parser_t *abstract, dc_ static const dc_parser_vtable_t cressi_edy_parser_vtable = { sizeof(cressi_edy_parser_t), DC_FAMILY_CRESSI_EDY, - cressi_edy_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -73,7 +71,7 @@ cressi_edy_parser_count_gasmixes (const unsigned char *data) } dc_status_t -cressi_edy_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +cressi_edy_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { cressi_edy_parser_t *parser = NULL; @@ -81,7 +79,7 @@ cressi_edy_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (cressi_edy_parser_t *) dc_parser_allocate (context, &cressi_edy_parser_vtable); + parser = (cressi_edy_parser_t *) dc_parser_allocate (context, &cressi_edy_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -96,13 +94,6 @@ cressi_edy_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int } -static dc_status_t -cressi_edy_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t cressi_edy_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/cressi_goa.h b/src/cressi_goa.h index 0a92512..63283a0 100644 --- a/src/cressi_goa.h +++ b/src/cressi_goa.h @@ -35,7 +35,7 @@ dc_status_t cressi_goa_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -cressi_goa_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +cressi_goa_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/cressi_goa_parser.c b/src/cressi_goa_parser.c index d5a9a34..2898662 100644 --- a/src/cressi_goa_parser.c +++ b/src/cressi_goa_parser.c @@ -62,7 +62,6 @@ typedef struct cressi_goa_layout_t { unsigned int temperature; } cressi_goa_layout_t; -static dc_status_t cressi_goa_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t cressi_goa_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t cressi_goa_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t cressi_goa_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -70,7 +69,6 @@ static dc_status_t cressi_goa_parser_samples_foreach (dc_parser_t *abstract, dc_ static const dc_parser_vtable_t cressi_goa_parser_vtable = { sizeof(cressi_goa_parser_t), DC_FAMILY_CRESSI_GOA, - cressi_goa_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -128,7 +126,7 @@ static const cressi_goa_layout_t layouts[] = { }; dc_status_t -cressi_goa_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +cressi_goa_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { cressi_goa_parser_t *parser = NULL; @@ -136,7 +134,7 @@ cressi_goa_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (cressi_goa_parser_t *) dc_parser_allocate (context, &cressi_goa_parser_vtable); + parser = (cressi_goa_parser_t *) dc_parser_allocate (context, &cressi_goa_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -149,12 +147,6 @@ cressi_goa_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int return DC_STATUS_SUCCESS; } -static dc_status_t -cressi_goa_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - static dc_status_t cressi_goa_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/cressi_leonardo.h b/src/cressi_leonardo.h index 982bb01..2efc4d8 100644 --- a/src/cressi_leonardo.h +++ b/src/cressi_leonardo.h @@ -35,7 +35,7 @@ dc_status_t cressi_leonardo_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -cressi_leonardo_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +cressi_leonardo_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/cressi_leonardo_parser.c b/src/cressi_leonardo_parser.c index 3a6824e..df382c5 100644 --- a/src/cressi_leonardo_parser.c +++ b/src/cressi_leonardo_parser.c @@ -39,7 +39,6 @@ struct cressi_leonardo_parser_t { unsigned int model; }; -static dc_status_t cressi_leonardo_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t cressi_leonardo_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t cressi_leonardo_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t cressi_leonardo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -47,7 +46,6 @@ static dc_status_t cressi_leonardo_parser_samples_foreach (dc_parser_t *abstract static const dc_parser_vtable_t cressi_leonardo_parser_vtable = { sizeof(cressi_leonardo_parser_t), DC_FAMILY_CRESSI_LEONARDO, - cressi_leonardo_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -59,7 +57,7 @@ static const dc_parser_vtable_t cressi_leonardo_parser_vtable = { dc_status_t -cressi_leonardo_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +cressi_leonardo_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { cressi_leonardo_parser_t *parser = NULL; @@ -67,7 +65,7 @@ cressi_leonardo_parser_create (dc_parser_t **out, dc_context_t *context, unsigne return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (cressi_leonardo_parser_t *) dc_parser_allocate (context, &cressi_leonardo_parser_vtable); + parser = (cressi_leonardo_parser_t *) dc_parser_allocate (context, &cressi_leonardo_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -81,13 +79,6 @@ cressi_leonardo_parser_create (dc_parser_t **out, dc_context_t *context, unsigne } -static dc_status_t -cressi_leonardo_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t cressi_leonardo_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/deepblu_cosmiq.h b/src/deepblu_cosmiq.h index 3587812..0d0c29a 100644 --- a/src/deepblu_cosmiq.h +++ b/src/deepblu_cosmiq.h @@ -36,7 +36,7 @@ dc_status_t deepblu_cosmiq_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -deepblu_cosmiq_parser_create (dc_parser_t **parser, dc_context_t *context); +deepblu_cosmiq_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/deepblu_cosmiq_parser.c b/src/deepblu_cosmiq_parser.c index d744698..95b5ae7 100644 --- a/src/deepblu_cosmiq_parser.c +++ b/src/deepblu_cosmiq_parser.c @@ -41,7 +41,6 @@ typedef struct deepblu_cosmiq_parser_t { double hydrostatic; } deepblu_cosmiq_parser_t; -static dc_status_t deepblu_cosmiq_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t deepblu_cosmiq_parser_set_density (dc_parser_t *abstract, double density); static dc_status_t deepblu_cosmiq_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t deepblu_cosmiq_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); @@ -50,7 +49,6 @@ static dc_status_t deepblu_cosmiq_parser_samples_foreach (dc_parser_t *abstract, static const dc_parser_vtable_t deepblu_cosmiq_parser_vtable = { sizeof(deepblu_cosmiq_parser_t), DC_FAMILY_DEEPBLU_COSMIQ, - deepblu_cosmiq_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ deepblu_cosmiq_parser_set_density, /* set_density */ @@ -61,7 +59,7 @@ static const dc_parser_vtable_t deepblu_cosmiq_parser_vtable = { }; dc_status_t -deepblu_cosmiq_parser_create (dc_parser_t **out, dc_context_t *context) +deepblu_cosmiq_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { deepblu_cosmiq_parser_t *parser = NULL; @@ -69,7 +67,7 @@ deepblu_cosmiq_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (deepblu_cosmiq_parser_t *) dc_parser_allocate (context, &deepblu_cosmiq_parser_vtable); + parser = (deepblu_cosmiq_parser_t *) dc_parser_allocate (context, &deepblu_cosmiq_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -83,12 +81,6 @@ deepblu_cosmiq_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_SUCCESS; } -static dc_status_t -deepblu_cosmiq_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - static dc_status_t deepblu_cosmiq_parser_set_density (dc_parser_t *abstract, double density) { diff --git a/src/deepsix_excursion.h b/src/deepsix_excursion.h index 42ecffc..839511f 100644 --- a/src/deepsix_excursion.h +++ b/src/deepsix_excursion.h @@ -35,7 +35,7 @@ dc_status_t deepsix_excursion_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -deepsix_excursion_parser_create (dc_parser_t **parser, dc_context_t *context); +deepsix_excursion_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/deepsix_excursion_parser.c b/src/deepsix_excursion_parser.c index 919fb6a..52d06af 100644 --- a/src/deepsix_excursion_parser.c +++ b/src/deepsix_excursion_parser.c @@ -112,7 +112,6 @@ typedef struct deepsix_excursion_parser_t { deepsix_excursion_gasmix_t gasmix[MAX_GASMIXES]; } deepsix_excursion_parser_t; -static dc_status_t deepsix_excursion_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t deepsix_excursion_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t deepsix_excursion_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t deepsix_excursion_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -122,7 +121,6 @@ static dc_status_t deepsix_excursion_parser_samples_foreach_v1 (dc_parser_t *abs static const dc_parser_vtable_t deepsix_parser_vtable = { sizeof(deepsix_excursion_parser_t), DC_FAMILY_DEEPSIX_EXCURSION, - deepsix_excursion_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -185,7 +183,7 @@ deepsix_excursion_find_gasmix(deepsix_excursion_parser_t *parser, unsigned int o } dc_status_t -deepsix_excursion_parser_create (dc_parser_t **out, dc_context_t *context) +deepsix_excursion_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { deepsix_excursion_parser_t *parser = NULL; @@ -193,7 +191,7 @@ deepsix_excursion_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (deepsix_excursion_parser_t *) dc_parser_allocate (context, &deepsix_parser_vtable); + parser = (deepsix_excursion_parser_t *) dc_parser_allocate (context, &deepsix_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -213,23 +211,6 @@ deepsix_excursion_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_SUCCESS; } -static dc_status_t -deepsix_excursion_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - deepsix_excursion_parser_t *parser = (deepsix_excursion_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < MAX_GASMIXES; ++i) { - parser->gasmix[i].id = 0; - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - } - - return DC_STATUS_SUCCESS; -} - static dc_status_t deepsix_excursion_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/diverite_nitekq.h b/src/diverite_nitekq.h index e016cab..9bbf728 100644 --- a/src/diverite_nitekq.h +++ b/src/diverite_nitekq.h @@ -35,7 +35,7 @@ dc_status_t diverite_nitekq_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -diverite_nitekq_parser_create (dc_parser_t **parser, dc_context_t *context); +diverite_nitekq_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/diverite_nitekq_parser.c b/src/diverite_nitekq_parser.c index bb13446..d9f6dcc 100644 --- a/src/diverite_nitekq_parser.c +++ b/src/diverite_nitekq_parser.c @@ -49,7 +49,6 @@ struct diverite_nitekq_parser_t { double maxdepth; }; -static dc_status_t diverite_nitekq_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t diverite_nitekq_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t diverite_nitekq_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t diverite_nitekq_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -57,7 +56,6 @@ static dc_status_t diverite_nitekq_parser_samples_foreach (dc_parser_t *abstract static const dc_parser_vtable_t diverite_nitekq_parser_vtable = { sizeof(diverite_nitekq_parser_t), DC_FAMILY_DIVERITE_NITEKQ, - diverite_nitekq_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -69,7 +67,7 @@ static const dc_parser_vtable_t diverite_nitekq_parser_vtable = { dc_status_t -diverite_nitekq_parser_create (dc_parser_t **out, dc_context_t *context) +diverite_nitekq_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { diverite_nitekq_parser_t *parser = NULL; @@ -77,7 +75,7 @@ diverite_nitekq_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (diverite_nitekq_parser_t *) dc_parser_allocate (context, &diverite_nitekq_parser_vtable); + parser = (diverite_nitekq_parser_t *) dc_parser_allocate (context, &diverite_nitekq_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -101,13 +99,6 @@ diverite_nitekq_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -diverite_nitekq_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t diverite_nitekq_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/divesoft_freedom.h b/src/divesoft_freedom.h index db04edb..bca87b7 100644 --- a/src/divesoft_freedom.h +++ b/src/divesoft_freedom.h @@ -35,7 +35,7 @@ dc_status_t divesoft_freedom_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -divesoft_freedom_parser_create (dc_parser_t **parser, dc_context_t *context); +divesoft_freedom_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/divesoft_freedom_parser.c b/src/divesoft_freedom_parser.c index 51a229a..49c0f0f 100644 --- a/src/divesoft_freedom_parser.c +++ b/src/divesoft_freedom_parser.c @@ -254,7 +254,6 @@ typedef struct divesoft_freedom_parser_t { unsigned int calibrated; } divesoft_freedom_parser_t; -static dc_status_t divesoft_freedom_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t divesoft_freedom_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t divesoft_freedom_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t divesoft_freedom_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -262,7 +261,6 @@ static dc_status_t divesoft_freedom_parser_samples_foreach (dc_parser_t *abstrac static const dc_parser_vtable_t divesoft_freedom_parser_vtable = { sizeof(divesoft_freedom_parser_t), DC_FAMILY_DIVESOFT_FREEDOM, - divesoft_freedom_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -643,7 +641,7 @@ divesoft_freedom_cache (divesoft_freedom_parser_t *parser) } dc_status_t -divesoft_freedom_parser_create (dc_parser_t **out, dc_context_t *context) +divesoft_freedom_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { divesoft_freedom_parser_t *parser = NULL; @@ -651,7 +649,7 @@ divesoft_freedom_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (divesoft_freedom_parser_t *) dc_parser_allocate (context, &divesoft_freedom_parser_vtable); + parser = (divesoft_freedom_parser_t *) dc_parser_allocate (context, &divesoft_freedom_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -698,50 +696,6 @@ divesoft_freedom_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_SUCCESS; } -static dc_status_t -divesoft_freedom_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - divesoft_freedom_parser_t *parser = (divesoft_freedom_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->version = 0; - parser->headersize = 0; - parser->divetime = 0; - parser->divemode = 0; - parser->temperature_min = 0; - parser->maxdepth = 0; - parser->atmospheric = 0; - parser->avgdepth = 0; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - parser->gasmix[i].type = 0; - parser->gasmix[i].id = 0; - } - parser->diluent = UNDEFINED; - parser->ntanks = 0; - for (unsigned int i = 0; i < NTANKS; ++i) { - parser->tank[i].volume = 0; - parser->tank[i].workpressure = 0; - parser->tank[i].beginpressure = 0; - parser->tank[i].endpressure = 0; - parser->tank[i].transmitter = 0; - parser->tank[i].active = 0; - } - parser->vpm = 0; - parser->gf_lo = 0; - parser->gf_hi = 0; - parser->seawater = 0; - for (unsigned int i = 0; i < NSENSORS; ++i) { - parser->calibration[i] = 0; - } - parser->calibrated = 0; - - return DC_STATUS_SUCCESS; -} - static dc_status_t divesoft_freedom_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/divesystem_idive.h b/src/divesystem_idive.h index 1da80a0..91e1ea9 100644 --- a/src/divesystem_idive.h +++ b/src/divesystem_idive.h @@ -36,7 +36,7 @@ dc_status_t divesystem_idive_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t -divesystem_idive_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +divesystem_idive_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/divesystem_idive_parser.c b/src/divesystem_idive_parser.c index 28326a6..c7f5fb4 100644 --- a/src/divesystem_idive_parser.c +++ b/src/divesystem_idive_parser.c @@ -89,7 +89,6 @@ struct divesystem_idive_parser_t { unsigned int gf_high; }; -static dc_status_t divesystem_idive_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t divesystem_idive_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t divesystem_idive_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t divesystem_idive_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -97,7 +96,6 @@ static dc_status_t divesystem_idive_parser_samples_foreach (dc_parser_t *abstrac static const dc_parser_vtable_t divesystem_idive_parser_vtable = { sizeof(divesystem_idive_parser_t), DC_FAMILY_DIVESYSTEM_IDIVE, - divesystem_idive_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -109,7 +107,7 @@ static const dc_parser_vtable_t divesystem_idive_parser_vtable = { dc_status_t -divesystem_idive_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +divesystem_idive_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { divesystem_idive_parser_t *parser = NULL; @@ -117,7 +115,7 @@ divesystem_idive_parser_create (dc_parser_t **out, dc_context_t *context, unsign return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (divesystem_idive_parser_t *) dc_parser_allocate (context, &divesystem_idive_parser_vtable); + parser = (divesystem_idive_parser_t *) dc_parser_allocate (context, &divesystem_idive_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -156,35 +154,6 @@ divesystem_idive_parser_create (dc_parser_t **out, dc_context_t *context, unsign } -static dc_status_t -divesystem_idive_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - divesystem_idive_parser_t *parser = (divesystem_idive_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divemode = INVALID; - parser->divetime = 0; - parser->maxdepth = 0; - parser->ngasmixes = 0; - parser->ntanks = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - } - for (unsigned int i = 0; i < NTANKS; ++i) { - parser->tank[i].id = 0; - parser->tank[i].beginpressure = 0; - parser->tank[i].endpressure = 0; - } - parser->algorithm = INVALID; - parser->gf_low = INVALID; - parser->gf_high = INVALID; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t divesystem_idive_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/hw_ostc.h b/src/hw_ostc.h index fc45182..55abda9 100644 --- a/src/hw_ostc.h +++ b/src/hw_ostc.h @@ -36,7 +36,7 @@ dc_status_t hw_ostc_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -hw_ostc_parser_create (dc_parser_t **parser, dc_context_t *context); +hw_ostc_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/hw_ostc3.h b/src/hw_ostc3.h index 92cf277..0fddc96 100644 --- a/src/hw_ostc3.h +++ b/src/hw_ostc3.h @@ -36,7 +36,7 @@ dc_status_t hw_ostc3_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -hw_ostc3_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model); +hw_ostc3_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/hw_ostc_parser.c b/src/hw_ostc_parser.c index ca19458..288d28a 100644 --- a/src/hw_ostc_parser.c +++ b/src/hw_ostc_parser.c @@ -132,7 +132,6 @@ typedef struct hw_ostc_parser_t { hw_ostc_gasmix_t gasmix[NGASMIXES]; } hw_ostc_parser_t; -static dc_status_t hw_ostc_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t hw_ostc_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t hw_ostc_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -140,7 +139,6 @@ static dc_status_t hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sam static const dc_parser_vtable_t hw_ostc_parser_vtable = { sizeof(hw_ostc_parser_t), DC_FAMILY_HW_OSTC, - hw_ostc_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -367,7 +365,7 @@ hw_ostc_parser_cache (hw_ostc_parser_t *parser) } static dc_status_t -hw_ostc_parser_create_internal (dc_parser_t **out, dc_context_t *context, unsigned int hwos, unsigned int model) +hw_ostc_parser_create_internal (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int hwos, unsigned int model) { hw_ostc_parser_t *parser = NULL; @@ -375,7 +373,7 @@ hw_ostc_parser_create_internal (dc_parser_t **out, dc_context_t *context, unsign return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (hw_ostc_parser_t *) dc_parser_allocate (context, &hw_ostc_parser_vtable); + parser = (hw_ostc_parser_t *) dc_parser_allocate (context, &hw_ostc_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -408,44 +406,17 @@ hw_ostc_parser_create_internal (dc_parser_t **out, dc_context_t *context, unsign dc_status_t -hw_ostc_parser_create (dc_parser_t **out, dc_context_t *context) +hw_ostc_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { - return hw_ostc_parser_create_internal (out, context, 0, 0); + return hw_ostc_parser_create_internal (out, context, data, size, 0, 0); } dc_status_t -hw_ostc3_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +hw_ostc3_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { - return hw_ostc_parser_create_internal (out, context, 1, model); + return hw_ostc_parser_create_internal (out, context, data, size, 1, model); } -static dc_status_t -hw_ostc_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - hw_ostc_parser_t *parser = (hw_ostc_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->version = 0; - parser->header = 0; - parser->layout = NULL; - parser->ngasmixes = 0; - parser->nfixed = 0; - parser->initial = 0; - parser->initial_setpoint = 0; - parser->initial_cns = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - parser->gasmix[i].type = 0; - parser->gasmix[i].enabled = 0; - parser->gasmix[i].diluent = 0; - } - - return DC_STATUS_SUCCESS; -} - - static dc_status_t hw_ostc_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/libdivecomputer.symbols b/src/libdivecomputer.symbols index e47a5e6..477f1ec 100644 --- a/src/libdivecomputer.symbols +++ b/src/libdivecomputer.symbols @@ -91,7 +91,6 @@ dc_parser_set_clock dc_parser_set_atmospheric dc_parser_set_density dc_parser_get_type -dc_parser_set_data dc_parser_get_datetime dc_parser_get_field dc_parser_samples_foreach diff --git a/src/liquivision_lynx.h b/src/liquivision_lynx.h index 52e7294..dd278b4 100644 --- a/src/liquivision_lynx.h +++ b/src/liquivision_lynx.h @@ -35,7 +35,7 @@ dc_status_t liquivision_lynx_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -liquivision_lynx_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +liquivision_lynx_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/liquivision_lynx_parser.c b/src/liquivision_lynx_parser.c index 0ddb69e..c336b6a 100644 --- a/src/liquivision_lynx_parser.c +++ b/src/liquivision_lynx_parser.c @@ -117,7 +117,6 @@ struct liquivision_lynx_parser_t { liquivision_lynx_tank_t tank[NTANKS]; }; -static dc_status_t liquivision_lynx_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t liquivision_lynx_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t liquivision_lynx_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t liquivision_lynx_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -125,7 +124,6 @@ static dc_status_t liquivision_lynx_parser_samples_foreach (dc_parser_t *abstrac static const dc_parser_vtable_t liquivision_lynx_parser_vtable = { sizeof(liquivision_lynx_parser_t), DC_FAMILY_LIQUIVISION_LYNX, - liquivision_lynx_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -137,7 +135,7 @@ static const dc_parser_vtable_t liquivision_lynx_parser_vtable = { dc_status_t -liquivision_lynx_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +liquivision_lynx_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { liquivision_lynx_parser_t *parser = NULL; @@ -145,7 +143,7 @@ liquivision_lynx_parser_create (dc_parser_t **out, dc_context_t *context, unsign return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (liquivision_lynx_parser_t *) dc_parser_allocate (context, &liquivision_lynx_parser_vtable); + parser = (liquivision_lynx_parser_t *) dc_parser_allocate (context, &liquivision_lynx_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -173,29 +171,6 @@ liquivision_lynx_parser_create (dc_parser_t **out, dc_context_t *context, unsign } -static dc_status_t -liquivision_lynx_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - liquivision_lynx_parser_t *parser = (liquivision_lynx_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->ngasmixes = 0; - parser->ntanks = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - } - for (unsigned int i = 0; i < NTANKS; ++i) { - parser->tank[i].id = 0; - parser->tank[i].beginpressure = 0; - parser->tank[i].endpressure = 0; - } - - return DC_STATUS_SUCCESS; -} - - static dc_status_t liquivision_lynx_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/mares_darwin.h b/src/mares_darwin.h index a902014..35efbcb 100644 --- a/src/mares_darwin.h +++ b/src/mares_darwin.h @@ -35,7 +35,7 @@ dc_status_t mares_darwin_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t -mares_darwin_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +mares_darwin_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/mares_darwin_parser.c b/src/mares_darwin_parser.c index 699fbc7..bebd89c 100644 --- a/src/mares_darwin_parser.c +++ b/src/mares_darwin_parser.c @@ -47,7 +47,6 @@ struct mares_darwin_parser_t { unsigned int samplesize; }; -static dc_status_t mares_darwin_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t mares_darwin_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t mares_darwin_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t mares_darwin_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -55,7 +54,6 @@ static dc_status_t mares_darwin_parser_samples_foreach (dc_parser_t *abstract, d static const dc_parser_vtable_t mares_darwin_parser_vtable = { sizeof(mares_darwin_parser_t), DC_FAMILY_MARES_DARWIN, - mares_darwin_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -67,7 +65,7 @@ static const dc_parser_vtable_t mares_darwin_parser_vtable = { dc_status_t -mares_darwin_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +mares_darwin_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { mares_darwin_parser_t *parser = NULL; @@ -75,7 +73,7 @@ mares_darwin_parser_create (dc_parser_t **out, dc_context_t *context, unsigned i return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (mares_darwin_parser_t *) dc_parser_allocate (context, &mares_darwin_parser_vtable); + parser = (mares_darwin_parser_t *) dc_parser_allocate (context, &mares_darwin_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -97,13 +95,6 @@ mares_darwin_parser_create (dc_parser_t **out, dc_context_t *context, unsigned i } -static dc_status_t -mares_darwin_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t mares_darwin_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/mares_iconhd.h b/src/mares_iconhd.h index 55a50d0..1b00c54 100644 --- a/src/mares_iconhd.h +++ b/src/mares_iconhd.h @@ -35,7 +35,7 @@ dc_status_t mares_iconhd_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -mares_iconhd_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +mares_iconhd_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/mares_iconhd_parser.c b/src/mares_iconhd_parser.c index 63a4021..73f32d9 100644 --- a/src/mares_iconhd_parser.c +++ b/src/mares_iconhd_parser.c @@ -264,7 +264,6 @@ static const mares_iconhd_layout_t horizon = { 0x54 + 8, /* tanks */ }; -static dc_status_t mares_iconhd_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t mares_iconhd_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t mares_iconhd_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -272,7 +271,6 @@ static dc_status_t mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, d static const dc_parser_vtable_t mares_iconhd_parser_vtable = { sizeof(mares_iconhd_parser_t), DC_FAMILY_MARES_ICONHD, - mares_iconhd_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -656,7 +654,7 @@ mares_iconhd_parser_cache (mares_iconhd_parser_t *parser) } dc_status_t -mares_iconhd_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +mares_iconhd_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { mares_iconhd_parser_t *parser = NULL; @@ -664,7 +662,7 @@ mares_iconhd_parser_create (dc_parser_t **out, dc_context_t *context, unsigned i return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (mares_iconhd_parser_t *) dc_parser_allocate (context, &mares_iconhd_parser_vtable); + parser = (mares_iconhd_parser_t *) dc_parser_allocate (context, &mares_iconhd_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -701,41 +699,6 @@ mares_iconhd_parser_create (dc_parser_t **out, dc_context_t *context, unsigned i return DC_STATUS_SUCCESS; } - -static dc_status_t -mares_iconhd_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - mares_iconhd_parser_t *parser = (mares_iconhd_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->logformat = 0; - parser->mode = (parser->model == GENIUS || parser->model == HORIZON) ? GENIUS_AIR : ICONHD_AIR; - parser->nsamples = 0; - parser->samplesize = 0; - parser->headersize = 0; - parser->settings = 0; - parser->surftime = 0; - parser->interval = 0; - parser->samplerate = 0; - parser->ntanks = 0; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - } - for (unsigned int i = 0; i < NTANKS; ++i) { - parser->tank[i].volume = 0; - parser->tank[i].workpressure = 0; - parser->tank[i].beginpressure = 0; - parser->tank[i].endpressure = 0; - } - parser->layout = NULL; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t mares_iconhd_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/mares_nemo.h b/src/mares_nemo.h index c7a162b..1847d0f 100644 --- a/src/mares_nemo.h +++ b/src/mares_nemo.h @@ -35,7 +35,7 @@ dc_status_t mares_nemo_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -mares_nemo_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +mares_nemo_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/mares_nemo_parser.c b/src/mares_nemo_parser.c index 4b962ff..cb3e3bf 100644 --- a/src/mares_nemo_parser.c +++ b/src/mares_nemo_parser.c @@ -59,7 +59,6 @@ struct mares_nemo_parser_t { unsigned int extra; }; -static dc_status_t mares_nemo_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t mares_nemo_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t mares_nemo_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t mares_nemo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -67,7 +66,6 @@ static dc_status_t mares_nemo_parser_samples_foreach (dc_parser_t *abstract, dc_ static const dc_parser_vtable_t mares_nemo_parser_vtable = { sizeof(mares_nemo_parser_t), DC_FAMILY_MARES_NEMO, - mares_nemo_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -79,15 +77,16 @@ static const dc_parser_vtable_t mares_nemo_parser_vtable = { dc_status_t -mares_nemo_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +mares_nemo_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { + dc_status_t status = DC_STATUS_SUCCESS; mares_nemo_parser_t *parser = NULL; if (out == NULL) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (mares_nemo_parser_t *) dc_parser_allocate (context, &mares_nemo_parser_vtable); + parser = (mares_nemo_parser_t *) dc_parser_allocate (context, &mares_nemo_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -98,70 +97,42 @@ mares_nemo_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int if (model == NEMOWIDE || model == NEMOAIR || model == PUCK || model == PUCKAIR) freedive = GAUGE; - // Set the default values. - parser->model = model; - parser->freedive = freedive; - parser->mode = AIR; - parser->length = 0; - parser->sample_count = 0; - parser->sample_size = 0; - parser->header = 0; - parser->extra = 0; - - *out = (dc_parser_t*) parser; - - return DC_STATUS_SUCCESS; -} - - -static dc_status_t -mares_nemo_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - mares_nemo_parser_t *parser = (mares_nemo_parser_t *) abstract; - - // Clear the previous state. - parser->base.data = NULL; - parser->base.size = 0; - parser->mode = AIR; - parser->length = 0; - parser->sample_count = 0; - parser->sample_size = 0; - parser->header = 0; - parser->extra = 0; - - if (size == 0) - return DC_STATUS_SUCCESS; - - if (size < 2 + 3) - return DC_STATUS_DATAFORMAT; + if (size < 2 + 3) { + status = DC_STATUS_DATAFORMAT; + goto error_free; + } unsigned int length = array_uint16_le (data); - if (length > size) - return DC_STATUS_DATAFORMAT; + if (length > size) { + status = DC_STATUS_DATAFORMAT; + goto error_free; + } unsigned int extra = 0; const unsigned char marker[3] = {0xAA, 0xBB, 0xCC}; if (memcmp (data + length - 3, marker, sizeof (marker)) == 0) { - if (parser->model == PUCKAIR) + if (model == PUCKAIR) extra = 7; else extra = 12; } - if (length < 2 + extra + 3) - return DC_STATUS_DATAFORMAT; + if (length < 2 + extra + 3) { + status = DC_STATUS_DATAFORMAT; + goto error_free; + } unsigned int mode = data[length - extra - 1]; unsigned int header_size = 53; unsigned int sample_size = 2; if (extra) { - if (parser->model == PUCKAIR) + if (model == PUCKAIR) sample_size = 3; else sample_size = 5; } - if (mode == parser->freedive) { + if (mode == freedive) { header_size = 28; sample_size = 6; } @@ -169,12 +140,14 @@ mares_nemo_parser_set_data (dc_parser_t *abstract, const unsigned char *data, un unsigned int nsamples = array_uint16_le (data + length - extra - 3); unsigned int nbytes = 2 + nsamples * sample_size + header_size + extra; - if (length != nbytes) - return DC_STATUS_DATAFORMAT; + if (length != nbytes) { + status = DC_STATUS_DATAFORMAT; + goto error_free; + } - // Store the new state. - parser->base.data = data; - parser->base.size = size; + // Set the default values. + parser->model = model; + parser->freedive = freedive; parser->mode = mode; parser->length = length; parser->sample_count = nsamples; @@ -182,7 +155,13 @@ mares_nemo_parser_set_data (dc_parser_t *abstract, const unsigned char *data, un parser->header = header_size; parser->extra = extra; + *out = (dc_parser_t*) parser; + return DC_STATUS_SUCCESS; + +error_free: + dc_parser_deallocate ((dc_parser_t *) parser); + return status; } diff --git a/src/mclean_extreme.h b/src/mclean_extreme.h index c388bd4..fd7c6bc 100644 --- a/src/mclean_extreme.h +++ b/src/mclean_extreme.h @@ -35,7 +35,7 @@ dc_status_t mclean_extreme_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -mclean_extreme_parser_create (dc_parser_t **parser, dc_context_t *context); +mclean_extreme_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/mclean_extreme_parser.c b/src/mclean_extreme_parser.c index 645a909..b9de495 100644 --- a/src/mclean_extreme_parser.c +++ b/src/mclean_extreme_parser.c @@ -58,7 +58,6 @@ struct mclean_extreme_parser_t { unsigned int gasmix[NGASMIXES]; }; -static dc_status_t mclean_extreme_parser_set_data(dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t mclean_extreme_parser_get_datetime(dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t mclean_extreme_parser_get_field(dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t mclean_extreme_parser_samples_foreach(dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -66,7 +65,6 @@ static dc_status_t mclean_extreme_parser_samples_foreach(dc_parser_t *abstract, static const dc_parser_vtable_t mclean_extreme_parser_vtable = { sizeof(mclean_extreme_parser_t), DC_FAMILY_MCLEAN_EXTREME, - mclean_extreme_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -77,7 +75,7 @@ static const dc_parser_vtable_t mclean_extreme_parser_vtable = { }; dc_status_t -mclean_extreme_parser_create(dc_parser_t **out, dc_context_t *context) +mclean_extreme_parser_create(dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { mclean_extreme_parser_t *parser = NULL; @@ -86,7 +84,7 @@ mclean_extreme_parser_create(dc_parser_t **out, dc_context_t *context) } // Allocate memory. - parser = (mclean_extreme_parser_t *)dc_parser_allocate(context, &mclean_extreme_parser_vtable); + parser = (mclean_extreme_parser_t *)dc_parser_allocate(context, &mclean_extreme_parser_vtable, data, size); if (parser == NULL) { ERROR(context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -104,21 +102,6 @@ mclean_extreme_parser_create(dc_parser_t **out, dc_context_t *context) return DC_STATUS_SUCCESS; } -static dc_status_t -mclean_extreme_parser_set_data(dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - mclean_extreme_parser_t *parser = (mclean_extreme_parser_t *)abstract; - - // Reset the cache. - parser->cached = 0; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i] = INVALID; - } - - return DC_STATUS_SUCCESS; -} - static dc_status_t mclean_extreme_parser_get_datetime(dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/oceanic_atom2.h b/src/oceanic_atom2.h index 25da953..152c439 100644 --- a/src/oceanic_atom2.h +++ b/src/oceanic_atom2.h @@ -37,7 +37,7 @@ dc_status_t oceanic_atom2_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t -oceanic_atom2_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +oceanic_atom2_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index cb98366..49b2c0c 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -59,7 +59,6 @@ struct oceanic_atom2_parser_t { double maxdepth; }; -static dc_status_t oceanic_atom2_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t oceanic_atom2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t oceanic_atom2_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -67,7 +66,6 @@ static dc_status_t oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, static const dc_parser_vtable_t oceanic_atom2_parser_vtable = { sizeof(oceanic_atom2_parser_t), DC_FAMILY_OCEANIC_ATOM2, - oceanic_atom2_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -79,7 +77,7 @@ static const dc_parser_vtable_t oceanic_atom2_parser_vtable = { dc_status_t -oceanic_atom2_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +oceanic_atom2_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { oceanic_atom2_parser_t *parser = NULL; @@ -87,7 +85,7 @@ oceanic_atom2_parser_create (dc_parser_t **out, dc_context_t *context, unsigned return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (oceanic_atom2_parser_t *) dc_parser_allocate (context, &oceanic_atom2_parser_vtable); + parser = (oceanic_atom2_parser_t *) dc_parser_allocate (context, &oceanic_atom2_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -153,28 +151,6 @@ oceanic_atom2_parser_create (dc_parser_t **out, dc_context_t *context, unsigned } -static dc_status_t -oceanic_atom2_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - oceanic_atom2_parser_t *parser = (oceanic_atom2_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->header = 0; - parser->footer = 0; - parser->mode = NORMAL; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->oxygen[i] = 0; - parser->helium[i] = 0; - } - parser->divetime = 0; - parser->maxdepth = 0.0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t oceanic_atom2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/oceanic_veo250.h b/src/oceanic_veo250.h index fc79375..5d24f74 100644 --- a/src/oceanic_veo250.h +++ b/src/oceanic_veo250.h @@ -37,7 +37,7 @@ dc_status_t oceanic_veo250_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -oceanic_veo250_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +oceanic_veo250_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/oceanic_veo250_parser.c b/src/oceanic_veo250_parser.c index ee14061..096e47c 100644 --- a/src/oceanic_veo250_parser.c +++ b/src/oceanic_veo250_parser.c @@ -42,7 +42,6 @@ struct oceanic_veo250_parser_t { double maxdepth; }; -static dc_status_t oceanic_veo250_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t oceanic_veo250_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t oceanic_veo250_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t oceanic_veo250_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -50,7 +49,6 @@ static dc_status_t oceanic_veo250_parser_samples_foreach (dc_parser_t *abstract, static const dc_parser_vtable_t oceanic_veo250_parser_vtable = { sizeof(oceanic_veo250_parser_t), DC_FAMILY_OCEANIC_VEO250, - oceanic_veo250_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -62,7 +60,7 @@ static const dc_parser_vtable_t oceanic_veo250_parser_vtable = { dc_status_t -oceanic_veo250_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +oceanic_veo250_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { oceanic_veo250_parser_t *parser = NULL; @@ -70,7 +68,7 @@ oceanic_veo250_parser_create (dc_parser_t **out, dc_context_t *context, unsigned return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (oceanic_veo250_parser_t *) dc_parser_allocate (context, &oceanic_veo250_parser_vtable); + parser = (oceanic_veo250_parser_t *) dc_parser_allocate (context, &oceanic_veo250_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -88,20 +86,6 @@ oceanic_veo250_parser_create (dc_parser_t **out, dc_context_t *context, unsigned } -static dc_status_t -oceanic_veo250_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - oceanic_veo250_parser_t *parser = (oceanic_veo250_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0.0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t oceanic_veo250_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/oceanic_vtpro.h b/src/oceanic_vtpro.h index 6a3c2cd..3928adf 100644 --- a/src/oceanic_vtpro.h +++ b/src/oceanic_vtpro.h @@ -37,7 +37,7 @@ dc_status_t oceanic_vtpro_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t -oceanic_vtpro_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +oceanic_vtpro_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/oceanic_vtpro_parser.c b/src/oceanic_vtpro_parser.c index 4902033..ec380b3 100644 --- a/src/oceanic_vtpro_parser.c +++ b/src/oceanic_vtpro_parser.c @@ -42,7 +42,6 @@ struct oceanic_vtpro_parser_t { double maxdepth; }; -static dc_status_t oceanic_vtpro_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t oceanic_vtpro_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t oceanic_vtpro_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t oceanic_vtpro_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -50,7 +49,6 @@ static dc_status_t oceanic_vtpro_parser_samples_foreach (dc_parser_t *abstract, static const dc_parser_vtable_t oceanic_vtpro_parser_vtable = { sizeof(oceanic_vtpro_parser_t), DC_FAMILY_OCEANIC_VTPRO, - oceanic_vtpro_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -62,7 +60,7 @@ static const dc_parser_vtable_t oceanic_vtpro_parser_vtable = { dc_status_t -oceanic_vtpro_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +oceanic_vtpro_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { oceanic_vtpro_parser_t *parser = NULL; @@ -70,7 +68,7 @@ oceanic_vtpro_parser_create (dc_parser_t **out, dc_context_t *context, unsigned return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (oceanic_vtpro_parser_t *) dc_parser_allocate (context, &oceanic_vtpro_parser_vtable); + parser = (oceanic_vtpro_parser_t *) dc_parser_allocate (context, &oceanic_vtpro_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -88,20 +86,6 @@ oceanic_vtpro_parser_create (dc_parser_t **out, dc_context_t *context, unsigned } -static dc_status_t -oceanic_vtpro_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - oceanic_vtpro_parser_t *parser = (oceanic_vtpro_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0.0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t oceanic_vtpro_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/oceans_s1.h b/src/oceans_s1.h index 825d309..e5e43f8 100644 --- a/src/oceans_s1.h +++ b/src/oceans_s1.h @@ -36,7 +36,7 @@ dc_status_t oceans_s1_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -oceans_s1_parser_create (dc_parser_t **parser, dc_context_t *context); +oceans_s1_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/oceans_s1_parser.c b/src/oceans_s1_parser.c index c31bfe1..cce5031 100644 --- a/src/oceans_s1_parser.c +++ b/src/oceans_s1_parser.c @@ -58,7 +58,6 @@ struct oceans_s1_parser_t { unsigned int divetime; }; -static dc_status_t oceans_s1_parser_set_data(dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t oceans_s1_parser_get_datetime(dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t oceans_s1_parser_get_field(dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t oceans_s1_parser_samples_foreach(dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -66,7 +65,6 @@ static dc_status_t oceans_s1_parser_samples_foreach(dc_parser_t *abstract, dc_sa static const dc_parser_vtable_t oceans_s1_parser_vtable = { sizeof(oceans_s1_parser_t), DC_FAMILY_OCEANS_S1, - oceans_s1_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -77,7 +75,7 @@ static const dc_parser_vtable_t oceans_s1_parser_vtable = { }; dc_status_t -oceans_s1_parser_create (dc_parser_t **out, dc_context_t *context) +oceans_s1_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { oceans_s1_parser_t *parser = NULL; @@ -85,7 +83,7 @@ oceans_s1_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (oceans_s1_parser_t *) dc_parser_allocate (context, &oceans_s1_parser_vtable); + parser = (oceans_s1_parser_t *) dc_parser_allocate (context, &oceans_s1_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -105,23 +103,6 @@ oceans_s1_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_SUCCESS; } -static dc_status_t -oceans_s1_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - oceans_s1_parser_t *parser = (oceans_s1_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->timestamp = 0; - parser->number = 0; - parser->divemode = 0; - parser->oxygen = 0; - parser->maxdepth = 0; - parser->divetime = 0; - - return DC_STATUS_SUCCESS; -} - static dc_status_t oceans_s1_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/parser-private.h b/src/parser-private.h index 9b8ed7c..73e2e59 100644 --- a/src/parser-private.h +++ b/src/parser-private.h @@ -41,7 +41,7 @@ typedef struct dc_parser_vtable_t dc_parser_vtable_t; struct dc_parser_t { const dc_parser_vtable_t *vtable; dc_context_t *context; - const unsigned char *data; + unsigned char *data; unsigned int size; }; @@ -50,8 +50,6 @@ struct dc_parser_vtable_t { dc_family_t type; - dc_status_t (*set_data) (dc_parser_t *parser, const unsigned char *data, unsigned int size); - dc_status_t (*set_clock) (dc_parser_t *parser, unsigned int devtime, dc_ticks_t systime); dc_status_t (*set_atmospheric) (dc_parser_t *parser, double atmospheric); @@ -68,7 +66,7 @@ struct dc_parser_vtable_t { }; dc_parser_t * -dc_parser_allocate (dc_context_t *context, const dc_parser_vtable_t *vtable); +dc_parser_allocate (dc_context_t *context, const dc_parser_vtable_t *vtable, const unsigned char data[], size_t size); void dc_parser_deallocate (dc_parser_t *parser); diff --git a/src/parser.c b/src/parser.c index 5138e54..011115d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -20,6 +20,7 @@ */ #include +#include #include #include "suunto_d9.h" @@ -72,7 +73,7 @@ #define REACTPROWHITE 0x4354 static dc_status_t -dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t family, unsigned int model) +dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, dc_family_t family, unsigned int model) { dc_status_t rc = DC_STATUS_SUCCESS; dc_parser_t *parser = NULL; @@ -82,126 +83,126 @@ dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t fa switch (family) { case DC_FAMILY_SUUNTO_SOLUTION: - rc = suunto_solution_parser_create (&parser, context); + rc = suunto_solution_parser_create (&parser, context, data, size); break; case DC_FAMILY_SUUNTO_EON: - rc = suunto_eon_parser_create (&parser, context, 0); + rc = suunto_eon_parser_create (&parser, context, data, size, 0); break; case DC_FAMILY_SUUNTO_VYPER: if (model == 0x01) - rc = suunto_eon_parser_create (&parser, context, 1); + rc = suunto_eon_parser_create (&parser, context, data, size, 1); else - rc = suunto_vyper_parser_create (&parser, context); + rc = suunto_vyper_parser_create (&parser, context, data, size); break; case DC_FAMILY_SUUNTO_VYPER2: case DC_FAMILY_SUUNTO_D9: - rc = suunto_d9_parser_create (&parser, context, model); + rc = suunto_d9_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_SUUNTO_EONSTEEL: - rc = suunto_eonsteel_parser_create(&parser, context, model); + rc = suunto_eonsteel_parser_create(&parser, context, data, size, model); break; case DC_FAMILY_UWATEC_ALADIN: case DC_FAMILY_UWATEC_MEMOMOUSE: - rc = uwatec_memomouse_parser_create (&parser, context); + rc = uwatec_memomouse_parser_create (&parser, context, data, size); break; case DC_FAMILY_UWATEC_SMART: - rc = uwatec_smart_parser_create (&parser, context, model); + rc = uwatec_smart_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_REEFNET_SENSUS: - rc = reefnet_sensus_parser_create (&parser, context); + rc = reefnet_sensus_parser_create (&parser, context, data, size); break; case DC_FAMILY_REEFNET_SENSUSPRO: - rc = reefnet_sensuspro_parser_create (&parser, context); + rc = reefnet_sensuspro_parser_create (&parser, context, data, size); break; case DC_FAMILY_REEFNET_SENSUSULTRA: - rc = reefnet_sensusultra_parser_create (&parser, context); + rc = reefnet_sensusultra_parser_create (&parser, context, data, size); break; case DC_FAMILY_OCEANIC_VTPRO: - rc = oceanic_vtpro_parser_create (&parser, context, model); + rc = oceanic_vtpro_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_OCEANIC_VEO250: - rc = oceanic_veo250_parser_create (&parser, context, model); + rc = oceanic_veo250_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_OCEANIC_ATOM2: if (model == REACTPROWHITE) - rc = oceanic_veo250_parser_create (&parser, context, model); + rc = oceanic_veo250_parser_create (&parser, context, data, size, model); else - rc = oceanic_atom2_parser_create (&parser, context, model); + rc = oceanic_atom2_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_MARES_NEMO: case DC_FAMILY_MARES_PUCK: - rc = mares_nemo_parser_create (&parser, context, model); + rc = mares_nemo_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_MARES_DARWIN: - rc = mares_darwin_parser_create (&parser, context, model); + rc = mares_darwin_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_MARES_ICONHD: - rc = mares_iconhd_parser_create (&parser, context, model); + rc = mares_iconhd_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_HW_OSTC: - rc = hw_ostc_parser_create (&parser, context); + rc = hw_ostc_parser_create (&parser, context, data, size); break; case DC_FAMILY_HW_FROG: case DC_FAMILY_HW_OSTC3: - rc = hw_ostc3_parser_create (&parser, context, model); + rc = hw_ostc3_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_CRESSI_EDY: case DC_FAMILY_ZEAGLE_N2ITION3: - rc = cressi_edy_parser_create (&parser, context, model); + rc = cressi_edy_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_CRESSI_LEONARDO: - rc = cressi_leonardo_parser_create (&parser, context, model); + rc = cressi_leonardo_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_CRESSI_GOA: - rc = cressi_goa_parser_create (&parser, context, model); + rc = cressi_goa_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_ATOMICS_COBALT: - rc = atomics_cobalt_parser_create (&parser, context); + rc = atomics_cobalt_parser_create (&parser, context, data, size); break; case DC_FAMILY_SHEARWATER_PREDATOR: - rc = shearwater_predator_parser_create (&parser, context, model); + rc = shearwater_predator_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_SHEARWATER_PETREL: - rc = shearwater_petrel_parser_create (&parser, context, model); + rc = shearwater_petrel_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_DIVERITE_NITEKQ: - rc = diverite_nitekq_parser_create (&parser, context); + rc = diverite_nitekq_parser_create (&parser, context, data, size); break; case DC_FAMILY_CITIZEN_AQUALAND: - rc = citizen_aqualand_parser_create (&parser, context); + rc = citizen_aqualand_parser_create (&parser, context, data, size); break; case DC_FAMILY_DIVESYSTEM_IDIVE: - rc = divesystem_idive_parser_create (&parser, context, model); + rc = divesystem_idive_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_COCHRAN_COMMANDER: - rc = cochran_commander_parser_create (&parser, context, model); + rc = cochran_commander_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_TECDIVING_DIVECOMPUTEREU: - rc = tecdiving_divecomputereu_parser_create (&parser, context); + rc = tecdiving_divecomputereu_parser_create (&parser, context, data, size); break; case DC_FAMILY_MCLEAN_EXTREME: - rc = mclean_extreme_parser_create (&parser, context); + rc = mclean_extreme_parser_create (&parser, context, data, size); break; case DC_FAMILY_LIQUIVISION_LYNX: - rc = liquivision_lynx_parser_create (&parser, context, model); + rc = liquivision_lynx_parser_create (&parser, context, data, size, model); break; case DC_FAMILY_SPORASUB_SP2: - rc = sporasub_sp2_parser_create (&parser, context); + rc = sporasub_sp2_parser_create (&parser, context, data, size); break; case DC_FAMILY_DEEPSIX_EXCURSION: - rc = deepsix_excursion_parser_create (&parser, context); + rc = deepsix_excursion_parser_create (&parser, context, data, size); break; case DC_FAMILY_SEAC_SCREEN: - rc = seac_screen_parser_create (&parser, context); + rc = seac_screen_parser_create (&parser, context, data, size); break; case DC_FAMILY_DEEPBLU_COSMIQ: - rc = deepblu_cosmiq_parser_create (&parser, context); + rc = deepblu_cosmiq_parser_create (&parser, context, data, size); break; case DC_FAMILY_OCEANS_S1: - rc = oceans_s1_parser_create (&parser, context); + rc = oceans_s1_parser_create (&parser, context, data, size); break; case DC_FAMILY_DIVESOFT_FREEDOM: - rc = divesoft_freedom_parser_create (&parser, context); + rc = divesoft_freedom_parser_create (&parser, context, data, size); break; default: return DC_STATUS_INVALIDARGS; @@ -213,7 +214,7 @@ dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t fa } dc_status_t -dc_parser_new (dc_parser_t **out, dc_device_t *device) +dc_parser_new (dc_parser_t **out, dc_device_t *device, const unsigned char data[], size_t size) { dc_status_t status = DC_STATUS_SUCCESS; dc_parser_t *parser = NULL; @@ -221,7 +222,7 @@ dc_parser_new (dc_parser_t **out, dc_device_t *device) if (device == NULL) return DC_STATUS_INVALIDARGS; - status = dc_parser_new_internal (&parser, device->context, + status = dc_parser_new_internal (&parser, device->context, data, size, dc_device_get_type (device), device->devinfo.model); if (status != DC_STATUS_SUCCESS) goto error_exit; @@ -241,14 +242,14 @@ error_exit: } dc_status_t -dc_parser_new2 (dc_parser_t **out, dc_context_t *context, dc_descriptor_t *descriptor) +dc_parser_new2 (dc_parser_t **out, dc_context_t *context, dc_descriptor_t *descriptor, const unsigned char data[], size_t size) { - return dc_parser_new_internal (out, context, + return dc_parser_new_internal (out, context, data, size, dc_descriptor_get_type (descriptor), dc_descriptor_get_model (descriptor)); } dc_parser_t * -dc_parser_allocate (dc_context_t *context, const dc_parser_vtable_t *vtable) +dc_parser_allocate (dc_context_t *context, const dc_parser_vtable_t *vtable, const unsigned char data[], size_t size) { dc_parser_t *parser = NULL; @@ -265,15 +266,34 @@ dc_parser_allocate (dc_context_t *context, const dc_parser_vtable_t *vtable) // Initialize the base class. parser->vtable = vtable; parser->context = context; - parser->data = NULL; - parser->size = 0; + if (size) { + // Allocate memory for the data. + parser->data = malloc (size); + if (parser->data == NULL) { + ERROR (context, "Failed to allocate memory."); + free (parser); + return NULL; + } + + // Copy the data. + memcpy (parser->data, data, size); + parser->size = size; + } else { + parser->data = NULL; + parser->size = 0; + + } return parser; } void dc_parser_deallocate (dc_parser_t *parser) { + if (parser == NULL) + return; + + free (parser->data); free (parser); } @@ -336,22 +356,6 @@ dc_parser_set_density (dc_parser_t *parser, double density) } -dc_status_t -dc_parser_set_data (dc_parser_t *parser, const unsigned char *data, unsigned int size) -{ - if (parser == NULL) - return DC_STATUS_UNSUPPORTED; - - if (parser->vtable->set_data == NULL) - return DC_STATUS_UNSUPPORTED; - - parser->data = data; - parser->size = size; - - return parser->vtable->set_data (parser, data, size); -} - - dc_status_t dc_parser_get_datetime (dc_parser_t *parser, dc_datetime_t *datetime) { diff --git a/src/reefnet_sensus.h b/src/reefnet_sensus.h index 2ed5cbe..38157dc 100644 --- a/src/reefnet_sensus.h +++ b/src/reefnet_sensus.h @@ -36,7 +36,7 @@ dc_status_t reefnet_sensus_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -reefnet_sensus_parser_create (dc_parser_t **parser, dc_context_t *context); +reefnet_sensus_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/reefnet_sensus_parser.c b/src/reefnet_sensus_parser.c index 9882778..29e7f46 100644 --- a/src/reefnet_sensus_parser.c +++ b/src/reefnet_sensus_parser.c @@ -48,7 +48,6 @@ struct reefnet_sensus_parser_t { unsigned int maxdepth; }; -static dc_status_t reefnet_sensus_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t reefnet_sensus_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime); static dc_status_t reefnet_sensus_parser_set_atmospheric (dc_parser_t *abstract, double atmospheric); static dc_status_t reefnet_sensus_parser_set_density (dc_parser_t *abstract, double density); @@ -59,7 +58,6 @@ static dc_status_t reefnet_sensus_parser_samples_foreach (dc_parser_t *abstract, static const dc_parser_vtable_t reefnet_sensus_parser_vtable = { sizeof(reefnet_sensus_parser_t), DC_FAMILY_REEFNET_SENSUS, - reefnet_sensus_parser_set_data, /* set_data */ reefnet_sensus_parser_set_clock, /* set_clock */ reefnet_sensus_parser_set_atmospheric, /* set_atmospheric */ reefnet_sensus_parser_set_density, /* set_density */ @@ -71,7 +69,7 @@ static const dc_parser_vtable_t reefnet_sensus_parser_vtable = { dc_status_t -reefnet_sensus_parser_create (dc_parser_t **out, dc_context_t *context) +reefnet_sensus_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { reefnet_sensus_parser_t *parser = NULL; @@ -79,7 +77,7 @@ reefnet_sensus_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (reefnet_sensus_parser_t *) dc_parser_allocate (context, &reefnet_sensus_parser_vtable); + parser = (reefnet_sensus_parser_t *) dc_parser_allocate (context, &reefnet_sensus_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -100,20 +98,6 @@ reefnet_sensus_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -reefnet_sensus_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - reefnet_sensus_parser_t *parser = (reefnet_sensus_parser_t*) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t reefnet_sensus_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime) { diff --git a/src/reefnet_sensuspro.h b/src/reefnet_sensuspro.h index fd21d99..f187f93 100644 --- a/src/reefnet_sensuspro.h +++ b/src/reefnet_sensuspro.h @@ -36,7 +36,7 @@ dc_status_t reefnet_sensuspro_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -reefnet_sensuspro_parser_create (dc_parser_t **parser, dc_context_t *context); +reefnet_sensuspro_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/reefnet_sensuspro_parser.c b/src/reefnet_sensuspro_parser.c index 6dc0613..5d6fd5e 100644 --- a/src/reefnet_sensuspro_parser.c +++ b/src/reefnet_sensuspro_parser.c @@ -47,7 +47,6 @@ struct reefnet_sensuspro_parser_t { unsigned int maxdepth; }; -static dc_status_t reefnet_sensuspro_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t reefnet_sensuspro_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime); static dc_status_t reefnet_sensuspro_parser_set_atmospheric (dc_parser_t *abstract, double atmospheric); static dc_status_t reefnet_sensuspro_parser_set_density (dc_parser_t *abstract, double density); @@ -58,7 +57,6 @@ static dc_status_t reefnet_sensuspro_parser_samples_foreach (dc_parser_t *abstra static const dc_parser_vtable_t reefnet_sensuspro_parser_vtable = { sizeof(reefnet_sensuspro_parser_t), DC_FAMILY_REEFNET_SENSUSPRO, - reefnet_sensuspro_parser_set_data, /* set_data */ reefnet_sensuspro_parser_set_clock, /* set_clock */ reefnet_sensuspro_parser_set_atmospheric, /* set_atmospheric */ reefnet_sensuspro_parser_set_density, /* set_density */ @@ -70,7 +68,7 @@ static const dc_parser_vtable_t reefnet_sensuspro_parser_vtable = { dc_status_t -reefnet_sensuspro_parser_create (dc_parser_t **out, dc_context_t *context) +reefnet_sensuspro_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { reefnet_sensuspro_parser_t *parser = NULL; @@ -78,7 +76,7 @@ reefnet_sensuspro_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (reefnet_sensuspro_parser_t *) dc_parser_allocate (context, &reefnet_sensuspro_parser_vtable); + parser = (reefnet_sensuspro_parser_t *) dc_parser_allocate (context, &reefnet_sensuspro_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -99,20 +97,6 @@ reefnet_sensuspro_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -reefnet_sensuspro_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - reefnet_sensuspro_parser_t *parser = (reefnet_sensuspro_parser_t*) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t reefnet_sensuspro_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime) { diff --git a/src/reefnet_sensusultra.h b/src/reefnet_sensusultra.h index 054745a..1cefc9c 100644 --- a/src/reefnet_sensusultra.h +++ b/src/reefnet_sensusultra.h @@ -36,7 +36,7 @@ dc_status_t reefnet_sensusultra_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -reefnet_sensusultra_parser_create (dc_parser_t **parser, dc_context_t *context); +reefnet_sensusultra_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/reefnet_sensusultra_parser.c b/src/reefnet_sensusultra_parser.c index 5564019..670a0c3 100644 --- a/src/reefnet_sensusultra_parser.c +++ b/src/reefnet_sensusultra_parser.c @@ -47,7 +47,6 @@ struct reefnet_sensusultra_parser_t { unsigned int maxdepth; }; -static dc_status_t reefnet_sensusultra_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t reefnet_sensusultra_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime); static dc_status_t reefnet_sensusultra_parser_set_atmospheric (dc_parser_t *abstract, double atmospheric); static dc_status_t reefnet_sensusultra_parser_set_density (dc_parser_t *abstract, double density); @@ -58,7 +57,6 @@ static dc_status_t reefnet_sensusultra_parser_samples_foreach (dc_parser_t *abst static const dc_parser_vtable_t reefnet_sensusultra_parser_vtable = { sizeof(reefnet_sensusultra_parser_t), DC_FAMILY_REEFNET_SENSUSULTRA, - reefnet_sensusultra_parser_set_data, /* set_data */ reefnet_sensusultra_parser_set_clock, /* set_clock */ reefnet_sensusultra_parser_set_atmospheric, /* set_atmospheric */ reefnet_sensusultra_parser_set_density, /* set_density */ @@ -70,7 +68,7 @@ static const dc_parser_vtable_t reefnet_sensusultra_parser_vtable = { dc_status_t -reefnet_sensusultra_parser_create (dc_parser_t **out, dc_context_t *context) +reefnet_sensusultra_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { reefnet_sensusultra_parser_t *parser = NULL; @@ -78,7 +76,7 @@ reefnet_sensusultra_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (reefnet_sensusultra_parser_t *) dc_parser_allocate (context, &reefnet_sensusultra_parser_vtable); + parser = (reefnet_sensusultra_parser_t *) dc_parser_allocate (context, &reefnet_sensusultra_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -99,20 +97,6 @@ reefnet_sensusultra_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -reefnet_sensusultra_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - reefnet_sensusultra_parser_t *parser = (reefnet_sensusultra_parser_t*) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t reefnet_sensusultra_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime) { diff --git a/src/seac_screen.h b/src/seac_screen.h index 64c15b6..4ff05ea 100644 --- a/src/seac_screen.h +++ b/src/seac_screen.h @@ -35,7 +35,7 @@ dc_status_t seac_screen_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -seac_screen_parser_create (dc_parser_t **parser, dc_context_t *context); +seac_screen_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/seac_screen_parser.c b/src/seac_screen_parser.c index c50eaee..07553d6 100644 --- a/src/seac_screen_parser.c +++ b/src/seac_screen_parser.c @@ -48,7 +48,6 @@ struct seac_screen_parser_t { unsigned int gf_high; }; -static dc_status_t seac_screen_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t seac_screen_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t seac_screen_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t seac_screen_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -56,7 +55,6 @@ static dc_status_t seac_screen_parser_samples_foreach (dc_parser_t *abstract, dc static const dc_parser_vtable_t seac_screen_parser_vtable = { sizeof(seac_screen_parser_t), DC_FAMILY_SEAC_SCREEN, - seac_screen_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -67,7 +65,7 @@ static const dc_parser_vtable_t seac_screen_parser_vtable = { }; dc_status_t -seac_screen_parser_create (dc_parser_t **out, dc_context_t *context) +seac_screen_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { seac_screen_parser_t *parser = NULL; @@ -75,7 +73,7 @@ seac_screen_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (seac_screen_parser_t *) dc_parser_allocate (context, &seac_screen_parser_vtable); + parser = (seac_screen_parser_t *) dc_parser_allocate (context, &seac_screen_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -95,23 +93,6 @@ seac_screen_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_SUCCESS; } -static dc_status_t -seac_screen_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - seac_screen_parser_t *parser = (seac_screen_parser_t *)abstract; - - // Reset the cache. - parser->cached = 0; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->oxygen[i] = 0; - } - parser->gf_low = 0; - parser->gf_high = 0; - - return DC_STATUS_SUCCESS; -} - static dc_status_t seac_screen_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/shearwater_petrel.h b/src/shearwater_petrel.h index 0a4e756..166007e 100644 --- a/src/shearwater_petrel.h +++ b/src/shearwater_petrel.h @@ -35,7 +35,7 @@ dc_status_t shearwater_petrel_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -shearwater_petrel_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +shearwater_petrel_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/shearwater_predator.h b/src/shearwater_predator.h index 5d1fccb..5d8ef9d 100644 --- a/src/shearwater_predator.h +++ b/src/shearwater_predator.h @@ -35,7 +35,7 @@ dc_status_t shearwater_predator_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -shearwater_predator_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +shearwater_predator_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/shearwater_predator_parser.c b/src/shearwater_predator_parser.c index fe0a6db..749fe3c 100644 --- a/src/shearwater_predator_parser.c +++ b/src/shearwater_predator_parser.c @@ -148,7 +148,6 @@ struct shearwater_predator_parser_t { unsigned int density; }; -static dc_status_t shearwater_predator_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t shearwater_predator_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t shearwater_predator_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -158,7 +157,6 @@ static dc_status_t shearwater_predator_parser_cache (shearwater_predator_parser_ static const dc_parser_vtable_t shearwater_predator_parser_vtable = { sizeof(shearwater_predator_parser_t), DC_FAMILY_SHEARWATER_PREDATOR, - shearwater_predator_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -171,7 +169,6 @@ static const dc_parser_vtable_t shearwater_predator_parser_vtable = { static const dc_parser_vtable_t shearwater_petrel_parser_vtable = { sizeof(shearwater_predator_parser_t), DC_FAMILY_SHEARWATER_PETREL, - shearwater_predator_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -197,7 +194,7 @@ shearwater_predator_find_gasmix (shearwater_predator_parser_t *parser, unsigned static dc_status_t -shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model, unsigned int petrel) +shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model, unsigned int petrel) { shearwater_predator_parser_t *parser = NULL; const dc_parser_vtable_t *vtable = NULL; @@ -215,7 +212,7 @@ shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsig } // Allocate memory. - parser = (shearwater_predator_parser_t *) dc_parser_allocate (context, vtable); + parser = (shearwater_predator_parser_t *) dc_parser_allocate (context, vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -270,64 +267,16 @@ shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsig dc_status_t -shearwater_predator_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +shearwater_predator_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { - return shearwater_common_parser_create (out, context, model, 0); + return shearwater_common_parser_create (out, context, data, size, model, 0); } dc_status_t -shearwater_petrel_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +shearwater_petrel_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { - return shearwater_common_parser_create (out, context, model, 1); -} - - -static dc_status_t -shearwater_predator_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - shearwater_predator_parser_t *parser = (shearwater_predator_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->pnf = 0; - parser->logversion = 0; - parser->headersize = 0; - parser->footersize = 0; - for (unsigned int i = 0; i < NRECORDS; ++i) { - parser->opening[i] = UNDEFINED; - parser->closing[i] = UNDEFINED; - } - parser->final = UNDEFINED; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - parser->gasmix[i].diluent = 0; - } - parser->ntanks = 0; - for (unsigned int i = 0; i < NTANKS; ++i) { - parser->tank[i].enabled = 0; - parser->tank[i].active = 0; - parser->tank[i].beginpressure = 0; - parser->tank[i].endpressure = 0; - parser->tank[i].pressure_max = 0; - parser->tank[i].pressure_reserve = 0; - parser->tank[i].serial = 0; - memset (parser->tank[i].name, 0, sizeof (parser->tank[i].name)); - parser->tankidx[i] = i; - } - parser->aimode = AI_OFF; - parser->calibrated = 0; - for (unsigned int i = 0; i < 3; ++i) { - parser->calibration[i] = 0.0; - } - parser->divemode = M_OC_TEC; - parser->units = METRIC; - parser->density = DEF_DENSITY_SALT; - parser->atmospheric = DEF_ATMOSPHERIC / (BAR / 1000); - - return DC_STATUS_SUCCESS; + return shearwater_common_parser_create (out, context, data, size, model, 1); } diff --git a/src/sporasub_sp2.h b/src/sporasub_sp2.h index de2ca42..6b21c45 100644 --- a/src/sporasub_sp2.h +++ b/src/sporasub_sp2.h @@ -35,7 +35,7 @@ dc_status_t sporasub_sp2_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -sporasub_sp2_parser_create (dc_parser_t **parser, dc_context_t *context); +sporasub_sp2_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/sporasub_sp2_parser.c b/src/sporasub_sp2_parser.c index c84a35c..37f0211 100644 --- a/src/sporasub_sp2_parser.c +++ b/src/sporasub_sp2_parser.c @@ -37,7 +37,6 @@ struct sporasub_sp2_parser_t { dc_parser_t base; }; -static dc_status_t sporasub_sp2_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t sporasub_sp2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t sporasub_sp2_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t sporasub_sp2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -45,7 +44,6 @@ static dc_status_t sporasub_sp2_parser_samples_foreach (dc_parser_t *abstract, d static const dc_parser_vtable_t sporasub_sp2_parser_vtable = { sizeof(sporasub_sp2_parser_t), DC_FAMILY_SPORASUB_SP2, - sporasub_sp2_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -57,7 +55,7 @@ static const dc_parser_vtable_t sporasub_sp2_parser_vtable = { dc_status_t -sporasub_sp2_parser_create (dc_parser_t **out, dc_context_t *context) +sporasub_sp2_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { sporasub_sp2_parser_t *parser = NULL; @@ -65,7 +63,7 @@ sporasub_sp2_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (sporasub_sp2_parser_t *) dc_parser_allocate (context, &sporasub_sp2_parser_vtable); + parser = (sporasub_sp2_parser_t *) dc_parser_allocate (context, &sporasub_sp2_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -77,13 +75,6 @@ sporasub_sp2_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -sporasub_sp2_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t sporasub_sp2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/suunto_d9.h b/src/suunto_d9.h index 94a782f..e6ae5bd 100644 --- a/src/suunto_d9.h +++ b/src/suunto_d9.h @@ -36,7 +36,7 @@ dc_status_t suunto_d9_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t -suunto_d9_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +suunto_d9_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/suunto_d9_parser.c b/src/suunto_d9_parser.c index 43e9ccc..8445d11 100644 --- a/src/suunto_d9_parser.c +++ b/src/suunto_d9_parser.c @@ -92,7 +92,6 @@ typedef struct sample_info_t { unsigned int divisor; } sample_info_t; -static dc_status_t suunto_d9_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t suunto_d9_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t suunto_d9_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t suunto_d9_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -100,7 +99,6 @@ static dc_status_t suunto_d9_parser_samples_foreach (dc_parser_t *abstract, dc_s static const dc_parser_vtable_t suunto_d9_parser_vtable = { sizeof(suunto_d9_parser_t), DC_FAMILY_SUUNTO_D9, - suunto_d9_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -251,7 +249,7 @@ suunto_d9_parser_cache (suunto_d9_parser_t *parser) } dc_status_t -suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { suunto_d9_parser_t *parser = NULL; @@ -259,7 +257,7 @@ suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (suunto_d9_parser_t *) dc_parser_allocate (context, &suunto_d9_parser_vtable); + parser = (suunto_d9_parser_t *) dc_parser_allocate (context, &suunto_d9_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -285,28 +283,6 @@ suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int } -static dc_status_t -suunto_d9_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - suunto_d9_parser_t *parser = (suunto_d9_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->id = 0; - parser->mode = AIR; - parser->ngasmixes = 0; - parser->nccr = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->oxygen[i] = 0; - parser->helium[i] = 0; - } - parser->gasmix = 0; - parser->config = 0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t suunto_d9_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/suunto_eon.h b/src/suunto_eon.h index 5e99a69..9c605eb 100644 --- a/src/suunto_eon.h +++ b/src/suunto_eon.h @@ -36,7 +36,7 @@ dc_status_t suunto_eon_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -suunto_eon_parser_create (dc_parser_t **parser, dc_context_t *context, int spyder); +suunto_eon_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, int spyder); #ifdef __cplusplus } diff --git a/src/suunto_eon_parser.c b/src/suunto_eon_parser.c index 9bfadda..94370a3 100644 --- a/src/suunto_eon_parser.c +++ b/src/suunto_eon_parser.c @@ -43,7 +43,6 @@ struct suunto_eon_parser_t { unsigned int nitrox; }; -static dc_status_t suunto_eon_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t suunto_eon_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t suunto_eon_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t suunto_eon_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -51,7 +50,6 @@ static dc_status_t suunto_eon_parser_samples_foreach (dc_parser_t *abstract, dc_ static const dc_parser_vtable_t suunto_eon_parser_vtable = { sizeof(suunto_eon_parser_t), DC_FAMILY_SUUNTO_EON, - suunto_eon_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -112,7 +110,7 @@ suunto_eon_parser_cache (suunto_eon_parser_t *parser) } dc_status_t -suunto_eon_parser_create (dc_parser_t **out, dc_context_t *context, int spyder) +suunto_eon_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, int spyder) { suunto_eon_parser_t *parser = NULL; @@ -120,7 +118,7 @@ suunto_eon_parser_create (dc_parser_t **out, dc_context_t *context, int spyder) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (suunto_eon_parser_t *) dc_parser_allocate (context, &suunto_eon_parser_vtable); + parser = (suunto_eon_parser_t *) dc_parser_allocate (context, &suunto_eon_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -140,22 +138,6 @@ suunto_eon_parser_create (dc_parser_t **out, dc_context_t *context, int spyder) } -static dc_status_t -suunto_eon_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - suunto_eon_parser_t *parser = (suunto_eon_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0; - parser->marker = 0; - parser->nitrox = 0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t suunto_eon_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/suunto_eonsteel.h b/src/suunto_eonsteel.h index 2800107..cb18296 100644 --- a/src/suunto_eonsteel.h +++ b/src/suunto_eonsteel.h @@ -35,7 +35,7 @@ dc_status_t suunto_eonsteel_device_open(dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t -suunto_eonsteel_parser_create(dc_parser_t **parser, dc_context_t *context, unsigned int model); +suunto_eonsteel_parser_create(dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/suunto_eonsteel_parser.c b/src/suunto_eonsteel_parser.c index 5c5c328..d6fd027 100644 --- a/src/suunto_eonsteel_parser.c +++ b/src/suunto_eonsteel_parser.c @@ -1509,18 +1509,6 @@ static void show_all_descriptors(suunto_eonsteel_parser_t *eon) show_descriptor(eon, i, eon->type_desc+i); } -static dc_status_t -suunto_eonsteel_parser_set_data(dc_parser_t *parser, const unsigned char *data, unsigned int size) -{ - suunto_eonsteel_parser_t *eon = (suunto_eonsteel_parser_t *) parser; - - desc_free(eon->type_desc, MAXTYPE); - memset(eon->type_desc, 0, sizeof(eon->type_desc)); - initialize_field_caches(eon); - show_all_descriptors(eon); - return DC_STATUS_SUCCESS; -} - static dc_status_t suunto_eonsteel_parser_destroy(dc_parser_t *parser) { @@ -1534,7 +1522,6 @@ suunto_eonsteel_parser_destroy(dc_parser_t *parser) static const dc_parser_vtable_t suunto_eonsteel_parser_vtable = { sizeof(suunto_eonsteel_parser_t), DC_FAMILY_SUUNTO_EONSTEEL, - suunto_eonsteel_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -1545,14 +1532,14 @@ static const dc_parser_vtable_t suunto_eonsteel_parser_vtable = { }; dc_status_t -suunto_eonsteel_parser_create(dc_parser_t **out, dc_context_t *context, unsigned int model) +suunto_eonsteel_parser_create(dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { suunto_eonsteel_parser_t *parser = NULL; if (out == NULL) return DC_STATUS_INVALIDARGS; - parser = (suunto_eonsteel_parser_t *) dc_parser_allocate (context, &suunto_eonsteel_parser_vtable); + parser = (suunto_eonsteel_parser_t *) dc_parser_allocate (context, &suunto_eonsteel_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -1561,6 +1548,9 @@ suunto_eonsteel_parser_create(dc_parser_t **out, dc_context_t *context, unsigned memset(&parser->type_desc, 0, sizeof(parser->type_desc)); memset(&parser->cache, 0, sizeof(parser->cache)); + initialize_field_caches(parser); + show_all_descriptors(parser); + *out = (dc_parser_t *) parser; return DC_STATUS_SUCCESS; diff --git a/src/suunto_solution.h b/src/suunto_solution.h index 9d9e632..0556ad7 100644 --- a/src/suunto_solution.h +++ b/src/suunto_solution.h @@ -35,7 +35,7 @@ dc_status_t suunto_solution_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -suunto_solution_parser_create (dc_parser_t **parser, dc_context_t *context); +suunto_solution_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/suunto_solution_parser.c b/src/suunto_solution_parser.c index f8320aa..69c6977 100644 --- a/src/suunto_solution_parser.c +++ b/src/suunto_solution_parser.c @@ -39,14 +39,12 @@ struct suunto_solution_parser_t { unsigned int maxdepth; }; -static dc_status_t suunto_solution_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t suunto_solution_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t suunto_solution_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); static const dc_parser_vtable_t suunto_solution_parser_vtable = { sizeof(suunto_solution_parser_t), DC_FAMILY_SUUNTO_SOLUTION, - suunto_solution_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -58,7 +56,7 @@ static const dc_parser_vtable_t suunto_solution_parser_vtable = { dc_status_t -suunto_solution_parser_create (dc_parser_t **out, dc_context_t *context) +suunto_solution_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { suunto_solution_parser_t *parser = NULL; @@ -66,7 +64,7 @@ suunto_solution_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (suunto_solution_parser_t *) dc_parser_allocate (context, &suunto_solution_parser_vtable); + parser = (suunto_solution_parser_t *) dc_parser_allocate (context, &suunto_solution_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -83,20 +81,6 @@ suunto_solution_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -suunto_solution_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - suunto_solution_parser_t *parser = (suunto_solution_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t suunto_solution_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value) { diff --git a/src/suunto_vyper.h b/src/suunto_vyper.h index 858520f..616c094 100644 --- a/src/suunto_vyper.h +++ b/src/suunto_vyper.h @@ -35,7 +35,7 @@ dc_status_t suunto_vyper_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -suunto_vyper_parser_create (dc_parser_t **parser, dc_context_t *context); +suunto_vyper_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/suunto_vyper_parser.c b/src/suunto_vyper_parser.c index fe9bfe2..8311363 100644 --- a/src/suunto_vyper_parser.c +++ b/src/suunto_vyper_parser.c @@ -44,7 +44,6 @@ struct suunto_vyper_parser_t { unsigned int oxygen[NGASMIXES]; }; -static dc_status_t suunto_vyper_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t suunto_vyper_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t suunto_vyper_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -52,7 +51,6 @@ static dc_status_t suunto_vyper_parser_samples_foreach (dc_parser_t *abstract, d static const dc_parser_vtable_t suunto_vyper_parser_vtable = { sizeof(suunto_vyper_parser_t), DC_FAMILY_SUUNTO_VYPER, - suunto_vyper_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -162,7 +160,7 @@ suunto_vyper_parser_cache (suunto_vyper_parser_t *parser) dc_status_t -suunto_vyper_parser_create (dc_parser_t **out, dc_context_t *context) +suunto_vyper_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { suunto_vyper_parser_t *parser = NULL; @@ -170,7 +168,7 @@ suunto_vyper_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (suunto_vyper_parser_t *) dc_parser_allocate (context, &suunto_vyper_parser_vtable); + parser = (suunto_vyper_parser_t *) dc_parser_allocate (context, &suunto_vyper_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -192,25 +190,6 @@ suunto_vyper_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -suunto_vyper_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - suunto_vyper_parser_t *parser = (suunto_vyper_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->divetime = 0; - parser->maxdepth = 0; - parser->marker = 0; - parser->ngasmixes = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->oxygen[i] = 0; - } - - return DC_STATUS_SUCCESS; -} - - static dc_status_t suunto_vyper_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/tecdiving_divecomputereu.h b/src/tecdiving_divecomputereu.h index 714ae43..8eafb4e 100644 --- a/src/tecdiving_divecomputereu.h +++ b/src/tecdiving_divecomputereu.h @@ -35,7 +35,7 @@ dc_status_t tecdiving_divecomputereu_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -tecdiving_divecomputereu_parser_create (dc_parser_t **parser, dc_context_t *context); +tecdiving_divecomputereu_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/tecdiving_divecomputereu_parser.c b/src/tecdiving_divecomputereu_parser.c index b0f1552..4f3f514 100644 --- a/src/tecdiving_divecomputereu_parser.c +++ b/src/tecdiving_divecomputereu_parser.c @@ -36,7 +36,6 @@ struct tecdiving_divecomputereu_parser_t { dc_parser_t base; }; -static dc_status_t tecdiving_divecomputereu_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t tecdiving_divecomputereu_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t tecdiving_divecomputereu_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t tecdiving_divecomputereu_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -44,7 +43,6 @@ static dc_status_t tecdiving_divecomputereu_parser_samples_foreach (dc_parser_t static const dc_parser_vtable_t tecdiving_divecomputereu_parser_vtable = { sizeof(tecdiving_divecomputereu_parser_t), DC_FAMILY_TECDIVING_DIVECOMPUTEREU, - tecdiving_divecomputereu_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -56,7 +54,7 @@ static const dc_parser_vtable_t tecdiving_divecomputereu_parser_vtable = { dc_status_t -tecdiving_divecomputereu_parser_create (dc_parser_t **out, dc_context_t *context) +tecdiving_divecomputereu_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { tecdiving_divecomputereu_parser_t *parser = NULL; @@ -64,7 +62,7 @@ tecdiving_divecomputereu_parser_create (dc_parser_t **out, dc_context_t *context return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (tecdiving_divecomputereu_parser_t *) dc_parser_allocate (context, &tecdiving_divecomputereu_parser_vtable); + parser = (tecdiving_divecomputereu_parser_t *) dc_parser_allocate (context, &tecdiving_divecomputereu_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -76,13 +74,6 @@ tecdiving_divecomputereu_parser_create (dc_parser_t **out, dc_context_t *context } -static dc_status_t -tecdiving_divecomputereu_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t tecdiving_divecomputereu_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { diff --git a/src/uwatec_memomouse.h b/src/uwatec_memomouse.h index 34ca2d3..e038cf9 100644 --- a/src/uwatec_memomouse.h +++ b/src/uwatec_memomouse.h @@ -35,7 +35,7 @@ dc_status_t uwatec_memomouse_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -uwatec_memomouse_parser_create (dc_parser_t **parser, dc_context_t *context); +uwatec_memomouse_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size); #ifdef __cplusplus } diff --git a/src/uwatec_memomouse_parser.c b/src/uwatec_memomouse_parser.c index 1019c6a..0849a3c 100644 --- a/src/uwatec_memomouse_parser.c +++ b/src/uwatec_memomouse_parser.c @@ -38,7 +38,6 @@ struct uwatec_memomouse_parser_t { dc_ticks_t systime; }; -static dc_status_t uwatec_memomouse_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t uwatec_memomouse_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime); static dc_status_t uwatec_memomouse_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t uwatec_memomouse_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); @@ -47,7 +46,6 @@ static dc_status_t uwatec_memomouse_parser_samples_foreach (dc_parser_t *abstrac static const dc_parser_vtable_t uwatec_memomouse_parser_vtable = { sizeof(uwatec_memomouse_parser_t), DC_FAMILY_UWATEC_MEMOMOUSE, - uwatec_memomouse_parser_set_data, /* set_data */ uwatec_memomouse_parser_set_clock, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -59,7 +57,7 @@ static const dc_parser_vtable_t uwatec_memomouse_parser_vtable = { dc_status_t -uwatec_memomouse_parser_create (dc_parser_t **out, dc_context_t *context) +uwatec_memomouse_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size) { uwatec_memomouse_parser_t *parser = NULL; @@ -67,7 +65,7 @@ uwatec_memomouse_parser_create (dc_parser_t **out, dc_context_t *context) return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (uwatec_memomouse_parser_t *) dc_parser_allocate (context, &uwatec_memomouse_parser_vtable); + parser = (uwatec_memomouse_parser_t *) dc_parser_allocate (context, &uwatec_memomouse_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -83,13 +81,6 @@ uwatec_memomouse_parser_create (dc_parser_t **out, dc_context_t *context) } -static dc_status_t -uwatec_memomouse_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - return DC_STATUS_SUCCESS; -} - - static dc_status_t uwatec_memomouse_parser_set_clock (dc_parser_t *abstract, unsigned int devtime, dc_ticks_t systime) { diff --git a/src/uwatec_smart.h b/src/uwatec_smart.h index 49013c5..646cc97 100644 --- a/src/uwatec_smart.h +++ b/src/uwatec_smart.h @@ -35,7 +35,7 @@ dc_status_t uwatec_smart_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -uwatec_smart_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +uwatec_smart_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model); #ifdef __cplusplus } diff --git a/src/uwatec_smart_parser.c b/src/uwatec_smart_parser.c index d98801b..c6c356d 100644 --- a/src/uwatec_smart_parser.c +++ b/src/uwatec_smart_parser.c @@ -157,7 +157,6 @@ struct uwatec_smart_parser_t { dc_divemode_t divemode; }; -static dc_status_t uwatec_smart_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size); static dc_status_t uwatec_smart_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t uwatec_smart_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); static dc_status_t uwatec_smart_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -167,7 +166,6 @@ static dc_status_t uwatec_smart_parse (uwatec_smart_parser_t *parser, dc_sample_ static const dc_parser_vtable_t uwatec_smart_parser_vtable = { sizeof(uwatec_smart_parser_t), DC_FAMILY_UWATEC_SMART, - uwatec_smart_parser_set_data, /* set_data */ NULL, /* set_clock */ NULL, /* set_atmospheric */ NULL, /* set_density */ @@ -573,7 +571,7 @@ uwatec_smart_parser_cache (uwatec_smart_parser_t *parser) dc_status_t -uwatec_smart_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +uwatec_smart_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; uwatec_smart_parser_t *parser = NULL; @@ -582,7 +580,7 @@ uwatec_smart_parser_create (dc_parser_t **out, dc_context_t *context, unsigned i return DC_STATUS_INVALIDARGS; // Allocate memory. - parser = (uwatec_smart_parser_t *) dc_parser_allocate (context, &uwatec_smart_parser_vtable); + parser = (uwatec_smart_parser_t *) dc_parser_allocate (context, &uwatec_smart_parser_vtable, data, size); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; @@ -707,31 +705,6 @@ error_free: } -static dc_status_t -uwatec_smart_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) -{ - uwatec_smart_parser_t *parser = (uwatec_smart_parser_t *) abstract; - - // Reset the cache. - parser->cached = 0; - parser->ngasmixes = 0; - parser->ntanks = 0; - for (unsigned int i = 0; i < NGASMIXES; ++i) { - parser->gasmix[i].id = 0; - parser->gasmix[i].oxygen = 0; - parser->gasmix[i].helium = 0; - parser->tank[i].id = 0; - parser->tank[i].beginpressure = 0; - parser->tank[i].endpressure = 0; - parser->tank[i].gasmix = 0; - } - parser->watertype = DC_WATER_FRESH; - parser->divemode = DC_DIVEMODE_OC; - - return DC_STATUS_SUCCESS; -} - - static dc_status_t uwatec_smart_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) {