From fae211953faaa0166d36ece35bfac48ee1b2ceb8 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 24 Nov 2020 06:51:02 +0100 Subject: [PATCH] Changing parameter signature from 'const char *' tp 'char *' as the buffer is in fact modified within the call. This also does away with tedious casting --- extras/test/src/test_GxRMC.cpp | 26 +++++++++++++------------- src/nmea/GxRMC.cpp | 8 ++++---- src/nmea/GxRMC.h | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/extras/test/src/test_GxRMC.cpp b/extras/test/src/test_GxRMC.cpp index aa8608a..46cecd3 100644 --- a/extras/test/src/test_GxRMC.cpp +++ b/extras/test/src/test_GxRMC.cpp @@ -33,7 +33,7 @@ SCENARIO("Extracting latitude/longiture from valid GPRMC message", "[GxRMC-01]") { std::string const GPRMC = "$GPRMC,062101.714,A,5001.869,N,01912.114,E,955535.7,116.2,290520,000.0,W*45\r\n"; - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.latitude == Approx(50.03114442)); REQUIRE(data.longitude == Approx(19.20189679)); @@ -43,7 +43,7 @@ SCENARIO("Extracting latitude/longiture from valid GPRMC message", "[GxRMC-01]") { std::string const GPRMC = "$GPRMC,122311.239,A,4056.748,N,11212.614,W,,,290620,000.0,W*63\r\n"; - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.latitude == Approx(40.9458060446613)); REQUIRE(data.longitude == Approx(-112.210235595703)); @@ -53,7 +53,7 @@ SCENARIO("Extracting latitude/longiture from valid GPRMC message", "[GxRMC-01]") { std::string const GPRMC = "$GPRMC,122311.239,A,2727.069,S,05859.190,W,,,290620,000.0,W*76\r\n"; - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.latitude == Approx(-27.4511422937699)); REQUIRE(data.longitude == Approx(-58.986502289772)); @@ -63,7 +63,7 @@ SCENARIO("Extracting latitude/longiture from valid GPRMC message", "[GxRMC-01]") { std::string const GPRMC = "$GPRMC,122311.239,A,0610.522,S,10649.632,E,,,290620,000.0,W*6D\r\n"; - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.latitude == Approx(-6.17536097471491)); REQUIRE(data.longitude == Approx(106.827192306519)); @@ -75,13 +75,13 @@ SCENARIO("Extracting satellite system from valid GxRMC message", "[GxRMC-02]") WHEN("GPS") { std::string const GPRMC = "$GPRMC,122311.239,A,0610.522,S,10649.632,E,,,290620,000.0,W*6D\r\n"; - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.source == nmea::RmcSource::GPS); } WHEN("GNSS") { std::string const GNSS = "$GNRMC,090348.80,A,4838.00682,N,01301.61381,E,1.533,,301020,,,A*61\r\n"; - nmea::GxRMC::parse(GNSS.c_str(), data); + nmea::GxRMC::parse(const_cast(GNSS.c_str()), data); REQUIRE(data.source == nmea::RmcSource::GNSS); } } @@ -90,7 +90,7 @@ TEST_CASE("Extracting speed over ground from valid GPRMC message", "[GxRMC-03]") { std::string const GPRMC = ("$GPRMC,052856.105,A,5230.874,N,01321.056,E,085.7,206.4,080720,000.0,W*78\r\n"); - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); /* 85.7 kts ~= 44.088 m/s */ REQUIRE(data.speed == Approx(44.088f)); @@ -100,7 +100,7 @@ TEST_CASE("Extracting track angle from valid GPRMC message", "[GxRMC-04]") { std::string const GPRMC = ("$GPRMC,052856.105,A,5230.874,N,01321.056,E,085.7,206.4,080720,000.0,W*78\r\n"); - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.course == Approx(206.4f)); } @@ -109,7 +109,7 @@ TEST_CASE("Extracting position time from valid GPRMC message", "[GxRMC-05]") { std::string const GPRMC = ("$GPRMC,052856.105,A,5230.874,N,01321.056,E,085.7,206.4,080720,000.0,W*78\r\n"); - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); /* 052856.105 -> 05:28:56.105 -> */ REQUIRE(data.time_utc.hour == 5); @@ -122,7 +122,7 @@ TEST_CASE("Extracting date from valid GPRMC message", "[GxRMC-06]") { std::string const GPRMC = ("$GPRMC,052856.105,A,5230.874,N,01321.056,E,085.7,206.4,080720,000.0,W*78\r\n"); - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.date.day == 8); REQUIRE(data.date.month == 7); @@ -133,7 +133,7 @@ TEST_CASE("Extracting magnetic variation from valid GPRMC message", "[GxRMC-07]" { std::string const GPRMC = ("$GPRMC,052856.105,A,5230.874,N,01321.056,E,085.7,206.4,080720,000.0,W*78\r\n"); - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.magnetic_variation == Approx(0.0)); } @@ -142,7 +142,7 @@ TEST_CASE("Extracted status indicates void ('V') position data", "[GxRMC-08]") { std::string const GPRMC = ("$GPRMC,052856.105,V,5230.874,N,01321.056,E,085.7,206.4,080720,000.0,W*78\r\n"); - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); REQUIRE(data.is_valid == false); } @@ -151,7 +151,7 @@ TEST_CASE("GxRMC message contains only date and time, but no location fix yet ", { std::string const GPRMC = ("$GPRMC,144602.00,V,,,,,,,011120,,,N*7B\r\n"); - nmea::GxRMC::parse(GPRMC.c_str(), data); + nmea::GxRMC::parse(const_cast(GPRMC.c_str()), data); /* RMC TIME = '144602.00' */ REQUIRE(data.time_utc.hour == 14); diff --git a/src/nmea/GxRMC.cpp b/src/nmea/GxRMC.cpp index 53a6441..4be11bf 100644 --- a/src/nmea/GxRMC.cpp +++ b/src/nmea/GxRMC.cpp @@ -35,7 +35,7 @@ constexpr float kts_to_m_per_s(float const v) { return (v / 1.9438444924574f); } * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ -void GxRMC::parse(char const * gxrmc, RmcData & data) +void GxRMC::parse(char * gxrmc, RmcData & data) { ParserState state = ParserState::MessadeId; @@ -43,11 +43,11 @@ void GxRMC::parse(char const * gxrmc, RmcData & data) * with a ',' in order to be able to tokenize all elements * including the one before the checksum. */ - *strchr((char *)gxrmc, '*') = ','; + *strchr(gxrmc, '*') = ','; - for (char * token = strsep((char **)&gxrmc, ","); + for (char * token = strsep(&gxrmc, ","); token != nullptr; - token = strsep((char **)&gxrmc, ",")) + token = strsep(&gxrmc, ",")) { ParserState next_state = state; diff --git a/src/nmea/GxRMC.h b/src/nmea/GxRMC.h index 5024168..9d7f47a 100644 --- a/src/nmea/GxRMC.h +++ b/src/nmea/GxRMC.h @@ -32,7 +32,7 @@ class GxRMC public: - static void parse(char const * gxrmc, RmcData & data); + static void parse(char * gxrmc, RmcData & data); private: