[poincare] Factorize SerializationHelper::Infix and Prefix

This commit is contained in:
Léa Saviot
2019-06-24 17:04:30 +02:00
committed by LeaNumworks
parent b985599079
commit 4945868ec0

View File

@@ -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) {