diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index 382f8dfe..87648213 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -140,7 +140,7 @@ - + @@ -317,6 +317,14 @@ + + + + + + + + diff --git a/src/ce_cdbcmd.lfm b/src/ce_cdbcmd.lfm new file mode 100644 index 00000000..300fda24 --- /dev/null +++ b/src/ce_cdbcmd.lfm @@ -0,0 +1,271 @@ +inherited CECdbWidget: TCECdbWidget + Left = 1404 + Height = 589 + Top = 2 + Width = 496 + Caption = 'CDB commander' + ClientHeight = 589 + ClientWidth = 496 + inherited Back: TPanel + Height = 589 + Width = 496 + ClientHeight = 589 + ClientWidth = 496 + inherited Content: TPanel + Height = 589 + Width = 496 + ClientHeight = 589 + ClientWidth = 496 + object txtCdbCmd: TEdit[0] + Left = 4 + Height = 23 + Hint = 'CDB command field' + Top = 562 + Width = 488 + Align = alBottom + BorderSpacing.Around = 4 + OnKeyPress = txtCdbCmdKeyPress + TabOrder = 0 + end + object Panel1: TPanel[1] + Left = 4 + Height = 26 + Top = 4 + Width = 488 + Align = alTop + BorderSpacing.Around = 4 + BevelOuter = bvNone + ClientHeight = 26 + ClientWidth = 488 + TabOrder = 1 + object btnGo: TSpeedButton + Left = 60 + Height = 26 + Hint = 'resume execution' + Top = 0 + Width = 30 + Align = alLeft + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000024000000330000 + 002F000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000000000000000000000000000007D41C100C684FF0086 + 46ED000000290000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000024000000330000003300000033008847FF00E4A6FF00BE + 80FF008345D90000002100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00007D41C1008A48FF008847FF008746FF008847FF00D9A1FF00D8 + A0FF00BC80FF007C41B900000022FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00008947FF43E8C2FF00D7A0FF00D7A0FF00D59FFF00D09CFF00D0 + 9CFF00D39FFF00B981FF007E43BDFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00008845FF6FE8D0FF00C899FF00C899FF00C899FF00C797FF00C8 + 98FF00CA9AFF63E6CDFF008A47FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00008946FF99F0E4FF4FE9D5FF51E8D4FF4DE6D1FF94E8D8FF00C3 + 97FF60E0C7FF00B281FF008B49ACFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00008847B2008946FF008744FF008642FF008847FF82E4D6FF5ADA + C4FF00AD7FFF008947A700000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000000000000000000000000000008847FF7AE4D8FF00AA + 7FFF008946CF0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000000000000000000000000000008847B200AA85FF008A + 46E9000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + OnClick = btnGoClick + ShowCaption = False + end + object btnStop: TSpeedButton + Left = 30 + Height = 26 + Hint = 'stop debugging' + Top = 0 + Width = 30 + Align = alLeft + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF003941D64C444BD9D2474FDAF0434BD9E94048D7E93E47 + D8F0353ED5D2252ED254232BD206FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF004148D74C636CE4E48997FAFF8495FFFF7F90FCFF7D8EFAFF7D8D + F7FF7D8BF2FF5159DDFF222AD173FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF004E56DA4D6C75E4DF96A5FAFF5A74FFFF3250FFFF304FFFFF2C49FEFF2542 + FAFF4860F9FF8694F4FF5159DDDC252ED14DFFFFFF00FFFFFF00FFFFFF005E65 + DE4B7981E7E59FADFBFF6781FFFF405EFFFF405EFFFF3C59FFFF3755FFFF3350 + FFFF2846FDFF4A65FDFF8996F6FF545EDEE52C34D44BFFFFFF00FFFFFF007178 + E3D5A2B2FCFF738FFFFF4F70FFFF4F6EFFFF4B69FFFF4664FFFF415EFFFF3C5A + FFFF3755FFFF2C4BFFFF4E67FFFF8493FAFF4048D8D5FFFFFF00FFFFFF007D84 + E5F2A6BBFFFF5F7FFFFF5F7EFFFF5A79FFFF5573FFFF506EFFFF4B69FFFF4664 + FFFF415EFFFF3B59FFFF314FFFFF8799FFFF4D55DBF2FFFFFF00FFFFFF00858A + E6E9ABBEFFFF6D8DFFFF6989FFFF6583FFFF5F7EFFFF5A79FFFF5574FFFF506F + FFFF4B69FFFF4663FFFF3F5CFFFF8A9BFFFF535BDCE9FFFFFF00FFFFFF008B91 + E7EAB1C4FFFF7698FFFF7393FFFF6E8EFFFF6989FFFF6583FFFF5F7EFFFF5A79 + FFFF5573FFFF4F6EFFFF4867FFFF90A1FFFF5A62DEEAFFFFFF00FFFFFF009298 + E9F2B8CDFFFF7DA0FFFF7C9DFFFF7899FFFF7393FFFF6E8EFFFF6989FFFF6583 + FFFF607EFFFF5978FFFF4F70FFFF98AAFFFF636AE0F2FFFFFF00FFFFFF00959A + EAD4BCCDFCFF9CBBFFFF81A5FFFF81A2FFFF7C9EFFFF7899FFFF7493FFFF6F8E + FFFF6989FFFF6080FFFF7893FFFF9EADFBFF656CE0D4FFFFFF00FFFFFF009297 + E84AA5ACEFE4C1D1FCFFA0BFFFFF86AAFFFF85A7FFFF81A2FFFF7C9DFFFF7898 + FFFF6F90FFFF85A1FFFFACBAFBFF838BE8E46369DF4AFFFFFF00FFFFFF00FFFF + FF009396E849A6ADEEDFC4D4FCFFA3C2FFFF8BAFFFFF89ABFFFF84A7FFFF7EA0 + FFFF91AEFFFFB4C3FBFF8C93EADB6D71E04AFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF009498E84AA9B1F0E4C2D3FCFFC1D6FFFFBDD1FFFFBBCFFFFFB9CE + FFFFB7C8FCFF989FEDFF797EE272FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00999DEA4B9EA3EBD2A0A5ECF09DA2EBE99BA0EBE9989E + EAF09297E9D2868BE6538388E506FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + OnClick = btnStopClick + ShowCaption = False + end + object btnStart: TSpeedButton + Left = 0 + Height = 26 + Hint = 'start debuggin' + Top = 0 + Width = 30 + Align = alLeft + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00000000000000003300000030000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000329EDEFF319CDBF10000002D0000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000329AD8C4329DDEFF2F98D7E90000003300000006000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000339EDE5A329BDDFF67C6EEFF369FDEFF133D574A000000050000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000000000000000319ADBFF83D7F3FF89E4FAFF349CDCFF133951490000 + 001200000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000000000003196D7BA57BEEAFFA9F5FFFF7BDEF8FF369CDCFF2772 + A17B00000011000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000330000003321648F6B42A9E2FFBDF5FEFF81E7FBFF76DBF6FF379B + DCFF276F9E790000001A0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00389BDCFF48ACE4FF45A9E2FF3FA5E1FFBDF3FDFF7FE4F8FF7AE3FAFF70D9 + F5FF42A5E0FF2E81B7990000002200000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF003799DBFF9EF1FDFF80E5F9FF73E0F9FF6FDEF7FF6DDCF7FF6EDDF7FF71E0 + F9FF70DFF8FF40A6E0FF358DC8B900000023FFFFFF00FFFFFF00FFFFFF00FFFF + FF003794D6D285DCF5FF89E5F8FF68DAF6FF68DAF6FFB9F0FCFFB8F2FDFFB4F2 + FCFFA9F1FDFFABF1FCFF44A9E2FF3890CBBFFFFFFF00FFFFFF00FFFFFF00FFFF + FF003993D2856DC5ECFF9CE8FAFF5FD6F4FF61D7F4FF46B4E6FF3191D8FF3595 + DAFF3797DAFF3A99DBFF3E9CDCFF409EDDFFFFFFFF00FFFFFF00FFFFFF00FFFF + FF003E9BDC324CAEE4FFB0EEFBFF66D8F4FF57D3F3FFACEDFBFF63B4E5FF2D77 + AB8900000001000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000003B9ADAFFACEEFBFF82DDF5FF4CCEF1FF82DFF6FFABE6F8FF3996 + D9FF0711182D000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000003C94D5D28BDAF3FFACEAF9FF3FCBF0FF45CDF0FFBBF0FBFF6DBA + E7FF3B93D0D90000000E0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000003E93D1876CC5EBFFD7FAFFFFCDF6FDFFC3F3FDFFD2F8FFFFC6F1 + FBFF409ADAFF2D67916D0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000479CDC3A439ADAFF3F97D9FF3E96D9FF3E96D9FF3E97D9FF4099 + DAFF459CDBFF489EDCFF0000000000000000FFFFFF00FFFFFF00 + } + OnClick = btnStartClick + ShowCaption = False + end + object btnStep: TSpeedButton + Left = 90 + Height = 26 + Hint = 'next instruction' + Top = 0 + Width = 30 + Align = alLeft + Glyph.Data = { + 42020000424D4202000000000000420000002800000010000000100000000100 + 100003000000000200006400000064000000000000000000000000F80000E007 + 00001F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE73EF7B0000000000004D6B9294FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF7B18C6CF7B000000006D6B14A5FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF7B9AD6FBDECF7B00008E7334A5FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF7B18C6F7BD5DEFEF7BAE7355ADFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF7B96B575AD7DEFEF7BCF7B55ADFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF7B14A51CE7CF7B0000EF7B75ADFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF7B1CE7CF7B00000000108496B5FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1084EF7B0000000000003084B6B5FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF + } + OnClick = btnStepClick + ShowCaption = False + end + object btnDisasm: TSpeedButton + Left = 120 + Height = 26 + Hint = 'disasm' + Top = 0 + Width = 30 + Align = alLeft + Glyph.Data = { + 42020000424D4202000000000000420000002800000010000000100000000100 + 100003000000000200006400000064000000000000000000000000F80000E007 + 00001F0000000000000000000000000000000000000000000000000000000000 + 00000000FFFFCF7BD39CD39CD39CD39CD39CD39CD39CD39CD39CD39CD39CD39C + D39C3084FFFFD39CDFFFBEF7BEF7BEF7BEF7BEF7BEF7BEF7BEF7BEF7BEF7BEF7 + DFFFD39CFFFFD39C9EF75DEF5DEF5DEF7DEF9EF79EF79EF77DEF5DEF5DEF5DEF + 9EF7D39CFFFFD39C7DEF3CE73CE75DEFEB5A0C632C630C63EB5A5DEF3CE73CE7 + 7DEFD39CFFFFD39C7DEFFBDEFBDE1CE7DFFFFFFFFFFFFFFFDFFF3CE71CE7FBDE + 7DEFD39CFFFFD39C5DEFDBDEDBDE1CE78A52AA52AA52AA52AA528A521CE7FBDE + 5DEFD39CFFFFD39C5DEFBAD6BAD6DBDEDFFFFFFFFFFFFFFFFFFFBEF7FBDEDBDE + 7DEFD39CFFFFD39C5DEF9AD6BAD6DBDE2842494A494A494A494A28420842BAD6 + 5DEFD39CFFFFD39C5DEF79CEBAD6DBDEDFFFFFFFFFFFDFFFBEF79EF75DEF79CE + 5DEFD39CFFFFD39C7DEF79CEA631C739C739C739C739A63179CE59CE59CE38C6 + 5DEFD39CFFFFD39C7DEF38C69EF79EF79EF79EF79EF75DEF38C638C638C618C6 + 7DEFD39CFFFFD39C7DEFF7BDF7BDF7BDF7BDF7BDF7BDF7BDF7BDF7BDF7BDF7BD + 7DEFD39CFFFFD39C9EF7B6B5D7BDD7BDD7BDD7BDD7BDD7BDD7BDD7BDD7BDB6B5 + 9EF7D39CFFFFD39CDFFFFBDEFBDE1CE71CE71CE71CE71CE71CE71CE7FBDEFBDE + DFFFD39CFFFFF39CD39CD39CD39CD39CD39CD39CD39CD39CD39CD39CD39CD39C + D39CF39CFFFF + } + OnClick = btnDisasmClick + ShowCaption = False + end + end + object lstCdbOut: TListView[2] + Left = 4 + Height = 524 + Hint = 'CDB output' + Top = 34 + Width = 488 + Align = alClient + AutoWidthLastColumn = True + BorderSpacing.Left = 4 + BorderSpacing.Top = 4 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 4 + Columns = < + item + Caption = 'CDB output' + Width = 484 + end> + Font.Height = -11 + Font.Name = 'Lucida Console' + ParentFont = False + TabOrder = 2 + ViewStyle = vsReport + end + end + end + inherited contextMenu: TPopupMenu + left = 200 + top = 8 + end +end diff --git a/src/ce_cdbcmd.pas b/src/ce_cdbcmd.pas new file mode 100644 index 00000000..8519950a --- /dev/null +++ b/src/ce_cdbcmd.pas @@ -0,0 +1,223 @@ +unit ce_cdbcmd; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, + process, Menus, StdCtrls, ce_widget, ce_project, ce_interfaces, ce_observer, + asyncprocess, ComCtrls, Buttons, ce_common; + +type + + { TCECdbWidget } + TCECdbWidget = class(TCEWidget, ICEProjectObserver) + btnGo: TSpeedButton; + btnStep: TSpeedButton; + btnDisasm: TSpeedButton; + btnStop: TSpeedButton; + btnStart: TSpeedButton; + txtCdbCmd: TEdit; + lstCdbOut: TListView; + Panel1: TPanel; + procedure btnDisasmClick(Sender: TObject); + procedure btnGoClick(Sender: TObject); + procedure btnStartClick(Sender: TObject); + procedure btnStepClick(Sender: TObject); + procedure btnStopClick(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure txtCdbCmdKeyPress(Sender: TObject; var Key: char); + private + fCdbProc: TAsyncProcess; + fProject: TCEProject; + procedure cdbOutput(sender: TObject); + procedure cdbTerminate(sender: TObject); + procedure cdbOutputToGui; + procedure cdbFree; + public + constructor create(aOwner: TComponent); override; + destructor destroy; override; + // + procedure projNew(const aProject: TCEProject); + procedure projClosing(const aProject: TCEProject); + procedure projFocused(const aProject: TCEProject); + procedure projChanged(const aProject: TCEProject); + end; + +implementation +{$R *.lfm} + +uses + ce_main; + +{$REGION Standard Comp/Obj------------------------------------------------------} +constructor TCECdbWidget.create(aOwner: TComponent); +begin + inherited; + Enabled := exeInSysPath('cdb'); + if Enabled then + EntitiesConnector.addObserver(self); +end; + +destructor TCECdbWidget.destroy; +begin + if Enabled then begin + cdbFree; + EntitiesConnector.removeObserver(self); + end; + inherited; +end; +{$ENDREGION --------------------------------------------------------------------} + +{$REGION ICEProjectMonitor -----------------------------------------------------} +procedure TCECdbWidget.projNew(const aProject: TCEProject); +begin + fProject := aProject; +end; + +procedure TCECdbWidget.projClosing(const aProject: TCEProject); +begin + fProject := nil; +end; + +procedure TCECdbWidget.projFocused(const aProject: TCEProject); +begin + fProject := aProject; +end; + +procedure TCECdbWidget.projChanged(const aProject: TCEProject); +begin + fProject := aProject; +end; +{$ENDREGION --------------------------------------------------------------------} + +procedure TCECdbWidget.btnStartClick(Sender: TObject); +var + outname: string; +begin + if fProject = nil then exit; + outname := fProject.outputFilename; + if not fileExists(outname) then exit; + // + cdbFree; + fCdbProc := TAsyncProcess.create(nil); + fCdbProc.Executable := 'cdb'; + fCdbProc.Parameters.Add('-c'); + fCdbProc.Parameters.Add('"l+*;.lines"'); + fCdbProc.Parameters.Add(outname); + fCdbProc.CurrentDirectory := extractFilePath(outname); + fCdbProc.Options := [poNoConsole, poStderrToOutPut, poUsePipes]; + fCdbProc.OnReadData := @cdbOutput; + fCdbProc.OnTerminate := @cdbTerminate; + // + fCdbProc.Execute; +end; + +procedure TCECdbWidget.btnStepClick(Sender: TObject); +const + cmd = 'p'#13#10; +begin + if fCdbProc = nil then exit; + fCdbProc.Input.Write(cmd[1], length(cmd)); +end; + +procedure TCECdbWidget.btnGoClick(Sender: TObject); +const + cmd = 'g'#13#10; +begin + if fCdbProc = nil then exit; + fCdbProc.Input.Write(cmd[1], length(cmd)); +end; + +procedure TCECdbWidget.btnDisasmClick(Sender: TObject); +const + cmd = 'u'#13#10; +begin + if fCdbProc = nil then exit; + fCdbProc.Input.Write(cmd[1], length(cmd)); +end; + +procedure TCECdbWidget.btnStopClick(Sender: TObject); +begin + cdbFree; +end; + +procedure TCECdbWidget.Button2Click(Sender: TObject); +begin + +end; + +procedure TCECdbWidget.txtCdbCmdKeyPress(Sender: TObject; var Key: char); +var + inp: string; +begin + if (fCdbProc = nil) or (key <> #13) then + exit; + // + inp := CEMainForm.expandSymbolicString(txtCdbCmd.Text) + LineEnding; + fCdbProc.Input.Write(inp[1], length(inp)); + // + inp := lstCdbOut.Items.Item[lstCdbOut.Items.Count-1].Caption; + inp += CEMainForm.expandSymbolicString(txtCdbCmd.Text); + lstCdbOut.Items.Item[lstCdbOut.Items.Count-1].Caption := inp; + // + txtCdbCmd.Text := ''; +end; + +procedure TCECdbWidget.cdbOutputToGui; +var + str: TMemoryStream; + lst: TStringList; + cnt: Integer; + sum: Integer; +begin + if fCdbProc = nil then exit; + + cnt := 0; + sum := 0; + str := TMemoryStream.Create; + lst := TStringList.Create; + + while fCdbProc.Output.NumBytesAvailable <> 0 do + begin + str.Size := str.Size + 1024; + cnt := fCdbProc.Output.Read((str.Memory + sum)^, 1024); + sum += cnt; + end; + + str.Size := sum; + lst.LoadFromStream(str); + + for cnt := 0 to lst.Count-1 do + lstCdbOut.AddItem(lst.Strings[cnt], nil); + lstCdbOut.Items[lstCdbOut.Items.Count-1].MakeVisible(true); + + lst.Free; + str.Free; +end; + +procedure TCECdbWidget.cdbOutput(sender: TObject); +begin + cdbOutputToGui; +end; + +procedure TCECdbWidget.cdbTerminate(sender: TObject); +begin + cdbOutputToGui; + cdbFree; +end; + +procedure TCECdbWidget.cdbFree; +begin + if fCdbProc = nil then + exit; + // + if fCdbProc.Running then + fCdbProc.Terminate(0); + fCdbProc.Free; + fCdbProc := nil; +end; + +end. + diff --git a/src/ce_gdbcmd.lfm b/src/ce_gdbcmd.lfm deleted file mode 100644 index a8a3a906..00000000 --- a/src/ce_gdbcmd.lfm +++ /dev/null @@ -1,80 +0,0 @@ -inherited CEWidget1: TCEWidget1 - Left = 874 - Height = 589 - Top = 248 - Width = 499 - ClientHeight = 589 - ClientWidth = 499 - inherited Back: TPanel - Height = 589 - Width = 499 - ClientHeight = 589 - ClientWidth = 499 - inherited Content: TPanel - Height = 589 - Width = 499 - ClientHeight = 589 - ClientWidth = 499 - object lstGdbOut: TMemo[0] - Left = 4 - Height = 524 - Top = 61 - Width = 491 - Align = alClient - BorderSpacing.Around = 4 - Font.Height = -12 - Font.Name = 'Lucida Console' - ParentFont = False - ReadOnly = True - ScrollBars = ssBoth - TabOrder = 0 - end - object Edit1: TEdit[1] - Left = 4 - Height = 23 - Top = 34 - Width = 491 - Align = alTop - BorderSpacing.Around = 4 - OnKeyPress = Edit1KeyPress - TabOrder = 1 - end - object Panel1: TPanel[2] - Left = 4 - Height = 26 - Top = 4 - Width = 491 - Align = alTop - BorderSpacing.Around = 4 - Caption = 'Panel1' - ClientHeight = 26 - ClientWidth = 491 - TabOrder = 2 - object Button1: TButton - Left = 8 - Height = 25 - Top = 0 - Width = 75 - Caption = 'start' - OnClick = Button1Click - TabOrder = 0 - end - object Button2: TButton - Left = 88 - Height = 25 - Top = 0 - Width = 75 - Caption = 'stop' - OnClick = Button2Click - TabOrder = 1 - end - end - end - end - object IdleTimer1: TIdleTimer[2] - Interval = 100 - OnTimer = IdleTimer1Timer - left = 211 - top = 16 - end -end diff --git a/src/ce_gdbcmd.pas b/src/ce_gdbcmd.pas deleted file mode 100644 index caf573dd..00000000 --- a/src/ce_gdbcmd.pas +++ /dev/null @@ -1,163 +0,0 @@ -unit ce_gdbcmd; - -{$mode objfpc}{$H+} - -interface - -uses - Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, process, - Menus, StdCtrls, ce_widget, ce_project, ce_interfaces, ce_observer, asyncprocess; - -type - - { TCEWidget1 } - - TCEWidget1 = class(TCEWidget, ICEProjectObserver) - Button1: TButton; - Button2: TButton; - Edit1: TEdit; - IdleTimer1: TIdleTimer; - lstGdbOut: TMemo; - Panel1: TPanel; - procedure Button1Click(Sender: TObject); - procedure Button2Click(Sender: TObject); - procedure Edit1KeyPress(Sender: TObject; var Key: char); - procedure IdleTimer1Timer(Sender: TObject); - private - fGdbProc: TProcess; - fProject: TCEProject; - procedure gdbReadData(sender: TObject); - public - constructor create(aOwner: TComponent); override; - destructor destroy; override; - // - procedure projNew(const aProject: TCEProject); - procedure projClosing(const aProject: TCEProject); - procedure projFocused(const aProject: TCEProject); - procedure projChanged(const aProject: TCEProject); - end; - -implementation -{$R *.lfm} - -{$REGION Standard Comp/Obj------------------------------------------------------} -constructor TCEWidget1.create(aOwner: TComponent); -begin - inherited; - // - EntitiesConnector.addObserver(self); -end; - -destructor TCEWidget1.destroy; -begin - EntitiesConnector.removeObserver(self); - inherited; -end; -{$ENDREGION --------------------------------------------------------------------} - -{$REGION ICEProjectMonitor -----------------------------------------------------} -procedure TCEWidget1.projNew(const aProject: TCEProject); -begin - fProject := aProject; -end; - -procedure TCEWidget1.projClosing(const aProject: TCEProject); -begin - fProject := nil; -end; - -procedure TCEWidget1.projFocused(const aProject: TCEProject); -begin - fProject := aProject; -end; - -procedure TCEWidget1.projChanged(const aProject: TCEProject); -begin - fProject := aProject; -end; -{$ENDREGION --------------------------------------------------------------------} - - -procedure TCEWidget1.Button1Click(Sender: TObject); -var - outname: string; -begin - if fProject = nil then exit; - outname := fProject.outputFilename; - if not fileExists(outname) then exit; - // - fGdbProc := TProcess.create(nil); - fGdbProc.Executable := 'cdb'; - fGdbProc.Parameters.Add('-c'); - fGdbProc.Parameters.Add('"l+*;.lines"'); - fGdbProc.Parameters.Add(outname); - fGdbProc.CurrentDirectory := extractFilePath(outname); - fGdbProc.Options := fGdbProc.Options + [poStderrToOutPut, poUsePipes]; - //fGdbProc.OnReadData := @gdbReadData; - - fGdbProc.Execute; -end; - -procedure TCEWidget1.Button2Click(Sender: TObject); -begin - if fGdbProc = nil then exit; - fGdbProc.Terminate(0); - fGdbProc.Free; - fGdbProc := nil; -end; - -procedure TCEWidget1.Edit1KeyPress(Sender: TObject; var Key: char); -var - inp: string; -begin - if fGdbProc <> nil then - if Key = LineEnding[1] then - begin - inp := Edit1.Text + LineEnding; - fGdbProc.Input.Write( inp[1], length(inp) ); - end; - Edit1.Text := ''; -end; - -procedure TCEWidget1.IdleTimer1Timer(Sender: TObject); -begin - gdbReadData(nil); -end; - -procedure TCEWidget1.gdbReadData(sender: TObject); -var - str: TMemoryStream; - lst: TStringList; - cnt: Integer; - sum: Integer; -begin - - if fGdbProc = nil then exit; - - cnt := 0; - sum := 0; - str := TMemoryStream.Create; - lst := TStringList.Create; - - - while fGdbProc.Output.NumBytesAvailable <> 0 do - begin - str.Size := str.Size + 1024; - cnt := fGdbProc.Output.Read((str.Memory + sum)^, 1024); - sum += cnt; - end; - // cnt = 0; - - str.Size := sum; - lst.LoadFromStream(str); - lstGdbOut.Lines.AddStrings(lst); - lstGdbOut.VertScrollBar.Position := lstGdbOut.Lines.Count * 53; - - lst.Free; - str.Free; -end; - - - -end. - diff --git a/src/ce_main.pas b/src/ce_main.pas index 9aa2186c..637ca95e 100644 --- a/src/ce_main.pas +++ b/src/ce_main.pas @@ -11,7 +11,7 @@ uses ce_common, ce_dmdwrap, ce_project, ce_dcd, ce_plugin, ce_synmemo, ce_widget, ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf, ce_search, ce_staticexplorer, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_customtools, - ce_observer, ce_writableComponent, ce_toolseditor, ce_procinput; + ce_observer, ce_writableComponent, ce_toolseditor, ce_procinput, ce_cdbcmd; type @@ -190,6 +190,7 @@ type fFileMru: TMruFileList; fLibMan: TLibraryManager; fPrInpWidg: TCEProcInputWidget; + fCdbWidg: TCECdbWidget; fTools: TCETools; fRunProc: TAsyncProcess; @@ -465,6 +466,10 @@ begin fTlsEdWidg:= TCEToolsEditorWidget.create(self); fPrInpWidg:= TCEProcInputWidget.create(self); + {$IFDEF WIN32} + fCdbWidg := TCECdbWidget.create(self); + {$ENDIF} + fWidgList.addWidget(@fMesgWidg); fWidgList.addWidget(@fEditWidg); fWidgList.addWidget(@fProjWidg); @@ -476,6 +481,10 @@ begin fWidgList.addWidget(@fTlsEdWidg); fWidgList.addWidget(@fPrInpWidg); + {$IFDEF WIN32} + fWidgList.addWidget(@fCdbWidg); + {$ENDIF} + for widg in fWidgList do begin act := TAction.Create(self);