Files
video-shader-toys/src/JsonUtil.cpp
2026-05-02 14:20:38 +10:00

49 lines
1.4 KiB
C++

#include "JsonUtil.h"
#include <charconv>
std::string jsonEscape(const std::string& value)
{
std::string out;
out.reserve(value.size());
for (char ch : value)
{
switch (ch)
{
case '\\': out += "\\\\"; break;
case '"': out += "\\\""; break;
case '\n': out += "\\n"; break;
case '\r': out += "\\r"; break;
case '\t': out += "\\t"; break;
default: out += ch; break;
}
}
return out;
}
std::optional<float> findJsonFloat(const std::string& body, const std::string& key)
{
const std::string quotedKey = "\"" + key + "\"";
size_t pos = body.find(quotedKey);
if (pos == std::string::npos)
return std::nullopt;
pos = body.find(':', pos + quotedKey.size());
if (pos == std::string::npos)
return std::nullopt;
++pos;
while (pos < body.size() && (body[pos] == ' ' || body[pos] == '\t' || body[pos] == '\r' || body[pos] == '\n'))
++pos;
size_t end = pos;
while (end < body.size() && (body[end] == '-' || body[end] == '+' || body[end] == '.' || (body[end] >= '0' && body[end] <= '9') || body[end] == 'e' || body[end] == 'E'))
++end;
float value = 0.0f;
const auto result = std::from_chars(body.data() + pos, body.data() + end, value);
if (result.ec != std::errc())
return std::nullopt;
return value;
}