diff --git a/app/src/gbs3/.project b/app/src/gbs3/.project index 889c10ad7..610ed4fe5 100644 --- a/app/src/gbs3/.project +++ b/app/src/gbs3/.project @@ -8,8 +8,8 @@ Component=gb.eval Component=gb.pcre Description="Gambas Script" Authors="Fabien Bodard, Benoit Minisini, Brian G" -Arguments=[["--help"],["--use","'gb.notify,gb.web'","-e","For i as Integer = 0 To 10:Print \"Hello World\":Next"],["~/bin/who"],["-c","-T","~/bin/mytest"],["-v","TestApp"],["--verbose","TestAppWithMain"],["--verbose","TestLazyApp"],["-c","~/testerror.gbs"],["~/Scripts/TestQuoteAtEnd"],["-c","~/Scripts/AForm"],["-c","-v","-w","~/Scripts/GambasHelpSearch"],["-c","-v","-w","~/Scripts/AMain"],["-c","-v","-w","~/Scripts/gshoutput"],["-c","-v","-w","~/Scripts/TestSets/TestWebApp.gbs"],["--convert-project","~/Projects/TestPrograms/testerror"],["--convert-project","~/Projects/TestPrograms/testusingtxthighlight","~/Scripts/TestSets"],["-c","-v","~/Scripts/TestSets/testusingtxthighlight.gbs"],["-l","library"],["-c","-v","-w","~/Scripts/TestScripterNoMain"],["-c","-v","-w","~/Scripts/TestGUI.gbs"],["-c","-v","-w","~/Scripts/TestSets/CPU_Test.gbs"],["-c","-v","-w","~/Scripts/TestSets/TestWebPage.gbs"],["-c","-v","-w","--convert-script","~/Scripts/TestSets/CPU_Test.gbs","~/Scripts"],["-c","-v","-w","~/Scripts/CPU_Test"],["-c","-v","-w","-p","~/Scripts/TestPlugin","~/myplugins"],["-c","-v","-w","~/Scripts/RunComponent"],["-c","-v","-w","~/Scripts/testshell.gbs"],["-v","~/Projects/TestTimer"],["-c","-v","-w","~/gbs3testwithclass.gbs"],["-c","-v","-w","/home/brian/Scripts/testLocalStatic.gbs"]] -CurrentArgumentList=["-c","-v","-w","/home/brian/Scripts/testLocalStatic.gbs"] +Arguments=[["--help"],["--use","'gb.notify,gb.web'","-e","For i as Integer = 0 To 10:Print \"Hello World\":Next"],["~/bin/who"],["-c","-T","~/bin/mytest"],["-v","TestApp"],["--verbose","TestAppWithMain"],["--verbose","TestLazyApp"],["-c","~/testerror.gbs"],["~/Scripts/TestQuoteAtEnd"],["-c","~/Scripts/AForm"],["-c","-v","-w","~/Scripts/GambasHelpSearch"],["-c","-v","-w","~/Scripts/AMain"],["-c","-v","-w","~/Scripts/gshoutput"],["-c","-v","-w","~/Scripts/TestSets/TestWebApp.gbs"],["--convert-project","~/Projects/TestPrograms/testerror"],["--convert-project","~/Projects/TestPrograms/testusingtxthighlight","~/Scripts/TestSets"],["-c","-v","~/Scripts/TestSets/testusingtxthighlight.gbs"],["-l","library"],["-c","-v","-w","~/Scripts/TestScripterNoMain"],["-c","-v","-w","~/Scripts/TestGUI.gbs"],["-c","-v","-w","~/Scripts/TestSets/CPU_Test.gbs"],["-c","-v","-w","~/Scripts/TestSets/TestWebPage.gbs"],["-c","-v","-w","--convert-script","~/Scripts/TestSets/CPU_Test.gbs","~/Scripts"],["-c","-v","-w","~/Scripts/CPU_Test"],["-c","-v","-w","-p","~/Scripts/TestPlugin","~/myplugins"],["-c","-v","-w","~/Scripts/RunComponent"],["-c","-v","-w","~/Scripts/testshell.gbs"],["-v","~/Projects/TestTimer"],["-c","-v","-w","~/gbs3testwithclass.gbs"],["-c","-v","-w","/home/brian/Scripts/testLocalStatic.gbs"],["-c","-v","-w","TestExternStructNoMain.gbs"],["-c","-v","-w","TestExternStructWithMain.gbs"]] +CurrentArgumentList=["-c","-v","-w","TestExternStructWithMain.gbs"] TabSize=2 Translate=1 Language=en_US diff --git a/app/src/gbs3/.src/Context.class b/app/src/gbs3/.src/Context.class index 7230b1fee..8fae7d4b8 100644 --- a/app/src/gbs3/.src/Context.class +++ b/app/src/gbs3/.src/Context.class @@ -13,12 +13,13 @@ Public $bArchiveOutput As Boolean = False ' Indicates that the user want Public $bScriptSourceStdIn As Boolean = False ' If file name is - or no filename is provided input from file.in(stdin) -Public $sPreambleHeader As String ' contains comments and such to be put before the file +Public $sPreambleHeader As String ' contains comments and such to be put before the file Public $sProgramHeader As String ' Contains statements and variable definitions needed before pubic sub main is defined +Public $sExternals As String ' Contains all the externals defined in a script Public $sCompilerOptions As String ' Contains all the compiler options -- fast, unsafe etc -Public $sStructures As String ' Public structs that are global and outside and before the public sub main definition -Public $sFinalProgram As String ' The final program Assembled from the script file to be written before compile is invoked -Public $bClassAsStartup As Boolean = False ' This indicates that the startup is a class not a module we create +Public $sStructures As String ' Public structs that are global and outside and before the public sub main definition +Public $sFinalProgram As String ' The final program Assembled from the script file to be written before compile is invoked +Public $bClassAsStartup As Boolean = False ' This indicates that the startup is a class not a module we create Public $bBuildOnly As Boolean ' add support to have scripter build the project only and print out the source files 'Public $bPrecompiler As Boolean ' precompiler is enabled on the command line programs {i}var1 = 3 -> Dim Var1 as integer : var1 = 3 diff --git a/app/src/gbs3/.src/GenerateFiles.module b/app/src/gbs3/.src/GenerateFiles.module index 9a33cd2d6..11d62d709 100644 --- a/app/src/gbs3/.src/GenerateFiles.module +++ b/app/src/gbs3/.src/GenerateFiles.module @@ -41,6 +41,9 @@ Public Sub _Call($oContext As Context, Path As String, sPrjPath As String) 'If Not cReader.bModuleStartup Then If cReader.IsMainDefined() Then $oContext.$sFinalProgram = cReader.GetProgram() + Verbose("Before Compile--------------------------------------------------") + Verbose(MakeListing.GenListing($oContext, $oContext.$sFinalProgram)) + Verbose("_____________________________________________") Else If cReader.HasPublicOrSub() Then cReader.DisplayWarnings() If $oContext.$bAllowLazyScript Then diff --git a/app/src/gbs3/.src/GenerateFromLazyScript.module b/app/src/gbs3/.src/GenerateFromLazyScript.module index 1610d16be..ccfa55d14 100644 --- a/app/src/gbs3/.src/GenerateFromLazyScript.module +++ b/app/src/gbs3/.src/GenerateFromLazyScript.module @@ -1,8 +1,8 @@ ' Gambas module file -Private aDefWords As Collection = ["PUBLIC": True, "STATIC": True, "STRUCT": True, "FAST": True, "UNSAFE": True, "PRIVATE": True, "ENUM": True] +Private aDefWords As Collection = ["PUBLIC": True, "STATIC": True, "STRUCT": True, "FAST": True, "UNSAFE": True, "PRIVATE": True, "ENUM": True, "EXTERN": True, "CONST": True] Private aDefFunc As Collection = ["SUB": True, "PROCEDURE": True, "FUNCTION": True] -Private aSpecial As Collection = ["STRUCT": True, "ENUM": True] +Private aSpecial As Collection = ["STRUCT": True, "ENUM": True, "EXTERN": True, "CONST": True] Private $iAdjustedOffset As Integer @@ -45,12 +45,21 @@ Public Sub _call(oContext As Context, Program As Reader) As String If s = "ENUM" Then Dim DefEnum As String = ProcessVariable(Program, i - $iAdjustedOffset) If Upper(DefEnum) Begins "ENUM" Then DefEnum = "Public " & DefEnum - DefOutPut &= DefEnum & "\n" + oContext.$sProgramHeader &= DefEnum & "\n" + Break + Else If s = "CONST" Then + Dim DefConst As String = ProcessVariable(Program, i - $iAdjustedOffset) + If Upper(DefCONST) Begins "CONST" Then DefConst = "Public " & DefConst + oContext.$sProgramHeader &= DefConst & "\n" + Break + Else If s = "EXTERN" Then + Dim DefExtern As String = AdjustProgram(Program, i - $iAdjustedOffset, i - $iAdjustedOffset) + oContext.$sExternals &= DefExtern & "\n" Break Else Dim DefStruct As String = ProcessBlock(Program, i - $iAdjustedOffset, ["END", "STRUCT"]) If Upper(DefStruct) Begins "STRUCT" Then DefStruct = "Public " & DefStruct - DefOutPut &= DefStruct & "\n" + oContext.$sStructures &= DefStruct & "\n" Break Endif Endif @@ -59,7 +68,7 @@ Public Sub _call(oContext As Context, Program As Reader) As String MainOutPut &= Program.ProgramLines.Join("\n") & "\nEND\n" Verbose("Before Compile--------------------------------------------------") - Verbose(MakeListing.GenListing(oContext, DefOutput & MainOutPut)) + Verbose(MakeListing.GenListing(oContext, oContext.$sProgramHeader & oContext.$sStructures & oContext.$sExternals & DefOutput & MainOutPut)) Verbose("_____________________________________________") Return DefOutput & MainOutPut diff --git a/app/src/gbs3/.src/MakeVirtualProject.module b/app/src/gbs3/.src/MakeVirtualProject.module index 943e2b334..f8d441a3c 100644 --- a/app/src/gbs3/.src/MakeVirtualProject.module +++ b/app/src/gbs3/.src/MakeVirtualProject.module @@ -14,6 +14,7 @@ Public Sub _Call($oContext As Context, sPath As String, Optional sProjectLocatio $oContext.$sStructures = "" $oContext.$sProgramHeader = "" $oContext.$sCompilerOptions = "" + $oContext.$sExternals = "" If $oContext.$bCreateProject Then Dim sPathInfo As String = File.Dir(sPath) @@ -102,6 +103,7 @@ Public Sub _Call($oContext As Context, sPath As String, Optional sProjectLocatio If $oContext.$sPreambleHeader <> "" Then Print #$hOutFile, $oContext.$sPreambleHeader If $oContext.$sCompilerOptions <> "" Then Print #$hOutFile, $oContext.$sCompilerOptions If $oContext.$sStructures <> "" Then Print #$hOutFile, $oContext.$sStructures + If $oContext.$sExternals <> "" Then Print #$hOutFile, $oContext.$sExternals If $oContext.$sProgramHeader <> "" Then Print #$hOutFile, $oContext.$sProgramHeader If $oContext.$bPlugin Then Print #$hOutFile, PluginInfo() If $oContext.$sFinalProgram <> "" Then Print #$hOutFile, $oContext.$sFinalProgram diff --git a/app/src/gbs3/.src/Reader.class b/app/src/gbs3/.src/Reader.class index da29c3890..4c32244cf 100644 --- a/app/src/gbs3/.src/Reader.class +++ b/app/src/gbs3/.src/Reader.class @@ -99,7 +99,8 @@ Private Sub GetFile(SourceFile As String) As String End -Private $cKeywords As Collection = ["PRIVATE": True, "PUBLIC": True, "STATIC": True, "SUB": True, "FUNCTION": True, "PROCEDURE": True, "STRUCT": True, "ENUM": True, "CLASSREF": True] +Private $cKeywords As Collection = ["PRIVATE": True, "PUBLIC": True, "STATIC": True, "SUB": True, "FUNCTION": True, "PROCEDURE": True, "STRUCT": True, "ENUM": True, "CLASSREF": True, + "EXTERN": True, "CONST": True] Private $cFuncDef As Collection = ["SUB": True, "FUNCTION": True, "PROCUDURE": True] Private $cAllowedInSub As Collection = ["STATIC": True] diff --git a/app/src/gbs3/TestExternStructNoMain.gbs b/app/src/gbs3/TestExternStructNoMain.gbs new file mode 100644 index 000000000..3e042b2a4 --- /dev/null +++ b/app/src/gbs3/TestExternStructNoMain.gbs @@ -0,0 +1,62 @@ +#!/usr/bin/gbs3 +' Gambas module file + +Public Struct newit + x[20] As Byte +End Struct + +Public Struct byeit + c As Integer + b As Float + e[20] As Struct Newit +End Struct + +Public Struct Hello + b As Integer + c As Integer + d As Long + e As Float + f As Struct Byeit + g[20] As Struct Byeit +End Struct + +Enum er, et, ey = 20 + +' We will use memcpy for two purposes , get the real address of the data, actually copy the data +Extern memcpy(dest As Hello, src As Hello, len As Integer) As Pointer In "libc:6" +Extern Arraymemcpy(dest As Pointer, src As Pointer, len As Integer) As Pointer In "libc:6" Exec "memcpy" +Const unitcount As Integer = 20 + +Public b As Struct Hello +Public c[20] As Struct Hello + +Sub test() + 'Static xx As Struct Hello + Print "Test Sub" +End + +'Public Sub Main() + b.b = 43 + Dim a As Variant = b + Dim e As Hello = c[1] ' these just set pointers + Dim f As Hello = c[2] + Dim g As Hello = c[3] + g.d = 500 + g.e = 3.67 + c[3].g[0].e[0].x[0] = 32 + ' Calc Struct length do pointer math c[1]-c[0] + Dim iStructLen As Integer = memcpy(c[1], c[1], 0) - memcpy(c[0], c[0], 0) + + Print "Struct len = "; iStructLen, "Dest Values before copy ", f.d, f.e, f.g[0].e[0].x[0] + 'Copy one entry to another + memcpy(f, g, iStructLen) + Print c[2].d, c[2].e, c[2].g[0].e[0].x[0] ' g = c[3] f = c[2] + a.b = 45 + + Print a.b, b.b + ' Display the actual address Of Each element And root + Print memcpy(a, a, 0), memcpy(b, b, 0), arraymemcpy(VarPtr(c), VarPtr(c), 0), memcpy(e, e, 0), memcpy(f, f, 0), memcpy(g, g, 0) + Print VarPtr(a), VarPtr(b), VarPtr(c) + Print "Hello world" + +'End diff --git a/app/src/gbs3/TestExternStructWithMain.gbs b/app/src/gbs3/TestExternStructWithMain.gbs new file mode 100644 index 000000000..e27cac99a --- /dev/null +++ b/app/src/gbs3/TestExternStructWithMain.gbs @@ -0,0 +1,62 @@ +#!/usr/bin/gbs3 +' Gambas module file + +Public Struct newit + x[20] As Byte +End Struct + +Public Struct byeit + c As Integer + b As Float + e[20] As Struct Newit +End Struct + +Public Struct Hello + b As Integer + c As Integer + d As Long + e As Float + f As Struct Byeit + g[20] As Struct Byeit +End Struct + +Enum er, et, ey = 20 + +' We will use memcpy for two purposes , get the real address of the data, actually copy the data +Extern memcpy(dest As Hello, src As Hello, len As Integer) As Pointer In "libc:6" +Extern Arraymemcpy(dest As Pointer, src As Pointer, len As Integer) As Pointer In "libc:6" Exec "memcpy" +Const unitcount As Integer = 20 + +Public b As Struct Hello +Public c[20] As Struct Hello + +Sub test() + 'Static xx As Struct Hello + Print "Test Sub" +End + +Public Sub Main() + b.b = 43 + Dim a As Variant = b + Dim e As Hello = c[1] ' these just set pointers + Dim f As Hello = c[2] + Dim g As Hello = c[3] + g.d = 500 + g.e = 3.67 + c[3].g[0].e[0].x[0] = 32 + ' Calc Struct length do pointer math c[1]-c[0] + Dim iStructLen As Integer = memcpy(c[1], c[1], 0) - memcpy(c[0], c[0], 0) + + Print "Struct len = "; iStructLen, "Dest Values before copy ", f.d, f.e, f.g[0].e[0].x[0] + 'Copy one entry to another + memcpy(f, g, iStructLen) + Print c[2].d, c[2].e, c[2].g[0].e[0].x[0] ' g = c[3] f = c[2] + a.b = 45 + + Print a.b, b.b + ' Display the actual address Of Each element And root + Print memcpy(a, a, 0), memcpy(b, b, 0), arraymemcpy(VarPtr(c), VarPtr(c), 0), memcpy(e, e, 0), memcpy(f, f, 0), memcpy(g, g, 0) + Print VarPtr(a), VarPtr(b), VarPtr(c) + Print "Hello world" + +End