From 0c836ebc47cab2f37274ae03ab2be6c7b2fd0456 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Tue, 6 May 2014 14:08:17 -0700 Subject: Simplify string comparison This is based on Linus' idea on the mailing list. Treat NULL strings and empty strings as identical. Suggested-by: Linus Torvalds Signed-off-by: Dirk Hohndel --- dive.h | 6 ++++++ equipment.c | 10 +--------- qt-ui/maintab.cpp | 11 +++++------ 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/dive.h b/dive.h index 5215c4997..13606f39e 100644 --- a/dive.h +++ b/dive.h @@ -7,6 +7,7 @@ #include #include #include +#include /* Windows has no MIN/MAX macros - so let's just roll our own */ #define MIN(x, y) ({ \ @@ -23,6 +24,11 @@ #define IS_FP_SAME(_a, _b) (fabs((_a) - (_b)) < 0.000001 * MAX(fabs(_a), fabs(_b))) +static inline int same_string(const char *a, const char *b) +{ + return !strcmp(a ? : "", b ? : ""); +} + #include #include diff --git a/equipment.c b/equipment.c index e63a876d0..548f15b5e 100644 --- a/equipment.c +++ b/equipment.c @@ -71,14 +71,6 @@ bool cylinder_none(void *_data) return cylinder_nodata(cyl) && cylinder_nosamples(cyl); } -/* descriptions are equal if they are both NULL or both non-NULL - and the same text */ -static bool description_equal(const char *desc1, const char *desc2) -{ - return ((!desc1 && !desc2) || - (desc1 && desc2 && strcmp(desc1, desc2) == 0)); -} - bool weightsystem_none(void *_data) { weightsystem_t *ws = _data; @@ -98,7 +90,7 @@ bool no_weightsystems(weightsystem_t *ws) static bool one_weightsystem_equal(weightsystem_t *ws1, weightsystem_t *ws2) { return ws1->weight.grams == ws2->weight.grams && - description_equal(ws1->description, ws2->description); + same_string(ws1->description, ws2->description); } bool weightsystems_equal(weightsystem_t *ws1, weightsystem_t *ws2) diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index ec4065d85..5bcc07cf9 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -856,12 +856,11 @@ void MainTab::rejectChanges() // this macro is rather fragile and is intended to be used as WHAT inside // an invocation of EDIT_SELECTED_DIVES(WHAT) -#define EDIT_TEXT(what, text) \ - if ((!mydive->what && !current_dive->what) || \ - (mydive->what && current_dive->what && strcmp(mydive->what, current_dive->what) == 0)) { \ - QByteArray textByteArray = text.toUtf8(); \ - free(mydive->what); \ - mydive->what = strdup(textByteArray.data()); \ +#define EDIT_TEXT(what, text) \ + if (same_string(mydive->what, current_dive->what)) { \ + QByteArray textByteArray = text.toUtf8(); \ + free(mydive->what); \ + mydive->what = strdup(textByteArray.data()); \ } #define EDIT_VALUE(what, value) \ -- cgit v1.2.3-70-g09d2