diff --git a/ibfi-ts/src/src/App.scss b/ibfi-ts/src/src/App.scss deleted file mode 100644 index 9fa2117..0000000 --- a/ibfi-ts/src/src/App.scss +++ /dev/null @@ -1,128 +0,0 @@ -$main-color: #282c34; -$main-color-brighter: #323942; -$light-color: ghostwhite; -$medium-color: #78787f; - -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -.App-header { - background-color: $main-color; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: $light-color; -} - -.App-link { - color: #61dafb; -} - -.bf-input { - .code-input { - resize: none; - width: 80vw; - height: 400px; - font-size: 100px; - } - - .code-options-wrapper > * { - margin: 10px; - } -} - -.code-display-wrapper { - max-width: 80vw; - font-family: monospace; - - span { - word-wrap: break-word; - } -} - -.memory-display-table { - $border: 1px solid $light-color; - - th, .cell { - border: $border; - } - - th, td { - min-width: 60px; - text-align: center; - } - - .array-set-value-field { - min-width: 50px; - max-width: 100px; - height: 40px; - color: $light-color; - font-size: 30px; - background-color: $main-color-brighter; - } -} - -.run-button { - height: 50px; - width: 200px; - -} - -.bf-run { - margin: 20px; - - - .speed-control-wrapper > * { - margin: 10px; - } - - .small-speed-button { - height: 40px; - width: 40px; - } - - .program-input-area { - resize: none; - width: 80vw; - height: 50px; - font-size: 30px; - } - - .info { - background-color: #579ca7; - } -} - -.bf-output { - .output-area { - resize: none; - width: 80vw; - height: 200px; - font-size: 20px; - } -} - -textarea { - background-color: $main-color-brighter; - color: $light-color; -} - -button { - background-color: $medium-color; - font-size: 20px; - border: 1px solid $main-color; - - &:hover { - cursor: pointer; - background-color: $light-color; - } -} \ No newline at end of file diff --git a/ibfi-ts/src/src/brainfuck/Interpreter.ts b/ibfi-ts/src/src/brainfuck/Interpreter.ts deleted file mode 100644 index 0c4b25a..0000000 --- a/ibfi-ts/src/src/brainfuck/Interpreter.ts +++ /dev/null @@ -1,157 +0,0 @@ -import {CodeOptions} from "../components/CodeInput"; - -type InHandler = (() => number); -type OutHandler = ((char: number) => void); - -export default class Interpreter { - private readonly _array: Uint8Array; - private _pointer: number; - private readonly _code: string; - private _programCounter: number; - - private readonly _inHandler: InHandler; - private readonly _outHandler: OutHandler; - - private readonly _options: CodeOptions; - - constructor(input: [string, CodeOptions], outHandler: OutHandler, inHandler: InHandler) { - const buf = new ArrayBuffer(32000); - this._array = new Uint8Array(buf); - this._pointer = 0; - - this._options = input[1]; - if (input[1].minify) { - this._code = this.minify(input[0]) - } else { - this._code = input[0]; - } - - this._programCounter = 0; - this._inHandler = inHandler; - this._outHandler = outHandler; - } - - public next() { - this.execute(this._code[this._programCounter++]); - } - - public execute(char: string) { - switch (char) { - case '+': - this._array[this._pointer]++; - break; - case '-': - this._array[this._pointer]--; - break; - case '>': - this._pointer++; - break; - case '<': - if (this._pointer === 0) { - throw new Error("Cannot wrap left"); - } - this._pointer--; - break; - case '.': - this._outHandler(this.value); - break; - case ',': - this.input(); - break; - case '[': - this.loopForwards(); - break; - case ']': - this.loopBackwards(); - break; - case '•': - if (this._options.enableBreakpoints) { - throw new Error("Breakpoint reached"); - } - break; - case undefined: - this._programCounter = this._code.length; - break; - default: - break; - } - } - - private loopForwards() { - if (this.value === 0) { - let level = 0; - while (this.lastInstruction !== ']' || level > -1) { - this._programCounter++; - if (this._programCounter > this._code.length) { - throw new Error("Reached end of code while searching ']'"); - } - if (this.lastInstruction === '[') level++; - else if (this.lastInstruction === ']') level--; - } - } - } - - private loopBackwards() { - if (this.value !== 0) { - let level = 0; - while (this.lastInstruction !== '[' || level > -1) { - this._programCounter--; - if (this._programCounter < 0) { - throw new Error("Reached start of code while searching '['"); - } - if (this.lastInstruction === '[') level--; - else if (this.lastInstruction === ']') level++; - } - } - } - - private input() { - try { - this._array[this._pointer] = this._inHandler(); - } catch { - this._programCounter--; - } - } - - get reachedEnd(): boolean { - return this._programCounter === this._code.length; - } - - get lastInstruction(): string { - return this._code[this._programCounter - 1]; - } - - get value(): number { - return this._array[this._pointer]; - } - - get array(): Uint8Array { - return this._array; - } - - get pointer(): number { - return this._pointer; - } - - get code(): string { - return this._code; - } - - get programCounter(): number { - return this._programCounter; - } - - private minify(code: string): string { - const CHARS = ['+', '-', '<', '>', '.', ',', '[', ']']; - if (this._options.enableBreakpoints) { - CHARS.push('•'); - } - - return code.split("") - .filter(c => CHARS.includes(c)) - .join(""); - } -} - - - diff --git a/ibfi-ts/src/src/components/App.tsx b/ibfi-ts/src/src/components/App.tsx deleted file mode 100644 index edf98c3..0000000 --- a/ibfi-ts/src/src/components/App.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import '../App.scss'; -import CodeInput, {CodeOptions} from "./CodeInput"; -import ProgramOutput from "./ProgramOutput"; -import React, {useCallback, useState} from "react"; -import Runner from "./Runner"; - -export const OptionContext = React.createContext({}); - -function App() { - const [out, setOut] = useState(""); - const [input, setInput] = useState<[string, CodeOptions]>(["", {}]); - const [running, setRunning] = useState(false); - - const outHandler = useCallback((char: number) => { - setOut(oldOut => oldOut + String.fromCharCode(char)) - }, []); - - const runHandler = (run: boolean) => { - setRunning(run); - if (!run) { - setOut(""); - } - } - - const inputHandler = (code: string, options: CodeOptions) => setInput([code, options]); - return ( -
- - { - !running && - } - - { - running && - } - -
- ); -} - -export default App; \ No newline at end of file diff --git a/ibfi-ts/src/src/components/CodeDisplay.tsx b/ibfi-ts/src/src/components/CodeDisplay.tsx deleted file mode 100644 index 9d2d5ab..0000000 --- a/ibfi-ts/src/src/components/CodeDisplay.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -interface CodeDisplayProps { - code: string, - index: number, -} - -const CodeDisplay = ({code, index}: CodeDisplayProps) => { - - const firstCodePart = code.substr(0, index); - const secondCodePart = code.substr(index + 1, code.length - index + 1); - - return ( -
- {firstCodePart} - {code[index] || " "} - {secondCodePart} -
- ); -}; - -export default CodeDisplay; \ No newline at end of file diff --git a/ibfi-ts/src/src/components/CodeInput.tsx b/ibfi-ts/src/src/components/CodeInput.tsx deleted file mode 100644 index 37fa956..0000000 --- a/ibfi-ts/src/src/components/CodeInput.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React, {ChangeEvent, useState} from 'react'; -import presets from "../presets.json"; - -export interface CodeOptions { - minify?: boolean, - directStart?: boolean, - startSuperSpeed?: boolean, - enableBreakpoints?: boolean - asciiView?: boolean -} - -interface CodeInputProps { - setInput: ((code: string, options: CodeOptions) => void), - input: [string, CodeOptions] -} - -const codeOptions: Array<[string, keyof CodeOptions]> = [ - ["Minify Code", "minify"], - ["Start directly", "directStart"], - ["Start in blocking mode", "startSuperSpeed"], - ["Breakpoints (•)", "enableBreakpoints"], - ["Show ASCII in memory", "asciiView"] -] - -const CodeInput = ({input: [code, options], setInput}: CodeInputProps) => { - const [fontSize, setFontSize] = useState(40); - - const setPreset = (name: keyof typeof presets) => () => { - setInput(presets[name], options); - } - - const changeHandler = (name: keyof CodeOptions) => (event: ChangeEvent) => { - setInput(code, {...options, [name]: event.target.checked}) - } - - return ( -
-
-
- - setFontSize(+v.target.value)}/> -
- - {codeOptions.map(([display, id]) => - - )} - -
-