diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2023-03-08 19:57:26 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2023-03-08 19:57:26 -0500 |
commit | dcd5e792b1d84afd1bea9780781674b6e6ad8dc3 (patch) | |
tree | 6b841cd741c3d8df6cb7b22f1423a5c814e0add9 /state.hpp | |
parent | 1960aa8773e51a76f0a5a653c8a4eb4fbef5e4ba (diff) |
move libalee into folder
Diffstat (limited to 'state.hpp')
-rw-r--r-- | state.hpp | 109 |
1 files changed, 0 insertions, 109 deletions
diff --git a/state.hpp b/state.hpp deleted file mode 100644 index 28396dc..0000000 --- a/state.hpp +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Alee Forth: A portable and concise Forth implementation in modern C++. - * Copyright (C) 2023 Clyne Sullivan <clyne@bitgloo.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -#ifndef ALEEFORTH_STATE_HPP -#define ALEEFORTH_STATE_HPP - -#include "dictionary.hpp" -#include "types.hpp" - -#include <csetjmp> -#include <cstddef> - -constexpr unsigned DataStackSize = 16; -constexpr unsigned ReturnStackSize = 16; - -struct State -{ - enum class Error : int { - none = 0, - push, - pop, - pushr, - popr, - top, - pick, - exit - }; - - Addr ip = 0; - Dictionary& dict; - void (*input)(State&); - - Cell dstack[DataStackSize] = {}; - Cell rstack[ReturnStackSize] = {}; - Cell *dsp = dstack - 1; - Cell *rsp = rstack - 1; - - std::jmp_buf jmpbuf = {}; - - constexpr State(Dictionary& d, void (*i)(State&)): - dict(d), input(i) {} - - bool compiling() const; - void compiling(bool); - - Error execute(Addr); - - std::size_t size() const noexcept; - std::size_t rsize() const noexcept; - - inline void push(Cell value) { - if (dsp == dstack + DataStackSize - 1) - std::longjmp(jmpbuf, static_cast<int>(Error::push)); - *++dsp = value; - } - - inline Cell pop() { - if (dsp < dstack) - std::longjmp(jmpbuf, static_cast<int>(Error::pop)); - return *dsp--; - } - - inline Cell beyondip() { - ip += sizeof(Cell); - return dict.read(ip); - } - - inline void pushr(Cell value) { - if (rsp == rstack + ReturnStackSize - 1) - std::longjmp(jmpbuf, static_cast<int>(Error::pushr)); - *++rsp = value; - } - - inline Cell popr() { - if (rsp < rstack) - std::longjmp(jmpbuf, static_cast<int>(Error::popr)); - return *rsp--; - } - - inline Cell& top() { - if (dsp < dstack) - std::longjmp(jmpbuf, static_cast<int>(Error::top)); - return *dsp; - } - - inline Cell& pick(std::size_t i) { - if (dsp - i < dstack) - std::longjmp(jmpbuf, static_cast<int>(Error::pick)); - return *(dsp - i); - } -}; - -#endif // ALEEFORTH_STATE_HPP - |