Fixed several memory leaks
Removed unused variable
Changed use of int to unsigned int where it made sense and fixed initializations
Used ringbuffer functions
Adjusted enum names to comply
---
src/cochran_commander.c | 57 ++++++++++++++++++++++---------------------------
1 file changed, 25 insertions(+), 32 deletions(-)
diff --git a/src/cochran_commander.c b/src/cochran_commander.c
index 4c15541..5ff46a5 100644
--- a/src/cochran_commander.c
+++ b/src/cochran_commander.c
@@ -42,8 +42,8 @@ typedef enum cochran_endian_t {
} cochran_endian_t;
typedef enum cochran_profile_size_t {
- PROFILE_FULL_SIZE,
- PROFILE_READ_SIZE,
+ PROFILE_SIZE_FULL,
+ PROFILE_SIZE_READ,
} cochran_profile_size_t;
typedef struct cochran_commander_model_t {
@@ -54,7 +54,6 @@ typedef struct cochran_commander_model_t {
typedef struct cochran_data_t {
unsigned char config[1024];
unsigned char *logbook;
- unsigned char *sample;
unsigned short int dive_count;
int fp_dive_num;
@@ -455,18 +454,18 @@ cochran_commander_guess_sample_end_address(cochran_commander_device_t *device, c
}
-static int
+static unsigned int
cochran_commander_profile_size(cochran_commander_device_t *device, cochran_data_t *data, int dive_num, cochran_profile_size_t type)
{
const unsigned char *log_entry = data->logbook + dive_num * device->layout->rb_logbook_entry_size;
- unsigned int sample_start_address = -1;
+ unsigned int sample_start_address = 0xFFFFFFFF;
unsigned int sample_end_address = array_uint32_le (log_entry + device->layout->pt_profile_end);
- if (type == PROFILE_FULL_SIZE) {
+ if (type == PROFILE_SIZE_FULL) {
// actual size, includes pre-dive events
sample_start_address = array_uint32_le (log_entry + device->layout->pt_profile_pre);
- } else if (type == PROFILE_READ_SIZE) {
+ } else if (type == PROFILE_SIZE_READ) {
// read size, only include dive profile
sample_start_address = array_uint32_le (log_entry + device->layout->pt_profile_begin);
}
@@ -484,14 +483,7 @@ cochran_commander_profile_size(cochran_commander_device_t *device, cochran_data_
// Corrupt dive, guess the end address
sample_end_address = cochran_commander_guess_sample_end_address(device, data, dive_num);
- // Calculate the size of the profile only
- int sample_size = sample_end_address - sample_start_address;
-
- if (sample_size < 0)
- // Adjust for ring buffer wrap-around
- sample_size += device->layout->rb_profile_end - device->layout->rb_profile_begin;
-
- return sample_size;
+ return ringbuffer_distance(sample_start_address, sample_end_address, 0, device->layout->rb_profile_end - device->layout->rb_profile_begin);
}
@@ -501,7 +493,7 @@ cochran_commander_profile_size(cochran_commander_device_t *device, cochran_data_
* Determine the most recent dive without profile data.
*/
-static int
+static unsigned int
cochran_commander_find_fingerprint(cochran_commander_device_t *device, cochran_data_t *data)
{
// We track profile ringbuffer usage to determine which dives have profile data
@@ -536,8 +528,8 @@ cochran_commander_find_fingerprint(cochran_commander_device_t *device, cochran_d
break;
}
- int sample_size = cochran_commander_profile_size(device, data, i, PROFILE_FULL_SIZE);
- int read_size = cochran_commander_profile_size(device, data, i, PROFILE_READ_SIZE);
+ unsigned int sample_size = cochran_commander_profile_size(device, data, i, PROFILE_FULL_SIZE);
+ unsigned int read_size = cochran_commander_profile_size(device, data, i, PROFILE_READ_SIZE);
// Determine if sample exists
if (profile_capacity_remaining > 0) {
@@ -550,12 +542,6 @@ cochran_commander_find_fingerprint(cochran_commander_device_t *device, cochran_d
// Accumulate read size for progress bar
sample_read_size += read_size;
}
-
- if (profile_capacity_remaining < 0) {
- // There is no profile for this dive
- sample_size = 0;
- }
-
}
return sample_read_size;
@@ -790,7 +776,6 @@ cochran_commander_device_foreach (dc_device_t *abstract, dc_dive_callback_t call
cochran_data_t data;
data.logbook = NULL;
- data.sample = NULL;
// Calculate max data sizes
unsigned int max_config = sizeof(data.config);
@@ -839,11 +824,13 @@ cochran_commander_device_foreach (dc_device_t *abstract, dc_dive_callback_t call
// Request log book
rc = cochran_commander_read(device, &progress, 0, data.logbook, data.logbook_size);
- if (rc != DC_STATUS_SUCCESS)
- return rc;
+ if (rc != DC_STATUS_SUCCESS) {
+ status = rc;
+ goto error;
+ }
// Locate fingerprint, recent dive with invalid profile and calc read size
- int profile_read_size = cochran_commander_find_fingerprint(device, &data);
+ unsigned int profile_read_size = cochran_commander_find_fingerprint(device, &data);
// Update progress indicator with new maximum
progress.maximum -= (max_sample - profile_read_size);
device_event_emit (abstract, DC_EVENT_PROGRESS, &progress);
@@ -898,13 +885,18 @@ cochran_commander_device_foreach (dc_device_t *abstract, dc_dive_callback_t call
int tries = 0;
// Read profile data
if (sample_size) {
+ if (sample_end_address == 0xFFFFFFFF)
+ // Corrupt dive, guess the end address
+ sample_end_address = cochran_commander_guess_sample_end_address(device, data, dive_num);
+
if (sample_start_address <= sample_end_address) {
do {
rc = cochran_commander_read (device, &progress, sample_start_address, dive + device->layout->rb_logbook_entry_size, sample_size);
} while (rc != DC_STATUS_SUCCESS && tries++ < 3);
if (rc != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to read the sample data.");
- return rc;
+ status = rc
+ goto error;
}
} else {
// It wrapped the buffer, copy two sections
@@ -916,7 +908,8 @@ cochran_commander_device_foreach (dc_device_t *abstract, dc_dive_callback_t call
} while (rc != DC_STATUS_SUCCESS && tries++ < 3);
if (rc != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to read the sample data.");
- return rc;
+ status = rc
+ goto error;
}
tries = 0;
do {
@@ -924,7 +917,8 @@ cochran_commander_device_foreach (dc_device_t *abstract, dc_dive_callback_t call
} while (rc != DC_STATUS_SUCCESS && tries++ < 3);
if (rc != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to read the sample data.");
- return rc;
+ status = rc
+ goto error;
}
}
}
@@ -939,6 +933,5 @@ cochran_commander_device_foreach (dc_device_t *abstract, dc_dive_callback_t call
error:
free(data.logbook);
- free(data.sample);
return status;
}
--
2.4.11