mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-28 18:20:14 +01:00
[poincare] Factorize SerializationHelper::Infix and Prefix
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user