1
1
Fork 0
mirror of https://github.com/boxgaming/qbjs.git synced 2024-09-19 20:14:58 +00:00
qbjs/qb2js.js

2135 lines
83 KiB
JavaScript
Raw Normal View History

2022-02-16 17:40:03 +00:00
var QBCompiler = new function() {
// Option _Explicit
// $Console
// Only
const FILE = 1;
const TEXT = 2;
const False = 0;
const True = ! False;
var lines = QB.initArray([ 0], {line:0,text:''}); // CODELINE
var jsLines = QB.initArray([ 0], {line:0,text:''}); // CODELINE
var methods = QB.initArray([ 0], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:''}); // METHOD
var types = QB.initArray([ 0], {line:0,name:'',argc:0,args:''}); // QBTYPE
var typeVars = QB.initArray([ 0], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); // VARIABLE
var globalVars = QB.initArray([ 0], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); // VARIABLE
var localVars = QB.initArray([ 0], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); // VARIABLE
var warnings = QB.initArray([ 0], {line:0,text:''}); // CODELINE
var currentMethod = ''; // STRING
var programMethods = 0; // INTEGER
if ( QB.func_Command() != "" ) {
sub_QBToJS( QB.func_Command(), FILE);
sub_PrintJS();
QB.halt(); return;
}
async function sub_QBToJS(source/*STRING*/,sourceType/*INTEGER*/) {
if (QB.halted()) { return; }
QB.resizeArray(lines, [ 0], {line:0,text:''}, false); // CODELINE
QB.resizeArray(jsLines, [ 0], {line:0,text:''}, false); // CODELINE
QB.resizeArray(methods, [ 0], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:''}, false); // METHOD
QB.resizeArray(types, [ 0], {line:0,name:'',argc:0,args:''}, false); // QBTYPE
QB.resizeArray(typeVars, [ 0], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
QB.resizeArray(globalVars, [ 0], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
QB.resizeArray(localVars, [ 0], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
QB.resizeArray(warnings, [ 0], {line:0,text:''}, false); // CODELINE
currentMethod = "";
programMethods = 0;
if ( sourceType == FILE) {
sub_ReadLinesFromFile( source);
} else {
sub_ReadLinesFromText( source);
}
sub_FindMethods();
programMethods = QB.func_UBound( methods);
sub_InitGX();
sub_InitQBMethods();
var selfConvert = 0; // INTEGER
var isGX = 0; // INTEGER
isGX = False;
if ( sourceType == FILE) {
selfConvert = func_EndsWith( source, "qb2js.bas");
}
if ( selfConvert) {
sub_AddJSLine( 0, "var QBCompiler = new function() {");
} else if ( sourceType == FILE) {
sub_AddJSLine( 0, "async function init() {");
}
if (! selfConvert) {
sub_AddJSLine( 0, "QB.start();");
}
if (! selfConvert) {
var mtest = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:''}; // METHOD
if (func_FindMethod("GXOnGameEvent" , mtest, "SUB") ) {
sub_AddJSLine( 0, " await GX.registerGameEvents(sub_GXOnGameEvent);");
isGX = True;
} else {
sub_AddJSLine( 0, " await GX.registerGameEvents(function(e){});");
sub_AddJSLine( 0, " QB.sub_Screen(0);");
}
}
sub_AddJSLine( 0, "");
sub_ConvertLines( 1, func_MainEnd(), "");
if (! selfConvert && ! isGX) {
sub_AddJSLine( 0, "QB.end();");
}
sub_ConvertMethods();
if ( selfConvert) {
sub_AddJSLine( 0, "this.compile = function(src) {");
sub_AddJSLine( 0, " sub_QBToJS(src, TEXT);");
sub_AddJSLine( 0, " var js = '';");
sub_AddJSLine( 0, " for (var i=1; i<= QB.func_UBound(jsLines); i++) {");
sub_AddJSLine( 0, " js += QB.arrayValue(jsLines, [i]).value.text + '\\n';");
sub_AddJSLine( 0, " }");
sub_AddJSLine( 0, " return js;");
sub_AddJSLine( 0, "};");
sub_AddJSLine( 0, "this.getWarnings = function() {");
sub_AddJSLine( 0, " var w = [];");
sub_AddJSLine( 0, " for (var i=1; i <= QB.func_UBound(warnings); i++) {");
sub_AddJSLine( 0, " w.push({");
sub_AddJSLine( 0, " line: QB.arrayValue(warnings, [i]).value.line,");
sub_AddJSLine( 0, " text: QB.arrayValue(warnings, [i]).value.text");
sub_AddJSLine( 0, " });");
sub_AddJSLine( 0, " }");
sub_AddJSLine( 0, " return w;");
sub_AddJSLine( 0, "};");
sub_AddJSLine( 0, "};");
} else if ( sourceType == FILE) {
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:''}; // METHOD
var totalIndent = 0; // INTEGER
totalIndent = 1;
var caseCount = 0; // INTEGER
var loopMode = QB.initArray([ 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([ 0], ''); // STRING
var c = 0; // INTEGER
c = 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;
sub_AddJSLine( 0, "//-------- END JS native code block --------");
} else {
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);
}
sub_AddVariable( tvar, typeVars);
}
} else {
if ( first == "CONST" ) {
js = "const " +QB.arrayValue(parts, [ 2]).value +" = " +func_ConvertExpression(func_Join(parts , 4, -1, " ")) +";";
sub_AddConst(QB.arrayValue(parts, [ 2]).value);
} else if ( first == "DIM" || first == "REDIM" || first == "STATIC" ) {
js = func_DeclareVar(parts);
} else if ( first == "SELECT" ) {
caseVar = func_GenJSVar();
js = "var " + caseVar +" = " +func_ConvertExpression(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 +" " +func_ConvertExpression(func_Join(parts , 3, -1, " ")) +":";
} else {
var caseParts = QB.initArray([ 0], ''); // STRING
var cscount = 0; // INTEGER
cscount = func_ListSplit(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 " +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 = func_ConvertExpression(func_Join(parts , fi + 1, -1, " "));
}
}
var fvar = ''; // STRING
fvar = func_ConvertExpression(func_Join(parts , 2, eqIdx - 1, " "));
var sval = ''; // STRING
sval = func_ConvertExpression(func_Join(parts , eqIdx + 1, toIdx - 1, " "));
var uval = ''; // STRING
uval = func_ConvertExpression(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 (" +func_ConvertExpression(func_Join(parts , 2, thenIndex - 1, " ")) +") {";
indent = 1;
} else if ( first == "ELSEIF" ) {
js = "} else if (" +func_ConvertExpression(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 (" +func_ConvertExpression(func_Join(parts , 3, -1, " ")) +") {";
} else {
js = "while (!(" +func_ConvertExpression(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 (" +func_ConvertExpression(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 +func_ConvertExpression(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);
sub_AddType( qbtype);
currType = QB.func_UBound( types);
} else if ( first == "CALL" ) {
var subline = ''; // STRING
subline = QB.func__Trim(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 (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 = func_ConvertSub( m, subargs);
} else {
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 = func_RemoveSuffix(func_ConvertExpression(func_Join(parts , 1, assignment - 1, " "))) +" = " +func_ConvertExpression(func_Join(parts , assignment + 1, -1, " ")) +";";
} else {
if (func_FindMethod(QB.arrayValue(parts, [ 1]).value , m, "SUB") ) {
js = func_ConvertSub( m, func_Join(parts , 2, -1, " "));
} else {
js = "// " + l;
sub_AddWarning( i, "Missing/unsupported sub or syntax error");
}
}
} else {
if (func_FindMethod(QB.arrayValue(parts, [ 1]).value , m, "SUB") ) {
js = func_ConvertSub( m, func_Join(parts , 2, -1, " "));
} else {
js = "// " + l;
sub_AddWarning( i, "Missing/unsupported sub or syntax error");
}
}
if (( indent < 0) ) {
totalIndent = totalIndent + indent;
}
sub_AddJSLine( i, GXSTR.lPad("" , " " , ( totalIndent + tempIndent) * 3) + js);
if (( indent > 0) ) {
totalIndent = totalIndent + indent;
}
}
}
}
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([ 0], ''); // STRING
var plen = 0; // INTEGER
plen = func_SLSplit( args, parts);
if ( plen > 0) {
if (QB.func_UCase(QB.arrayValue(parts, [ 1]).value) == "INPUT" ) {
m.name = "Line Input";
m.jsname = "await QB.sub_LineInput";
args = func_Join(parts , 2, -1, " ");
}
}
}
if ( m.name == "Line" ) {
js = m.jsname +"(" +func_ConvertLine( args) +");";
} else if ( m.name == "PSet" || m.name == "Circle" ) {
js = m.jsname +"(" +func_ConvertPSet( args) +");";
} else if ( m.name == "_PrintString" ) {
js = m.jsname +"(" +func_ConvertPrintString( args) +");";
} else if ( m.name == "Print" ) {
js = m.jsname +"(" +func_ConvertPrint( args) +");";
} else if ( m.name == "Input" || m.name == "Line Input" ) {
js = func_ConvertInput( m, args);
} else if ( m.name == "Swap" ) {
js = func_ConvertSwap( m, args);
} else {
js = m.jsname +"(" +func_ConvertExpression( args) +");";
}
ConvertSub = js;
return ConvertSub;
}
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 = 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 = 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 = 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 = func_ConvertExpression( endCord);
theRest = 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;
}
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 = 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 = func_ConvertExpression( firstParam);
if ((QB.func__Trim( firstParam) == "") ) {
firstParam = "undefined, undefined";
}
theRest = func_ConvertExpression( theRest);
ConvertPSet = sstep +", " + firstParam +", " + theRest;
return ConvertPSet;
}
function func_ConvertPrint(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertPrint = null;
var pcount = 0; // INTEGER
var parts = QB.initArray([ 0], ''); // STRING
pcount = 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 +func_ConvertExpression(QB.arrayValue(parts, [ i]).value);
}
}
ConvertPrint = js +"]";
return ConvertPrint;
}
function func_ConvertPrintString(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertPrintString = null;
var firstParam = ''; // STRING
var theRest = ''; // STRING
var idx = 0; // INTEGER
idx = 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 = func_ConvertExpression( firstParam) +", " +func_ConvertExpression( theRest);
return ConvertPrintString;
}
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([ 0], ''); // STRING
var vars = QB.initArray([ 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 = 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 (func_StartsWith( p, QB.func_Chr( 34)) ) {
prompt = p;
} else if ( p != "," ) {
vcount = QB.func_UBound( vars) + 1;
QB.resizeArray(vars, [ vcount], '', true); // STRING
QB.arrayValue(vars, [ vcount]).value = p;
}
}
vname = func_GenJSVar();
js = "var " + vname +" = new Array(" +QB.func_Str(QB.func_UBound( vars)) +");" + GX.LF;
js = js + m.jsname +"(" + vname +", " + preventNewline +", " + addQuestionPrompt +", " + prompt +");" + GX.LF;
for ( i= 1; i <= QB.func_UBound( vars); i= i + 1) { if (QB.halted()) { return; }
js = js +func_ConvertExpression(QB.arrayValue(vars, [ i]).value) +" = " + vname +"[" +QB.func_Str( i - 1) +"];" + GX.LF;
}
ConvertInput = js;
return ConvertInput;
}
function func_ConvertSwap(m/*METHOD*/,args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertSwap = null;
var js = ''; // STRING
var swapArray = ''; // STRING
swapArray = func_GenJSVar();
var swapArgs = QB.initArray([ 0], ''); // STRING
var swapCount = 0; // INTEGER
swapCount = func_ListSplit( args, swapArgs);
var var1 = ''; // STRING
var var2 = ''; // STRING
var1 = func_ConvertExpression(QB.arrayValue(swapArgs, [ 1]).value);
var2 = func_ConvertExpression(QB.arrayValue(swapArgs, [ 2]).value);
js = "var " + swapArray +" = [" + var1 +"," + var2 +"];" + GX.LF;
js = js + m.jsname +"(" + swapArray +");" + GX.LF;
js = js + var1 +" = " + swapArray +"[0];" + GX.LF;
js = js + var2 +" = " + swapArray +"[1];";
ConvertSwap = js;
return ConvertSwap;
}
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;
}
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;
}
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([ 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 = func_FindTypeId( bvar.type);
vnamecount = func_ListSplit(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 = func_ConvertExpression(QB.func_Mid( vname, pstart + 1, QB.func_Len( vname) - pstart - 1));
bvar.name = 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 +" = " +func_InitTypeValue( bvar.type) +";";
} else {
if (func_FindVariable( bvar.name, findVar, True) ) {
js = js +"QB.resizeArray(" + bvar.name +", [" + arraySize +"], " +func_InitTypeValue( bvar.type) +", " + preserve +");";
} else {
js = js +"var " + bvar.name +" = QB.initArray([" + arraySize +"], " +func_InitTypeValue( bvar.type) +");";
}
}
if ( isGlobal) {
sub_AddVariable( bvar, globalVars);
} else {
sub_AddVariable( bvar, localVars);
}
js = js +" // " + bvar.type;
if ( i < vnamecount) {
js = js + GX.LF;
}
}
} else {
var vpartcount = 0; // INTEGER
var vparts = QB.initArray([ 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 = func_ListSplit(func_Join(parts , nextIdx, -1, " ") , varnames);
for ( i= 1; i <= vnamecount; i= i + 1) { if (QB.halted()) { return; }
vpartcount = func_SLSplit(QB.arrayValue(varnames, [ i]).value , vparts);
bvar.name = func_RemoveSuffix(QB.arrayValue(vparts, [ 1]).value);
if ( vpartcount == 1) {
bvar.type = 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(func_Join(vparts , 3, -1, " "));
} else {
}
bvar.typeId = func_FindTypeId( bvar.type);
pstart = QB.func_InStr( bvar.name, "(");
if ( pstart > 0) {
bvar.isArray = True;
arraySize = func_ConvertExpression(QB.func_Mid( bvar.name, pstart + 1, QB.func_Len( bvar.name) - pstart - 1));
bvar.name = func_RemoveSuffix(QB.func_Left( bvar.name, pstart - 1));
} else {
bvar.isArray = False;
arraySize = "";
}
bvar.jsname = "";
if (! bvar.isArray) {
js = js +"var " + bvar.name +" = " +func_InitTypeValue( bvar.type) +";";
} else {
if (func_FindVariable( bvar.name, findVar, True) ) {
js = js +"QB.resizeArray(" + bvar.name +", [" + arraySize +"], " +func_InitTypeValue( bvar.type) +", " + preserve +");";
} else {
js = js +"var " + bvar.name +" = QB.initArray([" + arraySize +"], " +func_InitTypeValue( bvar.type) +");";
}
}
if ( isGlobal) {
sub_AddVariable( bvar, globalVars);
} else {
sub_AddVariable( bvar, localVars);
}
js = js +" // " + bvar.type;
if ( i < vnamecount) {
js = js + GX.LF;
}
}
}
DeclareVar = js;
return DeclareVar;
}
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 = 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 +":" +func_InitTypeValue(QB.arrayValue(typeVars, [ i]).value .type) +",";
}
}
value = QB.func_Left( value, QB.func_Len( value) - 1) +"}";
}
InitTypeValue = value;
return InitTypeValue;
}
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;
}
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:''}; // 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 (func_FindVariable( word, bvar, False) ) {
js = js +" " + bvar.jsname;
} else {
if (func_FindMethod( word, m, "FUNCTION") ) {
if ( m.name != currentMethod) {
js = js +" " + m.jsname +"()";
} 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 (func_FindVariable( word, bvar, True) ) {
if (QB.func__Trim( ex2) == "" ) {
js = js + fneg + bvar.jsname;
} else {
js = js + fneg +"QB.arrayValue(" + bvar.jsname +", [" +func_ConvertExpression( ex2) +"]).value";
}
} else if (func_FindMethod( word, m, "FUNCTION") ) {
js = js + fneg + m.jsname +"(" +func_ConvertExpression( ex2) +")";
} else {
if (QB.func__Trim( word) != "" ) {
sub_AddWarning( i, "Missing function or array [" + word +"]");
}
js = js + fneg +"(" +func_ConvertExpression( ex2) +")";
}
word = "";
} else {
word = word + c;
}
}
i = i + 1;
}
ConvertExpression = js;
return ConvertExpression;
}
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(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;
}
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(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;
break;
}
}
FindMethod = found;
return FindMethod;
}
async function sub_ConvertMethods() {
if (QB.halted()) { return; }
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, [ 0], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); // VARIABLE
var asyncModifier = ''; // STRING
if (QB.arrayValue(methods, [ i]).value .type == "SUB" ) {
asyncModifier = "async ";
} else {
asyncModifier = "";
}
var methodDec = ''; // STRING
methodDec = asyncModifier +"function " +QB.arrayValue(methods, [ i]).value .jsname +"(";
if (QB.arrayValue(methods, [ i]).value .argc > 0) {
var args = QB.initArray([ 0], ''); // STRING
var c = 0; // INTEGER
c = 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([ 0], ''); // STRING
v = 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 = func_FindTypeId( bvar.type);
if (QB.arrayValue(parts, [ 3]).value == "true" ) {
bvar.isArray = True;
}
bvar.jsname = "";
sub_AddVariable( bvar, localVars);
}
}
methodDec = methodDec +") {";
sub_AddJSLine(QB.arrayValue(methods, [ i]).value .line, methodDec);
sub_AddJSLine(QB.arrayValue(methods, [ i]).value .line, "if (QB.halted()) { return; }");
if (QB.arrayValue(methods, [ i]).value .type == "FUNCTION" ) {
sub_AddJSLine(QB.arrayValue(methods, [ i]).value .line, "var " +func_RemoveSuffix(QB.arrayValue(methods, [ i]).value .name) +" = null;");
}
currentMethod = QB.arrayValue(methods, [ i]).value .name;
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" ) {
sub_AddJSLine( lastLine, "return " +func_RemoveSuffix(QB.arrayValue(methods, [ i]).value .name) +";");
}
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);
await QB.sub_LineInput(___v7055475, false, false, undefined);
// #1 = ___v7055475[ 0];
fline = ___v7055475[ 1];
lineIndex = lineIndex + 1;
if (QB.func__Trim( fline) != "" ) {
while (func_EndsWith( fline, " _")) { if (QB.halted()) { return; }
var nextLine = ''; // STRING
var ___v5334240 = new Array( 2);
await QB.sub_LineInput(___v5334240, false, false, undefined);
// #1 = ___v5334240[ 0];
nextLine = ___v5334240[ 1];
fline = QB.func_Left( fline, QB.func_Len( fline) - 1) + nextLine;
}
sub_ReadLine( lineIndex, fline);
}
}
// Close #1
}
async function sub_ReadLinesFromText(sourceText/*STRING*/) {
if (QB.halted()) { return; }
var sourceLines = QB.initArray([ 0], ''); // STRING
var lcount = 0; // INTEGER
var i = 0; // INTEGER
lcount = 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 (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;
}
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 == ":" ) {
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) != "" ) {
sub_AddLine( lineIndex, fline);
}
}
async function sub_FindMethods() {
if (QB.halted()) { return; }
var i = 0; // INTEGER
var pcount = 0; // INTEGER
var parts = QB.initArray([ 0], ''); // STRING
for ( i= 1; i <= QB.func_UBound( lines); i= i + 1) { if (QB.halted()) { return; }
pcount = 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:''}; // 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([ 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([ 0], ''); // STRING
m.argc = func_ListSplit( args, arga);
args = "";
for ( a= 1; a <= m.argc; a= a + 1) { if (QB.halted()) { return; }
var aparts = QB.initArray([ 0], ''); // STRING
var apcount = 0; // INTEGER
var argname = ''; // STRING
var isArray = ''; // STRING
isArray = "false";
apcount = func_Split(QB.arrayValue(arga, [ a]).value , " " , aparts);
argname = QB.arrayValue(aparts, [ 1]).value;
if (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 +":" +func_DataTypeFromName(QB.arrayValue(aparts, [ 1]).value) +":" + isArray;
}
if ( a != m.argc) {
args = args +",";
}
}
m.args = args;
}
sub_AddMethod( m, "");
}
}
}
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, [ 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, [ arrpos], '', true); // STRING
QB.arrayValue(results, [ arrpos]).value = QB.func_Mid( cstr, curpos);
Split = arrpos;
return Split;
}
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, [ 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, [ 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, [ count], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
}
SLSplit = QB.func_UBound( results);
return SLSplit;
}
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, [ 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, [ 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, [ count], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
}
ListSplit = QB.func_UBound( results);
return ListSplit;
}
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, [ 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, [ count], '', true); // STRING
QB.arrayValue(results, [ count]).value = result;
result = "";
}
count = QB.func_UBound( results) + 1;
QB.resizeArray(results, [ count], '', true); // STRING
QB.arrayValue(results, [ count]).value = c;
} else {
result = result + c;
}
}
if ( result != "" ) {
count = QB.func_UBound( results) + 1;
QB.resizeArray(results, [ 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:''}; // 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*/) {
if (QB.halted()) { return; }
var mcount = 0; // SINGLE
mcount = QB.func_UBound( methods) + 1;
QB.resizeArray(methods, [ mcount], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:''}, true); // METHOD
if ( m.type == "FUNCTION" ) {
m.returnType = func_DataTypeFromName( m.name);
}
m.uname = QB.func_UCase(func_RemoveSuffix( m.name));
m.jsname = func_MethodJS( m, prefix);
QB.arrayValue(methods, [ mcount]).value = m;
}
async function sub_AddGXMethod(mtype/*STRING*/,mname/*STRING*/) {
if (QB.halted()) { return; }
var mcount = 0; // SINGLE
mcount = QB.func_UBound( methods) + 1;
QB.resizeArray(methods, [ mcount], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:''}, true); // METHOD
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:''}; // METHOD
m.type = mtype;
m.name = mname;
m.uname = QB.func_UCase( m.name);
m.jsname = func_GXMethodJS(func_RemoveSuffix( mname));
if ( mtype == "FUNCTION" ) {
m.returnType = func_DataTypeFromName( mname);
}
QB.arrayValue(methods, [ mcount]).value = m;
}
async function sub_AddQBMethod(mtype/*STRING*/,mname/*STRING*/) {
if (QB.halted()) { return; }
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:''}; // METHOD
m.type = mtype;
m.name = mname;
sub_AddMethod( m, "QB.");
}
async function sub_AddLine(lineIndex/*INTEGER*/,fline/*STRING*/) {
if (QB.halted()) { return; }
var parts = QB.initArray([ 0], ''); // STRING
var c = 0; // INTEGER
c = 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) {
sub___AddLine( lineIndex, func_Join(parts , 1, thenIndex, " "));
sub___AddLine( lineIndex, func_Join(parts , thenIndex + 1, c, " "));
sub___AddLine( lineIndex, "End If");
} else {
sub___AddLine( lineIndex, fline);
}
} else {
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, [ 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, [ 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, [ 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;
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;
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;
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;
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, [ vcount], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, true); // VARIABLE
if ( bvar.jsname == "" ) {
bvar.jsname = func_RemoveSuffix( bvar.name);
}
QB.arrayValue(vlist, [ vcount]).value = bvar;
}
async function sub_AddType(t/*QBTYPE*/) {
if (QB.halted()) { return; }
var tcount = 0; // SINGLE
tcount = QB.func_UBound( types) + 1;
QB.resizeArray(types, [ 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;
sub_AddType( t);
var typeId = 0; // INTEGER
typeId = QB.func_UBound( types);
var count = 0; // INTEGER
var pairs = QB.initArray([ 0], ''); // STRING
count = 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([ 0], ''); // STRING
count = 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);
sub_AddVariable( tvar, typeVars);
}
}
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;
}
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;
}
function func_DataTypeFromName(vname/*STRING*/) {
if (QB.halted()) { return; }
var DataTypeFromName = null;
var dt = ''; // STRING
if (func_EndsWith( vname, "$") ) {
dt = "STRING";
} else if (func_EndsWith( vname, "`") ) {
dt = "_BIT";
} else if (func_EndsWith( vname, "%%") ) {
dt = "_BYTE";
} else if (func_EndsWith( vname, "~%") ) {
dt = "_UNSIGNED INTEGER";
} else if (func_EndsWith( vname, "%") ) {
dt = "INTEGER";
} else if (func_EndsWith( vname, "~&&") ) {
dt = "_UNSIGNED INTEGER64";
} else if (func_EndsWith( vname, "&&") ) {
dt = "_INTEGER64";
} else if (func_EndsWith( vname, "~&") ) {
dt = "_UNSIGNED LONG";
} else if (func_EndsWith( vname, "##") ) {
dt = "_FLOAT";
} else if (func_EndsWith( vname, "#") ) {
dt = "DOUBLE";
} else if (func_EndsWith( vname, "~%&") ) {
dt = "_UNSIGNED _OFFSET";
} else if (func_EndsWith( vname, "%&") ) {
dt = "_OFFSET";
} else if (func_EndsWith( vname, "&") ) {
dt = "LONG";
} else if (func_EndsWith( vname, "!") ) {
dt = "SINGLE";
} else {
dt = "SINGLE";
}
DataTypeFromName = dt;
return DataTypeFromName;
}
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;
}
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;
}
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;
}
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;
}
}
if ( m.name == "_Limit" || m.name == "_Delay" || m.name == "Sleep" || m.name == "Input" || m.name == "Print" || m.name == "Fetch" ) {
jsname = "await " + jsname;
}
MethodJS = jsname;
return MethodJS;
}
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; }
sub_AddSystemType("GXPOSITION" , "x:LONG,y:LONG");
sub_AddSystemType("GXDEVICEINPUT" , "deviceId:INTEGER,deviceType:INTEGER,inputType:INTEGER,inputId:INTEGER,inputValue:INTEGER");
sub_AddGXConst("GX_FALSE");
sub_AddGXConst("GX_TRUE");
sub_AddGXConst("GXEVENT_INIT");
sub_AddGXConst("GXEVENT_UPDATE");
sub_AddGXConst("GXEVENT_DRAWBG");
sub_AddGXConst("GXEVENT_DRAWMAP");
sub_AddGXConst("GXEVENT_DRAWSCREEN");
sub_AddGXConst("GXEVENT_MOUSEINPUT");
sub_AddGXConst("GXEVENT_PAINTBEFORE");
sub_AddGXConst("GXEVENT_PAINTAFTER");
sub_AddGXConst("GXEVENT_COLLISION_TILE");
sub_AddGXConst("GXEVENT_COLLISION_ENTITY");
sub_AddGXConst("GXEVENT_PLAYER_ACTION");
sub_AddGXConst("GXEVENT_ANIMATE_COMPLETE");
sub_AddGXConst("GXANIMATE_LOOP");
sub_AddGXConst("GXANIMATE_SINGLE");
sub_AddGXConst("GXBG_STRETCH");
sub_AddGXConst("GXBG_SCROLL");
sub_AddGXConst("GXBG_WRAP");
sub_AddGXConst("GXKEY_ESC");
sub_AddGXConst("GXKEY_1");
sub_AddGXConst("GXKEY_2");
sub_AddGXConst("GXKEY_3");
sub_AddGXConst("GXKEY_4");
sub_AddGXConst("GXKEY_5");
sub_AddGXConst("GXKEY_6");
sub_AddGXConst("GXKEY_7");
sub_AddGXConst("GXKEY_8");
sub_AddGXConst("GXKEY_9");
sub_AddGXConst("GXKEY_0");
sub_AddGXConst("GXKEY_DASH");
sub_AddGXConst("GXKEY_EQUALS");
sub_AddGXConst("GXKEY_BACKSPACE");
sub_AddGXConst("GXKEY_TAB");
sub_AddGXConst("GXKEY_Q");
sub_AddGXConst("GXKEY_W");
sub_AddGXConst("GXKEY_E");
sub_AddGXConst("GXKEY_R");
sub_AddGXConst("GXKEY_T");
sub_AddGXConst("GXKEY_Y");
sub_AddGXConst("GXKEY_U");
sub_AddGXConst("GXKEY_I");
sub_AddGXConst("GXKEY_O");
sub_AddGXConst("GXKEY_P");
sub_AddGXConst("GXKEY_LBRACKET");
sub_AddGXConst("GXKEY_RBRACKET");
sub_AddGXConst("GXKEY_ENTER");
sub_AddGXConst("GXKEY_LCTRL");
sub_AddGXConst("GXKEY_A");
sub_AddGXConst("GXKEY_S");
sub_AddGXConst("GXKEY_D");
sub_AddGXConst("GXKEY_F");
sub_AddGXConst("GXKEY_G");
sub_AddGXConst("GXKEY_H");
sub_AddGXConst("GXKEY_J");
sub_AddGXConst("GXKEY_K");
sub_AddGXConst("GXKEY_L");
sub_AddGXConst("GXKEY_SEMICOLON");
sub_AddGXConst("GXKEY_QUOTE");
sub_AddGXConst("GXKEY_BACKQUOTE");
sub_AddGXConst("GXKEY_LSHIFT");
sub_AddGXConst("GXKEY_BACKSLASH");
sub_AddGXConst("GXKEY_Z");
sub_AddGXConst("GXKEY_X");
sub_AddGXConst("GXKEY_C");
sub_AddGXConst("GXKEY_V");
sub_AddGXConst("GXKEY_B");
sub_AddGXConst("GXKEY_N");
sub_AddGXConst("GXKEY_M");
sub_AddGXConst("GXKEY_COMMA");
sub_AddGXConst("GXKEY_PERIOD");
sub_AddGXConst("GXKEY_SLASH");
sub_AddGXConst("GXKEY_RSHIFT");
sub_AddGXConst("GXKEY_NUMPAD_MULTIPLY");
sub_AddGXConst("GXKEY_SPACEBAR");
sub_AddGXConst("GXKEY_CAPSLOCK");
sub_AddGXConst("GXKEY_F1");
sub_AddGXConst("GXKEY_F2");
sub_AddGXConst("GXKEY_F3");
sub_AddGXConst("GXKEY_F4");
sub_AddGXConst("GXKEY_F5");
sub_AddGXConst("GXKEY_F6");
sub_AddGXConst("GXKEY_F7");
sub_AddGXConst("GXKEY_F8");
sub_AddGXConst("GXKEY_F9");
sub_AddGXConst("GXKEY_PAUSE");
sub_AddGXConst("GXKEY_SCRLK");
sub_AddGXConst("GXKEY_NUMPAD_7");
sub_AddGXConst("GXKEY_NUMPAD_8");
sub_AddGXConst("GXKEY_NUMPAD_9");
sub_AddGXConst("GXKEY_NUMPAD_MINUS");
sub_AddGXConst("GXKEY_NUMPAD_4");
sub_AddGXConst("GXKEY_NUMPAD_5");
sub_AddGXConst("GXKEY_NUMPAD_6");
sub_AddGXConst("GXKEY_NUMPAD_PLUS");
sub_AddGXConst("GXKEY_NUMPAD_1");
sub_AddGXConst("GXKEY_NUMPAD_2");
sub_AddGXConst("GXKEY_NUMPAD_3");
sub_AddGXConst("GXKEY_NUMPAD_0");
sub_AddGXConst("GXKEY_NUMPAD_PERIOD");
sub_AddGXConst("GXKEY_F11");
sub_AddGXConst("GXKEY_F12");
sub_AddGXConst("GXKEY_NUMPAD_ENTER");
sub_AddGXConst("GXKEY_RCTRL");
sub_AddGXConst("GXKEY_NUMPAD_DIVIDE");
sub_AddGXConst("GXKEY_NUMLOCK");
sub_AddGXConst("GXKEY_HOME");
sub_AddGXConst("GXKEY_UP");
sub_AddGXConst("GXKEY_PAGEUP");
sub_AddGXConst("GXKEY_LEFT");
sub_AddGXConst("GXKEY_RIGHT");
sub_AddGXConst("GXKEY_END");
sub_AddGXConst("GXKEY_DOWN");
sub_AddGXConst("GXKEY_PAGEDOWN");
sub_AddGXConst("GXKEY_INSERT");
sub_AddGXConst("GXKEY_DELETE");
sub_AddGXConst("GXKEY_LWIN");
sub_AddGXConst("GXKEY_RWIN");
sub_AddGXConst("GXKEY_MENU");
sub_AddGXConst("GXACTION_MOVE_LEFT");
sub_AddGXConst("GXACTION_MOVE_RIGHT");
sub_AddGXConst("GXACTION_MOVE_UP");
sub_AddGXConst("GXACTION_MOVE_DOWN");
sub_AddGXConst("GXACTION_JUMP");
sub_AddGXConst("GXACTION_JUMP_RIGHT");
sub_AddGXConst("GXACTION_JUMP_LEFT");
sub_AddGXConst("GXSCENE_FOLLOW_NONE");
sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER");
sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_X");
sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_Y");
sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_X_POS");
sub_AddGXConst("GXSCENE_FOLLOW_ENTITY_CENTER_X_NEG");
sub_AddGXConst("GXSCENE_CONSTRAIN_NONE");
sub_AddGXConst("GXSCENE_CONSTRAIN_TO_MAP");
sub_AddGXConst("GXFONT_DEFAULT");
sub_AddGXConst("GXFONT_DEFAULT_BLACK");
sub_AddGXConst("GXDEVICE_KEYBOARD");
sub_AddGXConst("GXDEVICE_MOUSE");
sub_AddGXConst("GXDEVICE_CONTROLLER");
sub_AddGXConst("GXDEVICE_BUTTON");
sub_AddGXConst("GXDEVICE_AXIS");
sub_AddGXConst("GXDEVICE_WHEEL");
sub_AddGXConst("GXTYPE_ENTITY");
sub_AddGXConst("GXTYPE_FONT");
sub_AddGXMethod("SUB" , "GXSleep");
sub_AddGXMethod("FUNCTION" , "GXMouseX");
sub_AddGXMethod("FUNCTION" , "GXMouseY");
sub_AddGXMethod("FUNCTION" , "GXSoundLoad");
sub_AddGXMethod("SUB" , "GXSoundPlay");
sub_AddGXMethod("SUB" , "GXSoundRepeat");
sub_AddGXMethod("SUB" , "GXSoundVolume");
sub_AddGXMethod("SUB" , "GXSoundPause");
sub_AddGXMethod("SUB" , "GXSoundStop");
sub_AddGXMethod("SUB" , "GXSoundMuted");
sub_AddGXMethod("FUNCTION" , "GXSoundMuted");
sub_AddGXMethod("SUB" , "GXEntityAnimate");
sub_AddGXMethod("SUB" , "GXEntityAnimateStop");
sub_AddGXMethod("SUB" , "GXEntityAnimateMode");
sub_AddGXMethod("FUNCTION" , "GXEntityAnimateMode");
sub_AddGXMethod("FUNCTION" , "GXScreenEntityCreate");
sub_AddGXMethod("FUNCTION" , "GXEntityCreate");
sub_AddGXMethod("SUB" , "GXEntityCreate");
sub_AddGXMethod("SUB" , "GXEntityVisible");
sub_AddGXMethod("SUB" , "GXEntityMove");
sub_AddGXMethod("SUB" , "GXEntityPos");
sub_AddGXMethod("SUB" , "GXEntityVX");
sub_AddGXMethod("FUNCTION" , "GXEntityVX");
sub_AddGXMethod("SUB" , "GXEntityVY");
sub_AddGXMethod("FUNCTION" , "GXEntityVY");
sub_AddGXMethod("FUNCTION" , "GXEntityX");
sub_AddGXMethod("FUNCTION" , "GXEntityY");
sub_AddGXMethod("FUNCTION" , "GXEntityWidth");
sub_AddGXMethod("FUNCTION" , "GXEntityHeight");
sub_AddGXMethod("SUB" , "GXEntityFrameNext");
sub_AddGXMethod("SUB" , "GXEntityFrameSet");
sub_AddGXMethod("SUB" , "GXEntityType");
sub_AddGXMethod("FUNCTION" , "GXEntityType");
sub_AddGXMethod("FUNCTION" , "GXEntityUID$");
sub_AddGXMethod("FUNCTION" , "GXFontUID$");
sub_AddGXMethod("FUNCTION" , "GX");
sub_AddGXMethod("SUB" , "GXEntityApplyGravity");
sub_AddGXMethod("FUNCTION" , "GXEntityApplyGravity");
sub_AddGXMethod("SUB" , "GXEntityCollisionOffset");
sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetLeft");
sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetTop");
sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetRight");
sub_AddGXMethod("FUNCTION" , "GXEntityCollisionOffsetBottom");
sub_AddGXMethod("SUB" , "GXFullScreen");
sub_AddGXMethod("FUNCTION" , "GXFullScreen");
sub_AddGXMethod("FUNCTION" , "GXBackgroundAdd");
sub_AddGXMethod("SUB" , "GXBackgroundY");
sub_AddGXMethod("SUB" , "GXBackgroundHeight");
sub_AddGXMethod("SUB" , "GXBackgroundClear");
sub_AddGXMethod("SUB" , "GXSceneEmbedded");
sub_AddGXMethod("FUNCTION" , "GXSceneEmbedded");
sub_AddGXMethod("SUB" , "GXSceneCreate");
sub_AddGXMethod("SUB" , "GXSceneWindowSize");
sub_AddGXMethod("SUB" , "GXSceneScale");
sub_AddGXMethod("SUB" , "GXSceneResize");
sub_AddGXMethod("SUB" , "GXSceneDestroy");
sub_AddGXMethod("SUB" , "GXCustomDraw");
sub_AddGXMethod("FUNCTION" , "GXCustomDraw");
sub_AddGXMethod("SUB" , "GXFrameRate");
sub_AddGXMethod("FUNCTION" , "GXFrameRate");
sub_AddGXMethod("FUNCTION" , "GXFrame");
sub_AddGXMethod("SUB" , "GXSceneDraw");
sub_AddGXMethod("SUB" , "GXSceneMove");
sub_AddGXMethod("SUB" , "GXScenePos");
sub_AddGXMethod("FUNCTION" , "GXSceneX");
sub_AddGXMethod("FUNCTION" , "GXSceneY");
sub_AddGXMethod("FUNCTION" , "GXSceneWidth");
sub_AddGXMethod("FUNCTION" , "GXSceneHeight");
sub_AddGXMethod("FUNCTION" , "GXSceneColumns");
sub_AddGXMethod("FUNCTION" , "GXSceneRows");
sub_AddGXMethod("SUB" , "GXSceneStart");
sub_AddGXMethod("SUB" , "GXSceneUpdate");
sub_AddGXMethod("SUB" , "GXSceneFollowEntity");
sub_AddGXMethod("SUB" , "GXSceneConstrain");
sub_AddGXMethod("SUB" , "GXSceneStop");
sub_AddGXMethod("SUB" , "GXMapCreate");
sub_AddGXMethod("FUNCTION" , "GXMapColumns");
sub_AddGXMethod("FUNCTION" , "GXMapRows");
sub_AddGXMethod("FUNCTION" , "GXMapLayers");
sub_AddGXMethod("SUB" , "GXMapLayerVisible");
sub_AddGXMethod("FUNCTION" , "GXMapLayerVisible");
sub_AddGXMethod("SUB" , "GXMapLayerAdd");
sub_AddGXMethod("SUB" , "GXMapLayerInsert");
sub_AddGXMethod("SUB" , "GXMapLayerRemove");
sub_AddGXMethod("SUB" , "GXMapResize");
sub_AddGXMethod("SUB" , "GXMapDraw");
sub_AddGXMethod("SUB" , "GXMapTilePosAt");
sub_AddGXMethod("SUB" , "GXMapTile");
sub_AddGXMethod("FUNCTION" , "GXMapTile");
sub_AddGXMethod("FUNCTION" , "GXMapTileDepth");
sub_AddGXMethod("SUB" , "GXMapTileAdd");
sub_AddGXMethod("SUB" , "GXMapTileRemove");
sub_AddGXMethod("FUNCTION" , "GXMapVersion");
sub_AddGXMethod("SUB" , "GXMapSave");
sub_AddGXMethod("SUB" , "GXMapLoad");
sub_AddGXMethod("FUNCTION" , "GXMapIsometric");
sub_AddGXMethod("SUB" , "GXMapIsometric");
sub_AddGXMethod("SUB" , "GXSpriteDraw");
sub_AddGXMethod("SUB" , "GXSpriteDrawScaled");
sub_AddGXMethod("SUB" , "GXTilesetCreate");
sub_AddGXMethod("SUB" , "GXTilesetReplaceImage");
sub_AddGXMethod("SUB" , "GXTilesetLoad");
sub_AddGXMethod("SUB" , "GXTilesetSave");
sub_AddGXMethod("SUB" , "GXTilesetPos");
sub_AddGXMethod("FUNCTION" , "GXTilesetWidth");
sub_AddGXMethod("FUNCTION" , "GXTilesetHeight");
sub_AddGXMethod("FUNCTION" , "GXTilesetColumns");
sub_AddGXMethod("FUNCTION" , "GXTilesetRows");
sub_AddGXMethod("FUNCTION" , "GXTilesetFilename");
sub_AddGXMethod("FUNCTION" , "GXTilesetImage");
sub_AddGXMethod("SUB" , "GXTilesetAnimationCreate");
sub_AddGXMethod("SUB" , "GXTilesetAnimationAdd");
sub_AddGXMethod("SUB" , "GXTilesetAnimationRemove");
sub_AddGXMethod("FUNCTION" , "GXTilesetAnimationFrames");
sub_AddGXMethod("FUNCTION" , "GXTilesetAnimationSpeed");
sub_AddGXMethod("SUB" , "GXTilesetAnimationSpeed");
sub_AddGXMethod("FUNCTION" , "GXFontCreate");
sub_AddGXMethod("SUB" , "GXFontCreate");
sub_AddGXMethod("FUNCTION" , "GXFontWidth");
sub_AddGXMethod("FUNCTION" , "GXFontHeight");
sub_AddGXMethod("FUNCTION" , "GXFontCharSpacing");
sub_AddGXMethod("SUB" , "GXFontCharSpacing");
sub_AddGXMethod("FUNCTION" , "GXFontLineSpacing");
sub_AddGXMethod("SUB" , "GXFontLineSpacing");
sub_AddGXMethod("SUB" , "GXDrawText");
sub_AddGXMethod("FUNCTION" , "GXDebug");
sub_AddGXMethod("SUB" , "GXDebug");
sub_AddGXMethod("FUNCTION" , "GXDebugScreenEntities");
sub_AddGXMethod("SUB" , "GXDebugScreenEntities");
sub_AddGXMethod("FUNCTION" , "GXDebugFont");
sub_AddGXMethod("SUB" , "GXDebugFont");
sub_AddGXMethod("FUNCTION" , "GXDebugTileBorderColor");
sub_AddGXMethod("SUB" , "GXDebugTileBorderColor");
sub_AddGXMethod("FUNCTION" , "GXDebugEntityBorderColor");
sub_AddGXMethod("SUB" , "GXDebugEntityBorderColor");
sub_AddGXMethod("FUNCTION" , "GXDebugEntityCollisionColor");
sub_AddGXMethod("SUB" , "GXDebugEntityCollisionColor");
sub_AddGXMethod("SUB" , "GXKeyInput");
sub_AddGXMethod("FUNCTION" , "GXKeyDown");
sub_AddGXMethod("SUB" , "GXDeviceInputDetect");
sub_AddGXMethod("FUNCTION" , "GXDeviceInputTest");
sub_AddGXMethod("FUNCTION" , "GXDeviceName");
sub_AddGXMethod("FUNCTION" , "GXDeviceTypeName");
sub_AddGXMethod("FUNCTION" , "GXInputTypeName");
sub_AddGXMethod("FUNCTION" , "GXKeyButtonName");
sub_AddGXConst("GX_CR");
sub_AddGXConst("GX_LF");
sub_AddGXConst("GX_CRLF");
sub_AddGXMethod("FUNCTION" , "GXSTR_LPad");
sub_AddGXMethod("FUNCTION" , "GXSTR_RPad");
sub_AddGXMethod("FUNCTION" , "GXSTR_Replace");
}
async function sub_InitQBMethods() {
if (QB.halted()) { return; }
sub_AddQBMethod("FUNCTION" , "_Alpha32");
sub_AddQBMethod("FUNCTION" , "_Atan2");
sub_AddQBMethod("FUNCTION" , "_Blue");
sub_AddQBMethod("FUNCTION" , "_Blue32");
sub_AddQBMethod("SUB" , "_Delay");
sub_AddQBMethod("FUNCTION" , "_FontWidth");
sub_AddQBMethod("FUNCTION" , "_Green");
sub_AddQBMethod("FUNCTION" , "_Green32");
sub_AddQBMethod("FUNCTION" , "_Height");
sub_AddQBMethod("FUNCTION" , "_InStrRev");
sub_AddQBMethod("SUB" , "_Limit");
sub_AddQBMethod("FUNCTION" , "_KeyDown");
sub_AddQBMethod("FUNCTION" , "_KeyHit");
sub_AddQBMethod("FUNCTION" , "_MouseButton");
sub_AddQBMethod("FUNCTION" , "_MouseInput");
sub_AddQBMethod("FUNCTION" , "_MouseX");
sub_AddQBMethod("FUNCTION" , "_MouseY");
sub_AddQBMethod("FUNCTION" , "_NewImage");
sub_AddQBMethod("FUNCTION" , "_Pi");
sub_AddQBMethod("SUB" , "_PrintString");
sub_AddQBMethod("FUNCTION" , "_PrintWidth");
sub_AddQBMethod("FUNCTION" , "_Red");
sub_AddQBMethod("FUNCTION" , "_Red32");
sub_AddQBMethod("FUNCTION" , "_RGB");
sub_AddQBMethod("FUNCTION" , "_RGB32");
sub_AddQBMethod("FUNCTION" , "_Round");
sub_AddQBMethod("FUNCTION" , "_ScreenExists");
sub_AddQBMethod("SUB" , "_Title");
sub_AddQBMethod("FUNCTION" , "_Trim");
sub_AddQBMethod("FUNCTION" , "_Width");
sub_AddQBMethod("FUNCTION" , "Abs");
sub_AddQBMethod("FUNCTION" , "Asc");
sub_AddQBMethod("FUNCTION" , "Atn");
sub_AddQBMethod("FUNCTION" , "Chr$");
sub_AddQBMethod("SUB" , "Circle");
sub_AddQBMethod("SUB" , "Cls");
sub_AddQBMethod("SUB" , "Color");
sub_AddQBMethod("FUNCTION" , "Command$");
sub_AddQBMethod("FUNCTION" , "Cos");
sub_AddQBMethod("FUNCTION" , "Exp");
sub_AddQBMethod("FUNCTION" , "Fix");
sub_AddQBMethod("SUB" , "Input");
sub_AddQBMethod("FUNCTION" , "InKey$");
sub_AddQBMethod("FUNCTION" , "InStr");
sub_AddQBMethod("FUNCTION" , "Int");
sub_AddQBMethod("FUNCTION" , "Left$");
sub_AddQBMethod("FUNCTION" , "LCase$");
sub_AddQBMethod("FUNCTION" , "Len");
sub_AddQBMethod("SUB" , "Line");
sub_AddQBMethod("SUB" , "Locate");
sub_AddQBMethod("FUNCTION" , "Log");
sub_AddQBMethod("FUNCTION" , "LTrim$");
sub_AddQBMethod("FUNCTION" , "Mid$");
sub_AddQBMethod("SUB" , "Print");
sub_AddQBMethod("SUB" , "PSet");
sub_AddQBMethod("FUNCTION" , "Right$");
sub_AddQBMethod("FUNCTION" , "RTrim$");
sub_AddQBMethod("FUNCTION" , "Rnd");
sub_AddQBMethod("SUB" , "Screen");
sub_AddQBMethod("FUNCTION" , "Sgn");
sub_AddQBMethod("FUNCTION" , "Sin");
sub_AddQBMethod("SUB" , "Sleep");
sub_AddQBMethod("FUNCTION" , "Sqr");
sub_AddQBMethod("FUNCTION" , "Str$");
sub_AddQBMethod("SUB" , "Swap");
sub_AddQBMethod("FUNCTION" , "Tan");
sub_AddQBMethod("FUNCTION" , "Timer");
sub_AddQBMethod("FUNCTION" , "UBound");
sub_AddQBMethod("FUNCTION" , "UCase$");
sub_AddQBMethod("FUNCTION" , "Val");
sub_AddSystemType("FETCHRESPONSE" , "ok:INTEGER,status:INTEGER,statusText:STRING,text:STRING");
sub_AddQBMethod("FUNCTION" , "Fetch");
sub_AddQBMethod("FUNCTION" , "FromJSON");
sub_AddQBMethod("FUNCTION" , "ToJSON");
}
this.compile = function(src) {
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;
};
};