diff options
Diffstat (limited to 'src/GCodes/GCodeBuffer/StringParser.cpp')
-rw-r--r-- | src/GCodes/GCodeBuffer/StringParser.cpp | 137 |
1 files changed, 72 insertions, 65 deletions
diff --git a/src/GCodes/GCodeBuffer/StringParser.cpp b/src/GCodes/GCodeBuffer/StringParser.cpp index 9247c577..4876f3d6 100644 --- a/src/GCodes/GCodeBuffer/StringParser.cpp +++ b/src/GCodes/GCodeBuffer/StringParser.cpp @@ -1059,6 +1059,12 @@ bool StringParser::Seen(char c) noexcept return false; } +// Return true if any of the parameter letters in the bitmap were seen +bool StringParser::SeenAny(Bitmap<uint32_t> bm) const noexcept +{ + return parametersPresent.Intersects(bm); +} + // Get a float after a G Code letter found by a call to Seen() float StringParser::GetFValue() THROWS(GCodeException) { @@ -1074,35 +1080,32 @@ float StringParser::GetFValue() THROWS(GCodeException) // Get a colon-separated list of floats after a key letter // If doPad is true then we allow just one element to be given, in which case we fill all elements with that value -void StringParser::GetFloatArray(float arr[], size_t& returnedLength, bool doPad) THROWS(GCodeException) +void StringParser::GetFloatArray(float arr[], size_t& returnedLength) THROWS(GCodeException) { if (readPointer <= 0) { THROW_INTERNAL_ERROR; } - size_t length = 0; - for (;;) + if (gb.buffer[readPointer] == '{') { - CheckArrayLength(length, returnedLength); - arr[length++] = ReadFloatValue(); - if (gb.buffer[readPointer] != EXPRESSION_LIST_SEPARATOR && gb.buffer[readPointer] != LIST_SEPARATOR) - { - break; - } - ++readPointer; + ExpressionParser parser(gb, gb.buffer + readPointer, gb.buffer + ARRAY_SIZE(gb.buffer), commandIndent + readPointer); + parser.ParseFloatArray(arr, returnedLength); } - - // Special case if there is one entry and returnedLength requests several. Fill the array with the first entry. - if (doPad && length == 1 && returnedLength > 1) + else { - for (size_t i = 1; i < returnedLength; i++) + size_t length = 0; + for (;;) { - arr[i] = arr[0]; + CheckArrayLength(length, returnedLength); + arr[length++] = ReadFloatValue(); + if (gb.buffer[readPointer] != LIST_SEPARATOR) + { + break; + } + ++readPointer; } - } - else - { + returnedLength = length; } @@ -1110,72 +1113,67 @@ void StringParser::GetFloatArray(float arr[], size_t& returnedLength, bool doPad } // Get a :-separated list of ints after a key letter -void StringParser::GetIntArray(int32_t arr[], size_t& returnedLength, bool doPad) THROWS(GCodeException) +void StringParser::GetIntArray(int32_t arr[], size_t& returnedLength) THROWS(GCodeException) { if (readPointer <= 0) { THROW_INTERNAL_ERROR; } - size_t length = 0; - for (;;) + if (gb.buffer[readPointer] == '{') { - CheckArrayLength(length, returnedLength); - arr[length] = ReadIValue(); - length++; - if (gb.buffer[readPointer] != EXPRESSION_LIST_SEPARATOR && gb.buffer[readPointer] != LIST_SEPARATOR) - { - break; - } - ++readPointer; + ExpressionParser parser(gb, gb.buffer + readPointer, gb.buffer + ARRAY_SIZE(gb.buffer), commandIndent + readPointer); + parser.ParseIntArray(arr, returnedLength); } - - // Special case if there is one entry and returnedLength requests several. Fill the array with the first entry. - if (doPad && length == 1 && returnedLength > 1) + else { - for (size_t i = 1; i < returnedLength; i++) + size_t length = 0; + for (;;) { - arr[i] = arr[0]; + CheckArrayLength(length, returnedLength); + arr[length] = ReadIValue(); + length++; + if (gb.buffer[readPointer] != LIST_SEPARATOR) + { + break; + } + ++readPointer; } - } - else - { + returnedLength = length; } + readPointer = -1; } // Get a :-separated list of unsigned ints after a key letter -void StringParser::GetUnsignedArray(uint32_t arr[], size_t& returnedLength, bool doPad) THROWS(GCodeException) +void StringParser::GetUnsignedArray(uint32_t arr[], size_t& returnedLength) THROWS(GCodeException) { if (readPointer <= 0) { THROW_INTERNAL_ERROR; } - size_t length = 0; - for (;;) + if (gb.buffer[readPointer] == '{') { - CheckArrayLength(length, returnedLength); - arr[length] = ReadUIValue(); - length++; - if (gb.buffer[readPointer] != EXPRESSION_LIST_SEPARATOR && gb.buffer[readPointer] != LIST_SEPARATOR) - { - break; - } - ++readPointer; + ExpressionParser parser(gb, gb.buffer + readPointer, gb.buffer + ARRAY_SIZE(gb.buffer), commandIndent + readPointer); + parser.ParseUnsignedArray(arr, returnedLength); } - - // Special case if there is one entry and returnedLength requests several. Fill the array with the first entry. - if (doPad && length == 1 && returnedLength > 1) + else { - for (size_t i = 1; i < returnedLength; i++) + size_t length = 0; + for (;;) { - arr[i] = arr[0]; + CheckArrayLength(length, returnedLength); + arr[length] = ReadUIValue(); + length++; + if (gb.buffer[readPointer] != LIST_SEPARATOR) + { + break; + } + ++readPointer; } - } - else - { + returnedLength = length; } @@ -1190,20 +1188,29 @@ void StringParser::GetDriverIdArray(DriverId arr[], size_t& returnedLength) THRO THROW_INTERNAL_ERROR; } - size_t length = 0; - for (;;) + if (gb.buffer[readPointer] == '{') + { + ExpressionParser parser(gb, gb.buffer + readPointer, gb.buffer + ARRAY_SIZE(gb.buffer), commandIndent + readPointer); + parser.ParseDriverIdArray(arr, returnedLength); + } + else { - CheckArrayLength(length, returnedLength); - arr[length] = ReadDriverIdValue(); - length++; - if (gb.buffer[readPointer] != EXPRESSION_LIST_SEPARATOR && gb.buffer[readPointer] != LIST_SEPARATOR) + size_t length = 0; + for (;;) { - break; + CheckArrayLength(length, returnedLength); + arr[length] = ReadDriverIdValue(); + length++; + if (gb.buffer[readPointer] != LIST_SEPARATOR) + { + break; + } + ++readPointer; } - ++readPointer; + + returnedLength = length; } - returnedLength = length; readPointer = -1; } |