mirror of
https://github.com/boxgaming/qbjs.git
synced 2024-09-19 20:14:58 +00:00
Merge pull request #26 from WFBarnes/main
Prototyping Data/Read/Restore, Textured lines, classic RND behavior.
This commit is contained in:
commit
df3fc5b802
4 changed files with 409 additions and 65 deletions
|
@ -40,12 +40,12 @@ CodeMirror.defineMode("qbjs", function(conf, parserConf) {
|
|||
'_keyhit', '_loadimage', '_mousebutton', '_mouseinput', '_mousex', '_mousey', '_newimage', '_pi', '_printstring', '_printwidth',
|
||||
'_putimage', '_r2d', '_red', '_red32', '_resize', '_resizewidth', '_resizeheight', '_rgb', '_rgba', '_rgb32', '_rgba32', '_round',
|
||||
'_screenexists', '_sinh', '_source', '_sndclose', '_sndopen', '_sndplay', '_sndloop', '_sndpause', '_sndstop', '_sndvol',
|
||||
'_title', '_trim', '_width', 'abs', 'asc', 'atn', 'beep', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'draw', 'exp',
|
||||
'_title', '_trim', '_width', 'abs', 'asc', 'atn', 'beep', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'data', 'draw', 'exp',
|
||||
'fix', 'hex', 'input', 'inkey', 'instr', 'int', 'lbound', 'left', 'lcase', 'len', 'line', 'locate', 'log', 'ltrim', 'mid', 'mki', 'mkl',
|
||||
'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr',
|
||||
'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'randomize', 'read', 'restore', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr',
|
||||
'str', 'swap', 'tan', 'time', 'timer', 'ubound', 'ucase', 'val', 'varptr', 'window',
|
||||
// QBJS-specific
|
||||
'export', 'from', 'import']
|
||||
'export', 'from', 'import', '_label']
|
||||
|
||||
var builtinConsts = ['_off', '_smooth', '_stretch', '_squarepixels',
|
||||
'gx_true', 'gx_false', 'gxevent_init', 'gxevent_update', 'gxevent_drawbg', 'gxevent_drawmap', 'gxevent_drawscreen',
|
||||
|
|
203
qb.js
203
qb.js
|
@ -36,6 +36,10 @@ var QB = new function() {
|
|||
var _resizeWidth = 0;
|
||||
var _resizeHeight = 0;
|
||||
var _currScreenImage = null;
|
||||
var _dataBulk = [];
|
||||
var _readCursorPosition;
|
||||
var _dataLabelMap = new Map();
|
||||
var _rndSeed = 327680;
|
||||
|
||||
// Array handling methods
|
||||
// ----------------------------------------------------
|
||||
|
@ -55,22 +59,22 @@ var QB = new function() {
|
|||
|
||||
this.resizeArray = function(a, dimensions, obj, preserve) {
|
||||
if (!preserve) {
|
||||
var props = Object.getOwnPropertyNames(a);
|
||||
for (var i = 0; i < props.length; i++) {
|
||||
if (props[i] != "_newObj") {
|
||||
delete a[props[i]];
|
||||
var props = Object.getOwnPropertyNames(a);
|
||||
for (var i = 0; i < props.length; i++) {
|
||||
if (props[i] != "_newObj") {
|
||||
delete a[props[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dimensions && dimensions.length > 0) {
|
||||
a._dimensions = dimensions;
|
||||
}
|
||||
else {
|
||||
// default to single dimension to support Dim myArray() syntax
|
||||
// for convenient hashtable declaration
|
||||
a._dimensions = [{l:1,u:1}];
|
||||
}
|
||||
};
|
||||
}
|
||||
if (dimensions && dimensions.length > 0) {
|
||||
a._dimensions = dimensions;
|
||||
}
|
||||
else {
|
||||
// default to single dimension to support Dim myArray() syntax
|
||||
// for convenient hashtable declaration
|
||||
a._dimensions = [{l:1,u:1}];
|
||||
}
|
||||
};
|
||||
|
||||
this.arrayValue = function(a, indexes) {
|
||||
var value = a;
|
||||
|
@ -1194,9 +1198,13 @@ var QB = new function() {
|
|||
_strokeDrawColor = _color(color);
|
||||
};
|
||||
|
||||
this.sub__Label = function(t) {
|
||||
_dataLabelMap.set(t, _dataBulk.length);
|
||||
};
|
||||
|
||||
this.sub_Line = function(sstep, sx, sy, estep, ex, ey, color, style, pattern) {
|
||||
var screen = _images[_activeImage];
|
||||
var ctx = screen.ctx;
|
||||
//var ctx = screen.ctx;
|
||||
_images[_activeImage].dirty = true;
|
||||
|
||||
if (color == undefined) {
|
||||
|
@ -1246,27 +1254,99 @@ var QB = new function() {
|
|||
screen.lastX = ex;
|
||||
screen.lastY = ey;
|
||||
|
||||
ctx.lineWidth = _strokeLineThickness;
|
||||
if (style == "B") {
|
||||
ctx.strokeStyle = color.rgba();
|
||||
ctx.beginPath();
|
||||
ctx.strokeRect(sx, sy, ex-sx, ey-sy)
|
||||
}
|
||||
else if (style == "BF") {
|
||||
if (pattern != undefined) {
|
||||
if (typeof pattern == "number") {
|
||||
var value = pattern;
|
||||
//ptn = ("0000000000000000" + (value >>> 0).toString(2)).slice(-16);
|
||||
}
|
||||
}
|
||||
|
||||
if (pattern == undefined) {
|
||||
var ctx = screen.ctx;
|
||||
ctx.lineWidth = _strokeLineThickness;
|
||||
if (style == "B") {
|
||||
ctx.strokeStyle = color.rgba();
|
||||
ctx.beginPath();
|
||||
ctx.strokeRect(sx, sy, ex-sx, ey-sy);
|
||||
}
|
||||
else if (style == "BF") {
|
||||
ctx.fillStyle = color.rgba();
|
||||
ctx.beginPath();
|
||||
ctx.fillRect(sx, sy, ex-sx, ey-sy);
|
||||
}
|
||||
else {
|
||||
ctx.strokeStyle = color.rgba();
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(sx, sy);
|
||||
ctx.lineTo(ex, ey);
|
||||
ctx.stroke();
|
||||
}
|
||||
} else { // Stylized line.
|
||||
var ctx = screen.ctx;
|
||||
ctx.lineWidth = _strokeLineThickness;
|
||||
ctx.fillStyle = color.rgba();
|
||||
ctx.beginPath();
|
||||
ctx.fillRect(sx, sy, ex-sx, ey-sy)
|
||||
}
|
||||
else {
|
||||
ctx.strokeStyle = color.rgba();
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(sx, sy);
|
||||
ctx.lineTo(ex, ey);
|
||||
ctx.stroke();
|
||||
var nullDummy;
|
||||
if (style == "B") {
|
||||
nullDummy = lineStyle(sx, sy, ex, sy, value);
|
||||
nullDummy = lineStyle(ex, sy, ex, ey, value);
|
||||
nullDummy = lineStyle(ex, ey, sx, ey, value);
|
||||
nullDummy = lineStyle(sx, ey, sx, sy, value);
|
||||
} else {
|
||||
nullDummy = lineStyle(sx, sy, ex, ey, value);
|
||||
}
|
||||
}
|
||||
|
||||
_strokeDrawColor = _color(color);
|
||||
};
|
||||
|
||||
function bitTread(num, cnt) { // Bitwise treadmill left.
|
||||
var val = (num << cnt) | (num >>> (32 - cnt));
|
||||
return (val | (~~bitTest(num, 15))<<0);
|
||||
}
|
||||
|
||||
function bitTest(num, bit) { // true or false
|
||||
return ((num>>bit) % 2 != 0)
|
||||
}
|
||||
|
||||
function lineStyle(x1, y1, x2, y2, sty) {
|
||||
var screen = _images[_activeImage];
|
||||
var ctx = screen.ctx;
|
||||
var lx = Math.abs(x2 - x1);
|
||||
var ly = Math.abs(y2 - y1);
|
||||
var xtmp = x1;
|
||||
var ytmp = y1;
|
||||
var ptn = sty;
|
||||
var slope;
|
||||
var mi;
|
||||
if (lx > ly) {
|
||||
var y1f = y1;
|
||||
if (lx) { slope = (y1 - y2) / lx; }
|
||||
if (x1 < x2) { mi = 1; } else { mi = -1; }
|
||||
lx += 1;
|
||||
while (lx -= 1) {
|
||||
if (y1f < 0) {ytmp = y1f - 0.5; } else { ytmp = y1f + 0.5; }
|
||||
ptn = bitTread(ptn, 1);
|
||||
if (bitTest(ptn, 0) == true) { ctx.fillRect(xtmp, ytmp, 1, 1); }
|
||||
xtmp += mi;
|
||||
y1f -= slope;
|
||||
}
|
||||
} else {
|
||||
var x1f = x1;
|
||||
if (ly) { slope = (x1 - x2) / ly; }
|
||||
if (y1 < y2) { mi = 1; } else { mi = -1; }
|
||||
ly += 1;
|
||||
while (ly -= 1) {
|
||||
if (x1f < 0) {xtmp = x1f - 0.5; } else { xtmp = x1f + 0.5; }
|
||||
ptn = bitTread(ptn, 1);
|
||||
if (bitTest(ptn, 0) == true) { ctx.fillRect(xtmp, ytmp, 1, 1); }
|
||||
ytmp += mi;
|
||||
x1f += slope;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
this.sub_LineInput = async function(values, preventNewline, addQuestionPrompt, prompt) {
|
||||
await QB.sub_Input(values, preventNewline, addQuestionPrompt, prompt);
|
||||
}
|
||||
|
@ -1588,6 +1668,29 @@ var QB = new function() {
|
|||
_strokeDrawColor = _color(color);
|
||||
};
|
||||
|
||||
this.sub_Data = function(dat) {
|
||||
if (_dataBulk.length == 0) {
|
||||
_dataBulk = dat;
|
||||
} else {
|
||||
_dataBulk.push.apply(_dataBulk, dat);
|
||||
}
|
||||
};
|
||||
|
||||
this.sub_Read = function(values) {
|
||||
for (var i=0; i < values.length; i++) {
|
||||
values[i] = _dataBulk[_readCursorPosition];
|
||||
_readCursorPosition += 1;
|
||||
}
|
||||
}
|
||||
|
||||
this.sub_Restore = function(t) {
|
||||
if (t == undefined) {
|
||||
_readCursorPosition = 0;
|
||||
} else {
|
||||
_readCursorPosition = (1.0)*_dataLabelMap.get(t);
|
||||
}
|
||||
};
|
||||
|
||||
this.func_Right = function(value, n) {
|
||||
if (value == undefined) {
|
||||
return "";
|
||||
|
@ -1600,9 +1703,40 @@ var QB = new function() {
|
|||
return String(value).trimEnd();
|
||||
}
|
||||
|
||||
this.sub_Randomize = function(using, n) {
|
||||
const buffer = new ArrayBuffer(8);
|
||||
const view = new DataView(buffer);
|
||||
var m;
|
||||
if (n == undefined) { // TODO: implement user prompt case
|
||||
view.setFloat64(0, 0, false); // assumes n=0 for now
|
||||
m = view.getUint32(0);
|
||||
m ^= (m >> 16);
|
||||
_rndSeed = ((m & 0xffff)<<8) | (_rndSeed & 0xff);
|
||||
} else {
|
||||
view.setFloat64(0, n, false);
|
||||
m = view.getUint32(0);
|
||||
m ^= (m >> 16);
|
||||
if (using == false) {
|
||||
_rndSeed = ((m & 0xffff)<<8) | (_rndSeed & 0xff);
|
||||
} else if (using == true) {
|
||||
_rndSeed = ((m & 0xffff)<<8) | (327680 & 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.func_Rnd = function(n) {
|
||||
// TODO: implement modifier parameter
|
||||
return Math.random();
|
||||
if (n == undefined) {n = 1;}
|
||||
if (n != 0) {
|
||||
if (n < 0) {
|
||||
const buffer = new ArrayBuffer(8);
|
||||
const view = new DataView(buffer);
|
||||
view.setFloat32(0, n, false);
|
||||
var m = view.getUint32(0);
|
||||
_rndSeed = (m & 0xFFFFFF) + ((m & 0xFF000000) >>> 24);
|
||||
}
|
||||
_rndSeed = (_rndSeed * 16598013 + 12820163) & 0xFFFFFF;
|
||||
}
|
||||
return _rndSeed / 0x1000000;
|
||||
}
|
||||
|
||||
this.sub_Screen = async function(mode) {
|
||||
|
@ -1647,7 +1781,6 @@ var QB = new function() {
|
|||
_images[0] = { canvas: GX.canvas(), ctx: GX.ctx(), lastX: 0, lastY: 0};
|
||||
_images[0].lastX = _images[0].canvas.width/2;
|
||||
_images[0].lastY = _images[0].canvas.height/2;
|
||||
//_images[0].lineWidth = _strokeLineThickness; // this line does nothing
|
||||
|
||||
// initialize the graphics
|
||||
_fgColor = _color(7);
|
||||
|
@ -1666,6 +1799,8 @@ var QB = new function() {
|
|||
_keyHitBuffer = [];
|
||||
_keyDownMap = {};
|
||||
|
||||
_readCursorPosition = 0;
|
||||
|
||||
};
|
||||
|
||||
this.func_Sgn = function(value) {
|
||||
|
|
111
qb2js.js
111
qb2js.js
|
@ -27,6 +27,8 @@ async function _QBCompiler() {
|
|||
var currentMethod = ''; // STRING
|
||||
var currentModule = ''; // STRING
|
||||
var programMethods = 0; // INTEGER
|
||||
var dataTicker = 0; // INTEGER
|
||||
dataTicker = 1;
|
||||
if (QB.func_Command() != "" ) {
|
||||
await sub_QBToJS( QB.func_Command(), FILE, "");
|
||||
await sub_PrintJS();
|
||||
|
@ -503,22 +505,28 @@ var ConvertSub = null;
|
|||
}
|
||||
if ( m.name == "Line" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertLine( args)) +");";
|
||||
} else if ( m.name == "PSet" || m.name == "Circle" || m.name == "PReset" || m.name == "Paint" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPSet( args)) +");";
|
||||
} else if ( m.name == "_PrintString" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrintString( args)) +");";
|
||||
} else if ( m.name == "Print" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrint( args)) +");";
|
||||
} else if ( m.name == "Input" || m.name == "Line Input" ) {
|
||||
js = (await func_ConvertInput( m, args));
|
||||
} else if ( m.name == "Swap" ) {
|
||||
js = (await func_ConvertSwap( m, args));
|
||||
} else if ( m.name == "Cls" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertCls( args)) +");";
|
||||
} else if ( m.name == "_PutImage" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPutImage( args)) +");";
|
||||
} else if ( m.name == "Data" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertData( args)) +");";
|
||||
} else if ( m.name == "Input" || m.name == "Line Input" ) {
|
||||
js = (await func_ConvertInput( m, args));
|
||||
} else if ( m.name == "PSet" || m.name == "Circle" || m.name == "PReset" || m.name == "Paint" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPSet( args)) +");";
|
||||
} else if ( m.name == "Print" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrint( args)) +");";
|
||||
} else if ( m.name == "Randomize" ) {
|
||||
js = (await func_ConvertRandomize( m, args));
|
||||
} else if ( m.name == "Read" ) {
|
||||
js = (await func_ConvertRead( m, args));
|
||||
} else if ( m.name == "Swap" ) {
|
||||
js = (await func_ConvertSwap( m, args));
|
||||
} else if ( m.name == "Window" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertWindow( args)) +");";
|
||||
} else if ( m.name == "_PrintString" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrintString( args)) +");";
|
||||
} else if ( m.name == "_PutImage" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPutImage( args)) +");";
|
||||
} else if ( m.name == "_FullScreen" ) {
|
||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertFullScreen( args)) +");";
|
||||
} else {
|
||||
|
@ -609,6 +617,8 @@ var ConvertLine = null;
|
|||
theRest = (await func_Replace( theRest, " Bf", " " +(QB.func_Chr( 34)) +"BF" +(QB.func_Chr( 34))));
|
||||
theRest = (await func_Replace( theRest, " B", " " +(QB.func_Chr( 34)) +"B" +(QB.func_Chr( 34))));
|
||||
theRest = (await func_Replace( theRest, " b", " " +(QB.func_Chr( 34)) +"B" +(QB.func_Chr( 34))));
|
||||
theRest = (await func_Replace( theRest, " T", " " +(QB.func_Chr( 34)) +"T" +(QB.func_Chr( 34))));
|
||||
theRest = (await func_Replace( theRest, " t", " " +(QB.func_Chr( 34)) +"T" +(QB.func_Chr( 34))));
|
||||
ConvertLine = sstep +", " + startCord +", " + estep +", " + endCord +", " + theRest;
|
||||
return ConvertLine;
|
||||
}
|
||||
|
@ -727,6 +737,78 @@ var bgcolor = ''; // STRING
|
|||
ConvertCls = method +", " + bgcolor;
|
||||
return ConvertCls;
|
||||
}
|
||||
async function func_ConvertData(args/*STRING*/) {
|
||||
if (QB.halted()) { return; }
|
||||
var ConvertData = null;
|
||||
var argc = 0; // INTEGER
|
||||
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
|
||||
argc = (await func_ListSplit( args, parts));
|
||||
var i = 0; // INTEGER
|
||||
var r = ''; // STRING
|
||||
var q = ''; // STRING
|
||||
r = "[";
|
||||
for ( i= 1; i <= argc; i= i + 1) { if (QB.halted()) { return; }
|
||||
q = QB.arrayValue(parts, [ i]).value;
|
||||
if (((QB.func_Left( (QB.func_LTrim( q)), 1)) != (QB.func_Chr( 34))) ) {
|
||||
q = (QB.func_Chr( 34)) + q;
|
||||
}
|
||||
if (((QB.func_Right( (QB.func_RTrim( q)), 1)) != (QB.func_Chr( 34))) ) {
|
||||
q = q +(QB.func_Chr( 34));
|
||||
}
|
||||
r = r + q;
|
||||
if (( i < argc) ) {
|
||||
r = r +",";
|
||||
}
|
||||
}
|
||||
ConvertData = r +"]";
|
||||
return ConvertData;
|
||||
}
|
||||
async function func_ConvertRandomize(m/*METHOD*/,args/*STRING*/) {
|
||||
if (QB.halted()) { return; }
|
||||
var ConvertRandomize = null;
|
||||
var uusing = ''; // STRING
|
||||
var theseed = ''; // STRING
|
||||
uusing = "false";
|
||||
theseed = args;
|
||||
if ((QB.func__Trim( args)) == "" ) {
|
||||
theseed = "undefined";
|
||||
} else {
|
||||
if (((QB.func_UCase( (QB.func__Trim( (QB.func_Left( args, 5)))))) == "USING") ) {
|
||||
uusing = "true";
|
||||
theseed = (QB.func__Trim( (QB.func_Right( args, (QB.func_Len( args)) - 5))));
|
||||
theseed = (await func_ConvertExpression( theseed));
|
||||
}
|
||||
}
|
||||
ConvertRandomize = (await func_CallMethod( m)) +"(" + uusing +", " + theseed +")";
|
||||
return ConvertRandomize;
|
||||
}
|
||||
async function func_ConvertRead(m/*METHOD*/,args/*STRING*/) {
|
||||
if (QB.halted()) { return; }
|
||||
var ConvertRead = null;
|
||||
var js = ''; // STRING
|
||||
var vname = ''; // STRING
|
||||
var pcount = 0; // INTEGER
|
||||
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
|
||||
var vars = QB.initArray([{l:1,u:0}], ''); // STRING
|
||||
var vcount = 0; // INTEGER
|
||||
var p = ''; // STRING
|
||||
pcount = (await func_ListSplit( args, parts));
|
||||
var i = 0; // INTEGER
|
||||
for ( i= 1; i <= pcount; i= i + 1) { if (QB.halted()) { return; }
|
||||
p = (QB.func__Trim( QB.arrayValue(parts, [ i]).value));
|
||||
vcount = (QB.func_UBound( vars)) + 1;
|
||||
QB.resizeArray(vars, [{l:1,u:vcount}], '', true); // STRING
|
||||
QB.arrayValue(vars, [ vcount]).value = p;
|
||||
}
|
||||
vname = await func_GenJSVar();
|
||||
js = "var " + vname +" = new Array(" +(QB.func_Str( (QB.func_UBound( vars)))) +");" +await func_LF();
|
||||
js = js +(await func_CallMethod( m)) +"(" + vname +");" +await func_LF();
|
||||
for ( i= 1; i <= (QB.func_UBound( vars)); i= i + 1) { if (QB.halted()) { return; }
|
||||
js = js +(await func_ConvertExpression( QB.arrayValue(vars, [ i]).value)) +" = " + vname +"[" +(QB.func_Str( i - 1)) +"];" +await func_LF();
|
||||
}
|
||||
ConvertRead = js;
|
||||
return ConvertRead;
|
||||
}
|
||||
async function func_ConvertCoordParam(param/*STRING*/,hasEndCoord/*INTEGER*/) {
|
||||
if (QB.halted()) { return; }
|
||||
var ConvertCoordParam = null;
|
||||
|
@ -2734,6 +2816,7 @@ if (QB.halted()) { return; }
|
|||
await sub_AddQBMethod( "FUNCTION", "Csrlin", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "Cvi", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "Cvl", False);
|
||||
await sub_AddQBMethod( "SUB", "Data", False);
|
||||
await sub_AddQBMethod( "SUB", "Draw", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "Exp", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "Fix", False);
|
||||
|
@ -2760,8 +2843,11 @@ if (QB.halted()) { return; }
|
|||
await sub_AddQBMethod( "SUB", "PReset", False);
|
||||
await sub_AddQBMethod( "SUB", "Print", True);
|
||||
await sub_AddQBMethod( "SUB", "PSet", False);
|
||||
await sub_AddQBMethod( "SUB", "Randomize", False);
|
||||
await sub_AddQBMethod( "SUB", "Restore", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "Right$", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "RTrim$", False);
|
||||
await sub_AddQBMethod( "SUB", "Read", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "Rnd", False);
|
||||
await sub_AddQBMethod( "SUB", "Screen", False);
|
||||
await sub_AddQBMethod( "FUNCTION", "Sgn", False);
|
||||
|
@ -2781,6 +2867,7 @@ if (QB.halted()) { return; }
|
|||
await sub_AddQBMethod( "FUNCTION", "Varptr", False);
|
||||
await sub_AddQBMethod( "SUB", "Window", False);
|
||||
await sub_AddQBMethod( "SUB", "IncludeJS", True);
|
||||
await sub_AddQBMethod( "SUB", "_Label", False);
|
||||
await sub_AddSystemType( "FETCHRESPONSE", "ok:INTEGER,status:INTEGER,statusText:STRING,text:STRING");
|
||||
await sub_AddQBMethod( "FUNCTION", "Fetch", True);
|
||||
await sub_AddQBMethod( "SUB", "Fetch", True);
|
||||
|
|
154
tools/qb2js.bas
154
tools/qb2js.bas
|
@ -61,6 +61,8 @@ Dim Shared modLevel As Integer
|
|||
Dim Shared As String currentMethod
|
||||
Dim Shared As String currentModule
|
||||
Dim Shared As Integer programMethods
|
||||
Dim Shared As Integer dataTicker
|
||||
dataTicker = 1
|
||||
|
||||
' Only execute the conversion from the native version if we have been passed the
|
||||
' source file to convert on the command line
|
||||
|
@ -589,30 +591,39 @@ Function ConvertSub$ (m As Method, args As String)
|
|||
If m.name = "Line" Then
|
||||
js = CallMethod(m) + "(" + ConvertLine(args) + ");"
|
||||
|
||||
ElseIf m.name = "PSet" Or m.name = "Circle" Or m.name = "PReset" Or m.name = "Paint" Then
|
||||
js = CallMethod(m) + "(" + ConvertPSet(args) + ");"
|
||||
ElseIf m.name = "Cls" Then
|
||||
js = CallMethod(m) + "(" + ConvertCls(args) + ");"
|
||||
|
||||
ElseIf m.name = "_PrintString" Then
|
||||
js = CallMethod(m) + "(" + ConvertPrintString(args) + ");"
|
||||
|
||||
ElseIf m.name = "Print" Then
|
||||
js = CallMethod(m) + "(" + ConvertPrint(args) + ");"
|
||||
ElseIf m.name = "Data" Then
|
||||
js = CallMethod(m) + "(" + ConvertData(args) + ");"
|
||||
|
||||
ElseIf m.name = "Input" Or m.name = "Line Input" Then
|
||||
js = ConvertInput(m, args)
|
||||
|
||||
ElseIf m.name = "PSet" Or m.name = "Circle" Or m.name = "PReset" Or m.name = "Paint" Then
|
||||
js = CallMethod(m) + "(" + ConvertPSet(args) + ");"
|
||||
|
||||
ElseIf m.name = "Print" Then
|
||||
js = CallMethod(m) + "(" + ConvertPrint(args) + ");"
|
||||
|
||||
ElseIf m.name = "Randomize" Then
|
||||
js = ConvertRandomize(m, args)
|
||||
|
||||
ElseIf m.name = "Read" Then
|
||||
js = ConvertRead(m, args)
|
||||
|
||||
ElseIf m.name = "Swap" Then
|
||||
js = ConvertSwap(m, args)
|
||||
|
||||
ElseIf m.name = "Cls" Then
|
||||
js = CallMethod(m) + "(" + ConvertCls(args) + ");"
|
||||
ElseIf m.name = "Window" Then
|
||||
js = CallMethod(m) + "(" + ConvertWindow(args) + ");"
|
||||
|
||||
ElseIf m.name = "_PrintString" Then
|
||||
js = CallMethod(m) + "(" + ConvertPrintString(args) + ");"
|
||||
|
||||
ElseIf m.name = "_PutImage" Then
|
||||
js = CallMethod(m) + "(" + ConvertPutImage(args) + ");"
|
||||
|
||||
ElseIf m.name = "Window" Then
|
||||
js = CallMethod(m) + "(" + ConvertWindow(args) + ");"
|
||||
|
||||
ElseIf m.name = "_FullScreen" Then
|
||||
js = CallMethod(m) + "(" + ConvertFullScreen(args) + ");"
|
||||
Else
|
||||
|
@ -705,6 +716,8 @@ Function ConvertLine$ (args As String)
|
|||
theRest = Replace(theRest, " Bf", " " + Chr$(34) + "BF" + Chr$(34))
|
||||
theRest = Replace(theRest, " B", " " + Chr$(34) + "B" + Chr$(34))
|
||||
theRest = Replace(theRest, " b", " " + Chr$(34) + "B" + Chr$(34))
|
||||
theRest = Replace(theRest, " T", " " + Chr$(34) + "T" + Chr$(34))
|
||||
theRest = Replace(theRest, " t", " " + Chr$(34) + "T" + Chr$(34))
|
||||
|
||||
ConvertLine = sstep + ", " + startCord + ", " + estep + ", " + endCord + ", " + theRest
|
||||
End Function
|
||||
|
@ -810,6 +823,66 @@ Function ConvertCls$ (args As String)
|
|||
ConvertCls$ = method + ", " + bgcolor
|
||||
End Function
|
||||
|
||||
Function ConvertData$ (args As String)
|
||||
Dim argc As Integer
|
||||
ReDim parts(0) As String
|
||||
argc = ListSplit(args, parts())
|
||||
Dim i As Integer
|
||||
Dim r As String
|
||||
Dim q As String
|
||||
r = "["
|
||||
For i = 1 To argc
|
||||
q = parts(i)
|
||||
If (Left$(LTrim$(q), 1) <> Chr$(34)) Then q = Chr$(34) + q
|
||||
If (Right$(RTrim$(q), 1) <> Chr$(34)) Then q = q + Chr$(34)
|
||||
r = r + q
|
||||
If (i < argc) Then r = r + ","
|
||||
Next
|
||||
ConvertData$ = r + "]"
|
||||
End Function
|
||||
|
||||
Function ConvertRandomize$ (m As Method, args As String)
|
||||
Dim uusing As String
|
||||
Dim theseed As String
|
||||
uusing = "false"
|
||||
theseed = args
|
||||
If _Trim$(args) = "" Then
|
||||
theseed = "undefined"
|
||||
Else
|
||||
If (UCase$(_Trim$(Left$(args, 5))) = "USING") Then
|
||||
uusing = "true"
|
||||
theseed = _Trim$(Right$(args, Len(args) - 5))
|
||||
theseed = ConvertExpression(theseed)
|
||||
End If
|
||||
End If
|
||||
ConvertRandomize = CallMethod(m) + "(" + uusing + ", " + theseed + ")"
|
||||
End Function
|
||||
|
||||
Function ConvertRead$ (m As Method, args As String)
|
||||
Dim js As String
|
||||
Dim vname As String
|
||||
Dim pcount As Integer
|
||||
ReDim parts(0) As String
|
||||
ReDim vars(0) As String
|
||||
Dim vcount As Integer
|
||||
Dim p As String
|
||||
pcount = ListSplit(args, parts())
|
||||
Dim i As Integer
|
||||
For i = 1 To pcount
|
||||
p = _Trim$(parts(i))
|
||||
vcount = UBound(vars) + 1
|
||||
ReDim _Preserve As String vars(vcount)
|
||||
vars(vcount) = p
|
||||
Next i
|
||||
vname = GenJSVar
|
||||
js = "var " + vname + " = new Array(" + Str$(UBound(vars)) + ");" + LF
|
||||
js = js + CallMethod(m) + "(" + vname + ");" + LF
|
||||
For i = 1 To UBound(vars)
|
||||
js = js + ConvertExpression(vars(i)) + " = " + vname + "[" + Str$(i - 1) + "];" + LF
|
||||
Next i
|
||||
ConvertRead$ = js
|
||||
End Function
|
||||
|
||||
Function ConvertCoordParam$ (param As String, hasEndCoord As Integer)
|
||||
If _Trim$(param) = "" Then
|
||||
If hasEndCoord Then
|
||||
|
@ -964,7 +1037,6 @@ Function ConvertInput$ (m As Method, args As String)
|
|||
preventNewline = "true"
|
||||
Else
|
||||
addQuestionPrompt = "true"
|
||||
|
||||
End If
|
||||
ElseIf StartsWith(p, Chr$(34)) Then
|
||||
prompt = p
|
||||
|
@ -986,7 +1058,6 @@ Function ConvertInput$ (m As Method, args As String)
|
|||
ConvertInput = js
|
||||
End Function
|
||||
|
||||
|
||||
Function ConvertSwap$ (m As Method, args As String)
|
||||
Dim js As String
|
||||
Dim swapArray As String: swapArray = GenJSVar
|
||||
|
@ -1641,8 +1712,20 @@ Function ReadLine (lineIndex As Integer, fline As String, rawJS As Integer)
|
|||
|
||||
ReadLine = rawJS
|
||||
|
||||
If _Trim$(fline) = "" Then Exit Function
|
||||
'If (_Trim$(LCase$(Left$(fline, 4))) = "data") Then
|
||||
' 'AddLineTop dataTicker, fline
|
||||
' 'AddSubLinesTop dataTicker, fline
|
||||
' AddLine dataTicker, fline
|
||||
' AddSubLines dataTicker, fline
|
||||
' Exit Function
|
||||
'End If
|
||||
'If (_Trim$(LCase$(Left$(fline, 6))) = "_label") Then
|
||||
' 'AddLineTop dataTicker, fline
|
||||
' AddLine dataTicker, fline
|
||||
' Exit Function
|
||||
'End If
|
||||
|
||||
If _Trim$(fline) = "" Then Exit Function
|
||||
|
||||
Dim word As String
|
||||
Dim words(0) As String
|
||||
|
@ -1722,6 +1805,29 @@ Sub AddSubLines (lineIndex As Integer, fline As String)
|
|||
AddLine lineIndex, fline
|
||||
End Sub
|
||||
|
||||
'Sub AddSubLinesTop (lineIndex As Integer, fline As String)
|
||||
' Dim quoteDepth As Integer
|
||||
' quoteDepth = 0
|
||||
' Dim i As Integer
|
||||
' For i = 1 To Len(fline)
|
||||
' Dim c As String
|
||||
' c = Mid$(fline, i, 1)
|
||||
' If c = Chr$(34) Then
|
||||
' If quoteDepth = 0 Then
|
||||
' quoteDepth = 1
|
||||
' Else
|
||||
' quoteDepth = 0
|
||||
' End If
|
||||
' End If
|
||||
' If quoteDepth = 0 And c = ":" Then
|
||||
' AddLineTop lineIndex, Left$(fline, i - 1)
|
||||
' fline = Right$(fline, Len(fline) - i)
|
||||
' i = 0
|
||||
' End If
|
||||
' Next i
|
||||
|
||||
' AddLineTop lineIndex, fline
|
||||
'End Sub
|
||||
|
||||
Sub FindMethods
|
||||
Dim i As Integer
|
||||
|
@ -2167,6 +2273,18 @@ Sub AddQBMethod (mtype As String, mname As String, sync As Integer)
|
|||
AddMethod m, "QB.", sync
|
||||
End Sub
|
||||
|
||||
'Sub AddLineTop (lineIndex As Integer, fline As String)
|
||||
' Dim lcount As Integer: lcount = UBound(lines) + 1
|
||||
' ReDim _Preserve As CodeLine lines(lcount)
|
||||
' Dim j As Integer
|
||||
' For j = UBound(lines) To dataTicker Step -1
|
||||
' lines(j).line = lines(j - 1).line
|
||||
' lines(j).text = lines(j - 1).text
|
||||
' Next
|
||||
' lines(dataTicker).line = dataTicker
|
||||
' lines(dataTicker).text = fline
|
||||
' dataTicker = dataTicker + 1
|
||||
'End Sub
|
||||
|
||||
Sub AddLine (lineIndex As Integer, fline As String)
|
||||
__AddLine lineIndex, fline
|
||||
|
@ -2872,6 +2990,7 @@ Sub InitQBMethods
|
|||
AddQBMethod "FUNCTION", "Csrlin", False
|
||||
AddQBMethod "FUNCTION", "Cvi", False
|
||||
AddQBMethod "FUNCTION", "Cvl", False
|
||||
AddQBMethod "SUB", "Data", False
|
||||
AddQBMethod "SUB", "Draw", False
|
||||
AddQBMethod "FUNCTION", "Exp", False
|
||||
AddQBMethod "FUNCTION", "Fix", False
|
||||
|
@ -2898,8 +3017,11 @@ Sub InitQBMethods
|
|||
AddQBMethod "SUB", "PReset", False
|
||||
AddQBMethod "SUB", "Print", True
|
||||
AddQBMethod "SUB", "PSet", False
|
||||
AddQBMethod "SUB", "Randomize", False
|
||||
AddQBMethod "SUB", "Restore", False
|
||||
AddQBMethod "FUNCTION", "Right$", False
|
||||
AddQBMethod "FUNCTION", "RTrim$", False
|
||||
AddQBMethod "SUB", "Read", False
|
||||
AddQBMethod "FUNCTION", "Rnd", False
|
||||
AddQBMethod "SUB", "Screen", False
|
||||
AddQBMethod "FUNCTION", "Sgn", False
|
||||
|
@ -2919,10 +3041,10 @@ Sub InitQBMethods
|
|||
AddQBMethod "FUNCTION", "Varptr", False
|
||||
AddQBMethod "SUB", "Window", False
|
||||
|
||||
|
||||
' QBJS-only language features
|
||||
' --------------------------------------------------------------------------------
|
||||
AddQBMethod "SUB", "IncludeJS", True
|
||||
AddQBMethod "SUB", "_Label", False
|
||||
|
||||
' Undocumented at present
|
||||
AddSystemType "FETCHRESPONSE", "ok:INTEGER,status:INTEGER,statusText:STRING,text:STRING"
|
||||
|
|
Loading…
Reference in a new issue