mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-14 00:14:05 +09:00
base64 encoding
This commit is contained in:
@@ -68,12 +68,13 @@ Object.freeze(system);
|
|||||||
// some utilities functions
|
// some utilities functions
|
||||||
var base64 = {};
|
var base64 = {};
|
||||||
base64._lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
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._revLookup = {"":0,"=":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) {
|
base64.atobarr = function(base64str) {
|
||||||
|
var modulo = base64str.length % 4;
|
||||||
var ret = [];
|
var ret = [];
|
||||||
for (var i = 0; i < base64str.length; i += 4) {
|
for (var i = 0; i < base64str.length + modulo; 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 bits = (base64._revLookup[base64str[i]] << 18) | (base64._revLookup[base64str[i+1]] << 12) | (base64._revLookup[base64str[i+2]] << 6) | (base64._revLookup[base64str[i+3]]);
|
||||||
var pads = (base64str.charAt(i+2) == "=") ? 2 : ((base64str.charAt(i+3) == "=") ? 1 : 0);
|
var pads = (base64str[i+2] == "=") ? 2 : ((base64str[i+3] == "=") ? 1 : 0);
|
||||||
|
|
||||||
ret.push((bits >> 16) & 255);
|
ret.push((bits >> 16) & 255);
|
||||||
if (pads <= 1) ret.push((bits >> 8) & 255);
|
if (pads <= 1) ret.push((bits >> 8) & 255);
|
||||||
@@ -82,10 +83,11 @@ base64.atobarr = function(base64str) {
|
|||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
base64.atob = function(base64str) {
|
base64.atob = function(base64str) {
|
||||||
|
var modulo = base64str.length % 4;
|
||||||
var ret = "";
|
var ret = "";
|
||||||
for (var i = 0; i < base64str.length; i += 4) {
|
for (var i = 0; i < base64str.length + modulo; 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 bits = (base64._revLookup[base64str[i]] << 18) | (base64._revLookup[base64str[i+1]] << 12) | (base64._revLookup[base64str[i+2]] << 6) | (base64._revLookup[base64str[i+3]]);
|
||||||
var pads = (base64str.charAt(i+2) == "=") ? 2 : ((base64str.charAt(i+3) == "=") ? 1 : 0);
|
var pads = (base64str[i+2] == "=") ? 2 : ((base64str[i+3] == "=") ? 1 : 0);
|
||||||
|
|
||||||
ret += String.fromCharCode((bits >> 16) & 255);
|
ret += String.fromCharCode((bits >> 16) & 255);
|
||||||
if (pads <= 1) ret += String.fromCharCode((bits >> 8) & 255);
|
if (pads <= 1) ret += String.fromCharCode((bits >> 8) & 255);
|
||||||
@@ -93,19 +95,43 @@ base64.atob = function(base64str) {
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
base64.btoa = function(bytes) {
|
base64.btoa = function(inputString) {
|
||||||
if (typeof bytes == "string") {
|
var modulo = inputString.length % 3;
|
||||||
for (var i = 0; i < bytes.length; i += 3) {
|
var outStr = "";
|
||||||
|
if (Array.isArray(inputString)) {
|
||||||
|
for (var i = 0; i < inputString.length + ((modulo == 0) ? 0 : 3 - modulo); i += 3) {
|
||||||
|
var bytes = (inputString[i] << 16) | (inputString[i+1] << 8) | inputString[i+2];
|
||||||
|
// for arrays, out-of-bounds have value of undefined;
|
||||||
|
// for strings, out-of-bounds have value of NaN -- both are casted into int 0 on bitwise operations.
|
||||||
|
|
||||||
|
outStr += base64._lookup[(bytes >> 18) & 63];
|
||||||
|
outStr += base64._lookup[(bytes >> 12) & 63];
|
||||||
|
if (i < Math.floor(inputString.length / 3) * 3 | (modulo == 2 || modulo == 0)) outStr += base64._lookup[(bytes >> 6) & 63];
|
||||||
|
if (i < Math.floor(inputString.length / 3) * 3 | modulo == 0) outStr += base64._lookup[bytes & 63];
|
||||||
}
|
}
|
||||||
|
// pad the output
|
||||||
|
if (modulo == 1) outStr += "==";
|
||||||
|
else if (modulo == 2) outStr += "=";
|
||||||
}
|
}
|
||||||
else if (Array.isArray(bytes)) {
|
else if (typeof inputString == "string") {
|
||||||
for (var i = 0; i < bytes.length; i += 3) {
|
for (var i = 0; i < inputString.length + ((modulo == 0) ? 0 : 3 - modulo); i += 3) {
|
||||||
|
var bytes = (inputString.charCodeAt(i) << 16) | (inputString.charCodeAt(i+1) << 8) | inputString.charCodeAt(i+2);
|
||||||
|
// for arrays, out-of-bounds have value of undefined;
|
||||||
|
// for strings, out-of-bounds have value of NaN -- both are casted into int 0 on bitwise operations.
|
||||||
|
|
||||||
|
outStr += base64._lookup[(bytes >> 18) & 63];
|
||||||
|
outStr += base64._lookup[(bytes >> 12) & 63];
|
||||||
|
if (i < Math.floor(inputString.length / 3) * 3 | (modulo == 2 || modulo == 0)) outStr += base64._lookup[(bytes >> 6) & 63];
|
||||||
|
if (i < Math.floor(inputString.length / 3) * 3 | modulo == 0) outStr += base64._lookup[bytes & 63];
|
||||||
}
|
}
|
||||||
|
// pad the output
|
||||||
|
if (modulo == 1) outStr += "==";
|
||||||
|
else if (modulo == 2) outStr += "=";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw "Unknown byte representation (with typeof "+typeof bytes+")";
|
throw "Unknown byte representation (with typeof "+typeof bytes+")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return outStr;
|
||||||
};
|
};
|
||||||
Object.freeze(base64);
|
Object.freeze(base64);
|
||||||
@@ -11,5 +11,6 @@ for (i = indices.length - 1; i > 0; i--) {
|
|||||||
}
|
}
|
||||||
for (i = 0; i < 250880; i++) {
|
for (i = 0; i < 250880; i++) {
|
||||||
graphics.plotPixel(indices[i] % 560, (indices[i] / 560)|0, image[indices[i]]);
|
graphics.plotPixel(indices[i] % 560, (indices[i] / 560)|0, image[indices[i]]);
|
||||||
|
graphics.plotPixel(indices[i] % 560, (indices[i] / 560)|0, image[indices[i]]);
|
||||||
}
|
}
|
||||||
con.color_fore(0);
|
con.color_fore(0);
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ basicFunctions._interpretLine = function(lnum, cmd) {
|
|||||||
// TOKENISE
|
// TOKENISE
|
||||||
// TODO add separator
|
// TODO add separator
|
||||||
for (var k = 0; k < cmd.length; k++) {
|
for (var k = 0; k < cmd.length; k++) {
|
||||||
var char = cmd.charAt(k);
|
var char = cmd[k];
|
||||||
var charCode = cmd.charCodeAt(k);
|
var charCode = cmd.charCodeAt(k);
|
||||||
|
|
||||||
if (_debugprintStateTransition) print("Char: "+char+"("+charCode+"), state: "+mode);
|
if (_debugprintStateTransition) print("Char: "+char+"("+charCode+"), state: "+mode);
|
||||||
|
|||||||
@@ -60,8 +60,8 @@ class VMGUI(val appConfig: LwjglApplicationConfiguration) : ApplicationAdapter()
|
|||||||
fr1.close()
|
fr1.close()
|
||||||
|
|
||||||
//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 fr = FileReader("./assets/jscon.js")
|
||||||
val prg = fr.readText()
|
val prg = fr.readText()
|
||||||
fr.close()
|
fr.close()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user