Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/GCodes/GCodeBuffer/StringParser.cpp')
-rw-r--r--src/GCodes/GCodeBuffer/StringParser.cpp137
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;
}