core: make fp_get_data return an std::string

No need for manual memory management.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2024-02-29 08:23:55 +01:00
parent e456c1b574
commit a49e84082c
4 changed files with 17 additions and 12 deletions

View file

@ -286,12 +286,20 @@ extern "C" uint32_t fp_get_diveid(struct fingerprint_table *table, unsigned int
return table->fingerprints[i].fdiveid;
}
extern "C" char *fp_get_data(struct fingerprint_table *table, unsigned int i)
static char to_hex_digit(unsigned char d)
{
return d <= 9 ? d + '0' : d - 10 + 'a';
}
std::string fp_get_data(struct fingerprint_table *table, unsigned int i)
{
if (!table || i >= table->fingerprints.size())
return 0;
return std::string();
struct fingerprint_record *fpr = &table->fingerprints[i];
// fromRawData() avoids one copy of the raw_data
QByteArray hex = QByteArray::fromRawData((char *)fpr->raw_data, fpr->fsize).toHex();
return strdup(hex.constData());
std::string res(' ', fpr->fsize * 2);
for (unsigned int i = 0; i < fpr->fsize; ++i) {
res[2 * i] = to_hex_digit((fpr->raw_data[i] >> 4) & 0xf);
res[2 * i + 1] = to_hex_digit(fpr->raw_data[i] & 0xf);
}
return res;
}

View file

@ -54,7 +54,6 @@ extern uint32_t fp_get_model(struct fingerprint_table *table, unsigned int i);
extern uint32_t fp_get_serial(struct fingerprint_table *table, unsigned int i);
extern uint32_t fp_get_deviceid(struct fingerprint_table *table, unsigned int i);
extern uint32_t fp_get_diveid(struct fingerprint_table *table, unsigned int i);
extern char *fp_get_data(struct fingerprint_table *table, unsigned int i);
extern int is_default_dive_computer_device(const char *);
@ -100,6 +99,8 @@ struct fingerprint_table {
std::vector<fingerprint_record> fingerprints;
};
std::string fp_get_data(struct fingerprint_table *table, unsigned int i);
#endif
#endif // DEVICE_H

View file

@ -881,14 +881,12 @@ static void save_one_device(struct membuffer *b, const struct device *d)
static void save_one_fingerprint(struct membuffer *b, int i)
{
char *fp_data = fp_get_data(&fingerprint_table, i);
put_format(b, "fingerprint model=%08x serial=%08x deviceid=%08x diveid=%08x data=\"%s\"\n",
fp_get_model(&fingerprint_table, i),
fp_get_serial(&fingerprint_table, i),
fp_get_deviceid(&fingerprint_table, i),
fp_get_diveid(&fingerprint_table, i),
fp_data);
free(fp_data);
fp_get_data(&fingerprint_table, i).c_str());
}
static void save_settings(git_repository *repo, struct dir *tree)

View file

@ -620,14 +620,12 @@ static void save_one_device(struct membuffer *b, const struct device *d)
static void save_one_fingerprint(struct membuffer *b, int i)
{
char *data = fp_get_data(&fingerprint_table, i);
put_format(b, "<fingerprint model='%08x' serial='%08x' deviceid='%08x' diveid='%08x' data='%s'/>\n",
fp_get_model(&fingerprint_table, i),
fp_get_serial(&fingerprint_table, i),
fp_get_deviceid(&fingerprint_table, i),
fp_get_diveid(&fingerprint_table, i),
data);
free(data);
fp_get_data(&fingerprint_table, i).c_str());
}
extern "C" int save_dives(const char *filename)