From 62b605c6c0ea13e9763c0a0115464007b13a8831 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Tue, 20 Oct 2026 11:57:16 +0000 Subject: refactor(strings): replace compiler builtins with the STRING library Construct literals as STRING values and route string operations through ordinary library functions and operators. Preserve value ownership in records, arrays, constants and file I/O. Co-Authored-By: Claude Opus 5.5 --- pseudocode-lib/_exp_string.cc | 146 ------------------------------------------ 1 file changed, 146 deletions(-) delete mode 100644 pseudocode-lib/_exp_string.cc (limited to 'pseudocode-lib/_exp_string.cc') diff --git a/pseudocode-lib/_exp_string.cc b/pseudocode-lib/_exp_string.cc deleted file mode 100644 index 4cfd650..0000000 --- a/pseudocode-lib/_exp_string.cc +++ /dev/null @@ -1,146 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" int __cps_user_line; - -namespace { -template -decltype(auto) checked(Operation &&Op) { - try { - return std::forward(Op)(); - } catch (const std::exception &Error) { - std::fprintf(stderr, "[Fatal] line %d: %s\n", __cps_user_line, Error.what()); - throw 0; - } -} -std::string &text(void *Handle) { return *static_cast(Handle); } -} - -extern "C" { -void *_exp_string_impl_new() { - return checked([] { return new std::string; }); -} -void *_exp_string_impl_copy(void *Other) { - return checked([&] { return new std::string(text(Other)); }); -} -void *_exp_string_impl_from_cstr(const char *Text) { - return checked([&] { return new std::string(Text); }); -} -void *_exp_string_impl_from_count_char(long long Count, char Ch) { - return checked([&] { - if (Count < 0) throw std::invalid_argument("negative string length"); - return new std::string(static_cast(Count), Ch); - }); -} -void _exp_string_impl_delete(void *Handle) { - checked([&] { delete static_cast(Handle); }); -} -void _exp_string_impl_assign(void *Target, void *Other) { - checked([&] { text(Target) = text(Other); }); -} -void _exp_string_impl_assign_cstr(void *Target, const char *Text) { - checked([&] { text(Target) = Text; }); -} -void _exp_string_impl_concat(void *Target, void *A, void *B) { - checked([&] { text(Target) = text(A) + text(B); }); -} -void _exp_string_impl_from_int(void *Target, long long Number) { - checked([&] { text(Target) = std::to_string(Number); }); -} -void _exp_string_impl_from_real(void *Target, double Number) { - checked([&] { text(Target) = std::to_string(Number); }); -} -double _exp_string_impl_to_real(void *Handle) { - return checked([&] { - std::size_t Consumed = 0; - double Number = std::stod(text(Handle), &Consumed); - if (Consumed != text(Handle).size()) - throw std::invalid_argument("unconsumed characters in string conversion"); - return Number; - }); -} -long long _exp_string_impl_length(void *Handle) { - return checked([&] { return static_cast(text(Handle).size()); }); -} -void _exp_string_impl_left(void *Target, void *Handle, long long Count) { - checked([&] { - const auto &Source = text(Handle); - auto Length = Count <= 0 ? 0 : std::min(static_cast(Count), Source.size()); - text(Target) = Source.substr(0, Length); - }); -} -void _exp_string_impl_right(void *Target, void *Handle, long long Count) { - checked([&] { - const auto &Source = text(Handle); - auto Length = Count <= 0 ? 0 : std::min(static_cast(Count), Source.size()); - text(Target) = Source.substr(Source.size() - Length, Length); - }); -} -void _exp_string_impl_mid(void *Target, void *Handle, long long Start, long long Count) { - checked([&] { - const auto &Source = text(Handle); - auto Position = Start <= 1 ? 0 : std::min(static_cast(Start - 1), Source.size()); - auto Length = Count <= 0 ? 0 : std::min(static_cast(Count), Source.size() - Position); - text(Target) = Source.substr(Position, Length); - }); -} -void _exp_string_impl_lcase(void *Target, void *Handle) { - checked([&] { - text(Target) = text(Handle); - for (char &Ch : text(Target)) - Ch = static_cast(std::tolower(static_cast(Ch))); - }); -} -char _exp_string_impl_lcase_char(char Ch) { - return checked([&] { - return static_cast(std::tolower(static_cast(Ch))); - }); -} -void _exp_string_impl_ucase(void *Target, void *Handle) { - checked([&] { - text(Target) = text(Handle); - for (char &Ch : text(Target)) - Ch = static_cast(std::toupper(static_cast(Ch))); - }); -} -char _exp_string_impl_ucase_char(char Ch) { - return checked([&] { - return static_cast(std::toupper(static_cast(Ch))); - }); -} -long long _exp_string_impl_asc(void *Handle) { - return checked([&]() -> long long { - const auto &Source = text(Handle); - return Source.empty() ? 0 : static_cast(Source.front()); - }); -} -long long _exp_string_impl_asc_char(char Ch) { - return checked([&]() -> long long { return static_cast(Ch); }); -} -void _exp_string_impl_chr(void *Target, long long Code) { - checked([&] { - text(Target).assign(1, static_cast(static_cast(Code))); - }); -} -int _exp_string_impl_is_num(void *Handle) { - return checked([&]() -> int { - const auto &Source = text(Handle); - char *End = nullptr; - std::strtod(Source.c_str(), &End); - return !Source.empty() && End == Source.c_str() + Source.size(); - }); -} -void _exp_string_impl_output(void *Handle) { - checked([&] { - const auto &Text = text(Handle); - std::fwrite(Text.data(), 1, Text.size(), stdout); - std::fputc('\n', stdout); - }); -} -} -- cgit v1.3.1-4-g156e