1
1
Fork 0
mirror of https://github.com/boxgaming/qbjs.git synced 2024-09-20 04:24:45 +00:00
qbjs/qb2js.js

2340 lines
98 KiB
JavaScript

async function _QBCompiler() {
// Option _Explicit
// $Console
// Only
const FILE = 1;
const TEXT = 2;
const False = 0;
const True = ! False;
var lines = QB.initArray([{l:1,u:0}], {line:0,text:''}); // CODELINE
var jsLines = QB.initArray([{l:1,u:0}], {line:0,text:''}); // CODELINE
var methods = QB.initArray([{l:1,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}); // METHOD
var types = QB.initArray([{l:1,u:0}], {line:0,name:'',argc:0,args:''}); // QBTYPE
var typeVars = QB.initArray([{l:1,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); // VARIABLE
var globalVars = QB.initArray([{l:1,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); // VARIABLE
var localVars = QB.initArray([{l:1,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); // VARIABLE
var warnings = QB.initArray([{l:1,u:0}], {line:0,text:''}); // CODELINE
var currentMethod = ''; // STRING
var programMethods = 0; // INTEGER
if (QB.func_Command() != "" ) {
await sub_QBToJS(QB.func_Command(), FILE);
await sub_PrintJS();
QB.halt(); return;
}
async function sub_QBToJS(source/*STRING*/,sourceType/*INTEGER*/) {
if (QB.halted()) { return; }
QB.resizeArray(lines, [{l:1,u:0}], {line:0,text:''}, false); // CODELINE
QB.resizeArray(jsLines, [{l:1,u:0}], {line:0,text:''}, false); // CODELINE
QB.resizeArray(methods, [{l:1,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, false); // METHOD
QB.resizeArray(types, [{l:1,u:0}], {line:0,name:'',argc:0,args:''}, false); // QBTYPE
QB.resizeArray(typeVars, [{l:1,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
QB.resizeArray(globalVars, [{l:1,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
QB.resizeArray(localVars, [{l:1,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
QB.resizeArray(warnings, [{l:1,u:0}], {line:0,text:''}, false); // CODELINE
currentMethod = "";
programMethods = 0;
if ( sourceType == FILE) {
await sub_ReadLinesFromFile( source);
} else {
await sub_ReadLinesFromText( source);
}
await sub_FindMethods();
programMethods = (QB.func_UBound( methods));
await sub_InitGX();
await sub_InitQBMethods();
var selfConvert = 0; // INTEGER
var isGX = 0; // INTEGER
isGX = False;
if ( sourceType == FILE) {
selfConvert = (await func_EndsWith( source, "qb2js.bas"));
}
if ( selfConvert) {
await sub_AddJSLine( 0, "async function _QBCompiler() {");
} else if ( sourceType == FILE) {
await sub_AddJSLine( 0, "async function init() {");
}
if (! selfConvert) {
await sub_AddJSLine( 0, "QB.start();");
}
if (! selfConvert) {
var mtest = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; // METHOD
if ((await func_FindMethod("GXOnGameEvent" , mtest, "SUB")) ) {
await sub_AddJSLine( 0, " await GX.registerGameEvents(sub_GXOnGameEvent);");
isGX = True;
} else {
await sub_AddJSLine( 0, " await GX.registerGameEvents(function(e){});");
await sub_AddJSLine( 0, " QB.sub_Screen(0);");
}
}
await sub_AddJSLine( 0, "");
await sub_ConvertLines( 1, await func_MainEnd(), "");
if (! selfConvert && ! isGX) {
await sub_AddJSLine( 0, "QB.end();");
}
await sub_ConvertMethods();
if ( selfConvert) {
await sub_AddJSLine( 0, "this.compile = async function(src) {");
await sub_AddJSLine( 0, " await sub_QBToJS(src, TEXT);");
await sub_AddJSLine( 0, " var js = '';");
await sub_AddJSLine( 0, " for (var i=1; i<= QB.func_UBound(jsLines); i++) {");
await sub_AddJSLine( 0, " js += QB.arrayValue(jsLines, [i]).value.text + '\\n';");
await sub_AddJSLine( 0, " }");
await sub_AddJSLine( 0, " return js;");
await sub_AddJSLine( 0, "};");
await sub_AddJSLine( 0, "this.getWarnings = function() {");
await sub_AddJSLine( 0, " var w = [];");
await sub_AddJSLine( 0, " for (var i=1; i <= QB.func_UBound(warnings); i++) {");
await sub_AddJSLine( 0, " w.push({");
await sub_AddJSLine( 0, " line: QB.arrayValue(warnings, [i]).value.line,");
await sub_AddJSLine( 0, " text: QB.arrayValue(warnings, [i]).value.text");
await sub_AddJSLine( 0, " });");
await sub_AddJSLine( 0, " }");
await sub_AddJSLine( 0, " return w;");
await sub_AddJSLine( 0, "};");
await sub_AddJSLine( 0, "return this;");
await sub_AddJSLine( 0, "}");
} else if ( sourceType == FILE) {
await sub_AddJSLine( 0, "};");
}
}
async function sub_PrintJS() {
if (QB.halted()) { return; }
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( jsLines)); i= i + 1) { if (QB.halted()) { return; }
await QB.sub_Print([QB.arrayValue(jsLines, [ i]).value .text]);
}
}
async function sub_ConvertLines(firstLine/*INTEGER*/,lastLine/*INTEGER*/,functionName/*STRING*/) {
if (QB.halted()) { return; }
var typeMode = 0; // INTEGER
typeMode = False;
var jsMode = 0; // INTEGER
jsMode = False;
var i = 0; // INTEGER
var indent = 0; // INTEGER
var tempIndent = 0; // INTEGER
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; // METHOD
var totalIndent = 0; // INTEGER
totalIndent = 1;
var caseCount = 0; // INTEGER
var loopMode = QB.initArray([{l:1,u:100}], 0); // INTEGER
var loopLevel = 0; // INTEGER
var caseVar = ''; // STRING
var currType = 0; // INTEGER
for ( i= firstLine; i <= lastLine; i= i + 1) { if (QB.halted()) { return; }
indent = 0;
tempIndent = 0;
var l = ''; // STRING
l = (QB.func__Trim(QB.arrayValue(lines, [ i]).value .text));
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
var c = 0; // INTEGER
c = (await func_SLSplit( l, parts));
var js = ''; // STRING
js = "";
var first = ''; // STRING
first = (QB.func_UCase(QB.arrayValue(parts, [ 1]).value));
if ( jsMode == True) {
if ( first == "$END" ) {
jsMode = False;
await sub_AddJSLine( 0, "//-------- END JS native code block --------");
} else {
await sub_AddJSLine( i, QB.arrayValue(lines, [ i]).value .text);
}
} else if ( typeMode == True) {
if ( first == "END" ) {
var second = ''; // STRING
second = (QB.func_UCase(QB.arrayValue(parts, [ 2]).value));
if ( second == "TYPE" ) {
typeMode = False;
}
} else {
var tvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
tvar.typeId = currType;
tvar.name = QB.arrayValue(parts, [ 1]).value;
tvar.type = (QB.func_UCase(QB.arrayValue(parts, [ 3]).value));
if ( tvar.type == "_UNSIGNED" ) {
tvar.type = tvar.type +" " +(QB.func_UCase(QB.arrayValue(parts, [ 4]).value));
}
await sub_AddVariable( tvar, typeVars);
}
} else {
if ( first == "CONST" ) {
js = "const " +QB.arrayValue(parts, [ 2]).value +" = " +(await func_ConvertExpression((await func_Join(parts , 4, -1, " ")))) +";";
await sub_AddConst(QB.arrayValue(parts, [ 2]).value);
} else if ( first == "DIM" || first == "REDIM" || first == "STATIC" ) {
js = (await func_DeclareVar(parts));
} else if ( first == "SELECT" ) {
caseVar = await func_GenJSVar();
js = "var " + caseVar +" = " +(await func_ConvertExpression((await func_Join(parts , 3, -1, " ")))) +";" + GX.CRLF;
js = js +"switch (" + caseVar +") {";
indent = 1;
caseCount = 0;
} else if ( first == "CASE" ) {
if ( caseCount > 0) {
js = "break;" + GX.LF;
}
if ((QB.func_UCase(QB.arrayValue(parts, [ 2]).value)) == "ELSE" ) {
js = js +"default:";
} else if ((QB.func_UCase(QB.arrayValue(parts, [ 2]).value)) == "IS" ) {
js = js +"case " + caseVar +" " +(await func_ConvertExpression((await func_Join(parts , 3, -1, " ")))) +":";
} else {
var caseParts = QB.initArray([{l:1,u:0}], ''); // STRING
var cscount = 0; // INTEGER
cscount = (await func_ListSplit((await func_Join(parts , 2, -1, " ")) , caseParts));
var ci = 0; // INTEGER
for ( ci= 1; ci <= cscount; ci= ci + 1) { if (QB.halted()) { return; }
if ( ci > 1) {
js = js + GX.CRLF;
}
js = js +"case " +(await func_ConvertExpression(QB.arrayValue(caseParts, [ ci]).value)) +":";
}
}
caseCount = caseCount + 1;
} else if ( first == "FOR" ) {
var fstep = ''; // STRING
fstep = "1";
var eqIdx = 0; // INTEGER
var toIdx = 0; // INTEGER
var stepIdx = 0; // INTEGER
var fcond = ''; // STRING
fcond = " <= ";
stepIdx = 0;
var fi = 0; // INTEGER
for ( fi= 2; fi <= (QB.func_UBound( parts)); fi= fi + 1) { if (QB.halted()) { return; }
var fword = ''; // STRING
fword = (QB.func_UCase(QB.arrayValue(parts, [ fi]).value));
if ( fword == "=" ) {
eqIdx = fi;
} else if ( fword == "TO" ) {
toIdx = fi;
} else if ( fword == "STEP" ) {
stepIdx = fi;
fstep = (await func_ConvertExpression((await func_Join(parts , fi + 1, -1, " "))));
}
}
var fvar = ''; // STRING
fvar = (await func_ConvertExpression((await func_Join(parts , 2, eqIdx - 1, " "))));
var sval = ''; // STRING
sval = (await func_ConvertExpression((await func_Join(parts , eqIdx + 1, toIdx - 1, " "))));
var uval = ''; // STRING
uval = (await func_ConvertExpression((await func_Join(parts , toIdx + 1, stepIdx - 1, " "))));
if ((QB.func_Left((QB.func__Trim( fstep)) , 1)) == "-" ) {
fcond = " >= ";
}
js = "for (" + fvar +"=" + sval +"; " + fvar + fcond + uval +"; " + fvar +"=" + fvar +" + " + fstep +") {";
js = js +" if (QB.halted()) { return; }";
indent = 1;
} else if ( first == "IF" ) {
var thenIndex = 0; // INTEGER
for ( thenIndex= 2; thenIndex <= (QB.func_UBound( parts)); thenIndex= thenIndex + 1) { if (QB.halted()) { return; }
if ((QB.func_UCase(QB.arrayValue(parts, [ thenIndex]).value)) == "THEN" ) {
break;
}
}
js = "if (" +(await func_ConvertExpression((await func_Join(parts , 2, thenIndex - 1, " ")))) +") {";
indent = 1;
} else if ( first == "ELSEIF" ) {
js = "} else if (" +(await func_ConvertExpression((await func_Join(parts , 2, (QB.func_UBound( parts)) - 1, " ")))) +") {";
tempIndent = -1;
} else if ( first == "ELSE" ) {
js = "} else {";
tempIndent = -1;
} else if ( first == "NEXT" ) {
js = js +"}";
indent = -1;
} else if ( first == "END" ) {
if ((QB.func_UBound( parts)) == 1) {
js = "QB.halt(); return;";
} else {
if ((QB.func_UCase(QB.arrayValue(parts, [ 2]).value)) == "SELECT" ) {
js = "break;";
}
js = js +"}";
indent = -1;
}
} else if ( first == "SYSTEM" ) {
js = "QB.halt(); return;";
} else if ( first == "$IF" ) {
if ((QB.func_UBound( parts)) == 2) {
if ((QB.func_UCase(QB.arrayValue(parts, [ 2]).value)) == "JS" || (QB.func_UCase(QB.arrayValue(parts, [ 2]).value)) == "JAVASCRIPT" ) {
jsMode = True;
js = "//-------- BEGIN JS native code block --------";
}
}
} else if ( first == "DO" ) {
loopLevel = loopLevel + 1;
if ((QB.func_UBound( parts)) > 1) {
if ((QB.func_UCase(QB.arrayValue(parts, [ 2]).value)) == "WHILE" ) {
js = "while (" +(await func_ConvertExpression((await func_Join(parts , 3, -1, " ")))) +") {";
} else {
js = "while (!(" +(await func_ConvertExpression((await func_Join(parts , 3, -1, " ")))) +")) {";
}
QB.arrayValue(loopMode, [ loopLevel]).value = 1;
} else {
js = "do {";
QB.arrayValue(loopMode, [ loopLevel]).value = 2;
}
indent = 1;
js = js +" if (QB.halted()) { return; }";
} else if ( first == "WHILE" ) {
loopLevel = loopLevel + 1;
js = "while (" +(await func_ConvertExpression((await func_Join(parts , 2, -1, " ")))) +") {";
indent = 1;
js = js +" if (QB.halted()) { return; }";
} else if ( first == "WEND" ) {
js = "}";
loopLevel = loopLevel - 1;
indent = -1;
} else if ( first == "LOOP" ) {
if (QB.arrayValue(loopMode, [ loopLevel]).value == 1) {
js = "}";
} else {
js = "} while ((";
if ((QB.func_UBound( parts)) < 2) {
js = js +"1));";
} else {
if ((QB.func_UCase(QB.arrayValue(parts, [ 2]).value)) == "UNTIL" ) {
js = "} while (!(";
}
js = js +(await func_ConvertExpression((await func_Join(parts , 3, (QB.func_UBound( parts)) , " ")))) +"))";
}
}
loopLevel = loopLevel - 1;
indent = -1;
} else if ( first == "_CONTINUE" ) {
js = "continue;";
} else if ((QB.func_UCase( l)) == "EXIT FUNCTION" ) {
js = "return " + functionName +";";
} else if ((QB.func_UCase( l)) == "EXIT SUB" ) {
js = "return;";
} else if ( first == "EXIT" ) {
js = "break;";
} else if ( first == "TYPE" ) {
typeMode = True;
var qbtype = {line:0,name:'',argc:0,args:''}; // QBTYPE
qbtype.line = i;
qbtype.name = (QB.func_UCase(QB.arrayValue(parts, [ 2]).value));
await sub_AddType( qbtype);
currType = (QB.func_UBound( types));
} else if ( first == "CALL" ) {
var subline = ''; // STRING
subline = (QB.func__Trim((await func_Join(parts , 2, -1, " "))));
var subend = 0; // INTEGER
subend = (QB.func_InStr( subline, "("));
var subname = ''; // STRING
if ( subend == 0) {
subname = subline;
} else {
subname = (QB.func_Left( subline, subend - 1));
}
if ((await func_FindMethod( subname, m, "SUB")) ) {
var subargs = ''; // STRING
subargs = (QB.func_Mid( subline, (QB.func_Len( subname)) + 2, (QB.func_Len( subline)) -(QB.func_Len( subname)) - 2));
js = (await func_ConvertSub( m, subargs));
} else {
await sub_AddWarning( i, "Missing Sub [" + subname +"], ignoring Call command");
}
} else if ( c > 2) {
var assignment = 0; // INTEGER
assignment = 0;
var j = 0; // INTEGER
for ( j= 1; j <= (QB.func_UBound( parts)); j= j + 1) { if (QB.halted()) { return; }
if (QB.arrayValue(parts, [ j]).value == "=" ) {
assignment = j;
break;
}
}
if ( assignment > 0) {
js = (await func_RemoveSuffix((await func_ConvertExpression((await func_Join(parts , 1, assignment - 1, " ")))))) +" = " +(await func_ConvertExpression((await func_Join(parts , assignment + 1, -1, " ")))) +";";
} else {
if ((await func_FindMethod(QB.arrayValue(parts, [ 1]).value , m, "SUB")) ) {
js = (await func_ConvertSub( m, (await func_Join(parts , 2, -1, " "))));
} else {
js = "// " + l;
await sub_AddWarning( i, "Missing/unsupported sub or syntax error");
}
}
} else {
if ((await func_FindMethod(QB.arrayValue(parts, [ 1]).value , m, "SUB")) ) {
js = (await func_ConvertSub( m, (await func_Join(parts , 2, -1, " "))));
} else {
js = "// " + l;
await sub_AddWarning( i, "Missing/unsupported sub or syntax error");
}
}
if (( indent < 0) ) {
totalIndent = totalIndent + indent;
}
await sub_AddJSLine( i, (GXSTR.lPad("" , " " , ( totalIndent + tempIndent) * 3)) + js);
if (( indent > 0) ) {
totalIndent = totalIndent + indent;
}
}
}
}
async function func_ConvertSub(m/*METHOD*/,args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertSub = null;
var js = ''; // STRING
if ( m.name == "Line" ) {
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
var plen = 0; // INTEGER
plen = (await func_SLSplit( args, parts));
if ( plen > 0) {
if ((QB.func_UCase(QB.arrayValue(parts, [ 1]).value)) == "INPUT" ) {
m.name = "Line Input";
m.jsname = "QB.sub_LineInput";
args = (await func_Join(parts , 2, -1, " "));
}
}
}
if ( m.name == "Line" ) {
js = (await func_CallMethod( m)) +"(" +(await func_ConvertLine( args)) +");";
} else if ( m.name == "PSet" || m.name == "Circle" ) {
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 == "_PutImage" ) {
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPutImage( args)) +");";
} else {
js = (await func_CallMethod( m)) +"(" +(await func_ConvertExpression( args)) +");";
}
ConvertSub = js;
return ConvertSub;
}
async function func_ConvertLine(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertLine = null;
var firstParam = ''; // STRING
var theRest = ''; // STRING
var idx = 0; // INTEGER
var sstep = ''; // STRING
var estep = ''; // STRING
sstep = "false";
estep = "false";
idx = (await func_FindParamChar( args, ","));
if ( idx == -1) {
firstParam = args;
theRest = "";
} else {
firstParam = (QB.func_Left( args, idx - 1));
theRest = (QB.func_Right( args, (QB.func_Len( args)) - idx));
}
idx = (await func_FindParamChar( firstParam, "-"));
var startCord = ''; // STRING
var endCord = ''; // STRING
if ( idx == -1) {
endCord = firstParam;
} else {
startCord = (QB.func_Left( firstParam, idx - 1));
endCord = (QB.func_Right( firstParam, (QB.func_Len( firstParam)) - idx));
}
if ((QB.func_UCase((QB.func__Trim((QB.func_Left( startCord, 4)))))) == "STEP" ) {
sstep = "true";
}
if ((QB.func_UCase((QB.func__Trim((QB.func_Left( endCord, 4)))))) == "STEP" ) {
estep = "true";
}
idx = (QB.func_InStr( startCord, "("));
startCord = (QB.func_Right( startCord, (QB.func_Len( startCord)) - idx));
idx = (QB.func__InStrRev( startCord, ")"));
startCord = (QB.func_Left( startCord, idx - 1));
startCord = (await func_ConvertExpression( startCord));
if (((QB.func__Trim( startCord)) == "") ) {
startCord = "undefined, undefined";
}
idx = (QB.func_InStr( endCord, "("));
endCord = (QB.func_Right( endCord, (QB.func_Len( endCord)) - idx));
idx = (QB.func__InStrRev( endCord, ")"));
endCord = (QB.func_Left( endCord, idx - 1));
endCord = (await func_ConvertExpression( endCord));
theRest = (await func_ConvertExpression( theRest));
theRest = (GXSTR.replace( theRest, " BF" , " " +(QB.func_Chr( 34)) +"BF" +(QB.func_Chr( 34))));
theRest = (GXSTR.replace( theRest, " B" , " " +(QB.func_Chr( 34)) +"B" +(QB.func_Chr( 34))));
ConvertLine = sstep +", " + startCord +", " + estep +", " + endCord +", " + theRest;
return ConvertLine;
}
async function func_ConvertPutImage(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertPutImage = null;
var argc = 0; // INTEGER
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
var startCoord = ''; // STRING
var sourceImage = ''; // STRING
var destImage = ''; // STRING
var destCoord = ''; // STRING
var doSmooth = ''; // STRING
startCoord = (await func_ConvertCoordParam("" , True));
destCoord = (await func_ConvertCoordParam("" , True));
sourceImage = "undefined";
destImage = "undefined";
doSmooth = "false";
if ((await func_EndsWith((QB.func__Trim((QB.func_UCase( args)))) , "_SMOOTH")) ) {
doSmooth = "true";
args = (QB.func_Left((QB.func__Trim( args)) , (QB.func_Len((QB.func__Trim( args)))) - 7));
}
argc = (await func_ListSplit( args, parts));
if ( argc >= 1) {
startCoord = (await func_ConvertCoordParam(QB.arrayValue(parts, [ 1]).value , True));
}
if ( argc >= 2) {
sourceImage = (await func_ConvertExpression(QB.arrayValue(parts, [ 2]).value));
}
if ( argc >= 3) {
if ((QB.func__Trim(QB.arrayValue(parts, [ 3]).value)) != "" ) {
destImage = (await func_ConvertExpression(QB.arrayValue(parts, [ 3]).value));
}
}
if ( argc >= 4) {
destCoord = (await func_ConvertCoordParam(QB.arrayValue(parts, [ 4]).value , True));
}
if ( argc >= 5) {
if ((QB.func__Trim((QB.func_UCase(QB.arrayValue(parts, [ 5]).value)))) == "_SMOOTH" ) {
doSmooth = "true";
}
}
ConvertPutImage = startCoord +", " + sourceImage +", " + destImage +", " + destCoord +", " + doSmooth;
return ConvertPutImage;
}
async function func_ConvertCoordParam(param/*STRING*/,hasEndCoord/*INTEGER*/) {
if (QB.halted()) { return; }
var ConvertCoordParam = null;
if ((QB.func__Trim( param)) == "" ) {
if ( hasEndCoord) {
ConvertCoordParam = "false, undefined, undefined, false, undefined, undefined";
} else {
ConvertCoordParam = "false, undefined, undefined";
}
} else {
var js = ''; // STRING
var startCoord = ''; // STRING
var endCoord = ''; // STRING
var sstep = ''; // STRING
var estep = ''; // STRING
var idx = 0; // INTEGER
sstep = "false";
estep = "false";
idx = (await func_FindParamChar( param, "-"));
if ( idx == -1) {
startCoord = param;
endCoord = "";
} else {
startCoord = (QB.func_Left( param, idx - 1));
endCoord = (QB.func_Right( param, (QB.func_Len( param)) - idx));
}
if ((QB.func_UCase((QB.func__Trim((QB.func_Left( startCoord, 4)))))) == "STEP" ) {
sstep = "true";
}
if ((QB.func_UCase((QB.func__Trim((QB.func_Left( endCoord, 4)))))) == "STEP" ) {
estep = "true";
}
idx = (QB.func_InStr( startCoord, "("));
startCoord = (QB.func_Right( startCoord, (QB.func_Len( startCoord)) - idx));
idx = (QB.func__InStrRev( startCoord, ")"));
startCoord = (QB.func_Left( startCoord, idx - 1));
startCoord = (await func_ConvertExpression( startCoord));
if (((QB.func__Trim( startCoord)) == "") ) {
startCoord = "undefined, undefined";
}
if ( hasEndCoord) {
idx = (QB.func_InStr( endCoord, "("));
endCoord = (QB.func_Right( endCoord, (QB.func_Len( endCoord)) - idx));
idx = (QB.func__InStrRev( endCoord, ")"));
endCoord = (QB.func_Left( endCoord, idx - 1));
endCoord = (await func_ConvertExpression( endCoord));
if (((QB.func__Trim( endCoord)) == "") ) {
endCoord = "undefined, undefined";
}
ConvertCoordParam = sstep +", " + startCoord +", " + estep +", " + endCoord;
} else {
ConvertCoordParam = sstep +", " + startCoord;
}
}
return ConvertCoordParam;
}
async function func_ConvertPSet(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertPSet = null;
var firstParam = ''; // STRING
var theRest = ''; // STRING
var idx = 0; // INTEGER
var sstep = ''; // STRING
sstep = "false";
idx = (await func_FindParamChar( args, ","));
if ( idx == -1) {
firstParam = args;
theRest = "";
} else {
firstParam = (QB.func_Left( args, idx - 1));
theRest = (QB.func_Right( args, (QB.func_Len( args)) - idx));
}
if ((QB.func_UCase((QB.func__Trim((QB.func_Left( firstParam, 4)))))) == "STEP" ) {
sstep = "true";
}
idx = (QB.func_InStr( firstParam, "("));
firstParam = (QB.func_Right( firstParam, (QB.func_Len( firstParam)) - idx));
idx = (QB.func__InStrRev( firstParam, ")"));
firstParam = (QB.func_Left( firstParam, idx - 1));
firstParam = (await func_ConvertExpression( firstParam));
if (((QB.func__Trim( firstParam)) == "") ) {
firstParam = "undefined, undefined";
}
theRest = (await func_ConvertExpression( theRest));
ConvertPSet = sstep +", " + firstParam +", " + theRest;
return ConvertPSet;
}
async function func_ConvertPrint(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertPrint = null;
var pcount = 0; // INTEGER
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
pcount = (await func_PrintSplit( args, parts));
var js = ''; // STRING
js = "[";
var i = 0; // INTEGER
for ( i= 1; i <= pcount; i= i + 1) { if (QB.halted()) { return; }
if ( i > 1) {
js = js +",";
}
if (QB.arrayValue(parts, [ i]).value == "," ) {
js = js +"QB.COLUMN_ADVANCE";
} else if (QB.arrayValue(parts, [ i]).value == ";" ) {
js = js +"QB.PREVENT_NEWLINE";
} else {
js = js +(await func_ConvertExpression(QB.arrayValue(parts, [ i]).value));
}
}
ConvertPrint = js +"]";
return ConvertPrint;
}
async function func_ConvertPrintString(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertPrintString = null;
var firstParam = ''; // STRING
var theRest = ''; // STRING
var idx = 0; // INTEGER
idx = (await func_FindParamChar( args, ","));
if ( idx == -1) {
firstParam = args;
theRest = "";
} else {
firstParam = (QB.func_Left( args, idx - 1));
theRest = (QB.func_Right( args, (QB.func_Len( args)) - idx));
}
idx = (QB.func_InStr( firstParam, "("));
firstParam = (QB.func_Right( firstParam, (QB.func_Len( firstParam)) - idx));
idx = (QB.func__InStrRev( firstParam, ")"));
firstParam = (QB.func_Left( firstParam, idx - 1));
ConvertPrintString = (await func_ConvertExpression( firstParam)) +", " +(await func_ConvertExpression( theRest));
return ConvertPrintString;
}
async function func_ConvertInput(m/*METHOD*/,args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertInput = 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 varIndex = 0; // INTEGER
varIndex = 1;
var preventNewline = ''; // STRING
preventNewline = "false";
var addQuestionPrompt = ''; // STRING
addQuestionPrompt = "false";
var prompt = ''; // STRING
prompt = "undefined";
var vcount = 0; // INTEGER
var p = ''; // STRING
pcount = (await func_PrintSplit( 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));
if ( p == ";" ) {
if ( i == 1) {
preventNewline = "true";
} else {
addQuestionPrompt = "true";
}
} else if ((await func_StartsWith( p, (QB.func_Chr( 34)))) ) {
prompt = p;
} else if ( p != "," ) {
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)))) +");" + GX.LF;
js = js +(await func_CallMethod( m)) +"(" + vname +", " + preventNewline +", " + addQuestionPrompt +", " + prompt +");" + GX.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)) +"];" + GX.LF;
}
ConvertInput = js;
return ConvertInput;
}
async function func_ConvertSwap(m/*METHOD*/,args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertSwap = null;
var js = ''; // STRING
var swapArray = ''; // STRING
swapArray = await func_GenJSVar();
var swapArgs = QB.initArray([{l:1,u:0}], ''); // STRING
var swapCount = 0; // INTEGER
swapCount = (await func_ListSplit( args, swapArgs));
var var1 = ''; // STRING
var var2 = ''; // STRING
var1 = (await func_ConvertExpression(QB.arrayValue(swapArgs, [ 1]).value));
var2 = (await func_ConvertExpression(QB.arrayValue(swapArgs, [ 2]).value));
js = "var " + swapArray +" = [" + var1 +"," + var2 +"];" + GX.LF;
js = js +(await func_CallMethod( m)) +"(" + swapArray +");" + GX.LF;
js = js + var1 +" = " + swapArray +"[0];" + GX.LF;
js = js + var2 +" = " + swapArray +"[1];";
ConvertSwap = js;
return ConvertSwap;
}
async function func_GenJSVar() {
if (QB.halted()) { return; }
var GenJSVar = null;
GenJSVar = "___v" +(QB.func__Trim((QB.func_Str((QB.func__Round(QB.func_Rnd() * 10000000))))));
return GenJSVar;
}
async function func_FindParamChar(s/*STRING*/,char/*STRING*/) {
if (QB.halted()) { return; }
var FindParamChar = null;
var idx = 0; // INTEGER
idx = -1;
var c = ''; // STRING
var quote = 0; // INTEGER
var paren = 0; // INTEGER
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_Len( s)); i= i + 1) { if (QB.halted()) { return; }
c = (QB.func_Mid( s, i, 1));
if ( c == (QB.func_Chr( 34)) ) {
quote = ! quote;
} else if (! quote && c == "(" ) {
paren = paren + 1;
} else if (! quote && c == ")" ) {
paren = paren - 1;
} else if (! quote && paren == 0 && c == char) {
idx = i;
break;
}
}
FindParamChar = idx;
return FindParamChar;
}
async function func_DeclareVar(parts/*STRING*/) {
if (QB.halted()) { return; }
var DeclareVar = null;
var vname = ''; // STRING
var vtype = ''; // STRING
vtype = "";
var vtypeIndex = 0; // INTEGER
vtypeIndex = 4;
var isGlobal = 0; // INTEGER
isGlobal = False;
var isArray = 0; // INTEGER
isArray = False;
var arraySize = ''; // STRING
var pstart = 0; // INTEGER
var bvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
var varnames = QB.initArray([{l:1,u:0}], ''); // STRING
var vnamecount = 0; // INTEGER
var findVar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
var asIdx = 0; // INTEGER
asIdx = 0;
var js = ''; // STRING
js = "";
var preserve = ''; // STRING
preserve = "false";
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( parts)); i= i + 1) { if (QB.halted()) { return; }
if ((QB.func_UCase(QB.arrayValue(parts, [ i]).value)) == "AS" ) {
asIdx = i;
}
if ((QB.func_UCase(QB.arrayValue(parts, [ i]).value)) == "_PRESERVE" ) {
preserve = "true";
}
if ((QB.func_UCase(QB.arrayValue(parts, [ i]).value)) == "SHARED" ) {
isGlobal = True;
}
}
if ( asIdx == 2 || ( asIdx == 3 && ( isGlobal || preserve == "true")) || ( asIdx == 4 && isGlobal && preserve == "true") ) {
bvar.type = (QB.func_UCase(QB.arrayValue(parts, [ asIdx + 1]).value));
var nextIdx = 0; // INTEGER
nextIdx = asIdx + 2;
if ( bvar.type == "_UNSIGNED" ) {
bvar.type = bvar.type +" " +(QB.func_UCase(QB.arrayValue(parts, [ asIdx + 2]).value));
nextIdx = asIdx + 3;
}
bvar.typeId = (await func_FindTypeId( bvar.type));
vnamecount = (await func_ListSplit((await func_Join(parts , nextIdx, -1, " ")) , varnames));
for ( i= 1; i <= vnamecount; i= i + 1) { if (QB.halted()) { return; }
vname = (QB.func__Trim(QB.arrayValue(varnames, [ i]).value));
pstart = (QB.func_InStr( vname, "("));
if ( pstart > 0) {
bvar.isArray = True;
arraySize = (await func_ConvertExpression((QB.func_Mid( vname, pstart + 1, (QB.func_Len( vname)) - pstart - 1))));
bvar.name = (await func_RemoveSuffix((QB.func_Left( vname, pstart - 1))));
} else {
bvar.isArray = False;
arraySize = "";
bvar.name = vname;
}
bvar.jsname = "";
if (! bvar.isArray) {
js = js +"var " + bvar.name +" = " +(await func_InitTypeValue( bvar.type)) +";";
} else {
if ((await func_FindVariable( bvar.name, findVar, True)) ) {
js = js +"QB.resizeArray(" + bvar.name +", [" +(await func_FormatArraySize( arraySize)) +"], " +(await func_InitTypeValue( bvar.type)) +", " + preserve +");";
} else {
js = js +"var " + bvar.name +" = QB.initArray([" +(await func_FormatArraySize( arraySize)) +"], " +(await func_InitTypeValue( bvar.type)) +");";
}
}
if ( isGlobal) {
await sub_AddVariable( bvar, globalVars);
} else {
await sub_AddVariable( bvar, localVars);
}
js = js +" // " + bvar.type;
if ( i < vnamecount) {
js = js + GX.LF;
}
}
} else {
var vpartcount = 0; // INTEGER
var vparts = QB.initArray([{l:1,u:0}], ''); // STRING
nextIdx = 0;
for ( i= 1; i <= (QB.func_UBound( parts)); i= i + 1) { if (QB.halted()) { return; }
var p = ''; // STRING
p = (QB.func_UCase(QB.arrayValue(parts, [ i]).value));
if ( p == "DIM" || p == "REDIM" || p == "SHARED" || p == "_PRESERVE" ) {
nextIdx = i + 1;
}
}
vnamecount = (await func_ListSplit((await func_Join(parts , nextIdx, -1, " ")) , varnames));
for ( i= 1; i <= vnamecount; i= i + 1) { if (QB.halted()) { return; }
vpartcount = (await func_SLSplit2(QB.arrayValue(varnames, [ i]).value , vparts));
bvar.name = (await func_RemoveSuffix(QB.arrayValue(vparts, [ 1]).value));
if ( vpartcount == 1) {
bvar.type = (await func_DataTypeFromName( bvar.name));
} else if ( vpartcount == 3) {
bvar.type = (QB.func_UCase(QB.arrayValue(vparts, [ 3]).value));
} else if ( vpartcount == 4) {
bvar.type = (QB.func_UCase((await func_Join(vparts , 3, -1, " "))));
} else {
}
bvar.typeId = (await func_FindTypeId( bvar.type));
pstart = (QB.func_InStr( bvar.name, "("));
if ( pstart > 0) {
bvar.isArray = True;
arraySize = (await func_ConvertExpression((QB.func_Mid( bvar.name, pstart + 1, (QB.func_Len( bvar.name)) - pstart - 1))));
bvar.name = (await func_RemoveSuffix((QB.func_Left( bvar.name, pstart - 1))));
} else {
bvar.isArray = False;
arraySize = "";
}
bvar.jsname = "";
if (! bvar.isArray) {
js = js +"var " + bvar.name +" = " +(await func_InitTypeValue( bvar.type)) +";";
} else {
if ((await func_FindVariable( bvar.name, findVar, True)) ) {
js = js +"QB.resizeArray(" + bvar.name +", [" +(await func_FormatArraySize( arraySize)) +"], " +(await func_InitTypeValue( bvar.type)) +", " + preserve +");";
} else {
js = js +"var " + bvar.name +" = QB.initArray([" +(await func_FormatArraySize( arraySize)) +"], " +(await func_InitTypeValue( bvar.type)) +");";
}
}
if ( isGlobal) {
await sub_AddVariable( bvar, globalVars);
} else {
await sub_AddVariable( bvar, localVars);
}
js = js +" // " + bvar.type;
if ( i < vnamecount) {
js = js + GX.LF;
}
}
}
DeclareVar = js;
return DeclareVar;
}
async function func_FormatArraySize(sizeString/*STRING*/) {
if (QB.halted()) { return; }
var FormatArraySize = null;
var sizeParams = ''; // STRING
sizeParams = "";
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
var pcount = 0; // INTEGER
pcount = (await func_ListSplit( sizeString, parts));
var i = 0; // INTEGER
for ( i= 1; i <= pcount; i= i + 1) { if (QB.halted()) { return; }
var subparts = QB.initArray([{l:1,u:0}], ''); // STRING
var scount = 0; // INTEGER
scount = (await func_SLSplit2(QB.arrayValue(parts, [ i]).value , subparts));
if ( i > 1) {
sizeParams = sizeParams +",";
}
if ( scount == 1) {
sizeParams = sizeParams +"{l:1,u:" +QB.arrayValue(subparts, [ 1]).value +"}";
} else {
sizeParams = sizeParams +"{l:" +QB.arrayValue(subparts, [ 1]).value +",u:" +QB.arrayValue(subparts, [ 3]).value +"}";
}
}
FormatArraySize = sizeParams;
return FormatArraySize;
}
async function func_InitTypeValue(vtype/*STRING*/) {
if (QB.halted()) { return; }
var InitTypeValue = null;
var value = ''; // STRING
if ( vtype == "STRING" ) {
value = "''";
} else if ( vtype == "_BIT" || vtype == "_UNSIGNED _BIT" || vtype == "_BYTE" || vtype == "_UNSIGNED _BYTE" || vtype == "INTEGER" || vtype == "_UNSIGNED INTEGER" || vtype == "LONG" || vtype == "_UNSIGNED LONG" || vtype == "_INTEGER64" || vtype == "_UNSIGNED INTEGER64" || vtype == "SINGLE" || vtype == "DOUBLE" || vtype == "_FLOAT" || vtype == "_OFFSET" || vtype == "_UNSIGNED _OFFSET" ) {
value = "0";
} else {
value = "{";
var typeId = 0; // INTEGER
typeId = (await func_FindTypeId( vtype));
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( typeVars)); i= i + 1) { if (QB.halted()) { return; }
if ( typeId == QB.arrayValue(typeVars, [ i]).value .typeId) {
value = value +QB.arrayValue(typeVars, [ i]).value .name +":" +(await func_InitTypeValue(QB.arrayValue(typeVars, [ i]).value .type)) +",";
}
}
value = (QB.func_Left( value, (QB.func_Len( value)) - 1)) +"}";
}
InitTypeValue = value;
return InitTypeValue;
}
async function func_FindTypeId(typeName/*STRING*/) {
if (QB.halted()) { return; }
var FindTypeId = null;
var id = 0; // INTEGER
id = -1;
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( types)); i= i + 1) { if (QB.halted()) { return; }
if (QB.arrayValue(types, [ i]).value .name == typeName) {
id = i;
break;
}
}
FindTypeId = id;
return FindTypeId;
}
async function func_ConvertExpression(ex/*STRING*/) {
if (QB.halted()) { return; }
var ConvertExpression = null;
var c = ''; // STRING
var js = ''; // STRING
js = "";
var word = ''; // STRING
word = "";
var bvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; // METHOD
var stringLiteral = 0; // INTEGER
var i = 0; // INTEGER
i = 1;
while ( i <= (QB.func_Len( ex))) { if (QB.halted()) { return; }
c = (QB.func_Mid( ex, i, 1));
if ( c == (QB.func_Chr( 34)) ) {
js = js + c;
stringLiteral = ! stringLiteral;
} else if ( stringLiteral) {
js = js + c;
} else {
if ( c == " " || c == "," || i == (QB.func_Len( ex)) ) {
if ( i == (QB.func_Len( ex)) ) {
word = word + c;
}
var uword = ''; // STRING
uword = (QB.func_UCase( word));
if ( uword == "NOT" ) {
js = js +"!";
} else if ( uword == "AND" ) {
js = js +" && ";
} else if ( uword == "OR" ) {
js = js +" || ";
} else if ( uword == "MOD" ) {
js = js +" % ";
} else if ( word == "=" ) {
js = js +" == ";
} else if ( word == "<>" ) {
js = js +" != ";
} else if ( word == "^" ) {
js = js +" ** ";
} else if ( word == ">" || word == ">=" || word == "<" || word == "<=" ) {
js = js +" " + word +" ";
} else {
if ((await func_FindVariable( word, bvar, False)) ) {
js = js +" " + bvar.jsname;
} else {
if ((await func_FindMethod( word, m, "FUNCTION")) ) {
if ( m.name != currentMethod) {
js = js +(await func_CallMethod( m)) +"()";
} else {
js = js +" " + word;
}
} else {
js = js +" " + word;
}
}
}
if ( c == "," && i != (QB.func_Len( ex)) ) {
js = js +",";
}
word = "";
} else if ( c == "(" ) {
var done = 0; // INTEGER
done = False;
var pcount = 0; // INTEGER
pcount = 0;
var c2 = ''; // STRING
var ex2 = ''; // STRING
ex2 = "";
var stringLiteral2 = 0; // INTEGER
stringLiteral2 = False;
i = i + 1;
while (! done && i <= (QB.func_Len( ex))) { if (QB.halted()) { return; }
c2 = (QB.func_Mid( ex, i, 1));
if ( c2 == (QB.func_Chr( 34)) ) {
stringLiteral2 = ! stringLiteral2;
} else if (! stringLiteral2 && c2 == "(" ) {
pcount = pcount + 1;
} else if (! stringLiteral2 && c2 == ")" ) {
if ( pcount == 0) {
done = True;
} else {
pcount = pcount - 1;
}
}
if (! done) {
ex2 = ex2 + c2;
i = i + 1;
}
}
var fneg = ''; // STRING
fneg = "";
if ((QB.func_Len( word)) > 0) {
if ((QB.func_Left( word, 1)) == "-" ) {
fneg = "-";
word = (QB.func_Mid( word, 2));
}
}
if ((await func_FindVariable( word, bvar, True)) ) {
if ((QB.func__Trim( ex2)) == "" ) {
js = js + fneg + bvar.jsname;
} else {
js = js + fneg +"QB.arrayValue(" + bvar.jsname +", [" +(await func_ConvertExpression( ex2)) +"]).value";
}
} else if ((await func_FindMethod( word, m, "FUNCTION")) ) {
js = js + fneg +"(" +(await func_CallMethod( m)) +"(" +(await func_ConvertExpression( ex2)) +"))";
} else {
if ((QB.func__Trim( word)) != "" ) {
await sub_AddWarning( i, "Missing function or array [" + word +"]");
}
js = js + fneg +"(" +(await func_ConvertExpression( ex2)) +")";
}
word = "";
} else {
word = word + c;
}
}
i = i + 1;
}
ConvertExpression = js;
return ConvertExpression;
}
async function func_CallMethod(m/*METHOD*/) {
if (QB.halted()) { return; }
var CallMethod = null;
var js = ''; // STRING
if ( m.sync) {
js = "await ";
}
js = js + m.jsname;
CallMethod = js;
return CallMethod;
}
async function func_FindVariable(varname/*STRING*/,bvar/*VARIABLE*/,isArray/*INTEGER*/) {
if (QB.halted()) { return; }
var FindVariable = null;
var found = 0; // INTEGER
found = False;
var i = 0; // INTEGER
var fvarname = ''; // STRING
fvarname = (QB.func__Trim((QB.func_UCase((await func_RemoveSuffix( varname))))));
for ( i= 1; i <= (QB.func_UBound( localVars)); i= i + 1) { if (QB.halted()) { return; }
if (QB.arrayValue(localVars, [ i]).value .isArray == isArray && (QB.func_UCase(QB.arrayValue(localVars, [ i]).value .name)) == fvarname) {
found = True;
bvar.type = QB.arrayValue(localVars, [ i]).value .type;
bvar.name = QB.arrayValue(localVars, [ i]).value .name;
bvar.jsname = QB.arrayValue(localVars, [ i]).value .jsname;
bvar.isConst = QB.arrayValue(localVars, [ i]).value .isConst;
bvar.isArray = QB.arrayValue(localVars, [ i]).value .isArray;
bvar.arraySize = QB.arrayValue(localVars, [ i]).value .arraySize;
bvar.typeId = QB.arrayValue(localVars, [ i]).value .typeId;
break;
}
}
if (! found) {
for ( i= 1; i <= (QB.func_UBound( globalVars)); i= i + 1) { if (QB.halted()) { return; }
if (QB.arrayValue(globalVars, [ i]).value .isArray == isArray && (QB.func_UCase(QB.arrayValue(globalVars, [ i]).value .name)) == fvarname) {
found = True;
bvar.type = QB.arrayValue(globalVars, [ i]).value .type;
bvar.name = QB.arrayValue(globalVars, [ i]).value .name;
bvar.jsname = QB.arrayValue(globalVars, [ i]).value .jsname;
bvar.isConst = QB.arrayValue(globalVars, [ i]).value .isConst;
bvar.isArray = QB.arrayValue(globalVars, [ i]).value .isArray;
bvar.arraySize = QB.arrayValue(globalVars, [ i]).value .arraySize;
bvar.typeId = QB.arrayValue(globalVars, [ i]).value .typeId;
break;
}
}
}
FindVariable = found;
return FindVariable;
}
async function func_FindMethod(mname/*STRING*/,m/*METHOD*/,t/*STRING*/) {
if (QB.halted()) { return; }
var FindMethod = null;
var found = 0; // INTEGER
found = False;
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( methods)); i= i + 1) { if (QB.halted()) { return; }
if (QB.arrayValue(methods, [ i]).value .uname == (QB.func__Trim((QB.func_UCase((await func_RemoveSuffix( mname)))))) && QB.arrayValue(methods, [ i]).value .type == t) {
found = True;
m.line = QB.arrayValue(methods, [ i]).value .line;
m.type = QB.arrayValue(methods, [ i]).value .type;
m.returnType = QB.arrayValue(methods, [ i]).value .returnType;
m.name = QB.arrayValue(methods, [ i]).value .name;
m.jsname = QB.arrayValue(methods, [ i]).value .jsname;
m.uname = QB.arrayValue(methods, [ i]).value .uname;
m.argc = QB.arrayValue(methods, [ i]).value .argc;
m.args = QB.arrayValue(methods, [ i]).value .args;
m.sync = QB.arrayValue(methods, [ i]).value .sync;
break;
}
}
FindMethod = found;
return FindMethod;
}
async function sub_ConvertMethods() {
if (QB.halted()) { return; }
await sub_AddJSLine( 0, "");
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( methods)); i= i + 1) { if (QB.halted()) { return; }
if ((QB.arrayValue(methods, [ i]).value .line != 0) ) {
var lastLine = 0; // INTEGER
lastLine = QB.arrayValue(methods, [ i + 1]).value .line - 1;
if ( lastLine < 0) {
lastLine = (QB.func_UBound( lines));
}
QB.resizeArray(localVars, [{l:1,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
var asyncModifier = ''; // STRING
asyncModifier = "async ";
var methodDec = ''; // STRING
methodDec = asyncModifier +"function " +QB.arrayValue(methods, [ i]).value .jsname +"(";
if (QB.arrayValue(methods, [ i]).value .argc > 0) {
var args = QB.initArray([{l:1,u:0}], ''); // STRING
var c = 0; // INTEGER
c = (await func_Split(QB.arrayValue(methods, [ i]).value .args, "," , args));
var a = 0; // INTEGER
for ( a= 1; a <= c; a= a + 1) { if (QB.halted()) { return; }
var v = 0; // INTEGER
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
v = (await func_Split(QB.arrayValue(args, [ a]).value , ":" , parts));
methodDec = methodDec +QB.arrayValue(parts, [ 1]).value +"/*" +QB.arrayValue(parts, [ 2]).value +"*/";
if ( a < c) {
methodDec = methodDec +",";
}
var bvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
bvar.name = QB.arrayValue(parts, [ 1]).value;
bvar.type = QB.arrayValue(parts, [ 2]).value;
bvar.typeId = (await func_FindTypeId( bvar.type));
if (QB.arrayValue(parts, [ 3]).value == "true" ) {
bvar.isArray = True;
}
bvar.jsname = "";
await sub_AddVariable( bvar, localVars);
}
}
methodDec = methodDec +") {";
await sub_AddJSLine(QB.arrayValue(methods, [ i]).value .line, methodDec);
await sub_AddJSLine(QB.arrayValue(methods, [ i]).value .line, "if (QB.halted()) { return; }");
if (QB.arrayValue(methods, [ i]).value .type == "FUNCTION" ) {
await sub_AddJSLine(QB.arrayValue(methods, [ i]).value .line, "var " +(await func_RemoveSuffix(QB.arrayValue(methods, [ i]).value .name)) +" = null;");
}
currentMethod = QB.arrayValue(methods, [ i]).value .name;
await sub_ConvertLines(QB.arrayValue(methods, [ i]).value .line + 1, lastLine - 1, QB.arrayValue(methods, [ i]).value .name);
if (QB.arrayValue(methods, [ i]).value .type == "FUNCTION" ) {
await sub_AddJSLine( lastLine, "return " +(await func_RemoveSuffix(QB.arrayValue(methods, [ i]).value .name)) +";");
}
await sub_AddJSLine( lastLine, "}");
}
}
}
async function sub_ReadLinesFromFile(filename/*STRING*/) {
if (QB.halted()) { return; }
var fline = ''; // STRING
var lineIndex = 0; // INTEGER
// Open filename For Input As #1
while (!(( 1))) { if (QB.halted()) { return; }
var ___v7055475 = new Array( 2);
QB.sub_LineInput(___v7055475, false, false, undefined);
// #1 = ___v7055475[ 0];
fline = ___v7055475[ 1];
lineIndex = lineIndex + 1;
if ((QB.func__Trim( fline)) != "" ) {
while ((await func_EndsWith( fline, " _"))) { if (QB.halted()) { return; }
var nextLine = ''; // STRING
var ___v5334240 = new Array( 2);
QB.sub_LineInput(___v5334240, false, false, undefined);
// #1 = ___v5334240[ 0];
nextLine = ___v5334240[ 1];
fline = (QB.func_Left( fline, (QB.func_Len( fline)) - 1)) + nextLine;
}
await sub_ReadLine( lineIndex, fline);
}
}
// Close #1
}
async function sub_ReadLinesFromText(sourceText/*STRING*/) {
if (QB.halted()) { return; }
var sourceLines = QB.initArray([{l:1,u:0}], ''); // STRING
var lcount = 0; // INTEGER
var i = 0; // INTEGER
lcount = (await func_Split( sourceText, GX.LF, sourceLines));
for ( i= 1; i <= lcount; i= i + 1) { if (QB.halted()) { return; }
var fline = ''; // STRING
fline = QB.arrayValue(sourceLines, [ i]).value;
if ((QB.func__Trim( fline)) != "" ) {
var lineIndex = 0; // INTEGER
lineIndex = i;
while ((await func_EndsWith( fline, "_"))) { if (QB.halted()) { return; }
i = i + 1;
var nextLine = ''; // STRING
nextLine = QB.arrayValue(sourceLines, [ i]).value;
fline = (QB.func_Left( fline, (QB.func_Len( fline)) - 1)) + nextLine;
}
await sub_ReadLine( i, fline);
}
}
}
async function sub_ReadLine(lineIndex/*INTEGER*/,fline/*STRING*/) {
if (QB.halted()) { return; }
var quoteDepth = 0; // INTEGER
quoteDepth = 0;
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_Len( fline)); i= i + 1) { if (QB.halted()) { return; }
var c = ''; // STRING
c = (QB.func_Mid( fline, i, 1));
if ( c == (QB.func_Chr( 34)) ) {
if ( quoteDepth == 0) {
quoteDepth = 1;
} else {
quoteDepth = 0;
}
}
if ( quoteDepth == 0 && c == "'" ) {
fline = (QB.func_Left( fline, i - 1));
break;
}
if ( quoteDepth == 0 && c == ":" ) {
await sub_AddLine( lineIndex, (QB.func_Left( fline, i - 1)));
fline = (QB.func_Right( fline, (QB.func_Len( fline)) - i));
i = 0;
}
}
if ((QB.func__Trim( fline)) != "" ) {
await sub_AddLine( lineIndex, fline);
}
}
async function sub_FindMethods() {
if (QB.halted()) { return; }
var i = 0; // INTEGER
var pcount = 0; // INTEGER
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
for ( i= 1; i <= (QB.func_UBound( lines)); i= i + 1) { if (QB.halted()) { return; }
pcount = (await func_Split(QB.arrayValue(lines, [ i]).value .text, " " , parts));
var word = ''; // STRING
word = (QB.func_UCase(QB.arrayValue(parts, [ 1]).value));
if ( word == "FUNCTION" || word == "SUB" ) {
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; // METHOD
m.line = i;
m.type = (QB.func_UCase(QB.arrayValue(parts, [ 1]).value));
m.name = QB.arrayValue(parts, [ 2]).value;
m.argc = 0;
m.args = "";
var args = QB.initArray([{l:1,u:0}], {name:'',type:''}); // ARGUMENT
if ((QB.func_UBound( parts)) > 2) {
var a = 0; // INTEGER
var args = ''; // STRING
args = "";
for ( a= 3; a <= (QB.func_UBound( parts)); a= a + 1) { if (QB.halted()) { return; }
args = args +QB.arrayValue(parts, [ a]).value +" ";
}
args = (QB.func_Mid((QB.func__Trim( args)) , 2, (QB.func_Len((QB.func__Trim( args)))) - 2));
var arga = QB.initArray([{l:1,u:0}], ''); // STRING
m.argc = (await func_ListSplit( args, arga));
args = "";
for ( a= 1; a <= m.argc; a= a + 1) { if (QB.halted()) { return; }
var aparts = QB.initArray([{l:1,u:0}], ''); // STRING
var apcount = 0; // INTEGER
var argname = ''; // STRING
var isArray = ''; // STRING
isArray = "false";
apcount = (await func_Split(QB.arrayValue(arga, [ a]).value , " " , aparts));
argname = QB.arrayValue(aparts, [ 1]).value;
if ((await func_EndsWith( argname, "()")) ) {
isArray = "true";
argname = (QB.func_Left( argname, (QB.func_Len( argname)) - 2));
}
if ( apcount == 3) {
args = args + argname +":" +(QB.func_UCase(QB.arrayValue(aparts, [ 3]).value)) +":" + isArray;
} else {
args = args + argname +":" +(await func_DataTypeFromName(QB.arrayValue(aparts, [ 1]).value)) +":" + isArray;
}
if ( a != m.argc) {
args = args +",";
}
}
m.args = args;
}
await sub_AddMethod( m, "" , True);
}
}
}
async function func_Split(sourceString/*STRING*/,delimiter/*STRING*/,results/*STRING*/) {
if (QB.halted()) { return; }
var Split = null;
var cstr = ''; // STRING
var p = 0; // LONG
var curpos = 0; // LONG
var arrpos = 0; // LONG
var dpos = 0; // LONG
cstr = sourceString;
if ( delimiter == " " ) {
cstr = (QB.func_RTrim((QB.func_LTrim( cstr))));
p = (QB.func_InStr( cstr, " "));
while ( p > 0) { if (QB.halted()) { return; }
cstr = (QB.func_Mid( cstr, 1, p - 1)) +(QB.func_Mid( cstr, p + 1));
p = (QB.func_InStr( cstr, " "));
}
}
curpos = 1;
arrpos = 0;
dpos = (QB.func_InStr( curpos, cstr, delimiter));
while (!( dpos == 0)) { if (QB.halted()) { return; }
arrpos = arrpos + 1;
QB.resizeArray(results, [{l:1,u:arrpos}], '', true); // STRING
QB.arrayValue(results, [ arrpos]).value = (QB.func_Mid( cstr, curpos, dpos - curpos));
curpos = dpos +(QB.func_Len( delimiter));
dpos = (QB.func_InStr( curpos, cstr, delimiter));
}
arrpos = arrpos + 1;
QB.resizeArray(results, [{l:1,u:arrpos}], '', true); // STRING
QB.arrayValue(results, [ arrpos]).value = (QB.func_Mid( cstr, curpos));
Split = arrpos;
return Split;
}
async function func_SLSplit(sourceString/*STRING*/,results/*STRING*/) {
if (QB.halted()) { return; }
var SLSplit = null;
var cstr = ''; // STRING
var p = 0; // LONG
var curpos = 0; // LONG
var arrpos = 0; // LONG
var dpos = 0; // LONG
cstr = (QB.func__Trim( sourceString));
QB.resizeArray(results, [{l:1,u:0}], '', false); // STRING
var lastChar = ''; // STRING
var quoteMode = 0; // INTEGER
var result = ''; // STRING
var count = 0; // INTEGER
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_Len( cstr)); i= i + 1) { if (QB.halted()) { return; }
var c = ''; // STRING
c = (QB.func_Mid( cstr, i, 1));
if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode;
result = result + c;
if (! quoteMode) {
result = (GXSTR.replace( result, "\\" , "\\\\"));
}
} else if ( c == " " ) {
if ( quoteMode) {
result = result + c;
} else if ( lastChar == " " ) {
} else {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
result = "";
}
} else {
result = result + c;
}
lastChar = c;
}
if ( result != "" ) {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
}
SLSplit = (QB.func_UBound( results));
return SLSplit;
}
async function func_SLSplit2(sourceString/*STRING*/,results/*STRING*/) {
if (QB.halted()) { return; }
var SLSplit2 = null;
var cstr = ''; // STRING
var p = 0; // LONG
var curpos = 0; // LONG
var arrpos = 0; // LONG
var dpos = 0; // LONG
cstr = (QB.func__Trim( sourceString));
QB.resizeArray(results, [{l:1,u:0}], '', false); // STRING
var lastChar = ''; // STRING
var quoteMode = 0; // INTEGER
var result = ''; // STRING
var paren = 0; // INTEGER
var count = 0; // INTEGER
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_Len( cstr)); i= i + 1) { if (QB.halted()) { return; }
var c = ''; // STRING
c = (QB.func_Mid( cstr, i, 1));
if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode;
result = result + c;
} else if ( quoteMode) {
result = result + c;
} else if ( c == "(" ) {
paren = paren + 1;
result = result + c;
} else if ( c == ")" ) {
paren = paren - 1;
result = result + c;
} else if ( paren > 0) {
result = result + c;
} else if ( c == " " ) {
if ( lastChar == " " ) {
} else {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
result = "";
}
} else {
result = result + c;
}
lastChar = c;
}
if ( result != "" ) {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
}
SLSplit2 = (QB.func_UBound( results));
return SLSplit2;
}
async function func_ListSplit(sourceString/*STRING*/,results/*STRING*/) {
if (QB.halted()) { return; }
var ListSplit = null;
var cstr = ''; // STRING
var p = 0; // LONG
var curpos = 0; // LONG
var arrpos = 0; // LONG
var dpos = 0; // LONG
cstr = (QB.func__Trim( sourceString));
QB.resizeArray(results, [{l:1,u:0}], '', false); // STRING
var quoteMode = 0; // INTEGER
var result = ''; // STRING
var count = 0; // INTEGER
var paren = 0; // INTEGER
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_Len( cstr)); i= i + 1) { if (QB.halted()) { return; }
var c = ''; // STRING
c = (QB.func_Mid( cstr, i, 1));
if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode;
result = result + c;
} else if ( quoteMode) {
result = result + c;
} else if ( c == "(" ) {
paren = paren + 1;
result = result + c;
} else if ( c == ")" ) {
paren = paren - 1;
result = result + c;
} else if ( paren > 0) {
result = result + c;
} else if ( c == "," ) {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
result = "";
} else {
result = result + c;
}
}
if ( result != "" ) {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
}
ListSplit = (QB.func_UBound( results));
return ListSplit;
}
async function func_PrintSplit(sourceString/*STRING*/,results/*STRING*/) {
if (QB.halted()) { return; }
var PrintSplit = null;
var cstr = ''; // STRING
var p = 0; // LONG
var curpos = 0; // LONG
var arrpos = 0; // LONG
var dpos = 0; // LONG
cstr = (QB.func__Trim( sourceString));
QB.resizeArray(results, [{l:1,u:0}], '', false); // STRING
var quoteMode = 0; // INTEGER
var result = ''; // STRING
var count = 0; // INTEGER
var paren = 0; // INTEGER
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_Len( cstr)); i= i + 1) { if (QB.halted()) { return; }
var c = ''; // STRING
c = (QB.func_Mid( cstr, i, 1));
if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode;
result = result + c;
} else if ( quoteMode) {
result = result + c;
} else if ( c == "(" ) {
paren = paren + 1;
result = result + c;
} else if ( c == ")" ) {
paren = paren - 1;
result = result + c;
} else if ( paren > 0) {
result = result + c;
} else if ( c == "," || c == ";" ) {
if ( result != "" ) {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
result = "";
}
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = c;
} else {
result = result + c;
}
}
if ( result != "" ) {
count = (QB.func_UBound( results)) + 1;
QB.resizeArray(results, [{l:1,u:count}], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
}
PrintSplit = (QB.func_UBound( results));
return PrintSplit;
}
async function sub_PrintMethods() {
if (QB.halted()) { return; }
await QB.sub_Print([""]);
await QB.sub_Print(["Methods"]);
await QB.sub_Print(["------------------------------------------------------------"]);
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( methods)); i= i + 1) { if (QB.halted()) { return; }
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; // METHOD
m = QB.arrayValue(methods, [ i]).value;
await QB.sub_Print([(QB.func_Str( m.line)) +": " + m.type +" - " + m.name +" [" + m.jsname +"] - " + m.returnType +" - " + m.args]);
}
}
async function sub_PrintTypes() {
if (QB.halted()) { return; }
await QB.sub_Print([""]);
await QB.sub_Print(["Types"]);
await QB.sub_Print(["------------------------------------------------------------"]);
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( types)); i= i + 1) { if (QB.halted()) { return; }
var t = {line:0,name:'',argc:0,args:''}; // QBTYPE
t = QB.arrayValue(types, [ i]).value;
await QB.sub_Print([(QB.func_Str( t.line)) +": " + t.name]);
var v = 0; // INTEGER
for ( v= 1; v <= (QB.func_UBound( typeVars)); v= v + 1) { if (QB.halted()) { return; }
if (QB.arrayValue(typeVars, [ i]).value .typeId == i) {
await QB.sub_Print([" -> " +QB.arrayValue(typeVars, [ v]).value .name +": " +QB.arrayValue(typeVars, [ v]).value .type]);
}
}
}
}
async function sub_AddMethod(m/*METHOD*/,prefix/*STRING*/,sync/*INTEGER*/) {
if (QB.halted()) { return; }
var mcount = 0; // SINGLE
mcount = (QB.func_UBound( methods)) + 1;
QB.resizeArray(methods, [{l:1,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, true); // METHOD
if ( m.type == "FUNCTION" ) {
m.returnType = (await func_DataTypeFromName( m.name));
}
m.uname = (QB.func_UCase((await func_RemoveSuffix( m.name))));
m.jsname = (await func_MethodJS( m, prefix));
m.sync = sync;
QB.arrayValue(methods, [ mcount]).value = m;
}
async function sub_AddGXMethod(mtype/*STRING*/,mname/*STRING*/,sync/*INTEGER*/) {
if (QB.halted()) { return; }
var mcount = 0; // SINGLE
mcount = (QB.func_UBound( methods)) + 1;
QB.resizeArray(methods, [{l:1,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, true); // METHOD
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; // METHOD
m.type = mtype;
m.name = mname;
m.uname = (QB.func_UCase( m.name));
m.sync = sync;
m.jsname = (await func_GXMethodJS((await func_RemoveSuffix( mname))));
if ( mtype == "FUNCTION" ) {
m.returnType = (await func_DataTypeFromName( mname));
}
QB.arrayValue(methods, [ mcount]).value = m;
}
async function sub_AddQBMethod(mtype/*STRING*/,mname/*STRING*/,sync/*INTEGER*/) {
if (QB.halted()) { return; }
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; // METHOD
m.type = mtype;
m.name = mname;
await sub_AddMethod( m, "QB." , sync);
}
async function sub_AddLine(lineIndex/*INTEGER*/,fline/*STRING*/) {
if (QB.halted()) { return; }
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
var c = 0; // INTEGER
c = (await func_Split( fline, " " , parts));
if ((QB.func_UCase(QB.arrayValue(parts, [ 1]).value)) == "IF" ) {
var thenIndex = 0; // INTEGER
thenIndex = 0;
var i = 0; // INTEGER
for ( i= 1; i <= c; i= i + 1) { if (QB.halted()) { return; }
if ((QB.func_UCase(QB.arrayValue(parts, [ i]).value)) == "THEN" ) {
thenIndex = i;
break;
}
}
if ( thenIndex != c) {
await sub___AddLine( lineIndex, (await func_Join(parts , 1, thenIndex, " ")));
await sub___AddLine( lineIndex, (await func_Join(parts , thenIndex + 1, c, " ")));
await sub___AddLine( lineIndex, "End If");
} else {
await sub___AddLine( lineIndex, fline);
}
} else {
await sub___AddLine( lineIndex, fline);
}
}
async function sub___AddLine(lineIndex/*INTEGER*/,fline/*STRING*/) {
if (QB.halted()) { return; }
var lcount = 0; // INTEGER
lcount = (QB.func_UBound( lines)) + 1;
QB.resizeArray(lines, [{l:1,u:lcount}], {line:0,text:''}, true); // CODELINE
QB.arrayValue(lines, [ lcount]).value .line = lineIndex;
QB.arrayValue(lines, [ lcount]).value .text = fline;
}
async function sub_AddJSLine(sourceLine/*INTEGER*/,jsline/*STRING*/) {
if (QB.halted()) { return; }
var lcount = 0; // INTEGER
lcount = (QB.func_UBound( jsLines)) + 1;
QB.resizeArray(jsLines, [{l:1,u:lcount}], {line:0,text:''}, true); // CODELINE
QB.arrayValue(jsLines, [ lcount]).value .line = sourceLine;
QB.arrayValue(jsLines, [ lcount]).value .text = jsline;
}
async function sub_AddWarning(sourceLine/*INTEGER*/,msgText/*STRING*/) {
if (QB.halted()) { return; }
var lcount = 0; // INTEGER
lcount = (QB.func_UBound( warnings)) + 1;
QB.resizeArray(warnings, [{l:1,u:lcount}], {line:0,text:''}, true); // CODELINE
var l = 0; // INTEGER
if (( sourceLine > 0) ) {
l = QB.arrayValue(lines, [ sourceLine]).value .line;
}
QB.arrayValue(warnings, [ lcount]).value .line = l;
QB.arrayValue(warnings, [ lcount]).value .text = msgText;
}
async function sub_AddConst(vname/*STRING*/) {
if (QB.halted()) { return; }
var v = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
v.type = "CONST";
v.name = vname;
v.isConst = True;
await sub_AddVariable( v, globalVars);
}
async function sub_AddGXConst(vname/*STRING*/) {
if (QB.halted()) { return; }
var v = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
v.type = "CONST";
v.name = vname;
if ( vname == "GX_TRUE" ) {
v.jsname = "true";
} else if ( vname == "GX_FALSE" ) {
v.jsname = "false";
} else {
var jsname = ''; // STRING
jsname = (QB.func_Mid( vname, 3, (QB.func_Len( vname)) - 2));
if ((QB.func_Left( jsname, 1)) == "_" ) {
jsname = (QB.func_Right( jsname, (QB.func_Len( jsname)) - 1));
}
v.jsname = "GX." + jsname;
}
v.isConst = True;
await sub_AddVariable( v, globalVars);
}
async function sub_AddGlobal(vname/*STRING*/,vtype/*STRING*/,arraySize/*INTEGER*/) {
if (QB.halted()) { return; }
var v = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
v.type = vtype;
v.name = vname;
v.isArray = arraySize > -1;
v.arraySize = arraySize;
await sub_AddVariable( v, globalVars);
}
async function sub_AddLocal(vname/*STRING*/,vtype/*STRING*/,arraySize/*INTEGER*/) {
if (QB.halted()) { return; }
var v = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
v.type = vtype;
v.name = vname;
v.isArray = arraySize > -1;
v.arraySize = arraySize;
await sub_AddVariable( v, localVars);
}
async function sub_AddVariable(bvar/*VARIABLE*/,vlist/*VARIABLE*/) {
if (QB.halted()) { return; }
var vcount = 0; // SINGLE
vcount = (QB.func_UBound( vlist)) + 1;
QB.resizeArray(vlist, [{l:1,u:vcount}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, true); // VARIABLE
var nvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
nvar.type = bvar.type;
nvar.name = bvar.name;
nvar.jsname = bvar.jsname;
nvar.isConst = bvar.isConst;
nvar.isArray = bvar.isArray;
nvar.arraySize = bvar.arraySize;
nvar.typeId = bvar.typeId;
if ( nvar.jsname == "" ) {
nvar.jsname = (await func_RemoveSuffix( nvar.name));
}
QB.arrayValue(vlist, [ vcount]).value = nvar;
}
async function sub_AddType(t/*QBTYPE*/) {
if (QB.halted()) { return; }
var tcount = 0; // SINGLE
tcount = (QB.func_UBound( types)) + 1;
QB.resizeArray(types, [{l:1,u:tcount}], {line:0,name:'',argc:0,args:''}, true); // QBTYPE
QB.arrayValue(types, [ tcount]).value = t;
}
async function sub_AddSystemType(tname/*STRING*/,args/*STRING*/) {
if (QB.halted()) { return; }
var t = {line:0,name:'',argc:0,args:''}; // QBTYPE
t.name = tname;
await sub_AddType( t);
var typeId = 0; // INTEGER
typeId = (QB.func_UBound( types));
var count = 0; // INTEGER
var pairs = QB.initArray([{l:1,u:0}], ''); // STRING
count = (await func_Split( args, "," , pairs));
var i = 0; // INTEGER
for ( i= 1; i <= (QB.func_UBound( pairs)); i= i + 1) { if (QB.halted()) { return; }
var nv = QB.initArray([{l:1,u:0}], ''); // STRING
count = (await func_Split(QB.arrayValue(pairs, [ i]).value , ":" , nv));
var tvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; // VARIABLE
tvar.typeId = typeId;
tvar.name = QB.arrayValue(nv, [ 1]).value;
tvar.type = (QB.func_UCase(QB.arrayValue(nv, [ 2]).value));
await sub_AddVariable( tvar, typeVars);
}
}
async function func_MainEnd() {
if (QB.halted()) { return; }
var MainEnd = null;
if ( programMethods == 0) {
MainEnd = (QB.func_UBound( lines));
} else {
MainEnd = QB.arrayValue(methods, [ 1]).value .line - 1;
}
return MainEnd;
}
async function func_RemoveSuffix(vname/*STRING*/) {
if (QB.halted()) { return; }
var RemoveSuffix = null;
var i = 0; // INTEGER
var done = 0; // INTEGER
var c = ''; // STRING
vname = (QB.func__Trim( vname));
i = (QB.func_Len( vname));
while (! done) { if (QB.halted()) { return; }
c = (QB.func_Mid( vname, i, 1));
if ( c == "`" || c == "%" || c == "&" || c == "$" || c == "~" || c == "!" ) {
i = i - 1;
} else {
done = True;
}
}
RemoveSuffix = (QB.func_Left( vname, i));
return RemoveSuffix;
}
async function func_DataTypeFromName(vname/*STRING*/) {
if (QB.halted()) { return; }
var DataTypeFromName = null;
var dt = ''; // STRING
if ((await func_EndsWith( vname, "$")) ) {
dt = "STRING";
} else if ((await func_EndsWith( vname, "`")) ) {
dt = "_BIT";
} else if ((await func_EndsWith( vname, "%%")) ) {
dt = "_BYTE";
} else if ((await func_EndsWith( vname, "~%")) ) {
dt = "_UNSIGNED INTEGER";
} else if ((await func_EndsWith( vname, "%")) ) {
dt = "INTEGER";
} else if ((await func_EndsWith( vname, "~&&")) ) {
dt = "_UNSIGNED INTEGER64";
} else if ((await func_EndsWith( vname, "&&")) ) {
dt = "_INTEGER64";
} else if ((await func_EndsWith( vname, "~&")) ) {
dt = "_UNSIGNED LONG";
} else if ((await func_EndsWith( vname, "##")) ) {
dt = "_FLOAT";
} else if ((await func_EndsWith( vname, "#")) ) {
dt = "DOUBLE";
} else if ((await func_EndsWith( vname, "~%&")) ) {
dt = "_UNSIGNED _OFFSET";
} else if ((await func_EndsWith( vname, "%&")) ) {
dt = "_OFFSET";
} else if ((await func_EndsWith( vname, "&")) ) {
dt = "LONG";
} else if ((await func_EndsWith( vname, "!")) ) {
dt = "SINGLE";
} else {
dt = "SINGLE";
}
DataTypeFromName = dt;
return DataTypeFromName;
}
async function func_EndsWith(s/*STRING*/,finds/*STRING*/) {
if (QB.halted()) { return; }
var EndsWith = null;
if ((QB.func_Len( finds)) > (QB.func_Len( s)) ) {
EndsWith = False;
return EndsWith;
}
if ((QB.func__InStrRev( s, finds)) == (QB.func_Len( s)) -((QB.func_Len( finds)) - 1) ) {
EndsWith = True;
} else {
EndsWith = False;
}
return EndsWith;
}
async function func_StartsWith(s/*STRING*/,finds/*STRING*/) {
if (QB.halted()) { return; }
var StartsWith = null;
if ((QB.func_Len( finds)) > (QB.func_Len( s)) ) {
StartsWith = False;
return StartsWith;
}
if ((QB.func_InStr( s, finds)) == 1) {
StartsWith = True;
} else {
StartsWith = False;
}
return StartsWith;
}
async function func_Join(parts/*STRING*/,startIndex/*INTEGER*/,endIndex/*INTEGER*/,delimiter/*STRING*/) {
if (QB.halted()) { return; }
var Join = null;
if ( endIndex == -1) {
endIndex = (QB.func_UBound( parts));
}
var s = ''; // STRING
var i = 0; // INTEGER
for ( i= startIndex; i <= endIndex; i= i + 1) { if (QB.halted()) { return; }
s = s +QB.arrayValue(parts, [ i]).value;
if ( i != (QB.func_UBound( parts)) ) {
s = s + delimiter;
}
}
Join = s;
return Join;
}
async function func_MethodJS(m/*METHOD*/,prefix/*STRING*/) {
if (QB.halted()) { return; }
var MethodJS = null;
var jsname = ''; // STRING
jsname = prefix;
if ( m.type == "FUNCTION" ) {
jsname = jsname +"func_";
} else {
jsname = jsname +"sub_";
}
var i = 0; // INTEGER
var c = ''; // STRING
var a = 0; // INTEGER
for ( i= 1; i <= (QB.func_Len( m.name)); i= i + 1) { if (QB.halted()) { return; }
c = (QB.func_Mid( m.name, i, 1));
a = (QB.func_Asc( c));
if (( a >= 65 && a <= 90) || ( a >= 97 && a <= 122) || ( a >= 48 && a <= 57) || a == 95 || a == 46) {
jsname = jsname + c;
}
}
MethodJS = jsname;
return MethodJS;
}
async function func_GXMethodJS(mname/*STRING*/) {
if (QB.halted()) { return; }
var GXMethodJS = null;
var jsname = ''; // STRING
var startIdx = 0; // INTEGER
if ((QB.func_InStr( mname, "GXSTR")) == 1) {
jsname = "GXSTR.";
startIdx = 7;
} else {
jsname = "GX.";
startIdx = 3;
}
jsname = jsname +(QB.func_LCase((QB.func_Mid( mname, startIdx, 1))));
var i = 0; // INTEGER
var c = ''; // STRING
var a = 0; // INTEGER
for ( i= startIdx + 1; i <= (QB.func_Len( mname)); i= i + 1) { if (QB.halted()) { return; }
c = (QB.func_Mid( mname, i, 1));
a = (QB.func_Asc( c));
if (( a >= 65 && a <= 90) || ( a >= 97 && a <= 122) || ( a >= 48 && a <= 57) || a == 95 || a == 46) {
jsname = jsname + c;
}
}
if ( mname == "GXMapLoad" || mname == "GXSceneStart" ) {
jsname = "await " + jsname;
}
GXMethodJS = jsname;
return GXMethodJS;
}
async function sub_InitGX() {
if (QB.halted()) { return; }
await sub_AddSystemType("GXPOSITION" , "x:LONG,y:LONG");
await sub_AddSystemType("GXDEVICEINPUT" , "deviceId:INTEGER,deviceType:INTEGER,inputType:INTEGER,inputId:INTEGER,inputValue:INTEGER");
await sub_AddGXConst("GX_FALSE");
await sub_AddGXConst("GX_TRUE");
await sub_AddGXConst("GXEVENT_INIT");
await sub_AddGXConst("GXEVENT_UPDATE");
await sub_AddGXConst("GXEVENT_DRAWBG");
await sub_AddGXConst("GXEVENT_DRAWMAP");
await sub_AddGXConst("GXEVENT_DRAWSCREEN");
await sub_AddGXConst("GXEVENT_MOUSEINPUT");
await sub_AddGXConst("GXEVENT_PAINTBEFORE");
await sub_AddGXConst("GXEVENT_PAINTAFTER");
await sub_AddGXConst("GXEVENT_COLLISION_TILE");
await sub_AddGXConst("GXEVENT_COLLISION_ENTITY");
await sub_AddGXConst("GXEVENT_PLAYER_ACTION");
await sub_AddGXConst("GXEVENT_ANIMATE_COMPLETE");
await sub_AddGXConst("GXANIMATE_LOOP");
await sub_AddGXConst("GXANIMATE_SINGLE");
await sub_AddGXConst("GXBG_STRETCH");
await sub_AddGXConst("GXBG_SCROLL");
await sub_AddGXConst("GXBG_WRAP");
await sub_AddGXConst("GXKEY_ESC");
await sub_AddGXConst("GXKEY_1");
await sub_AddGXConst("GXKEY_2");
await sub_AddGXConst("GXKEY_3");
await sub_AddGXConst("GXKEY_4");
await sub_AddGXConst("GXKEY_5");
await sub_AddGXConst("GXKEY_6");
await sub_AddGXConst("GXKEY_7");
await sub_AddGXConst("GXKEY_8");
await sub_AddGXConst("GXKEY_9");
await sub_AddGXConst("GXKEY_0");
await sub_AddGXConst("GXKEY_DASH");
await sub_AddGXConst("GXKEY_EQUALS");
await sub_AddGXConst("GXKEY_BACKSPACE");
await sub_AddGXConst("GXKEY_TAB");
await sub_AddGXConst("GXKEY_Q");
await sub_AddGXConst("GXKEY_W");
await sub_AddGXConst("GXKEY_E");
await sub_AddGXConst("GXKEY_R");
await sub_AddGXConst("GXKEY_T");
await sub_AddGXConst("GXKEY_Y");
await sub_AddGXConst("GXKEY_U");
await sub_AddGXConst("GXKEY_I");
await sub_AddGXConst("GXKEY_O");
await sub_AddGXConst("GXKEY_P");
await sub_AddGXConst("GXKEY_LBRACKET");
await sub_AddGXConst("GXKEY_RBRACKET");
await sub_AddGXConst("GXKEY_ENTER");
await sub_AddGXConst("GXKEY_LCTRL");
await sub_AddGXConst("GXKEY_A");
await sub_AddGXConst("GXKEY_S");
await sub_AddGXConst("GXKEY_D");
await sub_AddGXConst("GXKEY_F");
await sub_AddGXConst("GXKEY_G");
await sub_AddGXConst("GXKEY_H");
await sub_AddGXConst("GXKEY_J");
await sub_AddGXConst("GXKEY_K");
await sub_AddGXConst("GXKEY_L");
await sub_AddGXConst("GXKEY_SEMICOLON");
await sub_AddGXConst("GXKEY_QUOTE");
await sub_AddGXConst("GXKEY_BACKQUOTE");
await sub_AddGXConst("GXKEY_LSHIFT");
await sub_AddGXConst("GXKEY_BACKSLASH");
await sub_AddGXConst("GXKEY_Z");
await sub_AddGXConst("GXKEY_X");
await sub_AddGXConst("GXKEY_C");
await sub_AddGXConst("GXKEY_V");
await sub_AddGXConst("GXKEY_B");
await sub_AddGXConst("GXKEY_N");
await sub_AddGXConst("GXKEY_M");
await sub_AddGXConst("GXKEY_COMMA");
await sub_AddGXConst("GXKEY_PERIOD");
await sub_AddGXConst("GXKEY_SLASH");
await sub_AddGXConst("GXKEY_RSHIFT");
await sub_AddGXConst("GXKEY_NUMPAD_MULTIPLY");
await sub_AddGXConst("GXKEY_SPACEBAR");
await sub_AddGXConst("GXKEY_CAPSLOCK");
await sub_AddGXConst("GXKEY_F1");
await sub_AddGXConst("GXKEY_F2");
await sub_AddGXConst("GXKEY_F3");
await sub_AddGXConst("GXKEY_F4");
await sub_AddGXConst("GXKEY_F5");
await sub_AddGXConst("GXKEY_F6");
await sub_AddGXConst("GXKEY_F7");
await sub_AddGXConst("GXKEY_F8");
await sub_AddGXConst("GXKEY_F9");
await sub_AddGXConst("GXKEY_PAUSE");
await sub_AddGXConst("GXKEY_SCRLK");
await sub_AddGXConst("GXKEY_NUMPAD_7");
await sub_AddGXConst("GXKEY_NUMPAD_8");
await sub_AddGXConst("GXKEY_NUMPAD_9");
await sub_AddGXConst("GXKEY_NUMPAD_MINUS");
await sub_AddGXConst("GXKEY_NUMPAD_4");
await sub_AddGXConst("GXKEY_NUMPAD_5");
await sub_AddGXConst("GXKEY_NUMPAD_6");
await sub_AddGXConst("GXKEY_NUMPAD_PLUS");
await sub_AddGXConst("GXKEY_NUMPAD_1");
await sub_AddGXConst("GXKEY_NUMPAD_2");
await sub_AddGXConst("GXKEY_NUMPAD_3");
await sub_AddGXConst("GXKEY_NUMPAD_0");
await sub_AddGXConst("GXKEY_NUMPAD_PERIOD");
await sub_AddGXConst("GXKEY_F11");
await sub_AddGXConst("GXKEY_F12");
await sub_AddGXConst("GXKEY_NUMPAD_ENTER");
await sub_AddGXConst("GXKEY_RCTRL");
await sub_AddGXConst("GXKEY_NUMPAD_DIVIDE");
await sub_AddGXConst("GXKEY_NUMLOCK");
await sub_AddGXConst("GXKEY_HOME");
await sub_AddGXConst("GXKEY_UP");
await sub_AddGXConst("GXKEY_PAGEUP");
await sub_AddGXConst("GXKEY_LEFT");
await sub_AddGXConst("GXKEY_RIGHT");
await sub_AddGXConst("GXKEY_END");
await sub_AddGXConst("GXKEY_DOWN");
await sub_AddGXConst("GXKEY_PAGEDOWN");
await sub_AddGXConst("GXKEY_INSERT");
await sub_AddGXConst("GXKEY_DELETE");
await sub_AddGXConst("GXKEY_LWIN");
await sub_AddGXConst("GXKEY_RWIN");
await sub_AddGXConst("GXKEY_MENU");
await sub_AddGXConst("GXACTION_MOVE_LEFT");
await sub_AddGXConst("GXACTION_MOVE_RIGHT");
await sub_AddGXConst("GXACTION_MOVE_UP");
await sub_AddGXConst("GXACTION_MOVE_DOWN");
await sub_AddGXConst("GXACTION_JUMP");
await sub_AddGXConst("GXACTION_JUMP_RIGHT");
await sub_AddGXConst("GXACTION_JUMP_LEFT");
await sub_AddGXConst("GXSCENE_FOLLOW_NONE");
await sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER");
await sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_X");
await sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_Y");
await sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_X_POS");
await sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_X_NEG");
await sub_AddGXConst("GXSCENE_CONSTRAIN_NONE");
await sub_AddGXConst("GXSCENE_CONSTRAIN_TO_MAP");
await sub_AddGXConst("GXFONT_DEFAULT");
await sub_AddGXConst("GXFONT_DEFAULT_BLACK");
await sub_AddGXConst("GXDEVICE_KEYBOARD");
await sub_AddGXConst("GXDEVICE_MOUSE");
await sub_AddGXConst("GXDEVICE_CONTROLLER");
await sub_AddGXConst("GXDEVICE_BUTTON");
await sub_AddGXConst("GXDEVICE_AXIS");
await sub_AddGXConst("GXDEVICE_WHEEL");
await sub_AddGXConst("GXTYPE_ENTITY");
await sub_AddGXConst("GXTYPE_FONT");
await sub_AddGXMethod("SUB" , "GXSleep" , True);
await sub_AddGXMethod("FUNCTION" , "GXMouseX" , False);
await sub_AddGXMethod("FUNCTION" , "GXMouseY" , False);
await sub_AddGXMethod("FUNCTION" , "GXSoundLoad" , False);
await sub_AddGXMethod("SUB" , "GXSoundPlay" , False);
await sub_AddGXMethod("SUB" , "GXSoundRepeat" , False);
await sub_AddGXMethod("SUB" , "GXSoundVolume" , False);
await sub_AddGXMethod("SUB" , "GXSoundPause" , False);
await sub_AddGXMethod("SUB" , "GXSoundStop" , False);
await sub_AddGXMethod("SUB" , "GXSoundMuted" , False);
await sub_AddGXMethod("FUNCTION" , "GXSoundMuted" , False);
await sub_AddGXMethod("SUB" , "GXEntityAnimate" , False);
await sub_AddGXMethod("SUB" , "GXEntityAnimateStop" , False);
await sub_AddGXMethod("SUB" , "GXEntityAnimateMode" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityAnimateMode" , False);
await sub_AddGXMethod("FUNCTION" , "GXScreenEntityCreate" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityCreate" , False);
await sub_AddGXMethod("SUB" , "GXEntityCreate" , False);
await sub_AddGXMethod("SUB" , "GXEntityVisible" , False);
await sub_AddGXMethod("SUB" , "GXEntityMove" , False);
await sub_AddGXMethod("SUB" , "GXEntityPos" , False);
await sub_AddGXMethod("SUB" , "GXEntityVX" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityVX" , False);
await sub_AddGXMethod("SUB" , "GXEntityVY" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityVY" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityX" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityY" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityWidth" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityHeight" , False);
await sub_AddGXMethod("SUB" , "GXEntityFrameNext" , False);
await sub_AddGXMethod("SUB" , "GXEntityFrameSet" , False);
await sub_AddGXMethod("SUB" , "GXEntityType" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityType" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityUID$" , False);
await sub_AddGXMethod("FUNCTION" , "GXFontUID$" , False);
await sub_AddGXMethod("SUB" , "GXEntityApplyGravity" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityApplyGravity" , False);
await sub_AddGXMethod("SUB" , "GXEntityCollisionOffset" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetLeft" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetTop" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetRight" , False);
await sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetBottom" , False);
await sub_AddGXMethod("SUB" , "GXFullScreen" , False);
await sub_AddGXMethod("FUNCTION" , "GXFullScreen" , False);
await sub_AddGXMethod("FUNCTION" , "GXBackgroundAdd" , False);
await sub_AddGXMethod("SUB" , "GXBackgroundY" , False);
await sub_AddGXMethod("SUB" , "GXBackgroundHeight" , False);
await sub_AddGXMethod("SUB" , "GXBackgroundClear" , False);
await sub_AddGXMethod("SUB" , "GXSceneEmbedded" , False);
await sub_AddGXMethod("FUNCTION" , "GXSceneEmbedded" , False);
await sub_AddGXMethod("SUB" , "GXSceneCreate" , False);
await sub_AddGXMethod("SUB" , "GXSceneWindowSize" , False);
await sub_AddGXMethod("SUB" , "GXSceneScale" , False);
await sub_AddGXMethod("SUB" , "GXSceneResize" , False);
await sub_AddGXMethod("SUB" , "GXSceneDestroy" , False);
await sub_AddGXMethod("SUB" , "GXCustomDraw" , False);
await sub_AddGXMethod("FUNCTION" , "GXCustomDraw" , False);
await sub_AddGXMethod("SUB" , "GXFrameRate" , False);
await sub_AddGXMethod("FUNCTION" , "GXFrameRate" , False);
await sub_AddGXMethod("FUNCTION" , "GXFrame" , False);
await sub_AddGXMethod("SUB" , "GXSceneDraw" , False);
await sub_AddGXMethod("SUB" , "GXSceneMove" , False);
await sub_AddGXMethod("SUB" , "GXScenePos" , False);
await sub_AddGXMethod("FUNCTION" , "GXSceneX" , False);
await sub_AddGXMethod("FUNCTION" , "GXSceneY" , False);
await sub_AddGXMethod("FUNCTION" , "GXSceneWidth" , False);
await sub_AddGXMethod("FUNCTION" , "GXSceneHeight" , False);
await sub_AddGXMethod("FUNCTION" , "GXSceneColumns" , False);
await sub_AddGXMethod("FUNCTION" , "GXSceneRows" , False);
await sub_AddGXMethod("SUB" , "GXSceneStart" , True);
await sub_AddGXMethod("SUB" , "GXSceneUpdate" , False);
await sub_AddGXMethod("SUB" , "GXSceneFollowEntity" , False);
await sub_AddGXMethod("SUB" , "GXSceneConstrain" , False);
await sub_AddGXMethod("SUB" , "GXSceneStop" , False);
await sub_AddGXMethod("SUB" , "GXMapCreate" , False);
await sub_AddGXMethod("FUNCTION" , "GXMapColumns" , False);
await sub_AddGXMethod("FUNCTION" , "GXMapRows" , False);
await sub_AddGXMethod("FUNCTION" , "GXMapLayers" , False);
await sub_AddGXMethod("SUB" , "GXMapLayerVisible" , False);
await sub_AddGXMethod("FUNCTION" , "GXMapLayerVisible" , False);
await sub_AddGXMethod("SUB" , "GXMapLayerAdd" , False);
await sub_AddGXMethod("SUB" , "GXMapLayerInsert" , False);
await sub_AddGXMethod("SUB" , "GXMapLayerRemove" , False);
await sub_AddGXMethod("SUB" , "GXMapResize" , False);
await sub_AddGXMethod("SUB" , "GXMapDraw" , False);
await sub_AddGXMethod("SUB" , "GXMapTilePosAt" , False);
await sub_AddGXMethod("SUB" , "GXMapTile" , False);
await sub_AddGXMethod("FUNCTION" , "GXMapTile" , False);
await sub_AddGXMethod("FUNCTION" , "GXMapTileDepth" , False);
await sub_AddGXMethod("SUB" , "GXMapTileAdd" , False);
await sub_AddGXMethod("SUB" , "GXMapTileRemove" , False);
await sub_AddGXMethod("FUNCTION" , "GXMapVersion" , False);
await sub_AddGXMethod("SUB" , "GXMapSave" , False);
await sub_AddGXMethod("SUB" , "GXMapLoad" , True);
await sub_AddGXMethod("FUNCTION" , "GXMapIsometric" , False);
await sub_AddGXMethod("SUB" , "GXMapIsometric" , False);
await sub_AddGXMethod("SUB" , "GXSpriteDraw" , False);
await sub_AddGXMethod("SUB" , "GXSpriteDrawScaled" , False);
await sub_AddGXMethod("SUB" , "GXTilesetCreate" , False);
await sub_AddGXMethod("SUB" , "GXTilesetReplaceImage" , False);
await sub_AddGXMethod("SUB" , "GXTilesetLoad" , False);
await sub_AddGXMethod("SUB" , "GXTilesetSave" , False);
await sub_AddGXMethod("SUB" , "GXTilesetPos" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetWidth" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetHeight" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetColumns" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetRows" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetFilename" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetImage" , False);
await sub_AddGXMethod("SUB" , "GXTilesetAnimationCreate" , False);
await sub_AddGXMethod("SUB" , "GXTilesetAnimationAdd" , False);
await sub_AddGXMethod("SUB" , "GXTilesetAnimationRemove" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetAnimationFrames" , False);
await sub_AddGXMethod("FUNCTION" , "GXTilesetAnimationSpeed" , False);
await sub_AddGXMethod("SUB" , "GXTilesetAnimationSpeed" , False);
await sub_AddGXMethod("FUNCTION" , "GXFontCreate" , False);
await sub_AddGXMethod("SUB" , "GXFontCreate" , False);
await sub_AddGXMethod("FUNCTION" , "GXFontWidth" , False);
await sub_AddGXMethod("FUNCTION" , "GXFontHeight" , False);
await sub_AddGXMethod("FUNCTION" , "GXFontCharSpacing" , False);
await sub_AddGXMethod("SUB" , "GXFontCharSpacing" , False);
await sub_AddGXMethod("FUNCTION" , "GXFontLineSpacing" , False);
await sub_AddGXMethod("SUB" , "GXFontLineSpacing" , False);
await sub_AddGXMethod("SUB" , "GXDrawText" , False);
await sub_AddGXMethod("FUNCTION" , "GXDebug" , False);
await sub_AddGXMethod("SUB" , "GXDebug" , False);
await sub_AddGXMethod("FUNCTION" , "GXDebugScreenEntities" , False);
await sub_AddGXMethod("SUB" , "GXDebugScreenEntities" , False);
await sub_AddGXMethod("FUNCTION" , "GXDebugFont" , False);
await sub_AddGXMethod("SUB" , "GXDebugFont" , False);
await sub_AddGXMethod("FUNCTION" , "GXDebugTileBorderColor" , False);
await sub_AddGXMethod("SUB" , "GXDebugTileBorderColor" , False);
await sub_AddGXMethod("FUNCTION" , "GXDebugEntityBorderColor" , False);
await sub_AddGXMethod("SUB" , "GXDebugEntityBorderColor" , False);
await sub_AddGXMethod("FUNCTION" , "GXDebugEntityCollisionColor" , False);
await sub_AddGXMethod("SUB" , "GXDebugEntityCollisionColor" , False);
await sub_AddGXMethod("SUB" , "GXKeyInput" , False);
await sub_AddGXMethod("FUNCTION" , "GXKeyDown" , False);
await sub_AddGXMethod("SUB" , "GXDeviceInputDetect" , False);
await sub_AddGXMethod("FUNCTION" , "GXDeviceInputTest" , False);
await sub_AddGXMethod("FUNCTION" , "GXDeviceName" , False);
await sub_AddGXMethod("FUNCTION" , "GXDeviceTypeName" , False);
await sub_AddGXMethod("FUNCTION" , "GXInputTypeName" , False);
await sub_AddGXMethod("FUNCTION" , "GXKeyButtonName" , False);
await sub_AddGXConst("GX_CR");
await sub_AddGXConst("GX_LF");
await sub_AddGXConst("GX_CRLF");
await sub_AddGXMethod("FUNCTION" , "GXSTR_LPad" , False);
await sub_AddGXMethod("FUNCTION" , "GXSTR_RPad" , False);
await sub_AddGXMethod("FUNCTION" , "GXSTR_Replace" , False);
}
async function sub_InitQBMethods() {
if (QB.halted()) { return; }
await sub_AddQBMethod("FUNCTION" , "_Alpha" , False);
await sub_AddQBMethod("FUNCTION" , "_Alpha32" , False);
await sub_AddQBMethod("FUNCTION" , "_Atan2" , False);
await sub_AddQBMethod("FUNCTION" , "_Blue" , False);
await sub_AddQBMethod("FUNCTION" , "_Blue32" , False);
await sub_AddQBMethod("FUNCTION" , "_CopyImage" , False);
await sub_AddQBMethod("SUB" , "_Delay" , True);
await sub_AddQBMethod("FUNCTION" , "_Dest" , True);
await sub_AddQBMethod("SUB" , "_Dest" , True);
await sub_AddQBMethod("SUB" , "_Display" , False);
await sub_AddQBMethod("FUNCTION" , "_FontWidth" , False);
await sub_AddQBMethod("FUNCTION" , "_FreeImage" , False);
await sub_AddQBMethod("FUNCTION" , "_Green" , False);
await sub_AddQBMethod("FUNCTION" , "_Green32" , False);
await sub_AddQBMethod("FUNCTION" , "_Height" , False);
await sub_AddQBMethod("FUNCTION" , "_InStrRev" , False);
await sub_AddQBMethod("SUB" , "_Limit" , True);
await sub_AddQBMethod("SUB" , "_KeyClear" , False);
await sub_AddQBMethod("FUNCTION" , "_KeyDown" , False);
await sub_AddQBMethod("FUNCTION" , "_KeyHit" , False);
await sub_AddQBMethod("FUNCTION" , "_LoadImage" , True);
await sub_AddQBMethod("FUNCTION" , "_MouseButton" , False);
await sub_AddQBMethod("FUNCTION" , "_MouseInput" , False);
await sub_AddQBMethod("FUNCTION" , "_MouseX" , False);
await sub_AddQBMethod("FUNCTION" , "_MouseY" , False);
await sub_AddQBMethod("FUNCTION" , "_NewImage" , False);
await sub_AddQBMethod("FUNCTION" , "_Pi" , False);
await sub_AddQBMethod("SUB" , "_PrintString" , False);
await sub_AddQBMethod("FUNCTION" , "_PrintWidth" , False);
await sub_AddQBMethod("SUB" , "_PutImage" , False);
await sub_AddQBMethod("FUNCTION" , "_Red" , False);
await sub_AddQBMethod("FUNCTION" , "_Red32" , False);
await sub_AddQBMethod("FUNCTION" , "_RGB" , False);
await sub_AddQBMethod("FUNCTION" , "_RGBA" , False);
await sub_AddQBMethod("FUNCTION" , "_RGB32" , False);
await sub_AddQBMethod("FUNCTION" , "_RGBA32" , False);
await sub_AddQBMethod("FUNCTION" , "_Round" , False);
await sub_AddQBMethod("FUNCTION" , "_ScreenExists" , False);
await sub_AddQBMethod("SUB" , "_Title" , False);
await sub_AddQBMethod("FUNCTION" , "_Trim" , False);
await sub_AddQBMethod("FUNCTION" , "_Width" , False);
await sub_AddQBMethod("FUNCTION" , "Abs" , False);
await sub_AddQBMethod("FUNCTION" , "Asc" , False);
await sub_AddQBMethod("FUNCTION" , "Atn" , False);
await sub_AddQBMethod("FUNCTION" , "Chr$" , False);
await sub_AddQBMethod("SUB" , "Circle" , False);
await sub_AddQBMethod("SUB" , "Cls" , False);
await sub_AddQBMethod("SUB" , "Color" , False);
await sub_AddQBMethod("FUNCTION" , "Command$" , False);
await sub_AddQBMethod("FUNCTION" , "Cos" , False);
await sub_AddQBMethod("FUNCTION" , "Exp" , False);
await sub_AddQBMethod("FUNCTION" , "Fix" , False);
await sub_AddQBMethod("SUB" , "Input" , True);
await sub_AddQBMethod("FUNCTION" , "InKey$" , False);
await sub_AddQBMethod("FUNCTION" , "InStr" , False);
await sub_AddQBMethod("FUNCTION" , "Int" , False);
await sub_AddQBMethod("FUNCTION" , "LBound" , False);
await sub_AddQBMethod("FUNCTION" , "Left$" , False);
await sub_AddQBMethod("FUNCTION" , "LCase$" , False);
await sub_AddQBMethod("FUNCTION" , "Len" , False);
await sub_AddQBMethod("SUB" , "Line" , False);
await sub_AddQBMethod("SUB" , "Locate" , False);
await sub_AddQBMethod("FUNCTION" , "Log" , False);
await sub_AddQBMethod("FUNCTION" , "LTrim$" , False);
await sub_AddQBMethod("FUNCTION" , "Mid$" , False);
await sub_AddQBMethod("SUB" , "Print" , True);
await sub_AddQBMethod("SUB" , "PSet" , False);
await sub_AddQBMethod("FUNCTION" , "Right$" , False);
await sub_AddQBMethod("FUNCTION" , "RTrim$" , False);
await sub_AddQBMethod("FUNCTION" , "Rnd" , False);
await sub_AddQBMethod("SUB" , "Screen" , False);
await sub_AddQBMethod("FUNCTION" , "Sgn" , False);
await sub_AddQBMethod("FUNCTION" , "Sin" , False);
await sub_AddQBMethod("SUB" , "Sleep" , True);
await sub_AddQBMethod("FUNCTION" , "Sqr" , False);
await sub_AddQBMethod("FUNCTION" , "Str$" , False);
await sub_AddQBMethod("SUB" , "Swap" , False);
await sub_AddQBMethod("FUNCTION" , "Tan" , False);
await sub_AddQBMethod("FUNCTION" , "Timer" , False);
await sub_AddQBMethod("FUNCTION" , "UBound" , False);
await sub_AddQBMethod("FUNCTION" , "UCase$" , False);
await sub_AddQBMethod("FUNCTION" , "Val" , False);
await sub_AddSystemType("FETCHRESPONSE" , "ok:INTEGER,status:INTEGER,statusText:STRING,text:STRING");
await sub_AddQBMethod("FUNCTION" , "Fetch" , True);
await sub_AddQBMethod("FUNCTION" , "FromJSON" , False);
await sub_AddQBMethod("FUNCTION" , "ToJSON" , False);
}
this.compile = async function(src) {
await sub_QBToJS(src, TEXT);
var js = '';
for (var i=1; i<= QB.func_UBound(jsLines); i++) {
js += QB.arrayValue(jsLines, [i]).value.text + '\n';
}
return js;
};
this.getWarnings = function() {
var w = [];
for (var i=1; i <= QB.func_UBound(warnings); i++) {
w.push({
line: QB.arrayValue(warnings, [i]).value.line,
text: QB.arrayValue(warnings, [i]).value.text
});
}
return w;
};
return this;
}