diff --git a/poincare/src/serialization_helper.cpp b/poincare/src/serialization_helper.cpp index 860c3d0fa..34f25f169 100644 --- a/poincare/src/serialization_helper.cpp +++ b/poincare/src/serialization_helper.cpp @@ -60,7 +60,8 @@ int SerializationHelper::SerializeChild( return numberOfChar; } -int SerializationHelper::Infix( +int InfixPrefix( + bool prefix, const TreeNode * node, char * buffer, int bufferSize, @@ -77,39 +78,77 @@ int SerializationHelper::Infix( } } - // Get some information on the node int numberOfChar = 0; - int numberOfChildren = node->numberOfChildren(); - assert(numberOfChildren > 0); - // Write the first child, with parentheses if needed - numberOfChar+= SerializeChild(node->childAtIndex(firstChildIndex), node, buffer + numberOfChar, bufferSize - numberOfChar, floatDisplayMode, numberOfDigits); - if (numberOfChar >= bufferSize-1) { - assert(buffer[bufferSize - 1] == 0); - return bufferSize-1; - } - // For all remaining children: - int lastIndex = lastChildIndex < 0 ? numberOfChildren - 1 : lastChildIndex; - for (int i = firstChildIndex + 1; i < lastIndex+1; i++) { - // Write the operator - numberOfChar += strlcpy(buffer+numberOfChar, operatorName, bufferSize-numberOfChar); + if (prefix) { + // Prefix: Copy the operator name + numberOfChar = strlcpy(buffer, operatorName, bufferSize); if (numberOfChar >= bufferSize-1) { assert(buffer[bufferSize - 1] == 0); return bufferSize-1; } - // Write the child, with parentheses if needed - numberOfChar+= SerializeChild(node->childAtIndex(i), node, buffer + numberOfChar, bufferSize - numberOfChar, floatDisplayMode, numberOfDigits); + // Add the opening parenthesis + numberOfChar += UTF8Decoder::CodePointToChars(UCodePointLeftSystemParenthesis, buffer+numberOfChar, bufferSize - numberOfChar); + if (numberOfChar >= bufferSize-1) { + return bufferSize-1; + } + } + + int childrenCount = node->numberOfChildren(); + assert(prefix || childrenCount > 0); + + if (childrenCount > 0) { + int lastIndex = lastChildIndex < 0 ? childrenCount - 1 : lastChildIndex; + assert(firstChildIndex <= lastIndex); + + // Write the children, separated with commas or the operator + for (int i = firstChildIndex; i <= lastIndex; i++) { + if (i != firstChildIndex) { + // Write the operator or the comma + numberOfChar += prefix ? + UTF8Decoder::CodePointToChars(',', buffer+numberOfChar, bufferSize - numberOfChar) : + strlcpy(buffer+numberOfChar, operatorName, bufferSize-numberOfChar); + if (numberOfChar >= bufferSize-1) { + assert(buffer[bufferSize - 1] == 0); + return bufferSize-1; + } + } + // Write the child, with or without parentheses if needed + numberOfChar+= prefix ? + node->childAtIndex(i)->serialize(buffer+numberOfChar, bufferSize-numberOfChar, floatDisplayMode, numberOfDigits) : + SerializationHelper::SerializeChild(node->childAtIndex(i), node, buffer + numberOfChar, bufferSize - numberOfChar, floatDisplayMode, numberOfDigits); + if (numberOfChar >= bufferSize-1) { + assert(buffer[bufferSize - 1] == 0); + return bufferSize-1; + } + } + } + + if (prefix) { + // Add the closing parenthesis + numberOfChar += UTF8Decoder::CodePointToChars(UCodePointRightSystemParenthesis, buffer+numberOfChar, bufferSize - numberOfChar); if (numberOfChar >= bufferSize-1) { - assert(buffer[bufferSize - 1] == 0); return bufferSize-1; } } - // Null-terminate the buffer buffer[numberOfChar] = 0; return numberOfChar; } +int SerializationHelper::Infix( + const TreeNode * node, + char * buffer, + int bufferSize, + Preferences::PrintFloatMode floatDisplayMode, + int numberOfDigits, + const char * operatorName, + int firstChildIndex, + int lastChildIndex) +{ + return InfixPrefix(false, node, buffer, bufferSize, floatDisplayMode, numberOfDigits, operatorName, firstChildIndex, lastChildIndex); +} + int SerializationHelper::Prefix( const TreeNode * node, char * buffer, @@ -119,54 +158,7 @@ int SerializationHelper::Prefix( const char * operatorName, int lastChildIndex) { - { - int result = 0; - if (checkBufferSize(buffer, bufferSize, &result)) { - return result; - } - } - - // Copy the operator name - int numberOfChar = strlcpy(buffer, operatorName, bufferSize); - if (numberOfChar >= bufferSize-1) { - assert(buffer[bufferSize - 1] == 0); - return bufferSize-1; - } - - // Add the opening parenthesis - numberOfChar += UTF8Decoder::CodePointToChars(UCodePointLeftSystemParenthesis, buffer+numberOfChar, bufferSize - numberOfChar); - if (numberOfChar >= bufferSize-1) { - return bufferSize-1; - } - - int childrenCount = node->numberOfChildren(); - if (childrenCount > 0) { - int lastIndex = lastChildIndex < 0 ? childrenCount - 1 : lastChildIndex; - - // Write the children, separated with commas - for (int i = 0; i <= lastIndex; i++) { - if (i != 0) { - // Write the comma - numberOfChar += UTF8Decoder::CodePointToChars(',', buffer+numberOfChar, bufferSize - numberOfChar); - if (numberOfChar >= bufferSize-1) { - return bufferSize-1; - } - } - numberOfChar += node->childAtIndex(i)->serialize(buffer+numberOfChar, bufferSize-numberOfChar, floatDisplayMode, numberOfDigits); - if (numberOfChar >= bufferSize-1) { - assert(buffer[bufferSize - 1] == 0); - return bufferSize-1; - } - } - } - - // Add the closing parenthesis - numberOfChar += UTF8Decoder::CodePointToChars(UCodePointRightSystemParenthesis, buffer+numberOfChar, bufferSize - numberOfChar); - if (numberOfChar >= bufferSize-1) { - return bufferSize-1; - } - buffer[numberOfChar] = 0; - return numberOfChar; + return InfixPrefix(true, node, buffer, bufferSize, floatDisplayMode, numberOfDigits, operatorName, 0, lastChildIndex); } int SerializationHelper::CodePoint(char * buffer, int bufferSize, class CodePoint c) {