From 37947abdbbe82803bfddbb65c647dd4d117a95aa Mon Sep 17 00:00:00 2001 From: gk646 Date: Tue, 9 Apr 2024 13:51:13 +0200 Subject: [PATCH] added string header --- src/cxutil/cxstring.h | 65 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/cxutil/cxstring.h diff --git a/src/cxutil/cxstring.h b/src/cxutil/cxstring.h new file mode 100644 index 0000000..89a9a17 --- /dev/null +++ b/src/cxutil/cxstring.h @@ -0,0 +1,65 @@ +// Copyright (c) 2023 gk646 +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#define FINISHED +#ifndef CXSTRUCTS_SRC_CXUTIL_CXSTRING_H_ +#define CXSTRUCTS_SRC_CXUTIL_CXSTRING_H_ + +#include "../cxconfig.h" + +namespace cxstructs { + +template +inline auto str_parse_token(char** context, char delim) { + const char* start = *context; + while (**context != '\0' && **context != delim) { + (*context)++; + } + if constexpr (std::is_same_v) { + auto result = std::strtof(start, const_cast(context)); + if (**context == delim) (*context)++; + return result; + } else if constexpr (std::is_same_v) { + auto result = (int)std::strtol(start, const_cast(context), 10); + if (**context == delim) (*context)++; + return result; + } else if constexpr (std::is_same_v) { + const char* result = start; + if (**context == delim) { + *(*context) = '\0'; + (*context)++; // Move past the delimiter for the next call + } + return result; + } +} + +#ifdef CX_INCLUDE_TESTS +static void TEST_STRING() { + char buff[64] = "ParseME|0.3|55|-55|"; + char* ptr = buff; + printf("%s\n", cxstructs::str_parse_token(&ptr, '|')); + printf("%f\n", cxstructs::str_parse_token(&ptr, '|')); + printf("%d\n", cxstructs::str_parse_token(&ptr, '|')); + printf("%d\n", cxstructs::str_parse_token(&ptr, '|')); +} +#endif + +} // namespace cxstructs + +#endif //CXSTRUCTS_SRC_CXUTIL_CXSTRING_H_