mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-19 19:04:05 +09:00
pipe is wip but && operator kinda works
This commit is contained in:
@@ -235,8 +235,6 @@ shell.parse = function(input) {
|
||||
tokens.push(stringBuffer);
|
||||
}
|
||||
|
||||
println(tokens)
|
||||
|
||||
return tokens;
|
||||
}
|
||||
shell.resolvePathInput = function(input) {
|
||||
@@ -385,16 +383,51 @@ shell.coreutils.chdir = shell.coreutils.cd;
|
||||
Object.freeze(shell.coreutils);
|
||||
shell.execute = function(line) {
|
||||
if (0 == line.size) return;
|
||||
var tokens = shell.parse(line);
|
||||
var cmd = tokens[0];
|
||||
if (cmd === undefined || cmd === '') return 0;
|
||||
let parsedTokens = shell.parse(line); // echo, "hai", |, less
|
||||
let statements = [] // [[echo, "hai"], [less]]
|
||||
let operators = [] // [|]
|
||||
|
||||
let opRegex = /[|>&<]/
|
||||
let stmtBuf = []
|
||||
parsedTokens.forEach((tok, i) => {
|
||||
if (tok.match(opRegex)) {
|
||||
operators.push(tok)
|
||||
statements.push(stmtBuf.slice())
|
||||
stmtBuf = []
|
||||
}
|
||||
else {
|
||||
stmtBuf.push(tok)
|
||||
}
|
||||
})
|
||||
if (stmtBuf[0] !== undefined) {
|
||||
statements.push(stmtBuf.slice())
|
||||
}
|
||||
|
||||
let retValue = undefined // return value of the previous statement
|
||||
for (let c = 0; c < statements.length; c++) {
|
||||
let op = operators[c]
|
||||
|
||||
// TODO : if operator is not undefined, swap built-in print functions with ones that 'prints' on pipes instead of stdout
|
||||
|
||||
|
||||
let tokens = statements[c]
|
||||
|
||||
let cmd = tokens[0];
|
||||
if (cmd === undefined || cmd === '') {
|
||||
retValue = 0;
|
||||
continue
|
||||
}
|
||||
|
||||
// handle Ctrl-C
|
||||
if (con.hitterminate()) return 1;
|
||||
if (con.hitterminate()) {
|
||||
retValue = 1;
|
||||
continue
|
||||
}
|
||||
|
||||
if (shell.coreutils[cmd.toLowerCase()] !== undefined) {
|
||||
var retval = shell.coreutils[cmd.toLowerCase()](tokens);
|
||||
return retval|0; // return value of undefined will cast into 0
|
||||
retValue = retval|0; // return value of undefined will cast into 0
|
||||
continue
|
||||
}
|
||||
else {
|
||||
// search through PATH for execution
|
||||
@@ -428,7 +461,8 @@ shell.execute = function(line) {
|
||||
|
||||
if (!fileExists) {
|
||||
printerrln('Bad command or filename: "'+cmd+'"');
|
||||
return 127;
|
||||
retValue = 127;
|
||||
continue
|
||||
}
|
||||
else {
|
||||
var programCode = filesystem.readAll(CURRENT_DRIVE);
|
||||
@@ -439,7 +473,7 @@ shell.execute = function(line) {
|
||||
|
||||
if ("BAT" == extension) {
|
||||
// parse and run as batch file
|
||||
var lines = programCode.split('\n').filter(function(it) { return it.length > 0; });
|
||||
var lines = programCode.split('\n').filter(function(it) { return it.length > 0 }); // this return is not shell's return!
|
||||
lines.forEach(function(line) {
|
||||
shell.execute(line);
|
||||
});
|
||||
@@ -482,11 +516,15 @@ shell.execute = function(line) {
|
||||
sendLcdMsg(_G.shellProgramTitles[_G.shellProgramTitles.length - 1]);
|
||||
//serial.println(_G.shellProgramTitles);
|
||||
|
||||
return errorlevel;
|
||||
retValue = errorlevel;
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retValue
|
||||
}
|
||||
};
|
||||
shell.pipes = {}; // syntax: _G.shell.pipes[name] = contents; all pipes are named pipes just like in Windows
|
||||
shell.currentlyActivePipes = []; // pipe queue. Use shell.getPipe() to dequeue and shell.pushPipe() to enqueue.
|
||||
|
||||
Reference in New Issue
Block a user