From a6d672a762e3699a6c9798d114f2218126f3ec1a Mon Sep 17 00:00:00 2001 From: Victor Castillo Date: Sat, 17 Aug 2024 18:05:14 +0200 Subject: [PATCH 1/2] Trim strings before comparing them --- source/api/inc/GnssMetadata/Xml/Translator.h | 7 +++++++ source/api/lib/GnssMetadata/Xml/ChunkTranslator.cpp | 12 +++++++++--- .../api/lib/GnssMetadata/Xml/DurationTranslator.cpp | 4 +++- .../api/lib/GnssMetadata/Xml/FrequencyTranslator.cpp | 4 +++- source/api/lib/GnssMetadata/Xml/LumpTranslator.cpp | 4 +++- source/api/lib/GnssMetadata/Xml/SourceTranslator.cpp | 8 ++++++-- source/api/lib/GnssMetadata/Xml/StreamTranslator.cpp | 12 +++++++++--- source/api/lib/GnssMetadata/Xml/SystemTranslator.cpp | 4 +++- source/api/lib/GnssMetadata/Xml/Translator.cpp | 11 +++++++++++ 9 files changed, 54 insertions(+), 12 deletions(-) diff --git a/source/api/inc/GnssMetadata/Xml/Translator.h b/source/api/inc/GnssMetadata/Xml/Translator.h index 9fbf433..e110711 100644 --- a/source/api/inc/GnssMetadata/Xml/Translator.h +++ b/source/api/inc/GnssMetadata/Xml/Translator.h @@ -129,6 +129,13 @@ namespace GnssMetadata private: NodeEntry* _nodesAllowed; + + public: + /** + * Helper function that trims a C string and outputs its length + */ + static const char* TrimString(const char* str, size_t* len); + }; } #endif diff --git a/source/api/lib/GnssMetadata/Xml/ChunkTranslator.cpp b/source/api/lib/GnssMetadata/Xml/ChunkTranslator.cpp index 7d8cbe5..8b1d75d 100644 --- a/source/api/lib/GnssMetadata/Xml/ChunkTranslator.cpp +++ b/source/api/lib/GnssMetadata/Xml/ChunkTranslator.cpp @@ -45,9 +45,11 @@ NODELIST_END static const char* _szEndian[] = {"Big","Little", "Undefined"}; Chunk::WordEndian ToEndian( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 3; i++) { - if( strcmp( _szEndian[i], pszFmt) == 0) + if( strncmp( _szEndian[i], trimmedPszFmt, len) == 0) return (Chunk::WordEndian)i; } return (Chunk::WordEndian)2; @@ -57,9 +59,11 @@ Chunk::WordEndian ToEndian( const char* pszFmt) static const char* _szWordPadding[] = {"None","Head","Tail"}; Chunk::WordPadding ToWordPadding( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 3; i++) { - if( strcmp( _szWordPadding[i], pszFmt) == 0) + if( strncmp( _szWordPadding[i], trimmedPszFmt, len) == 0) return (Chunk::WordPadding)i; } return (Chunk::WordPadding)2; @@ -69,9 +73,11 @@ Chunk::WordPadding ToWordPadding( const char* pszFmt) static const char* _szWordShift[] = {"Left","Right"}; Chunk::WordShift ToWordShift( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 2; i++) { - if( strcmp( _szWordShift[i], pszFmt) == 0) + if( strncmp( _szWordShift[i], trimmedPszFmt, len) == 0) return (Chunk::WordShift)i; } return (Chunk::WordShift)2; diff --git a/source/api/lib/GnssMetadata/Xml/DurationTranslator.cpp b/source/api/lib/GnssMetadata/Xml/DurationTranslator.cpp index 4025226..131efc7 100644 --- a/source/api/lib/GnssMetadata/Xml/DurationTranslator.cpp +++ b/source/api/lib/GnssMetadata/Xml/DurationTranslator.cpp @@ -38,9 +38,11 @@ using namespace tinyxml2; static const char* _szfmts[] = {"sec","msec", "usec", "nsec", "psec"}; static Duration::DurationFormat ToFormat( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 5; i++) { - if( strcmp( _szfmts[i], pszFmt) == 0) + if( strncmp( _szfmts[i], trimmedPszFmt, len) == 0) return (Duration::DurationFormat)i; } return (Duration::DurationFormat)0; diff --git a/source/api/lib/GnssMetadata/Xml/FrequencyTranslator.cpp b/source/api/lib/GnssMetadata/Xml/FrequencyTranslator.cpp index 656f7c3..298aac1 100644 --- a/source/api/lib/GnssMetadata/Xml/FrequencyTranslator.cpp +++ b/source/api/lib/GnssMetadata/Xml/FrequencyTranslator.cpp @@ -37,9 +37,11 @@ using namespace tinyxml2; static const char* _szfmts[] = {"Hz","kHz","MHz", "GHz", "Ratio"}; static Frequency::FrequencyFormat ToFormat( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 4; i++) { - if( strcmp( _szfmts[i], pszFmt) == 0) + if( strncmp( _szfmts[i], trimmedPszFmt, len) == 0) return (Frequency::FrequencyFormat)i; } return (Frequency::FrequencyFormat)0; diff --git a/source/api/lib/GnssMetadata/Xml/LumpTranslator.cpp b/source/api/lib/GnssMetadata/Xml/LumpTranslator.cpp index 5c671fa..ac1771e 100644 --- a/source/api/lib/GnssMetadata/Xml/LumpTranslator.cpp +++ b/source/api/lib/GnssMetadata/Xml/LumpTranslator.cpp @@ -42,9 +42,11 @@ LumpTranslator::LumpTranslator() static const char* _szShiftFmts[] = { "Left","Right", "Undefined" }; static Lump::LumpShift ToLumpShiftFormat(const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for (unsigned int i = 0; i < 3; i++) { - if (strcmp(_szShiftFmts[i], pszFmt) == 0) + if (strncmp(_szShiftFmts[i], trimmedPszFmt, len) == 0) return (Lump::LumpShift)i; } return (Lump::LumpShift)2; diff --git a/source/api/lib/GnssMetadata/Xml/SourceTranslator.cpp b/source/api/lib/GnssMetadata/Xml/SourceTranslator.cpp index 7c5e5ef..595cdd9 100644 --- a/source/api/lib/GnssMetadata/Xml/SourceTranslator.cpp +++ b/source/api/lib/GnssMetadata/Xml/SourceTranslator.cpp @@ -43,9 +43,11 @@ NODELIST_END static const char* _szSourceType[] = {"UndefinedType","Patch", "Dipole", "Helical", "Quadrilfilar", "Simulator", "Other"}; Source::SourceType ToSourceType( const char* psz) { + size_t len; + const char* trimmedPsz = Translator::TrimString(psz, &len); for( unsigned int i = 0; i < 7; i++) { - if( strcmp( _szSourceType[i], psz) == 0) + if( strncmp( _szSourceType[i], trimmedPsz, len) == 0) return (Source::SourceType)i; } return (Source::SourceType)0; @@ -55,9 +57,11 @@ Source::SourceType ToSourceType( const char* psz) static const char* _szSourcePolarization[] = {"UndefinedPolarization", "RHCP", "LHCP", "Linear", "Horizontal", "Vertical"}; Source::SourcePolarization ToSourcePolarization( const char* psz) { + size_t len; + const char* trimmedPsz = Translator::TrimString(psz, &len); for( unsigned int i = 0; i < 6; i++) { - if( strcmp( _szSourcePolarization[i], psz) == 0) + if( strncmp( _szSourcePolarization[i], trimmedPsz, len) == 0) return (Source::SourcePolarization)i; } return (Source::SourcePolarization)2; diff --git a/source/api/lib/GnssMetadata/Xml/StreamTranslator.cpp b/source/api/lib/GnssMetadata/Xml/StreamTranslator.cpp index 66a7a03..2fbf858 100644 --- a/source/api/lib/GnssMetadata/Xml/StreamTranslator.cpp +++ b/source/api/lib/GnssMetadata/Xml/StreamTranslator.cpp @@ -37,9 +37,11 @@ using namespace tinyxml2; static const char* _szAlignFmts[] = {"Left","Right", "Undefined"}; static IonStream::StreamAlignment ToAlignmentFormat( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 3; i++) { - if( strcmp( _szAlignFmts[i], pszFmt) == 0) + if( strncmp( _szAlignFmts[i], trimmedPszFmt, len) == 0) return (IonStream::StreamAlignment)i; } return (IonStream::StreamAlignment)2; @@ -48,9 +50,11 @@ static IonStream::StreamAlignment ToAlignmentFormat( const char* pszFmt) static const char* _szShiftFmts[] = {"Left","Right", "Undefined"}; static IonStream::StreamShift ToStreamShiftFormat( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 3; i++) { - if( strcmp(_szShiftFmts[i], pszFmt) == 0) + if( strncmp(_szShiftFmts[i], trimmedPszFmt, len) == 0) return (IonStream::StreamShift)i; } return (IonStream::StreamShift)2; @@ -61,9 +65,11 @@ static const char* _szSampleFmts[] = {"IF","IFn","IQ","IQn","InQ","InQn","QI","Q static IonStream::SampleFormat ToSampleFormat( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 10; i++) { - if( strcmp( _szSampleFmts[i], pszFmt) == 0) + if( strncmp( _szSampleFmts[i], trimmedPszFmt, len) == 0) return (IonStream::SampleFormat)i; } return (IonStream::SampleFormat)2; diff --git a/source/api/lib/GnssMetadata/Xml/SystemTranslator.cpp b/source/api/lib/GnssMetadata/Xml/SystemTranslator.cpp index 784c9b5..f4c7d20 100644 --- a/source/api/lib/GnssMetadata/Xml/SystemTranslator.cpp +++ b/source/api/lib/GnssMetadata/Xml/SystemTranslator.cpp @@ -46,9 +46,11 @@ NODELIST_END static const char* _szTypes[] = {"Undefined", "Processor", "Receiver", "Simulator"}; System::SystemType ToSystemType( const char* pszFmt) { + size_t len; + const char* trimmedPszFmt = Translator::TrimString(pszFmt, &len); for( unsigned int i = 0; i < 4; i++) { - if( strcmp( _szTypes[i], pszFmt) == 0) + if( strncmp( _szTypes[i], trimmedPszFmt, len) == 0) return (System::SystemType)i; } return (System::SystemType)3; diff --git a/source/api/lib/GnssMetadata/Xml/Translator.cpp b/source/api/lib/GnssMetadata/Xml/Translator.cpp index ad11a99..0ea4569 100644 --- a/source/api/lib/GnssMetadata/Xml/Translator.cpp +++ b/source/api/lib/GnssMetadata/Xml/Translator.cpp @@ -284,5 +284,16 @@ void Translator::WriteElement( const char* pszElemName, double dvalue, } } +const char* Translator::TrimString(const char* str, size_t* len) { + while (str[0] == ' ') { + str++; + } + (*len) = strlen(str); + while (str[(*len) - 1] == ' ') { + (*len)--; + } + return str; +} + } From 0e1c6c89ca27906461f08d28dc9abb334cf1ace7 Mon Sep 17 00:00:00 2001 From: Victor Castillo Date: Sat, 17 Aug 2024 17:31:36 +0200 Subject: [PATCH 2/2] Trim strings before parsing numbers and booleans --- source/api/lib/GnssMetadata/Xml/Translator.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/source/api/lib/GnssMetadata/Xml/Translator.cpp b/source/api/lib/GnssMetadata/Xml/Translator.cpp index 0ea4569..d8d0cf9 100644 --- a/source/api/lib/GnssMetadata/Xml/Translator.cpp +++ b/source/api/lib/GnssMetadata/Xml/Translator.cpp @@ -167,7 +167,9 @@ bool Translator::ReadFirstElement( const char* pszelem, } else { - return (strcmp( pchild->GetText(),"false")==0); + size_t len; + const char* trimmedText = TrimString(pchild->GetText(), &len); + return (strcmp( trimmedText,"false")==0); } } const char* Translator::ReadFirstElement( const char* pszelem, @@ -210,7 +212,9 @@ size_t Translator::ReadFirstElement( const char* pszelem, } else { - return atol( pchild->GetText()); + size_t len; + const char* trimmedText = TrimString(pchild->GetText(), &len); + return atol(trimmedText); } } @@ -232,7 +236,9 @@ double Translator::ReadFirstElement( const char* pszelem, } else { - return atof( pchild->GetText()); + size_t len; + const char* trimmedText = TrimString(pchild->GetText(), &len); + return atof(trimmedText); } }