1
1
Fork 0
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:
boxgaming 2022-06-07 07:50:06 -05:00 committed by GitHub
commit df3fc5b802
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 409 additions and 65 deletions

View file

@ -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
View file

@ -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
View file

@ -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);

View file

@ -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"