diff --git a/main.cpp b/main.cpp index f5c93a7..d30b815 100644 --- a/main.cpp +++ b/main.cpp @@ -22,16 +22,19 @@ #include #include -constinit static sforth::forth<1024> forth {sforth::initialize<&forth>()}; +constinit static sforth::forth<2048> forth {sforth::initialize<&forth>()}; constinit static sforth::native_word<".", [](auto) { char buf[32] = {}; auto ptr = buf + sizeof(buf); auto v = forth.pop(); + bool neg = v < 0; + if (neg) v = -v; *--ptr = '\0'; do { *--ptr = "0123456789abcdefghijklmnopqrstuvwxyz"[v % forth.base]; } while (v /= forth.base); + if (neg) *--ptr = '-'; std::cout << ptr << ' '; }> dot; constinit static sforth::native_word<"emit", [](auto) { diff --git a/sforth/types.hpp b/sforth/types.hpp index 3d26581..57c37c5 100644 --- a/sforth/types.hpp +++ b/sforth/types.hpp @@ -46,12 +46,12 @@ constexpr std::optional from_chars(std::string_view sv, int base = 10) } else if (ch >= 'A' && ch <= 'Z') { if (base > 10 && ch - 'A' < base - 10) { res *= base; - res += ch - 'A'; + res += ch - 'A' + 10; } else return {}; } else if (ch >= 'a' && ch <= 'z') { if (base > 10 && ch - 'a' < base - 10) { res *= base; - res += ch - 'a'; + res += ch - 'a' + 10; } else return {}; } else if (ch == '-' && res == 0) { neg = true;