diff --git a/commands/command_event.cpp b/commands/command_event.cpp index 486448a33..110ad9639 100644 --- a/commands/command_event.cpp +++ b/commands/command_event.cpp @@ -123,7 +123,7 @@ RemoveEvent::RemoveEvent(struct dive *d, int dcNr, struct event *ev) : EventBase cylinder(ev->type == SAMPLE_EVENT_GASCHANGE2 || ev->type == SAMPLE_EVENT_GASCHANGE ? ev->gas.index : -1) { - setText(Command::Base::tr("Remove %1 event").arg(ev->name)); + setText(Command::Base::tr("Remove %1 event").arg(ev->name.c_str())); } bool RemoveEvent::workToBeDone() diff --git a/core/dive.cpp b/core/dive.cpp index 2c79815c2..c6c2019ca 100644 --- a/core/dive.cpp +++ b/core/dive.cpp @@ -750,11 +750,11 @@ static void sanitize_cylinder_info(struct dive *dive) /* some events should never be thrown away */ static bool is_potentially_redundant(const struct event *event) { - if (!strcmp(event->name, "gaschange")) + if (event->name == "gaschange") return false; - if (!strcmp(event->name, "bookmark")) + if (event->name == "bookmark") return false; - if (!strcmp(event->name, "heading")) + if (event->name == "heading") return false; return true; } @@ -765,10 +765,10 @@ static struct event *find_previous_event(struct divecomputer *dc, struct event * struct event *ev = dc->events; struct event *previous = NULL; - if (empty_string(event->name)) + if (event->name.empty()) return NULL; while (ev && ev != event) { - if (same_string(ev->name, event->name)) + if (ev->name == event->name) previous = ev; ev = ev->next; } @@ -1546,12 +1546,12 @@ static int sort_event(const struct event *a, const struct event *b, int time_a, SORT_FIELD(a, b, type); SORT_FIELD(a, b, flags); SORT_FIELD(a, b, value); - return strcmp(a->name, b->name); + return a->name.compare(b->name); } static int same_gas(const struct event *a, const struct event *b) { - if (a->type == b->type && a->flags == b->flags && a->value == b->value && !strcmp(a->name, b->name) && + if (a->type == b->type && a->flags == b->flags && a->value == b->value && a->name == b->name && same_gasmix(a->gas.mix, b->gas.mix)) { return true; } diff --git a/core/divecomputer.cpp b/core/divecomputer.cpp index 61a90fbfb..6546af27e 100644 --- a/core/divecomputer.cpp +++ b/core/divecomputer.cpp @@ -433,7 +433,7 @@ void add_event_to_dc(struct divecomputer *dc, struct event *ev) *p = ev; } -struct event *add_event(struct divecomputer *dc, unsigned int time, int type, int flags, int value, const char *name) +struct event *add_event(struct divecomputer *dc, unsigned int time, int type, int flags, int value, const std::string &name) { struct event *ev = create_event(time, type, flags, value, name); diff --git a/core/divecomputer.h b/core/divecomputer.h index de7bdfa45..f4ba23fce 100644 --- a/core/divecomputer.h +++ b/core/divecomputer.h @@ -4,6 +4,7 @@ #include "divemode.h" #include "units.h" +#include struct extra_data; struct sample; @@ -60,7 +61,7 @@ extern void copy_events(const struct divecomputer *s, struct divecomputer *d); extern void swap_event(struct divecomputer *dc, struct event *from, struct event *to); extern void copy_samples(const struct divecomputer *s, struct divecomputer *d); extern void add_event_to_dc(struct divecomputer *dc, struct event *ev); -extern struct event *add_event(struct divecomputer *dc, unsigned int time, int type, int flags, int value, const char *name); +extern struct event *add_event(struct divecomputer *dc, unsigned int time, int type, int flags, int value, const std::string &name); extern void remove_event_from_dc(struct divecomputer *dc, struct event *event); extern void add_extra_data(struct divecomputer *dc, const char *key, const char *value); extern uint32_t calculate_string_hash(const char *str); diff --git a/core/event.cpp b/core/event.cpp index 648a7a4a4..92d2ca8e9 100644 --- a/core/event.cpp +++ b/core/event.cpp @@ -9,7 +9,6 @@ event::event() : next(nullptr), type(SAMPLE_EVENT_NONE), flags(0), value(0), divemode(OC), deleted(false), hidden(false) { - memset(name, 0, MAX_EVENT_NAME); /* That overwrites divemode. Is this a smart thing to do? */ gas.index = -1; gas.mix = gasmix_air; @@ -27,7 +26,7 @@ int event_is_gaschange(const struct event *ev) bool event_is_divemodechange(const struct event *ev) { - return same_string(ev->name, "modechange"); + return ev->name == "modechange"; } struct event *clone_event(const struct event *src_ev) @@ -52,13 +51,13 @@ void free_events(struct event *ev) } } -struct event *create_event(unsigned int time, int type, int flags, int value, const char *name) +struct event *create_event(unsigned int time, int type, int flags, int value, const std::string &name) { int gas_index = -1; struct event *ev; ev = new event; - strncpy(ev->name, name, MAX_EVENT_NAME - 1); + ev->name = name; ev->time.seconds = time; ev->type = type; ev->flags = flags; @@ -90,7 +89,7 @@ struct event *create_event(unsigned int time, int type, int flags, int value, co return ev; } -struct event *clone_event_rename(const struct event *ev, const char *name) +struct event *clone_event_rename(const struct event *ev, const std::string &name) { return create_event(ev->time.seconds, ev->type, ev->flags, ev->value, name); } @@ -105,7 +104,7 @@ bool same_event(const struct event *a, const struct event *b) return 0; if (a->value != b->value) return 0; - return !strcmp(a->name, b->name); + return a->name == b->name; } extern enum event_severity get_event_severity(const struct event *ev) diff --git a/core/event.h b/core/event.h index 202bdc103..fe3d0fc1b 100644 --- a/core/event.h +++ b/core/event.h @@ -6,6 +6,7 @@ #include "gas.h" #include "units.h" +#include #include enum event_severity { @@ -19,7 +20,6 @@ enum event_severity { * Events are currently based straight on what libdivecomputer gives us. * We need to wrap these into our own events at some point to remove some of the limitations. */ -#define MAX_EVENT_NAME 128 struct event { struct event *next; @@ -42,7 +42,7 @@ struct event { }; bool deleted; // used internally in the parser and in fixup_dive(). bool hidden; - char name[MAX_EVENT_NAME]; + std::string name; event(); ~event(); }; @@ -51,13 +51,13 @@ extern int event_is_gaschange(const struct event *ev); extern bool event_is_divemodechange(const struct event *ev); extern struct event *clone_event(const struct event *src_ev); extern void free_events(struct event *ev); -extern struct event *create_event(unsigned int time, int type, int flags, int value, const char *name); -extern struct event *clone_event_rename(const struct event *ev, const char *name); +extern struct event *create_event(unsigned int time, int type, int flags, int value, const std::string &name); +extern struct event *clone_event_rename(const struct event *ev, const std::string &name); extern bool same_event(const struct event *a, const struct event *b); extern enum event_severity get_event_severity(const struct event *ev); /* Since C doesn't have parameter-based overloading, two versions of get_next_event. */ -extern const struct event *get_next_event(const struct event *event, const char *name); -extern struct event *get_next_event_mutable(struct event *event, const char *name); +extern const struct event *get_next_event(const struct event *event, const std::string &name); +extern struct event *get_next_event_mutable(struct event *event, const std::string &name); #endif diff --git a/core/eventtype.cpp b/core/eventtype.cpp index 8fbeb2703..37f59615d 100644 --- a/core/eventtype.cpp +++ b/core/eventtype.cpp @@ -34,7 +34,7 @@ void clear_event_types() void remember_event_type(const struct event *ev) { - if (empty_string(ev->name)) + if (ev->name.empty()) return; event_type type(ev); if (std::find(event_types.begin(), event_types.end(), type) != event_types.end()) @@ -104,10 +104,10 @@ static QString event_type_name(QString name, event_severity severity) QString event_type_name(const event *ev) { - if (!ev || empty_string(ev->name)) + if (!ev || ev->name.empty()) return QString(); - QString name = QString::fromUtf8(ev->name); + QString name = QString::fromStdString(ev->name); return event_type_name(std::move(name), get_event_severity(ev)); } diff --git a/core/import-divinglog.cpp b/core/import-divinglog.cpp index 50eba6927..c2bc75573 100644 --- a/core/import-divinglog.cpp +++ b/core/import-divinglog.cpp @@ -56,6 +56,8 @@ static int divinglog_cylinder(void *param, int, char **data, char **) static int divinglog_profile(void *param, int, char **data, char **) { + using namespace std::string_literals; + struct parser_state *state = (struct parser_state *)param; int sinterval = 0; @@ -136,7 +138,7 @@ static int divinglog_profile(void *param, int, char **data, char **) event_start(state); state->cur_event.time.seconds = time; - strcpy(state->cur_event.name, "gaschange"); + state->cur_event.name = "gaschange"s; o2 = (o2 + 5) / 10; he = (he + 5) / 10; @@ -223,7 +225,7 @@ static int divinglog_profile(void *param, int, char **data, char **) if (ptr1[6] - '0') { event_start(state); state->cur_event.time.seconds = time; - strcpy(state->cur_event.name, "rbt"); + state->cur_event.name = "rbt"s; event_end(state); } @@ -231,7 +233,7 @@ static int divinglog_profile(void *param, int, char **data, char **) if (ptr1[7] - '0') { event_start(state); state->cur_event.time.seconds = time; - strcpy(state->cur_event.name, "ascent"); + state->cur_event.name = "ascent"s; event_end(state); } @@ -239,7 +241,7 @@ static int divinglog_profile(void *param, int, char **data, char **) if (ptr1[8] - '0') { event_start(state); state->cur_event.time.seconds = time; - strcpy(state->cur_event.name, "violation"); + state->cur_event.name = "violation"s; event_end(state); } @@ -247,7 +249,7 @@ static int divinglog_profile(void *param, int, char **data, char **) if (ptr1[9] - '0') { event_start(state); state->cur_event.time.seconds = time; - strcpy(state->cur_event.name, "workload"); + state->cur_event.name = "workload"s; event_end(state); } diff --git a/core/import-seac.cpp b/core/import-seac.cpp index 5ee9ac18e..a99128da5 100644 --- a/core/import-seac.cpp +++ b/core/import-seac.cpp @@ -27,11 +27,12 @@ */ static int seac_gaschange(void *param, sqlite3_stmt *sqlstmt) { + using namespace std::string_literals; struct parser_state *state = (struct parser_state *)param; event_start(state); state->cur_event.time.seconds = sqlite3_column_int(sqlstmt, 1); - strcpy(state->cur_event.name, "gaschange"); + state->cur_event.name = "gaschange"s; state->cur_event.gas.mix.o2.permille = 10 * sqlite3_column_int(sqlstmt, 4); event_end(state); diff --git a/core/import-suunto.cpp b/core/import-suunto.cpp index 5859b0bdf..b6e4bc6db 100644 --- a/core/import-suunto.cpp +++ b/core/import-suunto.cpp @@ -21,6 +21,7 @@ static int dm4_events(void *param, int, char **data, char **) { + using namespace std::string_literals; struct parser_state *state = (struct parser_state *)param; event_start(state); @@ -31,108 +32,108 @@ static int dm4_events(void *param, int, char **data, char **) switch (atoi(data[2])) { case 1: /* 1 Mandatory Safety Stop */ - strcpy(state->cur_event.name, "safety stop (mandatory)"); + state->cur_event.name = "safety stop (mandatory)"s; break; case 3: /* 3 Deco */ /* What is Subsurface's term for going to * deco? */ - strcpy(state->cur_event.name, "deco"); + state->cur_event.name = "deco"s; break; case 4: /* 4 Ascent warning */ - strcpy(state->cur_event.name, "ascent"); + state->cur_event.name = "ascent"s; break; case 5: /* 5 Ceiling broken */ - strcpy(state->cur_event.name, "violation"); + state->cur_event.name = "violation"s; break; case 6: /* 6 Mandatory safety stop ceiling error */ - strcpy(state->cur_event.name, "violation"); + state->cur_event.name = "violation"s; break; case 7: /* 7 Below deco floor */ - strcpy(state->cur_event.name, "below floor"); + state->cur_event.name = "below floor"s; break; case 8: /* 8 Dive time alarm */ - strcpy(state->cur_event.name, "divetime"); + state->cur_event.name = "divetime"s; break; case 9: /* 9 Depth alarm */ - strcpy(state->cur_event.name, "maxdepth"); + state->cur_event.name = "maxdepth"s; break; case 10: /* 10 OLF 80% */ case 11: /* 11 OLF 100% */ - strcpy(state->cur_event.name, "OLF"); + state->cur_event.name = "OLF"s; break; case 12: /* 12 High pO₂ */ - strcpy(state->cur_event.name, "PO2"); + state->cur_event.name = "PO2"s; break; case 13: /* 13 Air time */ - strcpy(state->cur_event.name, "airtime"); + state->cur_event.name = "airtime"s; break; case 17: /* 17 Ascent warning */ - strcpy(state->cur_event.name, "ascent"); + state->cur_event.name = "ascent"s; break; case 18: /* 18 Ceiling error */ - strcpy(state->cur_event.name, "ceiling"); + state->cur_event.name = "ceiling"s; break; case 19: /* 19 Surfaced */ - strcpy(state->cur_event.name, "surface"); + state->cur_event.name = "surface"s; break; case 20: /* 20 Deco */ - strcpy(state->cur_event.name, "deco"); + state->cur_event.name = "deco"s; break; case 22: case 32: /* 22 Mandatory safety stop violation */ /* 32 Deep stop violation */ - strcpy(state->cur_event.name, "violation"); + state->cur_event.name = "violation"s; break; case 30: /* Tissue level warning */ - strcpy(state->cur_event.name, "tissue warning"); + state->cur_event.name = "tissue warning"s; break; case 37: /* Tank pressure alarm */ - strcpy(state->cur_event.name, "tank pressure"); + state->cur_event.name = "tank pressure"s; break; case 257: /* 257 Dive active */ /* This seems to be given after surface when * descending again. */ - strcpy(state->cur_event.name, "surface"); + state->cur_event.name = "surface"s; break; case 258: /* 258 Bookmark */ if (data[3]) { - strcpy(state->cur_event.name, "heading"); + state->cur_event.name = "heading"s; state->cur_event.value = atoi(data[3]); } else { - strcpy(state->cur_event.name, "bookmark"); + state->cur_event.name = "bookmark"s; } break; case 259: /* Deep stop */ - strcpy(state->cur_event.name, "Deep stop"); + state->cur_event.name = "Deep stop"s; break; case 260: /* Deep stop */ - strcpy(state->cur_event.name, "Deep stop cleared"); + state->cur_event.name = "Deep stop cleared"s; break; case 266: /* Mandatory safety stop activated */ - strcpy(state->cur_event.name, "safety stop (mandatory)"); + state->cur_event.name = "safety stop (mandatory)"s; break; case 267: /* Mandatory safety stop deactivated */ @@ -140,7 +141,7 @@ static int dm4_events(void *param, int, char **data, char **) * profile so skipping as well for now */ break; default: - strcpy(state->cur_event.name, "unknown"); + state->cur_event.name = "unknown"s; state->cur_event.value = atoi(data[2]); break; } @@ -329,13 +330,14 @@ static int dm5_cylinders(void *param, int, char **data, char **) static int dm5_gaschange(void *param, int, char **data, char **) { + using namespace std::string_literals; struct parser_state *state = (struct parser_state *)param; event_start(state); if (data[0]) state->cur_event.time.seconds = atoi(data[0]); if (data[1]) { - strcpy(state->cur_event.name, "gaschange"); + state->cur_event.name = "gaschange"s; state->cur_event.value = lrint(permissive_strtod(data[1], NULL)); } diff --git a/core/parse-xml.cpp b/core/parse-xml.cpp index f75e61033..13caf6f19 100644 --- a/core/parse-xml.cpp +++ b/core/parse-xml.cpp @@ -439,14 +439,6 @@ static void cylindersize(const char *buffer, volume_t *volume) } } -static void event_name(const char *buffer, char *name) -{ - std::string trimmed = trimspace(buffer); - size_t size = std::min(trimmed.size(), (size_t)MAX_EVENT_NAME); - memcpy(name, trimmed.data(), size); - name[size] = 0; -} - // We don't use gauge as a mode, and pscr doesn't exist as a libdc divemode static const char *libdc_divemode_text[] = { "oc", "cc", "pscr", "freedive", "gauge"}; @@ -764,9 +756,9 @@ static void try_to_fill_fingerprint(const char *name, char *buf, struct parser_s static void try_to_fill_event(const char *name, char *buf, struct parser_state *state) { start_match("event", name, buf); - if (MATCH("event", event_name, state->cur_event.name)) + if (MATCH("event", utf8_string_std, &state->cur_event.name)) return; - if (MATCH("name", event_name, state->cur_event.name)) + if (MATCH("name", utf8_string_std, &state->cur_event.name)) return; if (MATCH_STATE("time", eventtime, &state->cur_event.time)) return; @@ -1931,39 +1923,39 @@ int parse_dlf_buffer(unsigned char *buffer, size_t size, struct divelog *log) state.cur_event.time.seconds = time; switch (ptr[4]) { case 1: - strcpy(state.cur_event.name, "Setpoint Manual"); + state.cur_event.name = "Setpoint Manual"s; state.cur_event.value = ptr[6]; sample_start(&state); state.cur_sample->setpoint.mbar = ptr[6] * 10; sample_end(&state); break; case 2: - strcpy(state.cur_event.name, "Setpoint Auto"); + state.cur_event.name = "Setpoint Auto"s; state.cur_event.value = ptr[6]; sample_start(&state); state.cur_sample->setpoint.mbar = ptr[6] * 10; sample_end(&state); switch (ptr[7]) { case 0: - strcat(state.cur_event.name, " Manual"); + state.cur_event.name += " Manual"s; break; case 1: - strcat(state.cur_event.name, " Auto Start"); + state.cur_event.name += " Auto Start"s; break; case 2: - strcat(state.cur_event.name, " Auto Hypox"); + state.cur_event.name += " Auto Hypox"s; break; case 3: - strcat(state.cur_event.name, " Auto Timeout"); + state.cur_event.name += " Auto Timeout"s; break; case 4: - strcat(state.cur_event.name, " Auto Ascent"); + state.cur_event.name += " Auto Ascent"s; break; case 5: - strcat(state.cur_event.name, " Auto Stall"); + state.cur_event.name += " Auto Stall"s; break; case 6: - strcat(state.cur_event.name, " Auto SP Low"); + state.cur_event.name += " Auto SP Low"s; break; default: break; @@ -1971,14 +1963,14 @@ int parse_dlf_buffer(unsigned char *buffer, size_t size, struct divelog *log) break; case 3: // obsolete - strcpy(state.cur_event.name, "OC"); + state.cur_event.name = "OC"s; break; case 4: // obsolete - strcpy(state.cur_event.name, "CCR"); + state.cur_event.name = "CCR"s; break; case 5: - strcpy(state.cur_event.name, "gaschange"); + state.cur_event.name = "gaschange"s; state.cur_event.type = SAMPLE_EVENT_GASCHANGE2; state.cur_event.value = ptr[7] << 8 ^ ptr[6]; @@ -2001,40 +1993,40 @@ int parse_dlf_buffer(unsigned char *buffer, size_t size, struct divelog *log) } break; case 6: - strcpy(state.cur_event.name, "Start"); + state.cur_event.name = "Start"s; break; case 7: - strcpy(state.cur_event.name, "Too Fast"); + state.cur_event.name = "Too Fast"s; break; case 8: - strcpy(state.cur_event.name, "Above Ceiling"); + state.cur_event.name = "Above Ceiling"s; break; case 9: - strcpy(state.cur_event.name, "Toxic"); + state.cur_event.name = "Toxic"s; break; case 10: - strcpy(state.cur_event.name, "Hypox"); + state.cur_event.name = "Hypox"s; break; case 11: - strcpy(state.cur_event.name, "Critical"); + state.cur_event.name = "Critical"s; break; case 12: - strcpy(state.cur_event.name, "Sensor Disabled"); + state.cur_event.name = "Sensor Disabled"s; break; case 13: - strcpy(state.cur_event.name, "Sensor Enabled"); + state.cur_event.name = "Sensor Enabled"s; break; case 14: - strcpy(state.cur_event.name, "O2 Backup"); + state.cur_event.name = "O2 Backup"s; break; case 15: - strcpy(state.cur_event.name, "Peer Down"); + state.cur_event.name = "Peer Down"s; break; case 16: - strcpy(state.cur_event.name, "HS Down"); + state.cur_event.name = "HS Down"s; break; case 17: - strcpy(state.cur_event.name, "Inconsistent"); + state.cur_event.name = "Inconsistent"s; break; case 18: // key pressed - It should never get in here @@ -2042,53 +2034,53 @@ int parse_dlf_buffer(unsigned char *buffer, size_t size, struct divelog *log) break; case 19: // obsolete - strcpy(state.cur_event.name, "SCR"); + state.cur_event.name = "SCR"s; break; case 20: - strcpy(state.cur_event.name, "Above Stop"); + state.cur_event.name = "Above Stop"s; break; case 21: - strcpy(state.cur_event.name, "Safety Miss"); + state.cur_event.name = "Safety Miss"s; break; case 22: - strcpy(state.cur_event.name, "Fatal"); + state.cur_event.name = "Fatal"s; break; case 23: - strcpy(state.cur_event.name, "gaschange"); + state.cur_event.name = "gaschange"s; state.cur_event.type = SAMPLE_EVENT_GASCHANGE2; state.cur_event.value = ptr[7] << 8 ^ ptr[6]; event_end(&state); break; case 24: - strcpy(state.cur_event.name, "gaschange"); + state.cur_event.name = "gaschange"s; state.cur_event.type = SAMPLE_EVENT_GASCHANGE2; state.cur_event.value = ptr[7] << 8 ^ ptr[6]; event_end(&state); // This is both a mode change and a gas change event // so we encode it as two separate events. event_start(&state); - strcpy(state.cur_event.name, "Change Mode"); + state.cur_event.name = "Change Mode"s; switch (ptr[8]) { case 1: - strcat(state.cur_event.name, ": OC"); + state.cur_event.name += ": OC"s; break; case 2: - strcat(state.cur_event.name, ": CCR"); + state.cur_event.name += ": CCR"s; break; case 3: - strcat(state.cur_event.name, ": mCCR"); + state.cur_event.name += ": mCCR"s; break; case 4: - strcat(state.cur_event.name, ": Free"); + state.cur_event.name += ": Free"s; break; case 5: - strcat(state.cur_event.name, ": Gauge"); + state.cur_event.name += ": Gauge"s; break; case 6: - strcat(state.cur_event.name, ": ASCR"); + state.cur_event.name += ": ASCR"s; break; case 7: - strcat(state.cur_event.name, ": PSCR"); + state.cur_event.name += ": PSCR"s; break; default: break; @@ -2098,22 +2090,22 @@ int parse_dlf_buffer(unsigned char *buffer, size_t size, struct divelog *log) case 25: // uint16_t solenoid_bitmap = (ptr[7] << 8) + (ptr[6] << 0); // uint32_t time = (ptr[11] << 24) + (ptr[10] << 16) + (ptr[9] << 8) + (ptr[8] << 0); - snprintf(state.cur_event.name, MAX_EVENT_NAME, "CCR O2 solenoid %s", ptr[12] ? "opened": "closed"); + state.cur_event.name = format_string_std("CCR O2 solenoid %s", ptr[12] ? "opened": "closed"); break; case 26: - strcpy(state.cur_event.name, "User mark"); + state.cur_event.name = "User mark"s; break; case 27: - snprintf(state.cur_event.name, MAX_EVENT_NAME, "%sGF Switch (%d/%d)", ptr[6] ? "Bailout, ": "", ptr[7], ptr[8]); + state.cur_event.name = format_string_std("%sGF Switch (%d/%d)", ptr[6] ? "Bailout, ": "", ptr[7], ptr[8]); break; case 28: - strcpy(state.cur_event.name, "Peer Up"); + state.cur_event.name = "Peer Up"s; break; case 29: - strcpy(state.cur_event.name, "HS Up"); + state.cur_event.name = "HS Up"s; break; case 30: - snprintf(state.cur_event.name, MAX_EVENT_NAME, "CNS %d%%", ptr[6]); + state.cur_event.name = format_string_std("CNS %d%%", ptr[6]); break; default: // No values above 30 had any description diff --git a/core/parse.cpp b/core/parse.cpp index fb58c7fe9..d2b935370 100644 --- a/core/parse.cpp +++ b/core/parse.cpp @@ -72,7 +72,7 @@ void event_end(struct parser_state *state) struct divecomputer *dc = get_dc(state); if (state->cur_event.type == 123) { struct picture pic; - pic.filename = strdup(state->cur_event.name); + pic.filename = strdup(state->cur_event.name.c_str()); /* theoretically this could fail - but we didn't support multi year offsets */ pic.offset.seconds = state->cur_event.time.seconds; add_picture(&state->cur_dive->pictures, pic); /* Takes ownership. */ @@ -81,7 +81,7 @@ void event_end(struct parser_state *state) /* At some point gas change events did not have any type. Thus we need to add * one on import, if we encounter the type one missing. */ - if (state->cur_event.type == 0 && strcmp(state->cur_event.name, "gaschange") == 0) + if (state->cur_event.type == 0 && state->cur_event.name == "gaschange") state->cur_event.type = state->cur_event.value >> 16 > 0 ? SAMPLE_EVENT_GASCHANGE2 : SAMPLE_EVENT_GASCHANGE; ev = add_event(dc, state->cur_event.time.seconds, state->cur_event.type, state->cur_event.flags, diff --git a/core/planner.cpp b/core/planner.cpp index eacb66e6f..6784637bf 100644 --- a/core/planner.cpp +++ b/core/planner.cpp @@ -86,7 +86,7 @@ int get_cylinderid_at_time(struct dive *dive, struct divecomputer *dc, duration_ int cylinder_idx = 0; struct event *event = dc->events; while (event && event->time.seconds <= time.seconds) { - if (!strcmp(event->name, "gaschange")) + if (event->name == "gaschange") cylinder_idx = get_cylinder_index(dive, event); event = event->next; } diff --git a/core/profile.cpp b/core/profile.cpp index 7a2242939..f4e75fcd1 100644 --- a/core/profile.cpp +++ b/core/profile.cpp @@ -221,19 +221,19 @@ int get_cylinder_index(const struct dive *dive, const struct event *ev) return best < 0 ? 0 : best; } -struct event *get_next_event_mutable(struct event *event, const char *name) +struct event *get_next_event_mutable(struct event *event, const std::string &name) { - if (!name || !*name) + if (name.empty()) return NULL; while (event) { - if (same_string(event->name, name)) + if (event->name == name) return event; event = event->next; } return event; } -const struct event *get_next_event(const struct event *event, const char *name) +const struct event *get_next_event(const struct event *event, const std::string &name) { return get_next_event_mutable((struct event *)event, name); } diff --git a/core/save-git.cpp b/core/save-git.cpp index fa11b18db..bbe493bcd 100644 --- a/core/save-git.cpp +++ b/core/save-git.cpp @@ -397,11 +397,11 @@ static void save_one_event(struct membuffer *b, struct dive *dive, struct event show_index(b, ev->type, "type=", ""); show_index(b, ev->flags, "flags=", ""); - if (!strcmp(ev->name,"modechange")) + if (ev->name == "modechange") show_utf8(b, " divemode=", divemode_text[ev->value], ""); else show_index(b, ev->value, "value=", ""); - show_utf8(b, " name=", ev->name, ""); + show_utf8(b, " name=", ev->name.c_str(), ""); if (event_is_gaschange(ev)) { struct gasmix mix = get_gasmix_from_event(dive, ev); if (ev->gas.index >= 0) diff --git a/core/save-html.cpp b/core/save-html.cpp index c604deca6..bc59db059 100644 --- a/core/save-html.cpp +++ b/core/save-html.cpp @@ -91,7 +91,7 @@ static void put_HTML_bookmarks(struct membuffer *b, struct dive *dive) put_string(b, separator); separator = ", "; put_string(b, "{\"name\":\""); - put_quoted(b, ev->name, 1, 0); + put_quoted(b, ev->name.c_str(), 1, 0); put_string(b, "\","); put_format(b, "\"value\":\"%d\",", ev->value); put_format(b, "\"type\":\"%d\",", ev->type); diff --git a/core/save-xml.cpp b/core/save-xml.cpp index 6d13d8bc5..ca6133fcf 100644 --- a/core/save-xml.cpp +++ b/core/save-xml.cpp @@ -358,11 +358,11 @@ static void save_one_event(struct membuffer *b, struct dive *dive, struct event put_format(b, " time.seconds, 60)); show_index(b, ev->type, "type='", "'"); show_index(b, ev->flags, "flags='", "'"); - if (!strcmp(ev->name,"modechange")) + if (ev->name == "modechange") show_utf8(b, divemode_text[ev->value], " divemode='", "'",1); else show_index(b, ev->value, "value='", "'"); - show_utf8(b, ev->name, " name='", "'", 1); + show_utf8(b, ev->name.c_str(), " name='", "'", 1); if (event_is_gaschange(ev)) { struct gasmix mix = get_gasmix_from_event(dive, ev); if (ev->gas.index >= 0) diff --git a/profile-widget/diveeventitem.cpp b/profile-widget/diveeventitem.cpp index 0c8dc04fc..dac9a649f 100644 --- a/profile-widget/diveeventitem.cpp +++ b/profile-widget/diveeventitem.cpp @@ -49,9 +49,9 @@ struct event *DiveEventItem::getEventMutable() void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pixmaps) { event_severity severity = get_event_severity(ev); - if (empty_string(ev->name)) { + if (ev->name.empty()) { setPixmap(pixmaps.warning); - } else if (same_string_caseinsensitive(ev->name, "modechange")) { + } else if (same_string_caseinsensitive(ev->name.c_str(), "modechange")) { if (ev->value == 0) setPixmap(pixmaps.bailout); else @@ -86,8 +86,8 @@ void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pix } } else if ((((ev->flags & SAMPLE_FLAGS_SEVERITY_MASK) >> SAMPLE_FLAGS_SEVERITY_SHIFT) == 1) || // those are useless internals of the dive computer - same_string_caseinsensitive(ev->name, "heading") || - (same_string_caseinsensitive(ev->name, "SP change") && ev->time.seconds == 0)) { + same_string_caseinsensitive(ev->name.c_str(), "heading") || + (same_string_caseinsensitive(ev->name.c_str(), "SP change") && ev->time.seconds == 0)) { // 2 cases: // a) some dive computers have heading in every sample // b) at t=0 we might have an "SP change" to indicate dive type @@ -102,19 +102,19 @@ void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pix setPixmap(pixmaps.warning); } else if (severity == EVENT_SEVERITY_ALARM) { setPixmap(pixmaps.violation); - } else if (same_string_caseinsensitive(ev->name, "violation") || // generic libdivecomputer - same_string_caseinsensitive(ev->name, "Safety stop violation") || // the rest are from the Uemis downloader - same_string_caseinsensitive(ev->name, "pO₂ ascend alarm") || - same_string_caseinsensitive(ev->name, "RGT alert") || - same_string_caseinsensitive(ev->name, "Dive time alert") || - same_string_caseinsensitive(ev->name, "Low battery alert") || - same_string_caseinsensitive(ev->name, "Speed alarm")) { + } else if (same_string_caseinsensitive(ev->name.c_str(), "violation") || // generic libdivecomputer + same_string_caseinsensitive(ev->name.c_str(), "Safety stop violation") || // the rest are from the Uemis downloader + same_string_caseinsensitive(ev->name.c_str(), "pO₂ ascend alarm") || + same_string_caseinsensitive(ev->name.c_str(), "RGT alert") || + same_string_caseinsensitive(ev->name.c_str(), "Dive time alert") || + same_string_caseinsensitive(ev->name.c_str(), "Low battery alert") || + same_string_caseinsensitive(ev->name.c_str(), "Speed alarm")) { setPixmap(pixmaps.violation); - } else if (same_string_caseinsensitive(ev->name, "non stop time") || // generic libdivecomputer - same_string_caseinsensitive(ev->name, "safety stop") || - same_string_caseinsensitive(ev->name, "safety stop (voluntary)") || - same_string_caseinsensitive(ev->name, "Tank change suggested") || // Uemis downloader - same_string_caseinsensitive(ev->name, "Marker")) { + } else if (same_string_caseinsensitive(ev->name.c_str(), "non stop time") || // generic libdivecomputer + same_string_caseinsensitive(ev->name.c_str(), "safety stop") || + same_string_caseinsensitive(ev->name.c_str(), "safety stop (voluntary)") || + same_string_caseinsensitive(ev->name.c_str(), "Tank change suggested") || // Uemis downloader + same_string_caseinsensitive(ev->name.c_str(), "Marker")) { setPixmap(pixmaps.info); } else { // we should do some guessing based on the type / name of the event; @@ -126,7 +126,7 @@ void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pix void DiveEventItem::setupToolTipString(struct gasmix lastgasmix) { // we display the event on screen - so translate - QString name = gettextFromC::tr(ev->name); + QString name = gettextFromC::tr(ev->name.c_str()); int value = ev->value; int type = ev->type; @@ -147,19 +147,19 @@ void DiveEventItem::setupToolTipString(struct gasmix lastgasmix) qPrintable(tr("ΔN₂")), icd_data.dN2 / 10.0, icd ? ">" : "<", lrint(-icd_data.dHe / 5.0) / 10.0); } - } else if (same_string(ev->name, "modechange")) { + } else if (ev->name == "modechange") { name += QString(": %1").arg(gettextFromC::tr(divemode_text_ui[ev->value])); } else if (value) { - if (type == SAMPLE_EVENT_PO2 && same_string(ev->name, "SP change")) { + if (type == SAMPLE_EVENT_PO2 && ev->name == "SP change") { name += QString(": %1bar").arg((double)value / 1000, 0, 'f', 1); - } else if (type == SAMPLE_EVENT_CEILING && same_string(ev->name, "planned waypoint above ceiling")) { + } else if (type == SAMPLE_EVENT_CEILING && ev->name == "planned waypoint above ceiling") { const char *depth_unit; double depth_value = get_depth_units(value*1000, NULL, &depth_unit); name += QString(": %1%2").arg((int) round(depth_value)).arg(depth_unit); } else { name += QString(": %1").arg(value); } - } else if (type == SAMPLE_EVENT_PO2 && same_string(ev->name, "SP change")) { + } else if (type == SAMPLE_EVENT_PO2 && ev->name == "SP change") { // this is a bad idea - we are abusing an existing event type that is supposed to // warn of high or low pO₂ and are turning it into a setpoint change event name += ":\n" + tr("Manual switch to OC"); @@ -202,7 +202,7 @@ bool DiveEventItem::isInteresting(const struct dive *d, const struct divecompute * Don't bother showing those */ const struct sample *first_sample = &dc->sample[0]; - if (!strcmp(ev->name, "gaschange") && + if (ev->name == "gaschange" && (ev->time.seconds == 0 || (first_sample && ev->time.seconds == first_sample->time.seconds) || depthAtTime(pi, ev->time) < SURFACE_THRESHOLD)) @@ -212,7 +212,7 @@ bool DiveEventItem::isInteresting(const struct dive *d, const struct divecompute * Some divecomputers give "surface" events that just aren't interesting. * Like at the beginning or very end of a dive. Well, duh. */ - if (!strcmp(ev->name, "surface")) { + if (ev->name == "surface") { int time = ev->time.seconds; if (time <= 30 || time + 30 >= (int)dc->duration.seconds) return false; diff --git a/profile-widget/profilescene.cpp b/profile-widget/profilescene.cpp index 37b0e7e00..d7feb8c70 100644 --- a/profile-widget/profilescene.cpp +++ b/profile-widget/profilescene.cpp @@ -556,9 +556,9 @@ void ProfileScene::plotDive(const struct dive *dIn, int dcIn, DivePlannerPointsM while (event) { // if print mode is selected only draw headings, SP change, gas events or bookmark event if (printMode) { - if (empty_string(event->name) || - !(strcmp(event->name, "heading") == 0 || - (same_string(event->name, "SP change") && event->time.seconds == 0) || + if (event->name.empty() || + !(event->name == "heading" || + (event->name == "SP change" && event->time.seconds == 0) || event_is_gaschange(event) || event->type == SAMPLE_EVENT_BOOKMARK)) { event = event->next; diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp index 268b80203..6535400d9 100644 --- a/profile-widget/profilewidget2.cpp +++ b/profile-widget/profilewidget2.cpp @@ -697,7 +697,7 @@ void ProfileWidget2::hideEventType(DiveEventItem *item) { const struct event *event = item->getEvent(); - if (!empty_string(event->name)) { + if (!event->name.empty()) { hide_event_type(event); replot(); @@ -727,7 +727,7 @@ void ProfileWidget2::removeEvent(DiveEventItem *item) if (QMessageBox::question(this, TITLE_OR_TEXT( tr("Remove the selected event?"), - tr("%1 @ %2:%3").arg(event->name).arg(event->time.seconds / 60).arg(event->time.seconds % 60, 2, 10, QChar('0'))), + tr("%1 @ %2:%3").arg(QString::fromStdString(event->name)).arg(event->time.seconds / 60).arg(event->time.seconds % 60, 2, 10, QChar('0'))), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) Command::removeEvent(mutable_dive(), dc, event); } @@ -786,7 +786,7 @@ void ProfileWidget2::editName(DiveEventItem *item) bool ok; QString newName = QInputDialog::getText(this, tr("Edit name of bookmark"), tr("Custom name:"), QLineEdit::Normal, - event->name, &ok); + event->name.c_str(), &ok); if (ok && !newName.isEmpty()) { if (newName.length() > 22) { //longer names will display as garbage. QMessageBox lengthWarning;