diff --git a/Firmware/util.cpp b/Firmware/util.cpp index 6d955bd5e..0e0bdbb7b 100644 --- a/Firmware/util.cpp +++ b/Firmware/util.cpp @@ -385,36 +385,16 @@ void gcode_level_check(uint16_t nGcodeLevel) { ); } -#define GCODE_DELIMITER '"' - -char *code_string(const char *pStr, size_t *nLength) { -char* pStrBegin; -char* pStrEnd; - -pStrBegin=strchr(pStr,GCODE_DELIMITER); -if(!pStrBegin) - return(NULL); -pStrBegin++; -pStrEnd=strchr(pStrBegin,GCODE_DELIMITER); -if(!pStrEnd) - return(NULL); -*nLength=pStrEnd-pStrBegin; -return pStrBegin; -} void printer_smodel_check(const char *pStrPos, const char *actualPrinterSModel) { - char* pResult; - size_t nLength; - size_t aLength; + unquoted_string smodel = unquoted_string(pStrPos); - pResult=code_string(pStrPos,&nLength); - if(pResult != NULL) { - aLength=strlen_P(actualPrinterSModel); - if(aLength > nLength) nLength = aLength; + if(smodel.WasFound()) { + const uint8_t compareLength = strlen_P(actualPrinterSModel); - // Only compare first 6 chars on MK3|MK3S if string longer than 4 characters - if (nLength > 4 && strncmp_P(pResult, PSTR("MK3"), 3) == 0) nLength = 6; - if (strncmp_P(pResult, actualPrinterSModel, nLength) == 0) return; + if(compareLength == smodel.GetLength()) { + if (strncmp_P(smodel.GetUnquotedString(), actualPrinterSModel, compareLength) == 0) return; + } } render_M862_warnings( diff --git a/Firmware/util.h b/Firmware/util.h index d06d466db..0e041a8f4 100644 --- a/Firmware/util.h +++ b/Firmware/util.h @@ -1,5 +1,6 @@ #pragma once #include +#include extern const uint16_t FW_VERSION_NR[4]; const char* FW_VERSION_STR_P(); @@ -84,6 +85,45 @@ enum class ClCompareValue:uint_least8_t _Greater=2 }; +struct unquoted_string { +public: + /// @brief Given a pointer to a quoted string, filter out the quotes + /// @param pStr A constant pointer to a constant string to be searched/filtered. Modifying the pointer is strictly forbidden. + unquoted_string(const char * const pStr) + : len(0) + , found(false) + { + char * pStrEnd = NULL; + + // Start of the string + this->ptr = strchr(pStr, '"'); + if (!this->ptr) { + // First quote not found + return; + } + + // Skip the leading quote + this->ptr++; + + // End of the string + pStrEnd = strchr(this->ptr, '"'); + if(!pStrEnd) { + // Second quote not found + return; + } + this->len = pStrEnd - this->ptr; + this->found = true; + } + + bool WasFound() { return found; } + uint8_t GetLength() { return len; } + const char * GetUnquotedString() { return ptr; } +private: + const char * ptr = NULL; + uint8_t len; + bool found; +}; + extern ClNozzleDiameter oNozzleDiameter; extern ClCheckMode oCheckMode; extern ClCheckModel oCheckModel;