From 304db2333528c7fc6fb994f0d15fa6a7d490fb01 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Mon, 5 Mar 2018 16:36:20 +0100 Subject: [PATCH] util-math: Add SizeFromString method Converts a String to an std::pair of int64_t (long long), which contain the size or 0 if none could be parsed. Any delimiter except digits(0-9), a minus sign(-) or a plus sign(+) between width and height are allowed. If a plus or minus sign is used as a delimiter, it must immediately be followed by the second size number. This allows for formats such as: 100x100, 100:100, 100p100, 100@100, 100+100 and so on, but not formats such as 100+:100, 100ThisIsSomeReall+yLongText100, etc. The parameter 'allowSquare' also determines what to do when the height parameter is not found. A value of true will have the function return instead of . --- source/util-math.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++-- source/util-math.h | 4 ++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/source/util-math.cpp b/source/util-math.cpp index 836e3391..cc69e742 100644 --- a/source/util-math.cpp +++ b/source/util-math.cpp @@ -20,8 +20,10 @@ #include "util-math.h" #include "util-memory.h" #include +#include +#include -void* util::vec3a::operator new(size_t count){ +void* util::vec3a::operator new(size_t count) { return _aligned_malloc(count, 16); } @@ -37,7 +39,7 @@ void util::vec3a::operator delete[](void* p) { _aligned_free(p); } -void* util::vec4a::operator new(size_t count){ +void* util::vec4a::operator new(size_t count) { return _aligned_malloc(count, 16); } @@ -52,3 +54,42 @@ void util::vec4a::operator delete(void* p) { void util::vec4a::operator delete[](void* p) { _aligned_free(p); } + +std::pair util::SizeFromString(std::string text, bool allowSquare) { + int64_t width, height; + + const char* begin = text.c_str(); + const char* end = text.c_str() + text.size() + 1; + char* here = const_cast(end); + + long long res = strtoll(begin, &here, 0); + if (errno == ERANGE) { + return { 0, 0 }; + } + width = res; + + while (here != end) { + if (isdigit(*here) || (*here == '-') || (*here == '+')) { + break; + } + here++; + } + if (here == end) { + // Are we allowed to return a square? + if (allowSquare) { + // Yes: Return width,width. + return { width, width }; + } else { + // No: Return width,0. + return { width, 0 }; + } + } + + res = strtoll(here, nullptr, 0); + if (errno == ERANGE) { + return { width, 0 }; + } + height = res; + + return { width, height }; +} diff --git a/source/util-math.h b/source/util-math.h index 479f4c1e..53f9b145 100644 --- a/source/util-math.h +++ b/source/util-math.h @@ -20,6 +20,8 @@ #pragma once #include #include +#include +#include // OBS #include @@ -60,4 +62,6 @@ namespace util { static void vec4a::operator delete(void* p); static void vec4a::operator delete[](void* p); }; + + std::pair SizeFromString(std::string text, bool allowSquare = true); }