PFW-1523 Refactor parsing quoted strings

My plan is to re-use this function in M79
in a later commit. The firmware doesn't
have a dedicated parser like Marlin 2.1
so this is my attempt to not duplicate the parsing of a quoted string in G-codes

Change in memory (MK3S+ Multilang):
Flash: -50 bytes
SRAM: 0 bytes
This commit is contained in:
gudnimg 2023-11-04 17:06:43 +00:00
parent fca93b00e9
commit cdb559040c
2 changed files with 46 additions and 26 deletions

View File

@ -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(

View File

@ -1,5 +1,6 @@
#pragma once
#include <stdint.h>
#include <string.h>
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;