mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 11:51:49 +09:00
base64 decoding for embedding image onto the src
This commit is contained in:
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -1,7 +1,10 @@
|
|||||||
*.psd filter=lfs diff=lfs merge=lfs -text
|
*.psd filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.kra filter=lfs diff=lfs merge=lfs -text
|
||||||
*.ogg filter=lfs diff=lfs merge=lfs -text
|
*.ogg filter=lfs diff=lfs merge=lfs -text
|
||||||
*.tga filter=lfs diff=lfs merge=lfs -text
|
*.tga filter=lfs diff=lfs merge=lfs -text
|
||||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||||
*.opus filter=lfs diff=lfs merge=lfs -text
|
*.opus filter=lfs diff=lfs merge=lfs -text
|
||||||
*.pdf filter=lfs diff=lfs merge=lfs -text
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bytes filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.base64 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|||||||
@@ -65,3 +65,47 @@ system.halt = function() {
|
|||||||
exit();
|
exit();
|
||||||
};
|
};
|
||||||
Object.freeze(system);
|
Object.freeze(system);
|
||||||
|
// some utilities functions
|
||||||
|
var base64 = {};
|
||||||
|
base64._lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
base64._revLookup = {"=":0,"A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,"H":7,"I":8,"J":9,"K":10,"L":11,"M":12,"N":13,"O":14,"P":15,"Q":16,"R":17,"S":18,"T":19,"U":20,"V":21,"W":22,"X":23,"Y":24,"Z":25,"a":26,"b":27,"c":28,"d":29,"e":30,"f":31,"g":32,"h":33,"i":34,"j":35,"k":36,"l":37,"m":38,"n":39,"o":40,"p":41,"q":42,"r":43,"s":44,"t":45,"u":46,"v":47,"w":48,"x":49,"y":50,"z":51,"0":52,"1":53,"2":54,"3":55,"4":56,"5":57,"6":58,"7":59,"8":60,"9":61,"+":62,"/":63};
|
||||||
|
base64.atobarr = function(base64str) {
|
||||||
|
var ret = [];
|
||||||
|
for (var i = 0; i < base64str.length; i += 4) {
|
||||||
|
var bits = (base64._revLookup[base64str.charAt(i)] << 18) | (base64._revLookup[base64str.charAt(i+1)] << 12) | (base64._revLookup[base64str.charAt(i+2)] << 6) | (base64._revLookup[base64str.charAt(i+3)]);
|
||||||
|
var pads = (base64str.charAt(i+2) == "=") ? 2 : ((base64str.charAt(i+3) == "=") ? 1 : 0);
|
||||||
|
|
||||||
|
ret.push((bits >> 16) & 255);
|
||||||
|
if (pads <= 1) ret.push((bits >> 8) & 255);
|
||||||
|
if (pads == 0) ret.push(bits & 255);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
base64.atob = function(base64str) {
|
||||||
|
var ret = "";
|
||||||
|
for (var i = 0; i < base64str.length; i += 4) {
|
||||||
|
var bits = (base64._revLookup[base64str.charAt(i)] << 18) | (base64._revLookup[base64str.charAt(i+1)] << 12) | (base64._revLookup[base64str.charAt(i+2)] << 6) | (base64._revLookup[base64str.charAt(i+3)]);
|
||||||
|
var pads = (base64str.charAt(i+2) == "=") ? 2 : ((base64str.charAt(i+3) == "=") ? 1 : 0);
|
||||||
|
|
||||||
|
ret += String.fromCharCode((bits >> 16) & 255);
|
||||||
|
if (pads <= 1) ret += String.fromCharCode((bits >> 8) & 255);
|
||||||
|
if (pads == 0) ret += String.fromCharCode(bits & 255);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
base64.btoa = function(bytes) {
|
||||||
|
if (typeof bytes == "string") {
|
||||||
|
for (var i = 0; i < bytes.length; i += 3) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Array.isArray(bytes)) {
|
||||||
|
for (var i = 0; i < bytes.length; i += 3) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw "Unknown byte representation (with typeof "+typeof bytes+")";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Object.freeze(base64);
|
||||||
File diff suppressed because one or more lines are too long
@@ -77,6 +77,14 @@ function BasicArr() {
|
|||||||
this.dimsize = dimsize;
|
this.dimsize = dimsize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Abstract Syntax Tree
|
||||||
|
// creates empty tree node
|
||||||
|
function BasicAST() {
|
||||||
|
this.depth = 0;
|
||||||
|
this.leaves = [];
|
||||||
|
this.value = undefined;
|
||||||
|
this.type = "null"; // literal, operator, variable, function
|
||||||
|
}
|
||||||
basicInterpreterStatus.gosubStack = [];
|
basicInterpreterStatus.gosubStack = [];
|
||||||
basicInterpreterStatus.variables = {};
|
basicInterpreterStatus.variables = {};
|
||||||
basicInterpreterStatus.defuns = {};
|
basicInterpreterStatus.defuns = {};
|
||||||
@@ -108,6 +116,38 @@ basicFunctions._isSeparator = function(code) {
|
|||||||
basicFunctions._isOperator = function(code) {
|
basicFunctions._isOperator = function(code) {
|
||||||
return (code == 0x21 || code == 0x23 || code == 0x25 || code == 0x2A || code == 0x2B || code == 0x2D || code == 0x2E || code == 0x2F || (code >= 0x3C && code <= 0x3E) || code == 0x5E || code == 0x7C);
|
return (code == 0x21 || code == 0x23 || code == 0x25 || code == 0x2A || code == 0x2B || code == 0x2D || code == 0x2E || code == 0x2F || (code >= 0x3C && code <= 0x3E) || code == 0x5E || code == 0x7C);
|
||||||
};
|
};
|
||||||
|
basicFunctions._parseTokens = function(tokens, states) {
|
||||||
|
// a line has one of these forms:
|
||||||
|
// VARIABLE = LITERAL
|
||||||
|
// VARIABLE = FUNCTION ARGUMENTS
|
||||||
|
// FUNCTION
|
||||||
|
// FUNCTION ARGUMENTS --arguments may contain another function call
|
||||||
|
// "FOR" VARIABLE "=" ARGUMENT "TO" ARGUMENT
|
||||||
|
// "FOR" VARIABLE "=" ARGUMENT "TO" ARGUMENT "STEP" ARGUMENT
|
||||||
|
// "IF" EXPRESSION "THEN" EXPRESSION
|
||||||
|
// "IF" EXPRESSION "THEN" EXPRESSION "ELSE" EXPRESSION
|
||||||
|
// "IF" EXPRESSION "GOTO" ARGUMENT
|
||||||
|
// "IF" EXPRESSION "GOTO" ARGUMENT "ELSE" EXPRESSION
|
||||||
|
// "WHILE" EXPRESSION
|
||||||
|
|
||||||
|
var i, j, k;
|
||||||
|
var headWord = tokens[0].toLowerCase();
|
||||||
|
var treeHead = BasicAST();
|
||||||
|
|
||||||
|
// is this a builtin function?
|
||||||
|
if (typeof basicInterpreterStatus.builtin[headWord] != "undefined") {
|
||||||
|
treeHead.value = headWord;
|
||||||
|
treeHead.type = "function";
|
||||||
|
|
||||||
|
// find and mark position of separators
|
||||||
|
var separators = [];
|
||||||
|
for (i = 1; i < tokens.length; i++) if (states[i] == "sep") separators.push(i);
|
||||||
|
|
||||||
|
// parse and populate leaves
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
// @returns: line number for the next command, normally (lnum + 1); if GOTO or GOSUB was met, returns its line number
|
// @returns: line number for the next command, normally (lnum + 1); if GOTO or GOSUB was met, returns its line number
|
||||||
basicFunctions._interpretLine = function(lnum, cmd) {
|
basicFunctions._interpretLine = function(lnum, cmd) {
|
||||||
var _debugprintStateTransition = false;
|
var _debugprintStateTransition = false;
|
||||||
@@ -350,6 +390,11 @@ basicFunctions._interpretLine = function(lnum, cmd) {
|
|||||||
|
|
||||||
// END TOKENISE
|
// END TOKENISE
|
||||||
|
|
||||||
|
// PARSING (SYNTAX ANALYSIS)
|
||||||
|
var syntaxTree = basicFunctions._parseTokens(tokens, modes);
|
||||||
|
// END PARSING
|
||||||
|
|
||||||
|
|
||||||
println(tokens.join("~"));
|
println(tokens.join("~"));
|
||||||
println(modes.join(" "));
|
println(modes.join(" "));
|
||||||
|
|
||||||
|
|||||||
BIN
fox.base64
LFS
Normal file
BIN
fox.base64
LFS
Normal file
Binary file not shown.
@@ -61,6 +61,7 @@ class VMGUI(val appConfig: LwjglApplicationConfiguration) : ApplicationAdapter()
|
|||||||
|
|
||||||
//val fr = FileReader("./assets/tvdos/command.js")
|
//val fr = FileReader("./assets/tvdos/command.js")
|
||||||
val fr = FileReader("./assets/tbas/basic.js")
|
val fr = FileReader("./assets/tbas/basic.js")
|
||||||
|
//val fr = FileReader("./assets/jscon.js")
|
||||||
val prg = fr.readText()
|
val prg = fr.readText()
|
||||||
fr.close()
|
fr.close()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user