commit 1c1be71bdce461d93e75b7782b016431c18e4d58 Author: allem Date: Sun Nov 4 23:07:58 2018 -0500 initial commit: overall class structure and small maven-compatible tornadofx app diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3ff393 --- /dev/null +++ b/.gitignore @@ -0,0 +1,96 @@ +# Created by .ignore support plugin (hsz.mobi) +### Maven template +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties + +# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) +!/.mvn/wrapper/maven-wrapper.jar +### Kotlin template +# Compiled class file +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/dictionaries +.idea/**/shelf + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ +cmake-build-release/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests +### Java template +# Compiled class file +# Log file +# BlueJ files +# Mobile Tools for Java (J2ME) +# Package Files # +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..78bab0e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/cssdialects.xml b/.idea/cssdialects.xml new file mode 100644 index 0000000..54c31ad --- /dev/null +++ b/.idea/cssdialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..4dbbc74 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..0dd4b35 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f47f730 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..2f05069 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b4b37a9 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# befide + +Befunge Interpreter and IDE implemented in Kotlin with TornadoFX \ No newline at end of file diff --git a/befunge/befunge.iml b/befunge/befunge.iml new file mode 100644 index 0000000..4dac62f --- /dev/null +++ b/befunge/befunge.iml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/befunge/pom.xml b/befunge/pom.xml new file mode 100644 index 0000000..d3044ce --- /dev/null +++ b/befunge/pom.xml @@ -0,0 +1,71 @@ + + + + 4.0.0 + + befide + befunge + 1.0-SNAPSHOT + jar + + befide befunge + + + UTF-8 + 1.3.0 + 4.12 + + + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-test-junit + ${kotlin.version} + test + + + junit + junit + ${junit.version} + test + + + + + src/main/kotlin + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + 1.8 + + + + + + diff --git a/befunge/src/main/kotlin/befide/befunge/b93/B93Funge.kt b/befunge/src/main/kotlin/befide/befunge/b93/B93Funge.kt new file mode 100644 index 0000000..c7019d4 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/b93/B93Funge.kt @@ -0,0 +1,26 @@ +package befide.befunge.b93 + +import befide.befunge.core.* +import befide.befunge.state.* + +class B93Funge : Funge { + override val width = 80 + override val height = 25 + + override fun get(vec: Vec): Value { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun set(vec: Vec, value: Value) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun nextVec(vec: Vec, delta: Vec): Vec { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun setString(data: String) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} + diff --git a/befunge/src/main/kotlin/befide/befunge/b93/B93Interpreter.kt b/befunge/src/main/kotlin/befide/befunge/b93/B93Interpreter.kt new file mode 100644 index 0000000..4cfa6f5 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/b93/B93Interpreter.kt @@ -0,0 +1,29 @@ +package befide.befunge.b93 + +import befide.befunge.core.Interpreter +import befide.befunge.events.Event +import befide.befunge.events.FungeEvent +import befide.befunge.events.IpEvent +import befide.befunge.events.StackEvent +import befide.befunge.state.IpMode +import befide.befunge.state.Value +import befide.befunge.state.Vec +import java.util.* + +class B93Interpreter : Interpreter { + override val funge = B93Funge() + override val stack = Stack() + override val ip = B93Pointer(Vec(0, 0), Vec(1, 0), IpMode.Normal) + + override val fungeChanged: Event = Event() + override val stackChanged: Event = Event() + override val ipChanged: Event = Event() + + override fun step(): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun reset() { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/b93/B93Pointer.kt b/befunge/src/main/kotlin/befide/befunge/b93/B93Pointer.kt new file mode 100644 index 0000000..f1a2fdf --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/b93/B93Pointer.kt @@ -0,0 +1,7 @@ +package befide.befunge.b93 + +import befide.befunge.core.Pointer +import befide.befunge.state.IpMode +import befide.befunge.state.Vec + +data class B93Pointer(override val pos: Vec, override val delta: Vec, override val mode: IpMode) : Pointer \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/core/Funge.kt b/befunge/src/main/kotlin/befide/befunge/core/Funge.kt new file mode 100644 index 0000000..f265d10 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/core/Funge.kt @@ -0,0 +1,33 @@ +package befide.befunge.core + +import befide.befunge.events.Event +import befide.befunge.events.FungeEvent +import befide.befunge.state.Value +import befide.befunge.state.Vec + +interface Funge { + val width: Int + val height: Int + + operator fun get(vec: Vec): Value + operator fun set(vec: Vec, value: Value) + + fun nextVec(vec: Vec, delta: Vec): Vec + + fun setString(data: String) + + fun nextVecs(vec: Vec, delta: Vec): Iterable { + return generateSequence(vec) { + nextVec(it, delta) + }.asIterable() + } + + fun setMany(vec: Vec, delta: Vec, data: List) { + for ((e, v) in data.zip(nextVecs(vec, delta))) + set(v, e) + } + + fun getMany(vec: Vec, delta: Vec, count: Int): Iterable { + return nextVecs(vec, delta).take(count).map(this::get).asIterable() + } +} \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/core/Interpreter.kt b/befunge/src/main/kotlin/befide/befunge/core/Interpreter.kt new file mode 100644 index 0000000..c4cf8d7 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/core/Interpreter.kt @@ -0,0 +1,22 @@ +package befide.befunge.core + +import befide.befunge.events.Event +import befide.befunge.events.FungeEvent +import befide.befunge.events.IpEvent +import befide.befunge.events.StackEvent +import befide.befunge.state.Value +import java.util.* + +interface Interpreter { + val funge: Funge + val stack: Stack + val ip: Pointer + + val fungeChanged: Event + val stackChanged: Event + val ipChanged: Event + + fun step(): Boolean + fun reset() +} + diff --git a/befunge/src/main/kotlin/befide/befunge/core/Pointer.kt b/befunge/src/main/kotlin/befide/befunge/core/Pointer.kt new file mode 100644 index 0000000..654f80c --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/core/Pointer.kt @@ -0,0 +1,12 @@ +package befide.befunge.core + +import befide.befunge.events.Event +import befide.befunge.events.IpEvent +import befide.befunge.state.IpMode +import befide.befunge.state.Vec + +interface Pointer { + val pos: Vec + val delta: Vec + val mode: IpMode +} \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/events/Event.kt b/befunge/src/main/kotlin/befide/befunge/events/Event.kt new file mode 100644 index 0000000..729b987 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/events/Event.kt @@ -0,0 +1,57 @@ +package befide.befunge.events + +/** + * Source is pulled unmodified from https://github.com/notiocide/kotlin-events, under the MIT licence + */ + +import java.util.function.Consumer + +typealias Handler = Consumer + +internal operator fun Handler.invoke(t: T) = accept(t) + +class Event : Iterable>> { + + private val list = LinkedHashMap>() + + var nextUnnamedIndex = 0L + private set + + val size: Int @JvmName("size") get() = list.size + val listeners: MutableCollection>> get() = list.entries + + fun clear() = list.clear() + + override operator fun iterator() = list.iterator() + + @JvmName("add") + operator fun plusAssign(handler: Handler) { + list.put("${nextUnnamedIndex++}", handler) + } + + @JvmName("put") + operator fun set(name: String, handler: Handler) { + list.put(name, handler) + } + + @JvmName("add") + inline operator fun plusAssign(crossinline handler: (T) -> Unit) { + this += Handler { handler(it) } + } + + @JvmName("put") + inline operator fun set(name: String, crossinline handler: (T) -> Unit) { + this[name] = Handler { handler(it) } + } + + @JvmName("remove") + operator fun minusAssign(name: String) { + list.remove(name) + } + + @JvmName("handle") + operator fun invoke(data: T) { + for ((_, value) in this) value(data) + } + +} \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/events/FungeEvent.kt b/befunge/src/main/kotlin/befide/befunge/events/FungeEvent.kt new file mode 100644 index 0000000..8005103 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/events/FungeEvent.kt @@ -0,0 +1,6 @@ +package befide.befunge.events + +import befide.befunge.state.Value +import befide.befunge.state.Vec + +data class FungeEvent(val vec: Vec, val from: Value, val to: Value) \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/events/IpEvent.kt b/befunge/src/main/kotlin/befide/befunge/events/IpEvent.kt new file mode 100644 index 0000000..a88d660 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/events/IpEvent.kt @@ -0,0 +1,5 @@ +package befide.befunge.events + +import befide.befunge.core.Pointer + +data class IpEvent(val from: Pointer, val to: Pointer) \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/events/StackAction.kt b/befunge/src/main/kotlin/befide/befunge/events/StackAction.kt new file mode 100644 index 0000000..2258a0b --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/events/StackAction.kt @@ -0,0 +1,7 @@ +package befide.befunge.events + +enum class StackAction { + Push, + Pop, + Clear +} \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/events/StackEvent.kt b/befunge/src/main/kotlin/befide/befunge/events/StackEvent.kt new file mode 100644 index 0000000..e54d3c3 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/events/StackEvent.kt @@ -0,0 +1,5 @@ +package befide.befunge.events + +import befide.befunge.state.Value + +data class StackEvent(val op: StackAction, val values: List) \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/state/IpMode.kt b/befunge/src/main/kotlin/befide/befunge/state/IpMode.kt new file mode 100644 index 0000000..11de76a --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/state/IpMode.kt @@ -0,0 +1,7 @@ +package befide.befunge.state + +enum class IpMode { + Normal, + String, + Char +} \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/state/Value.kt b/befunge/src/main/kotlin/befide/befunge/state/Value.kt new file mode 100644 index 0000000..3884051 --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/state/Value.kt @@ -0,0 +1,7 @@ +package befide.befunge.state + +data class Value(val value: Int) { + constructor(value: Char) : this(value.toInt()) + + val asChar: Char? = if (value in (32..126)) value.toChar() else null +} \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/state/Vec.kt b/befunge/src/main/kotlin/befide/befunge/state/Vec.kt new file mode 100644 index 0000000..da82c1a --- /dev/null +++ b/befunge/src/main/kotlin/befide/befunge/state/Vec.kt @@ -0,0 +1,6 @@ +package befide.befunge.state + +data class Vec(val x: Int, val y: Int) { + operator fun plus(other: Vec) = Vec(x + other.x, y + other.y) + operator fun times(c: Int) = Vec(x * c, y * c) +} \ No newline at end of file diff --git a/ide/ide.iml b/ide/ide.iml new file mode 100644 index 0000000..ba0964a --- /dev/null +++ b/ide/ide.iml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ide/pom.xml b/ide/pom.xml new file mode 100644 index 0000000..03777cb --- /dev/null +++ b/ide/pom.xml @@ -0,0 +1,87 @@ + + + + 4.0.0 + + befide + ide + 1.0-SNAPSHOT + jar + + befide ide + + + UTF-8 + 1.3.0 + 4.12 + + + + + + befide + befunge + 1.0-SNAPSHOT + + + + + no.tornado + tornadofx + 1.7.17 + + + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-test-junit + ${kotlin.version} + test + + + junit + junit + ${junit.version} + test + + + + + src/main/kotlin + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + 1.8 + + + + + + diff --git a/ide/src/main/kotlin/befide/ide/Sample.kt b/ide/src/main/kotlin/befide/ide/Sample.kt new file mode 100644 index 0000000..bd5e68b --- /dev/null +++ b/ide/src/main/kotlin/befide/ide/Sample.kt @@ -0,0 +1,46 @@ +package befide.ide + +import befide.befunge.b93.B93Interpreter +import befide.befunge.core.Interpreter +import javafx.beans.property.SimpleIntegerProperty +import javafx.scene.Parent +import javafx.scene.control.Label +import tornadofx.* + +class SampleView : View() { + private val controller: SampleController by inject() + + override val root: Parent by fxml() + + private val width: Label by fxid() + private val height: Label by fxid() + + init { + importStylesheet(resources["style.css"]) + + width.bind(controller.width) + height.bind(controller.height) + } +} + +class SampleController : Controller() { + private val bf: Interpreter = B93Interpreter() + + val width = SimpleIntegerProperty() + val height = SimpleIntegerProperty() + + init { + bf.fungeChanged += { updateFungeLabels() } + + updateFungeLabels() + } + + fun updateFungeLabels() { + width.set(bf.funge.width) + height.set(bf.funge.height) + } +} + +class SampleApp : App() { + override val primaryView = SampleView::class +} \ No newline at end of file diff --git a/ide/src/main/resources/befide/ide/SampleView.fxml b/ide/src/main/resources/befide/ide/SampleView.fxml new file mode 100644 index 0000000..2aed0d7 --- /dev/null +++ b/ide/src/main/resources/befide/ide/SampleView.fxml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/ide/src/main/resources/befide/ide/style.css b/ide/src/main/resources/befide/ide/style.css new file mode 100644 index 0000000..12f2231 --- /dev/null +++ b/ide/src/main/resources/befide/ide/style.css @@ -0,0 +1,16 @@ +.lbl { + -fx-text-fill: maroon; +} + +.val { + -fx-font-weight: bold; +} + +#heightLabel { + -fx-font-style: italic; +} + +GridPane { + -fx-font-size: 20px; + -fx-font-family: Consolas, monospace; +} \ No newline at end of file diff --git a/kotlin-befide.iml b/kotlin-befide.iml new file mode 100644 index 0000000..8021953 --- /dev/null +++ b/kotlin-befide.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file