mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
core: convert dive.c to C++
Long term project: convert core to C++ so that we can use higer-level constructs, notably std::vector<>. This does not change any code - only fixes compile issues. Mostly casting of (void *) to the proper type. Also designated initialization of the sample struct had to be rearranged. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
096e49e15b
commit
52e6a098aa
4 changed files with 121 additions and 121 deletions
|
@ -47,7 +47,7 @@ SOURCES += subsurface-mobile-main.cpp \
|
|||
core/pref.c \
|
||||
core/profile.c \
|
||||
core/device.cpp \
|
||||
core/dive.c \
|
||||
core/dive.cpp \
|
||||
core/divecomputer.c \
|
||||
core/divefilter.cpp \
|
||||
core/event.c \
|
||||
|
|
|
@ -59,7 +59,7 @@ set(SUBSURFACE_CORE_LIB_SRCS
|
|||
device.h
|
||||
devicedetails.cpp
|
||||
devicedetails.h
|
||||
dive.c
|
||||
dive.cpp
|
||||
dive.h
|
||||
divecomputer.c
|
||||
divecomputer.h
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* dive.c */
|
||||
/* dive.cpp */
|
||||
/* maintains the internal dive list structure */
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
@ -50,7 +50,7 @@ static double calculate_depth_to_mbarf(int depth, pressure_t surface_pressure, i
|
|||
* This function returns a negative number for "no legacy mode",
|
||||
* or a non-negative number that indicates the o2 sensor index.
|
||||
*/
|
||||
int legacy_format_o2pressures(const struct dive *dive, const struct divecomputer *dc)
|
||||
extern "C" int legacy_format_o2pressures(const struct dive *dive, const struct divecomputer *dc)
|
||||
{
|
||||
int i, o2sensor;
|
||||
|
||||
|
@ -82,7 +82,7 @@ int legacy_format_o2pressures(const struct dive *dive, const struct divecomputer
|
|||
}
|
||||
|
||||
/* warning: does not test idx for validity */
|
||||
struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx)
|
||||
extern "C" struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx)
|
||||
{
|
||||
/* The gas switch event format is insane for historical reasons */
|
||||
struct gasmix mix = get_cylinder(dive, idx)->gasmix;
|
||||
|
@ -101,7 +101,7 @@ struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc
|
|||
return ev;
|
||||
}
|
||||
|
||||
void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx)
|
||||
extern "C" void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx)
|
||||
{
|
||||
/* sanity check so we don't crash */
|
||||
/* FIXME: The planner uses a dummy cylinder one past the official number of cylinders
|
||||
|
@ -119,7 +119,7 @@ void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int second
|
|||
* have to actually remove the existing event and replace it with a new one.
|
||||
* WARNING, WARNING... this may end up freeing event in case that event is indeed
|
||||
* WARNING, WARNING... part of this divecomputer on this dive! */
|
||||
void update_event_name(struct dive *d, int dc_number, struct event *event, const char *name)
|
||||
extern "C" void update_event_name(struct dive *d, int dc_number, struct event *event, const char *name)
|
||||
{
|
||||
if (!d || !event)
|
||||
return;
|
||||
|
@ -139,7 +139,7 @@ void update_event_name(struct dive *d, int dc_number, struct event *event, const
|
|||
invalidate_dive_cache(d);
|
||||
}
|
||||
|
||||
struct gasmix get_gasmix_from_event(const struct dive *dive, const struct event *ev)
|
||||
extern "C" struct gasmix get_gasmix_from_event(const struct dive *dive, const struct event *ev)
|
||||
{
|
||||
if (ev && event_is_gaschange(ev)) {
|
||||
int index = ev->gas.index;
|
||||
|
@ -155,18 +155,18 @@ struct gasmix get_gasmix_from_event(const struct dive *dive, const struct event
|
|||
|
||||
// we need this to be uniq. oh, and it has no meaning whatsoever
|
||||
// - that's why we have the silly initial number and increment by 3 :-)
|
||||
int dive_getUniqID()
|
||||
extern "C" int dive_getUniqID()
|
||||
{
|
||||
static int maxId = 83529;
|
||||
maxId += 3;
|
||||
return maxId;
|
||||
}
|
||||
|
||||
struct dive *alloc_dive(void)
|
||||
extern "C" struct dive *alloc_dive(void)
|
||||
{
|
||||
struct dive *dive;
|
||||
|
||||
dive = malloc(sizeof(*dive));
|
||||
dive = (struct dive *)malloc(sizeof(*dive));
|
||||
if (!dive)
|
||||
exit(1);
|
||||
memset(dive, 0, sizeof(*dive));
|
||||
|
@ -207,7 +207,7 @@ static void copy_dc_renumber(struct dive *d, const struct divecomputer *sdc, str
|
|||
if (!sdc->next)
|
||||
break;
|
||||
sdc = sdc->next;
|
||||
ddc->next = calloc(1, sizeof(struct divecomputer));
|
||||
ddc->next = (divecomputer *)calloc(1, sizeof(struct divecomputer));
|
||||
ddc = ddc->next;
|
||||
}
|
||||
ddc->next = NULL;
|
||||
|
@ -234,7 +234,7 @@ static void free_dive_structures(struct dive *d)
|
|||
free(d->pictures.pictures);
|
||||
}
|
||||
|
||||
void free_dive(struct dive *d)
|
||||
extern "C" void free_dive(struct dive *d)
|
||||
{
|
||||
free_dive_structures(d);
|
||||
free(d);
|
||||
|
@ -244,7 +244,7 @@ void free_dive(struct dive *d)
|
|||
* in order not to leak memory, we need to free those .
|
||||
* copy_dive doesn't play with the divetrip and forward/backward pointers
|
||||
* so we can ignore those */
|
||||
void clear_dive(struct dive *d)
|
||||
extern "C" void clear_dive(struct dive *d)
|
||||
{
|
||||
if (!d)
|
||||
return;
|
||||
|
@ -277,7 +277,7 @@ static void copy_dive_nodc(const struct dive *s, struct dive *d)
|
|||
d->tag_list = taglist_copy(s->tag_list);
|
||||
}
|
||||
|
||||
void copy_dive(const struct dive *s, struct dive *d)
|
||||
extern "C" void copy_dive(const struct dive *s, struct dive *d)
|
||||
{
|
||||
copy_dive_nodc(s, d);
|
||||
|
||||
|
@ -296,7 +296,7 @@ static void copy_dive_onedc(const struct dive *s, const struct divecomputer *sdc
|
|||
/* make a clone of the source dive and clean out the source dive;
|
||||
* this allows us to create a dive on the stack and then
|
||||
* add it to the divelist. */
|
||||
struct dive *move_dive(struct dive *s)
|
||||
extern "C" struct dive *move_dive(struct dive *s)
|
||||
{
|
||||
struct dive *dive = alloc_dive();
|
||||
*dive = *s; // so all the pointers in dive point to the things s pointed to
|
||||
|
@ -309,7 +309,7 @@ struct dive *move_dive(struct dive *s)
|
|||
d->_component = copy_string(s->_component)
|
||||
|
||||
// copy elements, depending on bits in what that are set
|
||||
void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_components what, bool clear)
|
||||
extern "C" void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_components what, bool clear)
|
||||
{
|
||||
if (clear)
|
||||
clear_dive(d);
|
||||
|
@ -341,7 +341,7 @@ void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_compo
|
|||
/* copies all events from all dive computers before a given time
|
||||
this is used when editing a dive in the planner to preserve the events
|
||||
of the old dive */
|
||||
void copy_events_until(const struct dive *sd, struct dive *dd, int time)
|
||||
extern "C" void copy_events_until(const struct dive *sd, struct dive *dd, int time)
|
||||
{
|
||||
if (!sd || !dd)
|
||||
return;
|
||||
|
@ -363,17 +363,17 @@ void copy_events_until(const struct dive *sd, struct dive *dd, int time)
|
|||
}
|
||||
}
|
||||
|
||||
int nr_cylinders(const struct dive *dive)
|
||||
extern "C" int nr_cylinders(const struct dive *dive)
|
||||
{
|
||||
return dive->cylinders.nr;
|
||||
}
|
||||
|
||||
int nr_weightsystems(const struct dive *dive)
|
||||
extern "C" int nr_weightsystems(const struct dive *dive)
|
||||
{
|
||||
return dive->weightsystems.nr;
|
||||
}
|
||||
|
||||
void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only)
|
||||
extern "C" void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only)
|
||||
{
|
||||
int i;
|
||||
if (!s || !d)
|
||||
|
@ -402,23 +402,23 @@ void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only)
|
|||
* This considers 1m to be "clearly different". That's
|
||||
* a totally random number.
|
||||
*/
|
||||
static void update_depth(depth_t *depth, int new)
|
||||
static void update_depth(depth_t *depth, int new_depth)
|
||||
{
|
||||
if (new) {
|
||||
if (new_depth) {
|
||||
int old = depth->mm;
|
||||
|
||||
if (abs(old - new) > 1000)
|
||||
depth->mm = new;
|
||||
if (abs(old - new_depth) > 1000)
|
||||
depth->mm = new_depth;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_temperature(temperature_t *temperature, int new)
|
||||
static void update_temperature(temperature_t *temperature, int new_temp)
|
||||
{
|
||||
if (new) {
|
||||
if (new_temp) {
|
||||
int old = temperature->mkelvin;
|
||||
|
||||
if (abs(old - new) > 1000)
|
||||
temperature->mkelvin = new;
|
||||
if (abs(old - new_temp) > 1000)
|
||||
temperature->mkelvin = new_temp;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -455,7 +455,7 @@ static bool has_unknown_used_cylinders(const struct dive *dive, const struct div
|
|||
{
|
||||
int idx;
|
||||
const struct event *ev;
|
||||
bool *used_and_unknown = malloc(dive->cylinders.nr * sizeof(bool));
|
||||
bool *used_and_unknown = (bool *)malloc(dive->cylinders.nr * sizeof(bool));
|
||||
memcpy(used_and_unknown, used_cylinders, dive->cylinders.nr * sizeof(bool));
|
||||
|
||||
/* We know about using the O2 cylinder in a CCR dive */
|
||||
|
@ -489,11 +489,11 @@ static bool has_unknown_used_cylinders(const struct dive *dive, const struct div
|
|||
return num > 0;
|
||||
}
|
||||
|
||||
void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, int *mean, int *duration)
|
||||
extern "C" void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, int *mean, int *duration)
|
||||
{
|
||||
int i;
|
||||
int *depthtime;
|
||||
uint32_t lasttime = 0;
|
||||
int32_t lasttime = 0;
|
||||
int lastdepth = 0;
|
||||
int idx = 0;
|
||||
bool *used_cylinders;
|
||||
|
@ -512,7 +512,7 @@ void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, i
|
|||
* if we don't actually know about the usage of all the
|
||||
* used cylinders.
|
||||
*/
|
||||
used_cylinders = malloc(dive->cylinders.nr * sizeof(bool));
|
||||
used_cylinders = (bool *)malloc(dive->cylinders.nr * sizeof(bool));
|
||||
num_used_cylinders = get_cylinder_used(dive, used_cylinders);
|
||||
if (has_unknown_used_cylinders(dive, dc, used_cylinders, num_used_cylinders)) {
|
||||
/*
|
||||
|
@ -543,11 +543,11 @@ void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, i
|
|||
if (!dc->samples)
|
||||
fake_dc(dc);
|
||||
const struct event *ev = get_next_event(dc->events, "gaschange");
|
||||
depthtime = malloc(dive->cylinders.nr * sizeof(*depthtime));
|
||||
depthtime = (int*)malloc(dive->cylinders.nr * sizeof(*depthtime));
|
||||
memset(depthtime, 0, dive->cylinders.nr * sizeof(*depthtime));
|
||||
for (i = 0; i < dc->samples; i++) {
|
||||
struct sample *sample = dc->sample + i;
|
||||
uint32_t time = sample->time.seconds;
|
||||
int32_t time = sample->time.seconds;
|
||||
int depth = sample->depth.mm;
|
||||
|
||||
/* Make sure to move the event past 'lasttime' */
|
||||
|
@ -606,7 +606,7 @@ static int same_rounded_pressure(pressure_t a, pressure_t b)
|
|||
* first cylinder - in which case cylinder 0 is indeed the first cylinder.
|
||||
* We likewise return 0 if the event concerns a cylinder that doesn't exist.
|
||||
* If the dive has no cylinders, -1 is returned. */
|
||||
int explicit_first_cylinder(const struct dive *dive, const struct divecomputer *dc)
|
||||
extern "C" int explicit_first_cylinder(const struct dive *dive, const struct divecomputer *dc)
|
||||
{
|
||||
int res = 0;
|
||||
if (!dive->cylinders.nr)
|
||||
|
@ -624,7 +624,7 @@ int explicit_first_cylinder(const struct dive *dive, const struct divecomputer *
|
|||
/* this gets called when the dive mode has changed (so OC vs. CC)
|
||||
* there are two places we might have setpoints... events or in the samples
|
||||
*/
|
||||
void update_setpoint_events(const struct dive *dive, struct divecomputer *dc)
|
||||
extern "C" void update_setpoint_events(const struct dive *dive, struct divecomputer *dc)
|
||||
{
|
||||
struct event *ev;
|
||||
int new_setpoint = 0;
|
||||
|
@ -715,7 +715,7 @@ static void match_standard_cylinder(cylinder_type_t *type)
|
|||
return;
|
||||
}
|
||||
len = snprintf(buffer, sizeof(buffer), fmt, (int)lrint(cuft));
|
||||
p = malloc(len + 1);
|
||||
p = (char *)malloc(len + 1);
|
||||
if (!p)
|
||||
return;
|
||||
memcpy(p, buffer, len + 1);
|
||||
|
@ -784,7 +784,7 @@ static struct event *find_previous_event(struct divecomputer *dc, struct event *
|
|||
return previous;
|
||||
}
|
||||
|
||||
pressure_t calculate_surface_pressure(const struct dive *dive)
|
||||
extern "C" pressure_t calculate_surface_pressure(const struct dive *dive)
|
||||
{
|
||||
const struct divecomputer *dc;
|
||||
pressure_t res;
|
||||
|
@ -808,7 +808,7 @@ static void fixup_surface_pressure(struct dive *dive)
|
|||
/* if the surface pressure in the dive data is redundant to the calculated
|
||||
* value (i.e., it was added by running fixup on the dive) return 0,
|
||||
* otherwise return the surface pressure given in the dive */
|
||||
pressure_t un_fixup_surface_pressure(const struct dive *d)
|
||||
extern "C" pressure_t un_fixup_surface_pressure(const struct dive *d)
|
||||
{
|
||||
pressure_t res = d->surface_pressure;
|
||||
if (res.mbar && res.mbar == calculate_surface_pressure(d).mbar)
|
||||
|
@ -833,7 +833,7 @@ static void fixup_water_salinity(struct dive *dive)
|
|||
dive->salinity = (sum + nr / 2) / nr;
|
||||
}
|
||||
|
||||
int get_dive_salinity(const struct dive *dive)
|
||||
extern "C" int get_dive_salinity(const struct dive *dive)
|
||||
{
|
||||
return dive->user_salinity ? dive->user_salinity : dive->salinity;
|
||||
}
|
||||
|
@ -1272,7 +1272,7 @@ static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc)
|
|||
fake_dc(dc);
|
||||
}
|
||||
|
||||
struct dive *fixup_dive(struct dive *dive)
|
||||
extern "C" struct dive *fixup_dive(struct dive *dive)
|
||||
{
|
||||
int i;
|
||||
struct divecomputer *dc;
|
||||
|
@ -1396,7 +1396,7 @@ static void merge_samples(struct divecomputer *res,
|
|||
for (;;) {
|
||||
int j;
|
||||
int at, bt;
|
||||
struct sample sample = { .bearing.degrees = -1, .ndl.seconds = -1 };
|
||||
struct sample sample = { .ndl{ -1 } , .bearing{ -1 } };
|
||||
|
||||
if (!res)
|
||||
return;
|
||||
|
@ -1515,7 +1515,7 @@ static void merge_extra_data(struct divecomputer *res,
|
|||
for (src = b->extra_data; src; src = src->next) {
|
||||
if (extra_data_exists(src, a))
|
||||
continue;
|
||||
*ed = malloc(sizeof(struct extra_data));
|
||||
*ed = (extra_data *)malloc(sizeof(struct extra_data));
|
||||
if (!*ed)
|
||||
break;
|
||||
copy_extra_data(src, *ed);
|
||||
|
@ -1537,7 +1537,7 @@ static char *merge_text(const char *a, const char *b, const char *sep)
|
|||
return strdup(a);
|
||||
if (!strcmp(a, b))
|
||||
return copy_string(a);
|
||||
res = malloc(strlen(a) + strlen(b) + 32);
|
||||
res = (char *)malloc(strlen(a) + strlen(b) + 32);
|
||||
if (!res)
|
||||
return (char *)a;
|
||||
sprintf(res, "%s%s%s", a, sep, b);
|
||||
|
@ -1662,7 +1662,7 @@ pick_b:
|
|||
* A negative number returned indicates that a match could not be found.
|
||||
* Call parameters: dive = the dive being processed
|
||||
* cylinder_use_type = an enum, one of {oxygen, diluent, bailout} */
|
||||
extern int get_cylinder_idx_by_use(const struct dive *dive, enum cylinderuse cylinder_use_type)
|
||||
extern "C" int get_cylinder_idx_by_use(const struct dive *dive, enum cylinderuse cylinder_use_type)
|
||||
{
|
||||
int cylinder_index;
|
||||
for (cylinder_index = 0; cylinder_index < dive->cylinders.nr; cylinder_index++) {
|
||||
|
@ -1759,14 +1759,14 @@ static void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, con
|
|||
* Also note that we assume that the initial cylinder is cylinder 0,
|
||||
* so if that got renamed, we need to create a fake gas change event
|
||||
*/
|
||||
void cylinder_renumber(struct dive *dive, int mapping[])
|
||||
extern "C" void cylinder_renumber(struct dive *dive, int mapping[])
|
||||
{
|
||||
struct divecomputer *dc;
|
||||
for_each_dc (dive, dc)
|
||||
dc_cylinder_renumber(dive, dc, mapping);
|
||||
}
|
||||
|
||||
int same_gasmix_cylinder(const cylinder_t *cyl, int cylid, const struct dive *dive, bool check_unused)
|
||||
extern "C" int same_gasmix_cylinder(const cylinder_t *cyl, int cylid, const struct dive *dive, bool check_unused)
|
||||
{
|
||||
struct gasmix mygas = cyl->gasmix;
|
||||
for (int i = 0; i < dive->cylinders.nr; i++) {
|
||||
|
@ -1926,9 +1926,9 @@ static void merge_cylinders(struct dive *res, const struct dive *a, const struct
|
|||
{
|
||||
int i;
|
||||
int max_cylinders = a->cylinders.nr + b->cylinders.nr;
|
||||
bool *used_in_a = malloc(max_cylinders * sizeof(bool));
|
||||
bool *used_in_b = malloc(max_cylinders * sizeof(bool));
|
||||
bool *try_to_match = malloc(max_cylinders * sizeof(bool));
|
||||
bool *used_in_a = (bool *)malloc(max_cylinders * sizeof(bool));
|
||||
bool *used_in_b = (bool *)malloc(max_cylinders * sizeof(bool));
|
||||
bool *try_to_match = (bool *)malloc(max_cylinders * sizeof(bool));
|
||||
|
||||
/* First, clear all cylinders in destination */
|
||||
clear_cylinder_table(&res->cylinders);
|
||||
|
@ -2367,7 +2367,7 @@ static int likely_same_dive(const struct dive *a, const struct dive *b)
|
|||
* Attn: The dive_site parameter of the dive will be set, but the caller
|
||||
* still has to register the dive in the dive site!
|
||||
*/
|
||||
struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded)
|
||||
extern "C" struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded)
|
||||
{
|
||||
struct dive *res;
|
||||
struct dive_site *site;
|
||||
|
@ -2518,7 +2518,7 @@ static void interleave_dive_computers(struct dive *d, struct divecomputer *res,
|
|||
a = a->next;
|
||||
if (!a)
|
||||
break;
|
||||
res->next = calloc(1, sizeof(struct divecomputer));
|
||||
res->next = (divecomputer *)calloc(1, sizeof(struct divecomputer));
|
||||
res = res->next;
|
||||
} while (res);
|
||||
}
|
||||
|
@ -2558,14 +2558,14 @@ static void join_dive_computers(struct dive *d, struct divecomputer *res,
|
|||
while (tmp->next)
|
||||
tmp = tmp->next;
|
||||
|
||||
tmp->next = calloc(1, sizeof(*tmp));
|
||||
tmp->next = (divecomputer *)calloc(1, sizeof(*tmp));
|
||||
copy_dc_renumber(d, b, tmp->next, cylinders_map_b);
|
||||
|
||||
remove_redundant_dc(res, prefer_downloaded);
|
||||
}
|
||||
|
||||
// Does this dive have a dive computer for which is_dc_planner has value planned
|
||||
bool has_planned(const struct dive *dive, bool planned)
|
||||
extern "C" bool has_planned(const struct dive *dive, bool planned)
|
||||
{
|
||||
const struct divecomputer *dc = &dive->dc;
|
||||
|
||||
|
@ -2606,7 +2606,7 @@ bool has_planned(const struct dive *dive, bool planned)
|
|||
* The dive site the new dive should be added to (if any) is returned
|
||||
* in the "dive_site" output parameter.
|
||||
*/
|
||||
struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset, bool prefer_downloaded, struct dive_trip **trip, struct dive_site **site)
|
||||
extern "C" struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset, bool prefer_downloaded, struct dive_trip **trip, struct dive_site **site)
|
||||
{
|
||||
struct dive *res = alloc_dive();
|
||||
int *cylinders_map_a, *cylinders_map_b;
|
||||
|
@ -2646,8 +2646,8 @@ struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset,
|
|||
taglist_merge(&res->tag_list, a->tag_list, b->tag_list);
|
||||
/* if we get dives without any gas / cylinder information in an import, make sure
|
||||
* that there is at leatst one entry in the cylinder map for that dive */
|
||||
cylinders_map_a = malloc(MAX(1, a->cylinders.nr) * sizeof(*cylinders_map_a));
|
||||
cylinders_map_b = malloc(MAX(1, b->cylinders.nr) * sizeof(*cylinders_map_b));
|
||||
cylinders_map_a = (int *)malloc(MAX(1, a->cylinders.nr) * sizeof(*cylinders_map_a));
|
||||
cylinders_map_b = (int *)malloc(MAX(1, b->cylinders.nr) * sizeof(*cylinders_map_b));
|
||||
merge_cylinders(res, a, b, cylinders_map_a, cylinders_map_b);
|
||||
merge_equipment(res, a, b);
|
||||
merge_temperatures(res, a, b);
|
||||
|
@ -2702,7 +2702,7 @@ static void force_fixup_dive(struct dive *d)
|
|||
int old_mintemp = d->mintemp.mkelvin;
|
||||
int old_maxtemp = d->maxtemp.mkelvin;
|
||||
duration_t old_duration = d->duration;
|
||||
struct start_end_pressure *old_pressures = malloc(d->cylinders.nr * sizeof(*old_pressures));
|
||||
struct start_end_pressure *old_pressures = (start_end_pressure *)malloc(d->cylinders.nr * sizeof(*old_pressures));
|
||||
|
||||
d->maxdepth.mm = 0;
|
||||
dc->maxdepth.mm = 0;
|
||||
|
@ -2754,7 +2754,7 @@ static void force_fixup_dive(struct dive *d)
|
|||
static int split_dive_at(const struct dive *dive, int a, int b, struct dive **out1, struct dive **out2)
|
||||
{
|
||||
int i, nr;
|
||||
uint32_t t;
|
||||
int32_t t;
|
||||
struct dive *d1, *d2;
|
||||
struct divecomputer *dc1, *dc2;
|
||||
struct event *event, **evp;
|
||||
|
@ -2880,7 +2880,7 @@ static bool should_split(const struct divecomputer *dc, int t1, int t2)
|
|||
*
|
||||
* In other words, this is a (simplified) reversal of the dive merging.
|
||||
*/
|
||||
int split_dive(const struct dive *dive, struct dive **new1, struct dive **new2)
|
||||
extern "C" int split_dive(const struct dive *dive, struct dive **new1, struct dive **new2)
|
||||
{
|
||||
int i;
|
||||
int at_surface, surface_start;
|
||||
|
@ -2923,7 +2923,7 @@ int split_dive(const struct dive *dive, struct dive **new1, struct dive **new2)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int split_dive_at_time(const struct dive *dive, duration_t time, struct dive **new1, struct dive **new2)
|
||||
extern "C" int split_dive_at_time(const struct dive *dive, duration_t time, struct dive **new1, struct dive **new2)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
|
@ -2986,12 +2986,12 @@ static inline int dive_totaltime(const struct dive *dive)
|
|||
return time;
|
||||
}
|
||||
|
||||
timestamp_t dive_endtime(const struct dive *dive)
|
||||
extern "C" timestamp_t dive_endtime(const struct dive *dive)
|
||||
{
|
||||
return dive->when + dive_totaltime(dive);
|
||||
}
|
||||
|
||||
bool time_during_dive_with_offset(const struct dive *dive, timestamp_t when, timestamp_t offset)
|
||||
extern "C" bool time_during_dive_with_offset(const struct dive *dive, timestamp_t when, timestamp_t offset)
|
||||
{
|
||||
timestamp_t start = dive->when;
|
||||
timestamp_t end = dive_endtime(dive);
|
||||
|
@ -3008,7 +3008,7 @@ bool time_during_dive_with_offset(const struct dive *dive, timestamp_t when, tim
|
|||
* functionality for the core library that Subsurface itself doesn't
|
||||
* use but that another consumer of the library (like an HTML exporter)
|
||||
* will need */
|
||||
void set_informational_units(const char *units)
|
||||
extern "C" void set_informational_units(const char *units)
|
||||
{
|
||||
if (strstr(units, "METRIC")) {
|
||||
git_prefs.unit_system = METRIC;
|
||||
|
@ -3017,34 +3017,34 @@ void set_informational_units(const char *units)
|
|||
} else if (strstr(units, "PERSONALIZE")) {
|
||||
git_prefs.unit_system = PERSONALIZE;
|
||||
if (strstr(units, "METERS"))
|
||||
git_prefs.units.length = METERS;
|
||||
git_prefs.units.length = units::METERS;
|
||||
if (strstr(units, "FEET"))
|
||||
git_prefs.units.length = FEET;
|
||||
git_prefs.units.length = units::FEET;
|
||||
if (strstr(units, "LITER"))
|
||||
git_prefs.units.volume = LITER;
|
||||
git_prefs.units.volume = units::LITER;
|
||||
if (strstr(units, "CUFT"))
|
||||
git_prefs.units.volume = CUFT;
|
||||
git_prefs.units.volume = units::CUFT;
|
||||
if (strstr(units, "BAR"))
|
||||
git_prefs.units.pressure = BAR;
|
||||
git_prefs.units.pressure = units::BAR;
|
||||
if (strstr(units, "PSI"))
|
||||
git_prefs.units.pressure = PSI;
|
||||
git_prefs.units.pressure = units::PSI;
|
||||
if (strstr(units, "CELSIUS"))
|
||||
git_prefs.units.temperature = CELSIUS;
|
||||
git_prefs.units.temperature = units::CELSIUS;
|
||||
if (strstr(units, "FAHRENHEIT"))
|
||||
git_prefs.units.temperature = FAHRENHEIT;
|
||||
git_prefs.units.temperature = units::FAHRENHEIT;
|
||||
if (strstr(units, "KG"))
|
||||
git_prefs.units.weight = KG;
|
||||
git_prefs.units.weight = units::KG;
|
||||
if (strstr(units, "LBS"))
|
||||
git_prefs.units.weight = LBS;
|
||||
git_prefs.units.weight = units::LBS;
|
||||
if (strstr(units, "SECONDS"))
|
||||
git_prefs.units.vertical_speed_time = SECONDS;
|
||||
git_prefs.units.vertical_speed_time = units::SECONDS;
|
||||
if (strstr(units, "MINUTES"))
|
||||
git_prefs.units.vertical_speed_time = MINUTES;
|
||||
git_prefs.units.vertical_speed_time = units::MINUTES;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void set_git_prefs(const char *prefs)
|
||||
extern "C" void set_git_prefs(const char *prefs)
|
||||
{
|
||||
if (strstr(prefs, "TANKBAR"))
|
||||
git_prefs.tankbar = 1;
|
||||
|
@ -3057,7 +3057,7 @@ void set_git_prefs(const char *prefs)
|
|||
}
|
||||
|
||||
/* clones a dive and moves given dive computer to front */
|
||||
struct dive *make_first_dc(const struct dive *d, int dc_number)
|
||||
extern "C" struct dive *make_first_dc(const struct dive *d, int dc_number)
|
||||
{
|
||||
struct dive *res;
|
||||
struct divecomputer *dc, *newdc, *old_dc;
|
||||
|
@ -3073,7 +3073,7 @@ struct dive *make_first_dc(const struct dive *d, int dc_number)
|
|||
return res;
|
||||
|
||||
dc = &res->dc;
|
||||
newdc = malloc(sizeof(*newdc));
|
||||
newdc = (divecomputer *)malloc(sizeof(*newdc));
|
||||
old_dc = get_dive_dc(res, dc_number);
|
||||
|
||||
/* skip the current DC in the linked list */
|
||||
|
@ -3121,7 +3121,7 @@ static void delete_divecomputer(struct dive *d, int num)
|
|||
}
|
||||
|
||||
/* Clone a dive and delete goven dive computer */
|
||||
struct dive *clone_delete_divecomputer(const struct dive *d, int dc_number)
|
||||
extern "C" struct dive *clone_delete_divecomputer(const struct dive *d, int dc_number)
|
||||
{
|
||||
struct dive *res;
|
||||
|
||||
|
@ -3144,7 +3144,7 @@ struct dive *clone_delete_divecomputer(const struct dive *d, int dc_number)
|
|||
* The dives will not be associated with a trip.
|
||||
* On error, both output parameters are set to NULL.
|
||||
*/
|
||||
void split_divecomputer(const struct dive *src, int num, struct dive **out1, struct dive **out2)
|
||||
extern "C" void split_divecomputer(const struct dive *src, int num, struct dive **out1, struct dive **out2)
|
||||
{
|
||||
const struct divecomputer *srcdc = get_dive_dc_const(src, num);
|
||||
|
||||
|
@ -3170,7 +3170,7 @@ void split_divecomputer(const struct dive *src, int num, struct dive **out1, str
|
|||
}
|
||||
|
||||
//Calculate O2 in best mix
|
||||
fraction_t best_o2(depth_t depth, const struct dive *dive, bool in_planner)
|
||||
extern "C" fraction_t best_o2(depth_t depth, const struct dive *dive, bool in_planner)
|
||||
{
|
||||
fraction_t fo2;
|
||||
int po2 = in_planner ? prefs.bottompo2 : (int)(prefs.modpO2 * 1000.0);
|
||||
|
@ -3183,7 +3183,7 @@ fraction_t best_o2(depth_t depth, const struct dive *dive, bool in_planner)
|
|||
}
|
||||
|
||||
//Calculate He in best mix. O2 is considered narcopic
|
||||
fraction_t best_he(depth_t depth, const struct dive *dive, bool o2narcotic, fraction_t fo2)
|
||||
extern "C" fraction_t best_he(depth_t depth, const struct dive *dive, bool o2narcotic, fraction_t fo2)
|
||||
{
|
||||
fraction_t fhe;
|
||||
int pnarcotic, ambient;
|
||||
|
@ -3199,18 +3199,18 @@ fraction_t best_he(depth_t depth, const struct dive *dive, bool o2narcotic, frac
|
|||
return fhe;
|
||||
}
|
||||
|
||||
void invalidate_dive_cache(struct dive *dive)
|
||||
extern "C" void invalidate_dive_cache(struct dive *dive)
|
||||
{
|
||||
memset(dive->git_id, 0, 20);
|
||||
}
|
||||
|
||||
bool dive_cache_is_valid(const struct dive *dive)
|
||||
extern "C" bool dive_cache_is_valid(const struct dive *dive)
|
||||
{
|
||||
static const unsigned char null_id[20] = { 0, };
|
||||
return !!memcmp(dive->git_id, null_id, 20);
|
||||
}
|
||||
|
||||
int get_surface_pressure_in_mbar(const struct dive *dive, bool non_null)
|
||||
extern "C" int get_surface_pressure_in_mbar(const struct dive *dive, bool non_null)
|
||||
{
|
||||
int mbar = dive->surface_pressure.mbar;
|
||||
if (!mbar && non_null)
|
||||
|
@ -3246,12 +3246,12 @@ static double calculate_depth_to_mbarf(int depth, pressure_t surface_pressure, i
|
|||
return mbar + depth * specific_weight;
|
||||
}
|
||||
|
||||
int depth_to_mbar(int depth, const struct dive *dive)
|
||||
extern "C" int depth_to_mbar(int depth, const struct dive *dive)
|
||||
{
|
||||
return lrint(depth_to_mbarf(depth, dive));
|
||||
}
|
||||
|
||||
double depth_to_mbarf(int depth, const struct dive *dive)
|
||||
extern "C" double depth_to_mbarf(int depth, const struct dive *dive)
|
||||
{
|
||||
// To downloaded and planned dives, use DC's values
|
||||
int salinity = dive->dc.salinity;
|
||||
|
@ -3264,12 +3264,12 @@ double depth_to_mbarf(int depth, const struct dive *dive)
|
|||
return calculate_depth_to_mbarf(depth, surface_pressure, salinity);
|
||||
}
|
||||
|
||||
double depth_to_bar(int depth, const struct dive *dive)
|
||||
extern "C" double depth_to_bar(int depth, const struct dive *dive)
|
||||
{
|
||||
return depth_to_mbar(depth, dive) / 1000.0;
|
||||
}
|
||||
|
||||
double depth_to_atm(int depth, const struct dive *dive)
|
||||
extern "C" double depth_to_atm(int depth, const struct dive *dive)
|
||||
{
|
||||
return mbar_to_atm(depth_to_mbar(depth, dive));
|
||||
}
|
||||
|
@ -3278,7 +3278,7 @@ double depth_to_atm(int depth, const struct dive *dive)
|
|||
* (that's the one that some dive computers like the Uemis Zurich
|
||||
* provide - for the other models that do this libdivecomputer has to
|
||||
* take care of this, but the Uemis we support natively */
|
||||
int rel_mbar_to_depth(int mbar, const struct dive *dive)
|
||||
extern "C" int rel_mbar_to_depth(int mbar, const struct dive *dive)
|
||||
{
|
||||
// To downloaded and planned dives, use DC's salinity. Manual dives, use user's salinity
|
||||
int salinity = is_manually_added_dc(&dive->dc) ? dive->user_salinity : dive->dc.salinity;
|
||||
|
@ -3290,7 +3290,7 @@ int rel_mbar_to_depth(int mbar, const struct dive *dive)
|
|||
return (int)lrint(mbar / specific_weight);
|
||||
}
|
||||
|
||||
int mbar_to_depth(int mbar, const struct dive *dive)
|
||||
extern "C" int mbar_to_depth(int mbar, const struct dive *dive)
|
||||
{
|
||||
// To downloaded and planned dives, use DC's pressure. Manual dives, use user's pressure
|
||||
pressure_t surface_pressure = is_manually_added_dc(&dive->dc)
|
||||
|
@ -3304,7 +3304,7 @@ int mbar_to_depth(int mbar, const struct dive *dive)
|
|||
}
|
||||
|
||||
/* MOD rounded to multiples of roundto mm */
|
||||
depth_t gas_mod(struct gasmix mix, pressure_t po2_limit, const struct dive *dive, int roundto)
|
||||
extern "C" depth_t gas_mod(struct gasmix mix, pressure_t po2_limit, const struct dive *dive, int roundto)
|
||||
{
|
||||
depth_t rounded_depth;
|
||||
|
||||
|
@ -3314,7 +3314,7 @@ depth_t gas_mod(struct gasmix mix, pressure_t po2_limit, const struct dive *dive
|
|||
}
|
||||
|
||||
/* Maximum narcotic depth rounded to multiples of roundto mm */
|
||||
depth_t gas_mnd(struct gasmix mix, depth_t end, const struct dive *dive, int roundto)
|
||||
extern "C" depth_t gas_mnd(struct gasmix mix, depth_t end, const struct dive *dive, int roundto)
|
||||
{
|
||||
depth_t rounded_depth;
|
||||
pressure_t ppo2n2;
|
||||
|
@ -3332,25 +3332,25 @@ depth_t gas_mnd(struct gasmix mix, depth_t end, const struct dive *dive, int rou
|
|||
return rounded_depth;
|
||||
}
|
||||
|
||||
struct dive *get_dive(int nr)
|
||||
extern "C" struct dive *get_dive(int nr)
|
||||
{
|
||||
if (nr >= divelog.dives->nr || nr < 0)
|
||||
return NULL;
|
||||
return divelog.dives->dives[nr];
|
||||
}
|
||||
|
||||
struct dive_site *get_dive_site_for_dive(const struct dive *dive)
|
||||
extern "C" struct dive_site *get_dive_site_for_dive(const struct dive *dive)
|
||||
{
|
||||
return dive->dive_site;
|
||||
}
|
||||
|
||||
const char *get_dive_country(const struct dive *dive)
|
||||
extern "C" const char *get_dive_country(const struct dive *dive)
|
||||
{
|
||||
struct dive_site *ds = dive->dive_site;
|
||||
return ds ? taxonomy_get_country(&ds->taxonomy) : NULL;
|
||||
}
|
||||
|
||||
const char *get_dive_location(const struct dive *dive)
|
||||
extern "C" const char *get_dive_location(const struct dive *dive)
|
||||
{
|
||||
const struct dive_site *ds = dive->dive_site;
|
||||
if (ds && ds->name)
|
||||
|
@ -3358,7 +3358,7 @@ const char *get_dive_location(const struct dive *dive)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
unsigned int number_of_computers(const struct dive *dive)
|
||||
extern "C" unsigned int number_of_computers(const struct dive *dive)
|
||||
{
|
||||
unsigned int total_number = 0;
|
||||
const struct divecomputer *dc = &dive->dc;
|
||||
|
@ -3373,7 +3373,7 @@ unsigned int number_of_computers(const struct dive *dive)
|
|||
return total_number;
|
||||
}
|
||||
|
||||
struct divecomputer *get_dive_dc(struct dive *dive, int nr)
|
||||
extern "C" struct divecomputer *get_dive_dc(struct dive *dive, int nr)
|
||||
{
|
||||
struct divecomputer *dc;
|
||||
if (!dive)
|
||||
|
@ -3388,12 +3388,12 @@ struct divecomputer *get_dive_dc(struct dive *dive, int nr)
|
|||
return dc;
|
||||
}
|
||||
|
||||
const struct divecomputer *get_dive_dc_const(const struct dive *dive, int nr)
|
||||
extern "C" const struct divecomputer *get_dive_dc_const(const struct dive *dive, int nr)
|
||||
{
|
||||
return get_dive_dc((struct dive *)dive, nr);
|
||||
}
|
||||
|
||||
struct dive *get_dive_by_uniq_id(int id)
|
||||
extern "C" struct dive *get_dive_by_uniq_id(int id)
|
||||
{
|
||||
int i;
|
||||
struct dive *dive = NULL;
|
||||
|
@ -3411,7 +3411,7 @@ struct dive *get_dive_by_uniq_id(int id)
|
|||
return dive;
|
||||
}
|
||||
|
||||
int get_idx_by_uniq_id(int id)
|
||||
extern "C" int get_idx_by_uniq_id(int id)
|
||||
{
|
||||
int i;
|
||||
struct dive *dive = NULL;
|
||||
|
@ -3429,12 +3429,12 @@ int get_idx_by_uniq_id(int id)
|
|||
return i;
|
||||
}
|
||||
|
||||
bool dive_site_has_gps_location(const struct dive_site *ds)
|
||||
extern "C" bool dive_site_has_gps_location(const struct dive_site *ds)
|
||||
{
|
||||
return ds && has_location(&ds->location);
|
||||
}
|
||||
|
||||
int dive_has_gps_location(const struct dive *dive)
|
||||
extern "C" int dive_has_gps_location(const struct dive *dive)
|
||||
{
|
||||
if (!dive)
|
||||
return false;
|
||||
|
@ -3469,7 +3469,7 @@ static location_t dc_get_gps_location(const struct divecomputer *dc)
|
|||
* This function is potentially slow, therefore only call sparingly
|
||||
* and remember the result.
|
||||
*/
|
||||
location_t dive_get_gps_location(const struct dive *d)
|
||||
extern "C" location_t dive_get_gps_location(const struct dive *d)
|
||||
{
|
||||
location_t res = { };
|
||||
|
||||
|
@ -3489,7 +3489,7 @@ location_t dive_get_gps_location(const struct dive *d)
|
|||
}
|
||||
|
||||
/* When evaluated at the time of a gasswitch, this returns the new gas */
|
||||
struct gasmix get_gasmix(const struct dive *dive, const struct divecomputer *dc, int time, const struct event **evp, struct gasmix gasmix)
|
||||
extern "C" struct gasmix get_gasmix(const struct dive *dive, const struct divecomputer *dc, int time, const struct event **evp, struct gasmix gasmix)
|
||||
{
|
||||
const struct event *ev = *evp;
|
||||
struct gasmix res;
|
||||
|
@ -3517,7 +3517,7 @@ struct gasmix get_gasmix(const struct dive *dive, const struct divecomputer *dc,
|
|||
|
||||
/* get the gas at a certain time during the dive */
|
||||
/* If there is a gasswitch at that time, it returns the new gasmix */
|
||||
struct gasmix get_gasmix_at_time(const struct dive *d, const struct divecomputer *dc, duration_t time)
|
||||
extern "C" struct gasmix get_gasmix_at_time(const struct dive *d, const struct divecomputer *dc, duration_t time)
|
||||
{
|
||||
const struct event *ev = NULL;
|
||||
struct gasmix gasmix = gasmix_air;
|
||||
|
@ -3525,7 +3525,7 @@ struct gasmix get_gasmix_at_time(const struct dive *d, const struct divecomputer
|
|||
}
|
||||
|
||||
/* Does that cylinder have any pressure readings? */
|
||||
extern bool cylinder_with_sensor_sample(const struct dive *dive, int cylinder_id)
|
||||
extern "C" bool cylinder_with_sensor_sample(const struct dive *dive, int cylinder_id)
|
||||
{
|
||||
for (const struct divecomputer *dc = &dive->dc; dc; dc = dc->next) {
|
||||
for (int i = 0; i < dc->samples; ++i) {
|
|
@ -13,17 +13,17 @@
|
|||
} \
|
||||
}
|
||||
|
||||
#define STRUCTURED_LIST_COPY(_type, _first, _dest, _cpy) \
|
||||
{ \
|
||||
_type *_sptr = _first; \
|
||||
_type **_dptr = &_dest; \
|
||||
while (_sptr) { \
|
||||
*_dptr = malloc(sizeof(_type)); \
|
||||
_cpy(_sptr, *_dptr); \
|
||||
_sptr = _sptr->next; \
|
||||
_dptr = &(*_dptr)->next; \
|
||||
} \
|
||||
*_dptr = 0; \
|
||||
#define STRUCTURED_LIST_COPY(_type, _first, _dest, _cpy) \
|
||||
{ \
|
||||
_type *_sptr = _first; \
|
||||
_type **_dptr = &_dest; \
|
||||
while (_sptr) { \
|
||||
*_dptr = (_type *)malloc(sizeof(_type)); \
|
||||
_cpy(_sptr, *_dptr); \
|
||||
_sptr = _sptr->next; \
|
||||
_dptr = &(*_dptr)->next; \
|
||||
} \
|
||||
*_dptr = 0; \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue