'
' ---------------------------------------------------------------------------
' Jacques Philippe                                                 April 2002
'
' Creates an RQ Include file with all the .BIN file in the selected directory ;
' some kind of Library. BinToInc Reads only one .BIN File, BinToInc_Plus
' Reads all the .BIN Files it Founds in the Selected Directory.
' ---------------------------------------------------------------------------
'
$INCLUDE "QREDEX.INC"
$INCLUDE "Qini_jp.Inc"
'
$ESCAPECHARS ON
$TYPECHECK ON
$INCLUDE "RAPIDQ.INC"
'
Declare Sub OnClose_frmBinToInc_Plus
Declare Sub OnClic_AnyMenu (Sender As QMenuItem)
Declare Sub CreateIncFile
'
CONST MAX_HEX_PER_LINE = 10
'
Sub DummyWndProc
End Sub
Create frmBinToInc_Plus As QForm
    Top = 200
    Left = 200
    Width = 1000
    height = 600
    Caption = "frmBinToInc_Plus V 1.0.0 " 
    AutoScroll = False
    WndProc = DummyWndProc
    OnClose = OnClose_frmBinToInc_Plus
    CREATE rchWin AS QRichEdit
        Align = alClient
        Font.Name = "courier"    
        Font.Size = 8
        Font.Color = &HFF0000
        Width = 200
        Height = 200
        ReadOnly = False
        WordWrap = False
        ScrollBars = ssBoth
        HideSelection = False 
        PlainText = True
    END CREATE
    CREATE Main AS QMAINMENU
        CREATE mnuFile AS QMENUITEM
            Caption = "&File"
            OnClick = OnClic_AnyMenu
            CREATE mnuOpenBin AS QMENUITEM
                Caption = "&Open a Bin"
                OnClick = OnClic_AnyMenu           
            END CREATE
            CREATE mnuSaveInc AS QMENUITEM
                Caption = "&Save as Inc"
                OnClick = OnClic_AnyMenu           
            END CREATE
        END CREATE
        CREATE mnuOptions AS QMENUITEM
            Caption = "&Options"
            OnClick = OnClic_AnyMenu
            CREATE mnuSaveCR_LF AS QMENUITEM
                Caption = "&Save CR_LF"
                OnClick = OnClic_AnyMenu
Visible = False
                CREATE mnuSaveSingleCR AS QMENUITEM
                    Caption = "&Single CR"
                    OnClick = OnClic_AnyMenu
                    RadioItem = True
                END CREATE
                CREATE mnuSaveCRandLF AS QMENUITEM
                    Caption = "&CR and LF"
                    OnClick = OnClic_AnyMenu
                    RadioItem = True
                END CREATE
            END CREATE
            CREATE mnuAddDeclareCallAsmProc As QMenuItem
                Caption = "&Add Declare CallAsmProc To RQ Inc"
                OnClick = OnClic_AnyMenu
            END CREATE
        END CREATE
    END CREATE
End Create
' Variables Globales
DefStr binFileName, binPathFile, incFileName, incPathFile, binDir, incDir, rchStr
Dim binFile As QFileStream
Dim incFile As QFileStream
DIM OpenDialog AS QOpenDialog
DIM SaveDialog AS QSaveDialog
Dim myIni As QIni
' Global Variables Initialisation
frmBinToInc_Plus.width = Val(myIni.Read ("formWidth", Str$(frmBinToInc_Plus.width)))
frmBinToInc_Plus.Height = Val(myIni.Read ("formHeight", Str$(frmBinToInc_Plus.Height)))
frmBinToInc_Plus.Top = Val(myIni.Read ("formTop", Str$(frmBinToInc_Plus.Top)))
frmBinToInc_Plus.Left = Val(myIni.Read ("formLeft", Str$(frmBinToInc_Plus.Left)))
'
incDir = myIni.Read ("incDir", "C:\\")
binDir = myIni.Read ("binDir", "C:\\")
mnuAddDeclareCallAsmProc.Checked = Val(myIni.Read("mnuAddDeclareCallAsmProc", Str$(True)))
' mnuSaveSingleCR.Checked = Val(myIni.Read ("saveWithSingleCR", Str$(False)))
' mnuSaveCRandLF.Checked = Val(myIni.Read ("saveWithCRandLF", Str$(True)))
mnuSaveSingleCR.Checked = False
mnuSaveCRandLF.Checked = True
'
Sub OnClose_frmBinToInc_Plus
    myIni.write ("formWidth", Str$(frmBinToInc_Plus.width))
    myIni.write ("formHeight", Str$(frmBinToInc_Plus.Height))
    myIni.write ("formTop", Str$(frmBinToInc_Plus.Top))
    myIni.write ("formLeft", Str$(frmBinToInc_Plus.Left))
'
    myIni.Write ("mnuAddDeclareCallAsmProc", Str$(mnuAddDeclareCallAsmProc.Checked))
'    myIni.Write ("saveWithSingleCR", Str$(mnuSaveSingleCR.Checked))
'    myIni.Write ("saveWithCRandLF", Str$(mnuSaveCRandLF.Checked))
    myIni.Write ("incDir", incDir)
    myIni.Write ("binDir", binDir)
    application.Terminate
    End
End Sub
'
' *************************************
frmBinToInc_Plus.ShowModal
' *************************************
'
Sub CreateIncFile
    DefStr sTmp, binStringed, functionName, arrayName
    DefInt binStringedSize, inFilePosition, N, P
    binFileName = Mid$(binPathFile, RInstr(binPathFile, "\\") + 1)
    functionName = Left$(binFileName, RInstr(binFileName, ".") - 1)
    arrayName = functionName & "Array"
    functionName = Ucase$(Left$(functionName, 1)) & Mid$(functionName, 2)
    incFileName = functionName & ".Inc"
    ' LOAD BIN CODE IN A STRING
    ' Load Assembly Code In a String
    binFile.Open (binPathFile, fmOpenRead)
        binStringedSize = binFile.Size
        binStringed = binFile.ReadBinStr(binStringedSize)
    binFile.Close
    sTmp = "\' ============================================================\n"
    rchStr = rchStr + sTmp
    ' array
    sTmp = "\' ----- START ASM " & functionName & " -----\nDefByte " & arrayName _
                        & " (0 To " & Str$(binStringedSize - 1) & ") = _\n   { _\n    "
    rchStr = rchStr + sTmp
    P = 0
    For N = 1 To binStringedSize
        If P = MAX_HEX_PER_LINE Then
            P = 0
            rchStr = rchStr + " _\n    "
        End If    
        rchStr = rchStr + "&H" & Right$ (Hex$ (Asc (binStringed[N]) ), 2)
        If n <> binStringedSize Then
            rchStr = rchStr + ", "
            Inc P
        End If
    Next N
    sTmp = " _\n   }\n\' ----- END ASM " & functionName & " -----\n\'\n"
    rchStr = rchStr + sTmp
    ' Pointer
    rchStr = rchStr + "\' ----- POINTER to use In CallAsmProc -----\n"
    rchStr = rchStr + "\'       A Bit Faster than Calling " & functionName & "\n"
    rchStr = rchStr + "DefInt ptr" & functionName & "\n"
    rchStr = rchStr + "ptr" & functionName & " = VarPtr (" & arrayName & "(0))\n\'\n"
    ' function
    sTmp = "\' ----- RQ CALL " & functionName & " -----\n"
    rchStr = rchStr + sTmp
    sTmp = "Function " & functionName & " (Arg1 As Long, Arg2 As Long, Arg3 As Long, _" _
                            & "\n                                         Arg4 As Long) as Long\n"
    rchStr = rchStr + sTmp
    sTmp = "    Result = CallAsmProc (ptr" & functionName & ", Arg1, Arg2, Arg3, Arg4)\n"
    rchStr = rchStr + sTmp
    rchStr = rchStr + "End Function\n\'\n"
    sTmp = "\' ============================================================\n\'\n"
    rchStr = rchStr +  (sTmp)
    rchWin.Text = rchStr
End Sub
'
Sub OnClic_AnyMenu (Sender)
    DefStr strFile
    DefInt iTmp
    Select Case Sender.Handle
        Case mnuOpenBin.Handle
            OpenDialog.Caption = "Select A BIN File"
            OpenDialog.InitialDir = binDir
            OpenDialog.Filter = "ASM RQ Binary files|*.BIN;*.COM|All Files|*.*"
            OpenDialog.FilterIndex = 1
            IF OpenDialog.Execute = False THEN
                ShowMessage ("ERROR IN OPENDIALOG,\nNOTHING DONE")
                Exit Sub
            END IF
            binPathFile = OpenDialog.Filename
            binDir = Left$(binPathFile, RInstr(binPathFile, "\\"))
            myIni.Write ("binDir", binDir)
            ' Include CallBinProc In the asm.Inc
            ' ShowMessage
            If mnuAddDeclareCallAsmProc.Checked = True Then
                rchStr = "\'\nDECLARE FUNCTION CallAsmProc LIB \"user32\" ALIAS \"CallWindowProcA\" _" _
                                   & "\n           (Proc AS LONG, A1 AS LONG, A2 AS LONG, A3 AS LONG, _" _ 
                                   & "\n           A4 AS LONG) AS LONG\n\'\n"
            Else
                rchStr = "\'\n"                
            End If
            binPathFile = Dir$ ((binDir & "*.BIN"), 0)
            'ShowMessage (binPathFile)
            While binPathFile <> ""
                CreateIncFile
                binPathFile = Dir$
            Wend
        Case mnuSaveInc.Handle
            SaveDialog.Caption = "Save As  *.Inc;*.rq;*.Rql"
            SaveDialog.InitialDir = incDir
            SaveDialog.Filter = "RQ Include files|*.INC;*.RQ;*.RQL|All Files|*.*"
            SaveDialog.FilterIndex = 1
            SaveDialog.fileName = incPathFile
            IF SaveDialog.Execute = False THEN
                ShowMessage ("ERROR IN SAVEDIALOG,\nNOTHING DONE")
                Exit Sub
            END IF
            incPathFile = SaveDialog.Filename
            incDir = Left$(incPathFile, Rinstr(incPathFile, "\\"))
            myIni.Write ("incDir", incDir)
            strFile = rchWin.Text
            If mnuSaveCRandLF.Checked = True Then
                strFile = ReplaceSubStr$(strFile, "\n", "\r\n")
            End If
            incFile.Open (incPathFile, fmCreate)
                incFile.Write (strFile)
            incFile.Close
        Case mnuOptions.Handle
            Case mnuSaveCR_LF.Handle
                Case mnuSaveSingleCR.Handle
                    mnuSaveSingleCR.Checked = True
                    myIni.Write ("saveWithSingleCR", Str$(mnuSaveSingleCR.Checked))
                Case mnuSaveCRandLF.Handle
                    mnuSaveCRandLF.Checked = True
                    myIni.Write ("saveWithCRandLF", Str$(mnuSaveCRandLF.Checked))
            Case mnuAddDeclareCallAsmProc.Handle
                iTmp = mnuAddDeclareCallAsmProc.Checked
                If iTmp = True Then
                    mnuAddDeclareCallAsmProc.Checked = False
                    myIni.Write ("mnuAddDeclareCallAsmProc", Str$(False))
                Else
                    mnuAddDeclareCallAsmProc.Checked = True
                    myIni.Write ("mnuAddDeclareCallAsmProc", Str$(True))
                End If
    End Select
End Sub
