Files
nuki_hub/lib/PsychicHttp/src/TemplatePrinter.cpp
2024-12-30 14:37:09 +01:00

113 lines
1.9 KiB
C++

/************************************************************
TemplatePrinter Class
A basic templating engine for a stream of text.
This wraps the Arduino Print interface and writes to any
Print interface.
Written by Christopher Andrews (https://github.com/Chris--A)
************************************************************/
#include "TemplatePrinter.h"
void TemplatePrinter::resetParam(bool flush)
{
if (flush && _inParam)
{
_stream.write(_delimiter);
if (_paramPos)
_stream.print(_paramBuffer);
}
memset(_paramBuffer, 0, sizeof(_paramBuffer));
_paramPos = 0;
_inParam = false;
}
void TemplatePrinter::flush()
{
resetParam(true);
_stream.flush();
}
size_t TemplatePrinter::write(uint8_t data)
{
if (data == _delimiter)
{
// End of parameter, send to callback
if (_inParam)
{
// On false, return the parameter place holder as is: not a parameter
// Bug fix: ignore parameters that are zero length.
if (!_paramPos || !_cb(_stream, _paramBuffer))
{
resetParam(true);
_stream.write(data);
}
else
{
resetParam(false);
}
// Start collecting parameter
}
else
{
_inParam = true;
}
}
else
{
// Are we collecting
if (_inParam)
{
// Is param still valid
if (isalnum(data) || data == '_')
{
// Total param len must be 63, 1 for null.
if (_paramPos < sizeof(_paramBuffer) - 1)
{
_paramBuffer[_paramPos++] = data;
// Not a valid param
}
else
{
resetParam(true);
}
}
else
{
resetParam(true);
_stream.write(data);
}
// Just output
}
else
{
_stream.write(data);
}
}
return 1;
}
size_t TemplatePrinter::copyFrom(Stream& stream)
{
size_t count = 0;
while (stream.available())
count += this->write(stream.read());
return count;
}