aboutsummaryrefslogtreecommitdiff
path: root/pseudocode-lib/_exp_string.cc
diff options
context:
space:
mode:
Diffstat (limited to 'pseudocode-lib/_exp_string.cc')
-rw-r--r--pseudocode-lib/_exp_string.cc146
1 files changed, 0 insertions, 146 deletions
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 <algorithm>
-#include <cctype>
-#include <cstdio>
-#include <cstdlib>
-#include <exception>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-extern "C" int __cps_user_line;
-
-namespace {
-template <class Operation>
-decltype(auto) checked(Operation &&Op) {
- try {
- return std::forward<Operation>(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<std::string *>(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<std::size_t>(Count), Ch);
- });
-}
-void _exp_string_impl_delete(void *Handle) {
- checked([&] { delete static_cast<std::string *>(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<long long>(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<std::size_t>(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<std::size_t>(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<std::size_t>(Start - 1), Source.size());
- auto Length = Count <= 0 ? 0 : std::min(static_cast<std::size_t>(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<char>(std::tolower(static_cast<unsigned char>(Ch)));
- });
-}
-char _exp_string_impl_lcase_char(char Ch) {
- return checked([&] {
- return static_cast<char>(std::tolower(static_cast<unsigned char>(Ch)));
- });
-}
-void _exp_string_impl_ucase(void *Target, void *Handle) {
- checked([&] {
- text(Target) = text(Handle);
- for (char &Ch : text(Target))
- Ch = static_cast<char>(std::toupper(static_cast<unsigned char>(Ch)));
- });
-}
-char _exp_string_impl_ucase_char(char Ch) {
- return checked([&] {
- return static_cast<char>(std::toupper(static_cast<unsigned char>(Ch)));
- });
-}
-long long _exp_string_impl_asc(void *Handle) {
- return checked([&]() -> long long {
- const auto &Source = text(Handle);
- return Source.empty() ? 0 : static_cast<unsigned char>(Source.front());
- });
-}
-long long _exp_string_impl_asc_char(char Ch) {
- return checked([&]() -> long long { return static_cast<unsigned char>(Ch); });
-}
-void _exp_string_impl_chr(void *Target, long long Code) {
- checked([&] {
- text(Target).assign(1, static_cast<char>(static_cast<unsigned char>(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);
- });
-}
-}