mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-14 08:24:04 +09:00
command.js: fixing bad path syntax on shell.execute
This commit is contained in:
@@ -46,6 +46,16 @@ if (!String.prototype.startsWith) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (!String.prototype.endsWith) {
|
||||||
|
Object.defineProperty(String.prototype, 'endsWith', {
|
||||||
|
value: function(search, this_len) {
|
||||||
|
if (this_len === undefined || this_len > this.length) {
|
||||||
|
this_len = this.length;
|
||||||
|
}
|
||||||
|
return this.substring(this_len - search.length, this_len) === search;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
if (!Array.prototype.filter){
|
if (!Array.prototype.filter){
|
||||||
Array.prototype.filter = function(func, thisArg) {
|
Array.prototype.filter = function(func, thisArg) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ _TVDOS.getPath = function() {
|
|||||||
};
|
};
|
||||||
// initial values
|
// initial values
|
||||||
_TVDOS.variables = {
|
_TVDOS.variables = {
|
||||||
DOSDIR: "\\tvdos\\",
|
DOSDIR: "\\tvdos",
|
||||||
LANG: "EN",
|
LANG: "EN",
|
||||||
PATH: "\\tvdos\\bin\\",
|
PATH: "\\tvdos\\bin",
|
||||||
PATHEXT: ".com;.bat;.js",
|
PATHEXT: ".com;.bat;.js",
|
||||||
HELPPATH: "\\tvdos\\help\\",
|
HELPPATH: "\\tvdos\\help",
|
||||||
OS_NAME: "Terrarum Virtual DOS",
|
OS_NAME: "Terrarum Virtual DOS",
|
||||||
OS_VERSION: _TVDOS.VERSION
|
OS_VERSION: _TVDOS.VERSION
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ let shell_pwd = [""];
|
|||||||
let goInteractive = false;
|
let goInteractive = false;
|
||||||
let goFancy = false;
|
let goFancy = false;
|
||||||
|
|
||||||
|
let DEBUG_PRINT = true;
|
||||||
|
|
||||||
const welcome_text = "TSVM Disk Operating System, version " + _TVDOS.VERSION;
|
const welcome_text = "TSVM Disk Operating System, version " + _TVDOS.VERSION;
|
||||||
|
|
||||||
function print_prompt_text() {
|
function print_prompt_text() {
|
||||||
@@ -36,6 +38,18 @@ function greet() {
|
|||||||
println(welcome_text);
|
println(welcome_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function trimStartRevSlash(s) {
|
||||||
|
let cnt = 0;
|
||||||
|
while (cnt < s.length) {
|
||||||
|
let chr = s[cnt];
|
||||||
|
|
||||||
|
if (chr != '\\') break;
|
||||||
|
|
||||||
|
cnt += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.substring(cnt);
|
||||||
|
}
|
||||||
|
|
||||||
let shell = {};
|
let shell = {};
|
||||||
// example input: echo "the string" > subdir\test.txt
|
// example input: echo "the string" > subdir\test.txt
|
||||||
@@ -199,6 +213,7 @@ shell.execute = function(line) {
|
|||||||
|
|
||||||
let fileExists = false;
|
let fileExists = false;
|
||||||
let searchDir = (cmd.startsWith("\\")) ? [""] : ["\\"+shell_pwd.join("\\")].concat(_TVDOS.getPath());
|
let searchDir = (cmd.startsWith("\\")) ? [""] : ["\\"+shell_pwd.join("\\")].concat(_TVDOS.getPath());
|
||||||
|
|
||||||
let pathExt = [];
|
let pathExt = [];
|
||||||
// fill pathExt using %PATHEXT% but also capitalise them
|
// fill pathExt using %PATHEXT% but also capitalise them
|
||||||
if (cmd.split(".")[1] === undefined)
|
if (cmd.split(".")[1] === undefined)
|
||||||
@@ -209,7 +224,13 @@ shell.execute = function(line) {
|
|||||||
searchLoop:
|
searchLoop:
|
||||||
for (let i = 0; i < searchDir.length; i++) {
|
for (let i = 0; i < searchDir.length; i++) {
|
||||||
for (let j = 0; j < pathExt.length; j++) {
|
for (let j = 0; j < pathExt.length; j++) {
|
||||||
let path = (searchDir[i] + cmd + pathExt[j]).substring(1); // without substring, this will always prepend revslash
|
let search = searchDir[i]; if (!search.endsWith('\\')) search += '\\';
|
||||||
|
let path = trimStartRevSlash(search + cmd + pathExt[j]);
|
||||||
|
|
||||||
|
if (DEBUG_PRINT) {
|
||||||
|
serial.println("[command.js > shell.execute] file search path: "+path);
|
||||||
|
}
|
||||||
|
|
||||||
if (filesystem.open(CURRENT_DRIVE, path, "R")) {
|
if (filesystem.open(CURRENT_DRIVE, path, "R")) {
|
||||||
fileExists = true;
|
fileExists = true;
|
||||||
break searchLoop;
|
break searchLoop;
|
||||||
|
|||||||
@@ -15,14 +15,14 @@ import java.io.InputStream
|
|||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
import kotlin.experimental.and
|
import kotlin.experimental.and
|
||||||
|
|
||||||
class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: Boolean = true) : GlassTty(Companion.TEXT_ROWS, Companion.TEXT_COLS), PeriBase {
|
open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: Boolean = true) : GlassTty(Companion.TEXT_ROWS, Companion.TEXT_COLS), PeriBase {
|
||||||
|
|
||||||
override fun getVM(): VM {
|
override fun getVM(): VM {
|
||||||
return vm
|
return vm
|
||||||
}
|
}
|
||||||
|
|
||||||
internal val framebuffer = Pixmap(WIDTH, HEIGHT, Pixmap.Format.Alpha)
|
internal val framebuffer = Pixmap(WIDTH, HEIGHT, Pixmap.Format.Alpha)
|
||||||
private var rendertex = Texture(1, 1, Pixmap.Format.RGBA8888)
|
protected var rendertex = Texture(1, 1, Pixmap.Format.RGBA8888)
|
||||||
internal val paletteOfFloats = FloatArray(1024) {
|
internal val paletteOfFloats = FloatArray(1024) {
|
||||||
val rgba = DEFAULT_PALETTE[it / 4]
|
val rgba = DEFAULT_PALETTE[it / 4]
|
||||||
val channel = it % 4
|
val channel = it % 4
|
||||||
@@ -32,10 +32,10 @@ class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: Boole
|
|||||||
private val faketex: Texture
|
private val faketex: Texture
|
||||||
|
|
||||||
internal val spriteAndTextArea = UnsafeHelper.allocate(10660L)
|
internal val spriteAndTextArea = UnsafeHelper.allocate(10660L)
|
||||||
private val unusedArea = ByteArray(92)
|
protected val unusedArea = ByteArray(92)
|
||||||
|
|
||||||
private val paletteShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, if (lcdMode && !lcdInvert) DRAW_SHADER_FRAG_LCD_NOINV else if (lcdMode) DRAW_SHADER_FRAG_LCD else DRAW_SHADER_FRAG)
|
protected val paletteShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, if (lcdMode && !lcdInvert) DRAW_SHADER_FRAG_LCD_NOINV else if (lcdMode) DRAW_SHADER_FRAG_LCD else DRAW_SHADER_FRAG)
|
||||||
private val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, if (lcdMode && !lcdInvert) TEXT_TILING_SHADER_LCD_NOINV else if (lcdMode) TEXT_TILING_SHADER_LCD else TEXT_TILING_SHADER)
|
protected val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, if (lcdMode && !lcdInvert) TEXT_TILING_SHADER_LCD_NOINV else if (lcdMode) TEXT_TILING_SHADER_LCD else TEXT_TILING_SHADER)
|
||||||
|
|
||||||
override var blinkCursor = true
|
override var blinkCursor = true
|
||||||
override var ttyRawMode = false
|
override var ttyRawMode = false
|
||||||
|
|||||||
21
src/net/torvald/tsvm/peripheral/TexticsAdapter.kt
Normal file
21
src/net/torvald/tsvm/peripheral/TexticsAdapter.kt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package net.torvald.tsvm.peripheral
|
||||||
|
|
||||||
|
import net.torvald.tsvm.VM
|
||||||
|
|
||||||
|
class TexticsAdapter(vm: VM, lcdMode: Boolean = false, lcdInvert: Boolean = true) : GraphicsAdapter(vm, lcdMode, lcdInvert) {
|
||||||
|
|
||||||
|
override fun peek(addr: Long): Byte? {
|
||||||
|
return when (addr) {
|
||||||
|
in 0 until 250880 -> (-1).toByte()
|
||||||
|
else -> super.peek(addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun poke(addr: Long, byte: Byte) {
|
||||||
|
when (addr) {
|
||||||
|
in 0 until 250880 -> { /*do nothing*/ }
|
||||||
|
else -> super.poke(addr, byte)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user