From 7f00bb6805343062a7d8367c95102e6276bd0c42 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Fri, 5 Aug 2011 13:04:52 +0200 Subject: [PATCH] Squashed commit of the following: commit 7426db160fa410a90510309563a80779ca65d793 Author: Merlijn Wajer Date: Fri Aug 5 11:40:27 2011 +0200 Lape: Update HEAD. commit 6fa1740ea74f3777acd112370f232496898e533d Author: Niels Date: Thu Aug 4 23:07:35 2011 +0200 Simba compiles again now. commit 27b1c42b6a0dd09c4ee89822b631f94a92b265e5 Author: Niels Date: Thu Aug 4 00:31:28 2011 +0200 Little bugfix in lape wrapper generator + new wrappers. commit f46f841658bf81abb0c3101c0a4074d5c55873bd Author: Niels Date: Thu Aug 4 00:00:54 2011 +0200 Commented functions that cannot be imported yet for lape. commit b7aa543b6b477ea7befe6b4690e24a2d1b5bb1ab Author: Niels Date: Wed Aug 3 23:54:54 2011 +0200 New lape wrappers. commit ecfc435fab34f9c12ef2459141120ac7122ddfd2 Author: Niels Date: Wed Aug 3 23:49:54 2011 +0200 Fixed a bug in lape wrapper generation. commit 2d9d65000b78c6e77da5ee30cce33c9b7f8ed487 Author: Merlijn Wajer Date: Wed Aug 3 21:52:01 2011 +0200 Lape: Most types added. Interpreter starts. Lacks a few methods, but most tests just work. :-) commit bf0f806ecfe0abec8d43103dc87c366ca54c96c0 Author: Niels Date: Wed Aug 3 21:06:56 2011 +0200 Added debug message for when initializing the interpreter fails. commit a143016beb8ec9b0c92ad697ab4575cf6b23bbba Author: Merlijn Wajer Date: Wed Aug 3 20:30:11 2011 +0200 Lape-wrappers: Fix by nielsie95. commit 9deb9a1b67d97215d22bbe132d625ea7e9faa363 Author: Merlijn Wajer Date: Wed Aug 3 20:29:48 2011 +0200 Lape: Add wrappers. commit 510674570b4ee997b134ccef84e0bd353e389f8b Author: Merlijn Wajer Date: Wed Aug 3 20:12:26 2011 +0200 Lape: Update HEAD. commit 8260840b896b5db6fb07efdeb41b032cc7efeea7 Author: Merlijn Wajer Date: Wed Aug 3 14:34:48 2011 +0200 Lape: Update HEAD. commit 64bf115d3050c05efd758ce66c27f683b67faa2f Merge: 0701e91 aaafd6b Author: Merlijn Wajer Date: Mon Aug 1 19:26:15 2011 +0200 Merge branch 'master' into lape-integration commit 0701e911d122819cd2e88e87eb2fc0890aac4ef0 Merge: 26693f7 a20a31a Author: Merlijn Wajer Date: Sun Jul 31 18:11:58 2011 +0200 Merge branch 'master' into lape-integration commit 26693f7d4d2165585a40563a22ad94707463705c Merge: e124ae3 da0de6e Author: Merlijn Wajer Date: Sat Jul 30 00:16:12 2011 +0200 Merge branch 'master' into lape-integration commit e124ae396a3069b577e0a4cd47dc5b793ee323cf Merge: 4c6f304 c1051ef Author: Merlijn Wajer Date: Thu Jul 28 20:53:01 2011 +0200 Merge branch 'lape-integration' of github.com:MerlijnWajer/Simba into lape-integration commit 4c6f30462cc987ece159e9a4e1acdaf822da2670 Author: Merlijn Wajer Date: Thu Jul 28 20:52:13 2011 +0200 Lape: Update head. commit 2d8fdc4d7afa5a6c91d069316f7779a5baac71a3 Author: Merlijn Wajer Date: Thu Jul 28 20:08:01 2011 +0200 Lape: Add Wrappers project. commit e4f8e06f1c870cc42055c0517cf684c36195625f Merge: 7228a88 1fd51ff Author: Merlijn Wajer Date: Thu Jul 28 20:03:39 2011 +0200 Merge branch 'master' into lape-integration Conflicts: Projects/Simba/Simba.inc commit c1051efbeba009e6ad233b63d6f120fda2abc306 Merge: 7228a88 b83a277 Author: Merlijn Wajer Date: Sat Jul 23 13:41:15 2011 -0700 Merge pull request #30 from Dgby714/lape-integration TLPThread Update commit 7228a888c4f38e2a851e6fc940e662af18f66541 Merge: ad2e3ca e63dcbc Author: Merlijn Wajer Date: Sat Jul 23 21:54:58 2011 +0200 Merge branch 'master' into lape-integration Conflicts: Projects/Simba/Simba.inc Projects/Simba/simbaunit.pas Units/lape commit b83a27750258298454bbe99097cab47cddd4d6f2 Author: John P (Dgby714) Date: Thu Jul 7 12:22:51 2011 -0400 TLPThread Update - Init Result to False in OnHandleDirective. - Override lape _writeln, Now adds to Debug memo. commit ad2e3ca3c34f11c7645d67f49d8dbfd388771d07 Merge: 1a22452 c79eadf Author: Merlijn Wajer Date: Sat Jun 25 15:50:58 2011 -0700 Merge pull request #25 from Dgby714/la-pe Lape commit 1a224529f3b76c9dc6cdb98a57c3b50f769cf8c7 Merge: 5dc7611 89f1a9b Author: Merlijn Wajer Date: Sun Jun 26 00:49:03 2011 +0200 Merge branch 'master' into lape-integration commit c79eadf1efffd590801e9513fdb55ea3f6a39102 Author: John P (Dgby714) Date: Sat Jun 25 18:43:17 2011 -0400 TLPThread update, Uncommented Lape Defines commit 4d15ee07d5d25998f747723cc723dda3bd565029 Merge: 89f1a9b 5dc7611 Author: John P (Dgby714) Date: Sat Jun 25 17:23:24 2011 -0400 Merge branch 'lape-integration' of git://github.com/MerlijnWajer/Simba into la-pe commit 5dc7611dba70cfd9f0ad069daabe2f595ff4dc9d Author: John P (Dgby714) Date: Sat Jun 25 07:35:20 2011 -0400 TLPThread update, Lape settings, Add Lape unit to OtherUnitFiles commit e5812a80005d876ad94fff0f033f939491128c74 Author: John P (Dgby714) Date: Thu Jun 16 21:26:03 2011 -0400 Lape Integration, TLPThread work commit ecab4d58010318df635982fa1bc22a73d83f70d8 Author: Merlijn Wajer Date: Sat Jun 25 17:45:24 2011 +0200 Lape: Add lape submodule. --- .gitmodules | 3 + Projects/Simba/Simba.inc | 2 +- Projects/Simba/Simba.lpi | 4 +- Projects/Simba/simbaunit.lfm | 10 + Projects/Simba/simbaunit.pas | 97 +- Projects/lape-wrappers/main.lfm | 2226 +++++++++++++++++ Projects/lape-wrappers/main.pas | 204 ++ Projects/lape-wrappers/ruwa.ico | Bin 0 -> 137040 bytes Projects/lape-wrappers/ruwa.lpi | 380 +++ Projects/lape-wrappers/ruwa.lpr | 22 + Projects/lape-wrappers/wrapfiles.lfm | 94 + Projects/lape-wrappers/wrapfiles.pas | 127 + Units/MMLAddon/LPInc/Wrappers/GENERATE THESE! | 0 Units/MMLAddon/LPInc/Wrappers/bitmap.inc | 259 ++ Units/MMLAddon/LPInc/Wrappers/colour.inc | 104 + Units/MMLAddon/LPInc/Wrappers/colourconv.inc | 4 + Units/MMLAddon/LPInc/Wrappers/crypto.inc | 4 + Units/MMLAddon/LPInc/Wrappers/dtm.inc | 79 + Units/MMLAddon/LPInc/Wrappers/extensions.inc | 64 + Units/MMLAddon/LPInc/Wrappers/file.inc | 89 + Units/MMLAddon/LPInc/Wrappers/internets.inc | 124 + Units/MMLAddon/LPInc/Wrappers/keyboard.inc | 29 + Units/MMLAddon/LPInc/Wrappers/math.inc | 114 + Units/MMLAddon/LPInc/Wrappers/mouse.inc | 39 + Units/MMLAddon/LPInc/Wrappers/ocr.inc | 19 + Units/MMLAddon/LPInc/Wrappers/other.inc | 19 + Units/MMLAddon/LPInc/Wrappers/settings.inc | 39 + Units/MMLAddon/LPInc/Wrappers/strings.inc | 84 + Units/MMLAddon/LPInc/Wrappers/tpa.inc | 424 ++++ Units/MMLAddon/LPInc/Wrappers/window.inc | 84 + Units/MMLAddon/LPInc/lpcompile.inc | 96 + Units/MMLAddon/LPInc/lpdefines.inc | 39 + Units/MMLAddon/LPInc/lpexportedmethods.inc | 25 + Units/MMLAddon/LPInc/lpexportedmethodsinc.inc | 323 +++ Units/MMLAddon/mmlpsthread.pas | 206 +- Units/lape | 2 +- 36 files changed, 5393 insertions(+), 45 deletions(-) create mode 100644 .gitmodules create mode 100644 Projects/lape-wrappers/main.lfm create mode 100644 Projects/lape-wrappers/main.pas create mode 100644 Projects/lape-wrappers/ruwa.ico create mode 100644 Projects/lape-wrappers/ruwa.lpi create mode 100644 Projects/lape-wrappers/ruwa.lpr create mode 100644 Projects/lape-wrappers/wrapfiles.lfm create mode 100644 Projects/lape-wrappers/wrapfiles.pas create mode 100644 Units/MMLAddon/LPInc/Wrappers/GENERATE THESE! create mode 100644 Units/MMLAddon/LPInc/Wrappers/bitmap.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/colour.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/colourconv.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/crypto.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/dtm.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/extensions.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/file.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/internets.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/keyboard.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/math.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/mouse.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/ocr.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/other.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/settings.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/strings.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/tpa.inc create mode 100644 Units/MMLAddon/LPInc/Wrappers/window.inc create mode 100644 Units/MMLAddon/LPInc/lpcompile.inc create mode 100644 Units/MMLAddon/LPInc/lpdefines.inc create mode 100644 Units/MMLAddon/LPInc/lpexportedmethods.inc create mode 100644 Units/MMLAddon/LPInc/lpexportedmethodsinc.inc diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4ab43a4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Units/lape"] + path = Units/lape + url = git://villavu.com/lape.git diff --git a/Projects/Simba/Simba.inc b/Projects/Simba/Simba.inc index 9273f5c..1773703 100644 --- a/Projects/Simba/Simba.inc +++ b/Projects/Simba/Simba.inc @@ -29,9 +29,9 @@ //{$DEFINE SIMBA_VERBOSE} // For more verbosity. //{$DEFINE USE_RUTIS} +{$DEFINE USE_LAPE} //{$DEFINE USE_CPASCAL} // TODO -//{$DEFINE USE_LAPE} // TODO {$DEFINE USE_EXTENSIONS} //{$DEFINE USE_CODECOMPLETION} // TODO diff --git a/Projects/Simba/Simba.lpi b/Projects/Simba/Simba.lpi index 889e59c..3d3d76c 100644 --- a/Projects/Simba/Simba.lpi +++ b/Projects/Simba/Simba.lpi @@ -321,8 +321,8 @@ - - + + diff --git a/Projects/Simba/simbaunit.lfm b/Projects/Simba/simbaunit.lfm index f396c98..2c3814c 100644 --- a/Projects/Simba/simbaunit.lfm +++ b/Projects/Simba/simbaunit.lfm @@ -1263,12 +1263,18 @@ object SimbaForm: TSimbaForm end object MenuItemRUTIS: TMenuItem Action = ActionRUTIS + Enabled = False RadioItem = True end object MenuItemCPascal: TMenuItem Action = ActionCPascal RadioItem = True end + object MenuItemLape: TMenuItem + Action = ActionLape + Enabled = False + RadioItem = True + end end end object MenuView: TMenuItem @@ -3026,6 +3032,10 @@ object SimbaForm: TSimbaForm OnExecute = ActionGotoExecute ShortCut = 16455 end + object ActionLape: TAction + Caption = 'Lape' + OnExecute = ActionLapeExecute + end end object DebugTimer: TTimer OnTimer = ProcessDebugStream diff --git a/Projects/Simba/simbaunit.pas b/Projects/Simba/simbaunit.pas index 0a828a2..3ba1ae2 100644 --- a/Projects/Simba/simbaunit.pas +++ b/Projects/Simba/simbaunit.pas @@ -67,6 +67,7 @@ const interp_PS = 0; //PascalScript interp_RT = 1; //RUTIS interp_CP = 2; //CPascal + interp_LP = 3; //Lape { Place the shortcuts here } {$IFDEF LINUX} @@ -101,6 +102,7 @@ type { TSimbaForm } TSimbaForm = class(TForm) + ActionLape: TAction; ActionGoto: TAction; ActionCPascal: TAction; ActionRUTIS: TAction; @@ -146,6 +148,7 @@ type MenuHelp: TMenuItem; MenuDivider7: TMenuItem; MenuInterpreters: TMenuItem; + MenuItemLape: TMenuItem; MenuItemReadOnlyTab: TMenuItem; MenuItemGoto: TMenuItem; MenuItemDivider50: TMenuItem; @@ -286,6 +289,7 @@ type procedure ActionFindNextExecute(Sender: TObject); procedure ActionFindstartExecute(Sender: TObject); procedure ActionGotoExecute(Sender: TObject); + procedure ActionLapeExecute(Sender: TObject); procedure ActionNewExecute(Sender: TObject); procedure ActionNewTabExecute(Sender: TObject); procedure ActionNormalSizeExecute(Sender: TObject); @@ -735,13 +739,15 @@ end; procedure TSimbaForm.UpdateInterpreter; begin - ActionPascalScript.Checked:= false; - ActionRUTIS.Checked:= false; - ActionCPascal.Checked:= false; + ActionPascalScript.Checked := False; + ActionRUTIS.Checked := False; + ActionCPascal.Checked := False; + ActionLape.Checked := False; case Interpreter of interp_PS: ActionPascalScript.Checked:= True; interp_CP: ActionCPascal.Checked:= True; - interp_RT: ActionRUTIS.Checked:= true; + interp_RT: ActionRUTIS.Checked := True; + interp_LP: ActionLape.Checked := True; end; end; @@ -768,11 +774,11 @@ end; function TSimbaForm.GetInterpreter: Integer; begin - result := StrToIntDef(LoadSettingDef('Settings/Interpreter/Type','0'),0); - if (result < 0) or (result > 2) then + Result := StrToIntDef(LoadSettingDef('Settings/Interpreter/Type', '0'), 0); + if ((Result < 0) or (Result > 3)) then begin SetInterpreter(0); - result := 0; + Result := 0; end; end; @@ -990,7 +996,7 @@ var time:integer; LatestVersion : integer; begin - UpdateTimer.Interval:= MaxInt; + UpdateTimer.Interval := MaxInt; FontUpdate; chk := LowerCase(LoadSettingDef('Settings/Updater/CheckForUpdates','True')); @@ -1009,7 +1015,7 @@ begin mDebugLn('Latest Simba Version: ' + IntToStr(LatestVersion)); end; time := StrToIntDef(LoadSettingDef('Settings/Updater/CheckEveryXMinutes','30'),30); - UpdateTimer.Interval:= time {mins} * 60 {secs} * 1000 {ms};//Every half hour + UpdateTimer.Interval := time {mins} * 60 {secs} * 1000 {ms};//Every half hour end; procedure TSimbaForm.UpdateMenuButtonClick(Sender: TObject); @@ -1418,7 +1424,7 @@ begin SettingsForm.SettingsTreeView.Items.GetFirstNode.Expand(false); SettingsForm.SaveCurrent; LoadFormSettings; - UpdateTimer.Interval:=25; + UpdateTimer.Interval :=25; end; { Load settings } @@ -1635,19 +1641,25 @@ begin AppPath:= MainDir + DS; CurrScript.ScriptErrorLine:= -1; CurrentSyncInfo.SyncMethod:= @Self.SafeCallThread; + try case Interpreter of - interp_PS : Thread := TPSThread.Create(true,@CurrentSyncInfo,PluginPath); - - // XXX: Rutis needs to be completely removed from Simba if it's not defined. - // XXX: Not just print a message that it's not supported now. - interp_RT : {$IFDEF USE_RUTIS}Thread := TRTThread.Create(true,@CurrentSyncInfo,PluginPath){$ELSE}formWriteln('RUTIS NOT SUPPORTED') {$ENDIF}; - interp_CP : Thread := TCPThread.Create(true,@CurrentSyncInfo,PluginPath); + interp_PS: Thread := TPSThread.Create(True, @CurrentSyncInfo, PluginPath); + {$IFDEF USE_RUTIS}interp_RT: Thread := TRTThread.Create(True, @CurrentSyncInfo, PluginPath);{$ENDIF} + interp_CP: Thread := TCPThread.Create(True,@CurrentSyncInfo,PluginPath); + {$IFDEF USE_LAPE}interp_LP: Thread := TLPThread.Create(True, @CurrentSyncInfo, PluginPath);{$ENDIF} + else + raise Exception.CreateFmt('Unknown Interpreter %d!', [Interpreter]); end; except - mDebugLn('Failed to initialise the interpreter'); - Exit; + on E: Exception do + begin + mDebugLn('Failed to initialise the interpreter: ' + E.Message); + Thread := nil; + Exit; + end; end; + {$IFNDEF TERMINALWRITELN} Thread.SetDebug(@formWriteln); {$ENDIF} @@ -1760,26 +1772,29 @@ begin end; function TSimbaForm.DefaultScript: string; -var - x : TStringList; begin - result := ''; + Result := ''; + case Interpreter of - interp_PS : begin + interp_PS, interp_LP: begin + Result := 'program new;' + LineEnding + 'begin' + LineEnding + 'end.' + LineEnding; if FileExistsUTF8(SimbaForm.DefScriptPath) then begin - x := TStringList.Create; try - x.LoadFromFile(SimbaForm.DefScriptPath); + with TStringList.Create do + try + LoadFromFile(SimbaForm.DefScriptPath); + Result := Text; + finally + Free; + end; except mDebugLn('Couldn''t load default script file.'); end; - Result := x.Text; - end else - result := 'program new;'+LineEnding + 'begin'+LineEnding+'end.' + LineEnding; + end; end; - interp_RT : result := 'program untitled;' + LineEnding + lineEnding + 'interface' + LineEnding + LineEnding + - 'implementation' + LineEnding + LineEnding + 'begin' + LineEnding + 'end.' + LineEnding; + interp_RT: Result := 'program untitled;' + LineEnding + lineEnding + 'interface' + LineEnding + LineEnding + + 'implementation' + LineEnding + LineEnding + 'begin' + LineEnding + 'end.' + LineEnding; end; end; @@ -1835,7 +1850,7 @@ end; procedure TSimbaForm.ActionCPascalExecute(Sender: TObject); begin - Interpreter:= interp_CP; + Interpreter := interp_CP; end; procedure TSimbaForm.ActionCutExecute(Sender: TObject); @@ -1909,6 +1924,11 @@ begin end; end; +procedure TSimbaForm.ActionLapeExecute(Sender: TObject); +begin + {$IFDEF USE_LAPE}Interpreter := interp_LP;{$ENDIF} +end; + procedure TSimbaForm.ActionClearDebugExecute(Sender: TObject); begin Memo1.Clear; @@ -1950,7 +1970,7 @@ end; procedure TSimbaForm.ActionPascalScriptExecute(Sender: TObject); begin - Interpreter:= interp_PS; + Interpreter := interp_PS; end; procedure TSimbaForm.ActionPasteExecute(Sender: TObject); @@ -2363,6 +2383,9 @@ begin end; end; SimbaForm.InitializeTMThread(t); + if (t = nil) then + Exit; + KillThread(t.ThreadID); { XXX: Why do we kill the thread again ? } if (t is TPSThread) then try @@ -2502,10 +2525,8 @@ begin UpdateTitle; - {$IFNDEF USE_RUTIS} - MenuItemRUTIS.Enabled:=False; - {$ENDIF} - + {$IFDEF USE_RUTIS}MenuItemRUTIS.Enabled := True;{$ENDIF} + {$IFDEF USE_LAPE}MenuItemLape.Enabled := True;{$ENDIF} {$IFDEF USE_EXTENSIONS}ActionExtensions.Visible := True;{$ENDIF} self.EndFormUpdate; @@ -3060,9 +3081,11 @@ begin if (CurrScript <> nil) then with CurrScript.Synedit do if (Lines.text = DefaultScript) and not(CanUndo or CanRedo) then - UpdateCurrScript := true; - SetSetting('Settings/Interpreter/Type',Inttostr(AValue),true); + UpdateCurrScript := True; + + SetSetting('Settings/Interpreter/Type', IntToStr(AValue), True); UpdateInterpreter; + if UpdateCurrScript then CurrScript.SynEdit.Lines.text := DefaultScript; end; diff --git a/Projects/lape-wrappers/main.lfm b/Projects/lape-wrappers/main.lfm new file mode 100644 index 0000000..aa9b137 --- /dev/null +++ b/Projects/lape-wrappers/main.lfm @@ -0,0 +1,2226 @@ +object frmMain: TfrmMain + Left = 367 + Height = 419 + Top = 147 + Width = 708 + Caption = 'Wrap da Wrap' + ClientHeight = 419 + ClientWidth = 708 + LCLVersion = '0.9.29' + inline eIn: TSynEdit + Left = 0 + Height = 224 + Top = 0 + Width = 335 + Align = alClient + Font.Height = -13 + Font.Name = 'Courier New' + Font.Pitch = fpFixed + Font.Quality = fqNonAntialiased + ParentColor = False + ParentFont = False + TabOrder = 0 + Gutter.Width = 57 + Gutter.MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 13 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end> + RightGutter.Width = 0 + RightGutter.MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 13 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end> + Highlighter = PasHL + Keystrokes = < + item + Command = ecUp + ShortCut = 38 + end + item + Command = ecSelUp + ShortCut = 8230 + end + item + Command = ecScrollUp + ShortCut = 16422 + end + item + Command = ecDown + ShortCut = 40 + end + item + Command = ecSelDown + ShortCut = 8232 + end + item + Command = ecScrollDown + ShortCut = 16424 + end + item + Command = ecLeft + ShortCut = 37 + end + item + Command = ecSelLeft + ShortCut = 8229 + end + item + Command = ecWordLeft + ShortCut = 16421 + end + item + Command = ecSelWordLeft + ShortCut = 24613 + end + item + Command = ecRight + ShortCut = 39 + end + item + Command = ecSelRight + ShortCut = 8231 + end + item + Command = ecWordRight + ShortCut = 16423 + end + item + Command = ecSelWordRight + ShortCut = 24615 + end + item + Command = ecPageDown + ShortCut = 34 + end + item + Command = ecSelPageDown + ShortCut = 8226 + end + item + Command = ecPageBottom + ShortCut = 16418 + end + item + Command = ecSelPageBottom + ShortCut = 24610 + end + item + Command = ecPageUp + ShortCut = 33 + end + item + Command = ecSelPageUp + ShortCut = 8225 + end + item + Command = ecPageTop + ShortCut = 16417 + end + item + Command = ecSelPageTop + ShortCut = 24609 + end + item + Command = ecLineStart + ShortCut = 36 + end + item + Command = ecSelLineStart + ShortCut = 8228 + end + item + Command = ecEditorTop + ShortCut = 16420 + end + item + Command = ecSelEditorTop + ShortCut = 24612 + end + item + Command = ecLineEnd + ShortCut = 35 + end + item + Command = ecSelLineEnd + ShortCut = 8227 + end + item + Command = ecEditorBottom + ShortCut = 16419 + end + item + Command = ecSelEditorBottom + ShortCut = 24611 + end + item + Command = ecToggleMode + ShortCut = 45 + end + item + Command = ecCopy + ShortCut = 16429 + end + item + Command = ecPaste + ShortCut = 8237 + end + item + Command = ecDeleteChar + ShortCut = 46 + end + item + Command = ecCut + ShortCut = 8238 + end + item + Command = ecDeleteLastChar + ShortCut = 8 + end + item + Command = ecDeleteLastChar + ShortCut = 8200 + end + item + Command = ecDeleteLastWord + ShortCut = 16392 + end + item + Command = ecUndo + ShortCut = 32776 + end + item + Command = ecRedo + ShortCut = 40968 + end + item + Command = ecLineBreak + ShortCut = 13 + end + item + Command = ecSelectAll + ShortCut = 16449 + end + item + Command = ecCopy + ShortCut = 16451 + end + item + Command = ecBlockIndent + ShortCut = 24649 + end + item + Command = ecLineBreak + ShortCut = 16461 + end + item + Command = ecInsertLine + ShortCut = 16462 + end + item + Command = ecDeleteWord + ShortCut = 16468 + end + item + Command = ecBlockUnindent + ShortCut = 24661 + end + item + Command = ecPaste + ShortCut = 16470 + end + item + Command = ecCut + ShortCut = 16472 + end + item + Command = ecDeleteLine + ShortCut = 16473 + end + item + Command = ecDeleteEOL + ShortCut = 24665 + end + item + Command = ecUndo + ShortCut = 16474 + end + item + Command = ecRedo + ShortCut = 24666 + end + item + Command = ecGotoMarker0 + ShortCut = 16432 + end + item + Command = ecGotoMarker1 + ShortCut = 16433 + end + item + Command = ecGotoMarker2 + ShortCut = 16434 + end + item + Command = ecGotoMarker3 + ShortCut = 16435 + end + item + Command = ecGotoMarker4 + ShortCut = 16436 + end + item + Command = ecGotoMarker5 + ShortCut = 16437 + end + item + Command = ecGotoMarker6 + ShortCut = 16438 + end + item + Command = ecGotoMarker7 + ShortCut = 16439 + end + item + Command = ecGotoMarker8 + ShortCut = 16440 + end + item + Command = ecGotoMarker9 + ShortCut = 16441 + end + item + Command = ecSetMarker0 + ShortCut = 24624 + end + item + Command = ecSetMarker1 + ShortCut = 24625 + end + item + Command = ecSetMarker2 + ShortCut = 24626 + end + item + Command = ecSetMarker3 + ShortCut = 24627 + end + item + Command = ecSetMarker4 + ShortCut = 24628 + end + item + Command = ecSetMarker5 + ShortCut = 24629 + end + item + Command = ecSetMarker6 + ShortCut = 24630 + end + item + Command = ecSetMarker7 + ShortCut = 24631 + end + item + Command = ecSetMarker8 + ShortCut = 24632 + end + item + Command = ecSetMarker9 + ShortCut = 24633 + end + item + Command = EcFoldLevel1 + ShortCut = 41009 + end + item + Command = EcFoldLevel2 + ShortCut = 41010 + end + item + Command = EcFoldLevel1 + ShortCut = 41011 + end + item + Command = EcFoldLevel1 + ShortCut = 41012 + end + item + Command = EcFoldLevel1 + ShortCut = 41013 + end + item + Command = EcFoldLevel6 + ShortCut = 41014 + end + item + Command = EcFoldLevel7 + ShortCut = 41015 + end + item + Command = EcFoldLevel8 + ShortCut = 41016 + end + item + Command = EcFoldLevel9 + ShortCut = 41017 + end + item + Command = EcFoldLevel0 + ShortCut = 41008 + end + item + Command = EcFoldCurrent + ShortCut = 41005 + end + item + Command = EcUnFoldCurrent + ShortCut = 41003 + end + item + Command = EcToggleMarkupWord + ShortCut = 32845 + end + item + Command = ecNormalSelect + ShortCut = 24654 + end + item + Command = ecColumnSelect + ShortCut = 24643 + end + item + Command = ecLineSelect + ShortCut = 24652 + end + item + Command = ecTab + ShortCut = 9 + end + item + Command = ecShiftTab + ShortCut = 8201 + end + item + Command = ecMatchBracket + ShortCut = 24642 + end + item + Command = ecColSelUp + ShortCut = 40998 + end + item + Command = ecColSelDown + ShortCut = 41000 + end + item + Command = ecColSelLeft + ShortCut = 40997 + end + item + Command = ecColSelRight + ShortCut = 40999 + end + item + Command = ecColSelPageDown + ShortCut = 40994 + end + item + Command = ecColSelPageBottom + ShortCut = 57378 + end + item + Command = ecColSelPageUp + ShortCut = 40993 + end + item + Command = ecColSelPageTop + ShortCut = 57377 + end + item + Command = ecColSelLineStart + ShortCut = 40996 + end + item + Command = ecColSelLineEnd + ShortCut = 40995 + end + item + Command = ecColSelEditorTop + ShortCut = 57380 + end + item + Command = ecColSelEditorBottom + ShortCut = 57379 + end> + MouseActions = < + item + Shift = [] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 1 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssShift] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 1 + MoveCaret = True + Option = 1 + Priority = 0 + end + item + Shift = [ssAlt] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 3 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssShift, ssAlt] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 3 + MoveCaret = True + Option = 1 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccDouble + ClickDir = cdDown + Command = 6 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccTriple + ClickDir = cdDown + Command = 7 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccQuad + ClickDir = cdDown + Command = 8 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbMiddle + ClickCount = ccSingle + ClickDir = cdDown + Command = 10 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssCtrl] + ShiftMask = [ssShift, ssAlt, ssCtrl] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdUp + Command = 11 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MouseSelActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 9 + MoveCaret = False + Option = 0 + Priority = 0 + end> + Lines.Strings = ( + 'Input' + ) + BracketHighlightStyle = sbhsBoth + inline SynLeftGutterPartList1: TSynGutterPartList + object SynGutterMarks1: TSynGutterMarks + Width = 24 + end + object SynGutterLineNumber1: TSynGutterLineNumber + Width = 17 + MouseActions = <> + MarkupInfo.Background = clBtnFace + MarkupInfo.Foreground = clNone + DigitCount = 2 + ShowOnlyLineNumbersMultiplesOf = 1 + ZeroStart = False + LeadingZeros = False + end + object SynGutterChanges1: TSynGutterChanges + Width = 4 + ModifiedColor = 59900 + SavedColor = clGreen + end + object SynGutterSeparator1: TSynGutterSeparator + Width = 2 + end + object SynGutterCodeFolding1: TSynGutterCodeFolding + MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 16 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [ssShift] + Button = mbMiddle + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [ssShift] + ShiftMask = [ssShift] + Button = mbMiddle + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 1 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 0 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MarkupInfo.Background = clNone + MarkupInfo.Foreground = clGray + MouseActionsExpanded = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MouseActionsCollapsed = < + item + Shift = [ssCtrl] + ShiftMask = [ssCtrl] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 15 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [ssCtrl] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 15 + MoveCaret = False + Option = 1 + Priority = 0 + end> + end + end + inline SynRightGutterPartList1: TSynRightGutterPartList + end + end + inline eOut: TSynEdit + Left = 340 + Height = 224 + Top = 0 + Width = 368 + Align = alRight + Font.Height = -13 + Font.Name = 'Courier New' + Font.Pitch = fpFixed + Font.Quality = fqNonAntialiased + ParentColor = False + ParentFont = False + TabOrder = 1 + Gutter.Width = 57 + Gutter.MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 13 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end> + RightGutter.Width = 0 + RightGutter.MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 13 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end> + Highlighter = PasHL + Keystrokes = < + item + Command = ecUp + ShortCut = 38 + end + item + Command = ecSelUp + ShortCut = 8230 + end + item + Command = ecScrollUp + ShortCut = 16422 + end + item + Command = ecDown + ShortCut = 40 + end + item + Command = ecSelDown + ShortCut = 8232 + end + item + Command = ecScrollDown + ShortCut = 16424 + end + item + Command = ecLeft + ShortCut = 37 + end + item + Command = ecSelLeft + ShortCut = 8229 + end + item + Command = ecWordLeft + ShortCut = 16421 + end + item + Command = ecSelWordLeft + ShortCut = 24613 + end + item + Command = ecRight + ShortCut = 39 + end + item + Command = ecSelRight + ShortCut = 8231 + end + item + Command = ecWordRight + ShortCut = 16423 + end + item + Command = ecSelWordRight + ShortCut = 24615 + end + item + Command = ecPageDown + ShortCut = 34 + end + item + Command = ecSelPageDown + ShortCut = 8226 + end + item + Command = ecPageBottom + ShortCut = 16418 + end + item + Command = ecSelPageBottom + ShortCut = 24610 + end + item + Command = ecPageUp + ShortCut = 33 + end + item + Command = ecSelPageUp + ShortCut = 8225 + end + item + Command = ecPageTop + ShortCut = 16417 + end + item + Command = ecSelPageTop + ShortCut = 24609 + end + item + Command = ecLineStart + ShortCut = 36 + end + item + Command = ecSelLineStart + ShortCut = 8228 + end + item + Command = ecEditorTop + ShortCut = 16420 + end + item + Command = ecSelEditorTop + ShortCut = 24612 + end + item + Command = ecLineEnd + ShortCut = 35 + end + item + Command = ecSelLineEnd + ShortCut = 8227 + end + item + Command = ecEditorBottom + ShortCut = 16419 + end + item + Command = ecSelEditorBottom + ShortCut = 24611 + end + item + Command = ecToggleMode + ShortCut = 45 + end + item + Command = ecCopy + ShortCut = 16429 + end + item + Command = ecPaste + ShortCut = 8237 + end + item + Command = ecDeleteChar + ShortCut = 46 + end + item + Command = ecCut + ShortCut = 8238 + end + item + Command = ecDeleteLastChar + ShortCut = 8 + end + item + Command = ecDeleteLastChar + ShortCut = 8200 + end + item + Command = ecDeleteLastWord + ShortCut = 16392 + end + item + Command = ecUndo + ShortCut = 32776 + end + item + Command = ecRedo + ShortCut = 40968 + end + item + Command = ecLineBreak + ShortCut = 13 + end + item + Command = ecSelectAll + ShortCut = 16449 + end + item + Command = ecCopy + ShortCut = 16451 + end + item + Command = ecBlockIndent + ShortCut = 24649 + end + item + Command = ecLineBreak + ShortCut = 16461 + end + item + Command = ecInsertLine + ShortCut = 16462 + end + item + Command = ecDeleteWord + ShortCut = 16468 + end + item + Command = ecBlockUnindent + ShortCut = 24661 + end + item + Command = ecPaste + ShortCut = 16470 + end + item + Command = ecCut + ShortCut = 16472 + end + item + Command = ecDeleteLine + ShortCut = 16473 + end + item + Command = ecDeleteEOL + ShortCut = 24665 + end + item + Command = ecUndo + ShortCut = 16474 + end + item + Command = ecRedo + ShortCut = 24666 + end + item + Command = ecGotoMarker0 + ShortCut = 16432 + end + item + Command = ecGotoMarker1 + ShortCut = 16433 + end + item + Command = ecGotoMarker2 + ShortCut = 16434 + end + item + Command = ecGotoMarker3 + ShortCut = 16435 + end + item + Command = ecGotoMarker4 + ShortCut = 16436 + end + item + Command = ecGotoMarker5 + ShortCut = 16437 + end + item + Command = ecGotoMarker6 + ShortCut = 16438 + end + item + Command = ecGotoMarker7 + ShortCut = 16439 + end + item + Command = ecGotoMarker8 + ShortCut = 16440 + end + item + Command = ecGotoMarker9 + ShortCut = 16441 + end + item + Command = ecSetMarker0 + ShortCut = 24624 + end + item + Command = ecSetMarker1 + ShortCut = 24625 + end + item + Command = ecSetMarker2 + ShortCut = 24626 + end + item + Command = ecSetMarker3 + ShortCut = 24627 + end + item + Command = ecSetMarker4 + ShortCut = 24628 + end + item + Command = ecSetMarker5 + ShortCut = 24629 + end + item + Command = ecSetMarker6 + ShortCut = 24630 + end + item + Command = ecSetMarker7 + ShortCut = 24631 + end + item + Command = ecSetMarker8 + ShortCut = 24632 + end + item + Command = ecSetMarker9 + ShortCut = 24633 + end + item + Command = EcFoldLevel1 + ShortCut = 41009 + end + item + Command = EcFoldLevel2 + ShortCut = 41010 + end + item + Command = EcFoldLevel1 + ShortCut = 41011 + end + item + Command = EcFoldLevel1 + ShortCut = 41012 + end + item + Command = EcFoldLevel1 + ShortCut = 41013 + end + item + Command = EcFoldLevel6 + ShortCut = 41014 + end + item + Command = EcFoldLevel7 + ShortCut = 41015 + end + item + Command = EcFoldLevel8 + ShortCut = 41016 + end + item + Command = EcFoldLevel9 + ShortCut = 41017 + end + item + Command = EcFoldLevel0 + ShortCut = 41008 + end + item + Command = EcFoldCurrent + ShortCut = 41005 + end + item + Command = EcUnFoldCurrent + ShortCut = 41003 + end + item + Command = EcToggleMarkupWord + ShortCut = 32845 + end + item + Command = ecNormalSelect + ShortCut = 24654 + end + item + Command = ecColumnSelect + ShortCut = 24643 + end + item + Command = ecLineSelect + ShortCut = 24652 + end + item + Command = ecTab + ShortCut = 9 + end + item + Command = ecShiftTab + ShortCut = 8201 + end + item + Command = ecMatchBracket + ShortCut = 24642 + end + item + Command = ecColSelUp + ShortCut = 40998 + end + item + Command = ecColSelDown + ShortCut = 41000 + end + item + Command = ecColSelLeft + ShortCut = 40997 + end + item + Command = ecColSelRight + ShortCut = 40999 + end + item + Command = ecColSelPageDown + ShortCut = 40994 + end + item + Command = ecColSelPageBottom + ShortCut = 57378 + end + item + Command = ecColSelPageUp + ShortCut = 40993 + end + item + Command = ecColSelPageTop + ShortCut = 57377 + end + item + Command = ecColSelLineStart + ShortCut = 40996 + end + item + Command = ecColSelLineEnd + ShortCut = 40995 + end + item + Command = ecColSelEditorTop + ShortCut = 57380 + end + item + Command = ecColSelEditorBottom + ShortCut = 57379 + end> + MouseActions = < + item + Shift = [] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 1 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssShift] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 1 + MoveCaret = True + Option = 1 + Priority = 0 + end + item + Shift = [ssAlt] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 3 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssShift, ssAlt] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 3 + MoveCaret = True + Option = 1 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccDouble + ClickDir = cdDown + Command = 6 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccTriple + ClickDir = cdDown + Command = 7 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccQuad + ClickDir = cdDown + Command = 8 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbMiddle + ClickCount = ccSingle + ClickDir = cdDown + Command = 10 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssCtrl] + ShiftMask = [ssShift, ssAlt, ssCtrl] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdUp + Command = 11 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MouseSelActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 9 + MoveCaret = False + Option = 0 + Priority = 0 + end> + Lines.Strings = ( + 'Output' + ) + BracketHighlightStyle = sbhsBoth + inline SynLeftGutterPartList1: TSynGutterPartList + object SynGutterMarks1: TSynGutterMarks + Width = 24 + end + object SynGutterLineNumber1: TSynGutterLineNumber + Width = 17 + MouseActions = <> + MarkupInfo.Background = clBtnFace + MarkupInfo.Foreground = clNone + DigitCount = 2 + ShowOnlyLineNumbersMultiplesOf = 1 + ZeroStart = False + LeadingZeros = False + end + object SynGutterChanges1: TSynGutterChanges + Width = 4 + ModifiedColor = 59900 + SavedColor = clGreen + end + object SynGutterSeparator1: TSynGutterSeparator + Width = 2 + end + object SynGutterCodeFolding1: TSynGutterCodeFolding + MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 16 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [ssShift] + Button = mbMiddle + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [ssShift] + ShiftMask = [ssShift] + Button = mbMiddle + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 1 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 0 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MarkupInfo.Background = clNone + MarkupInfo.Foreground = clGray + MouseActionsExpanded = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MouseActionsCollapsed = < + item + Shift = [ssCtrl] + ShiftMask = [ssCtrl] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 15 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [ssCtrl] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 15 + MoveCaret = False + Option = 1 + Priority = 0 + end> + end + end + inline SynRightGutterPartList1: TSynRightGutterPartList + end + end + object pnlMain: TPanel + Left = 0 + Height = 190 + Top = 229 + Width = 708 + Align = alBottom + ClientHeight = 190 + ClientWidth = 708 + TabOrder = 2 + object btnGo: TButton + Left = 8 + Height = 25 + Top = 5 + Width = 75 + Caption = 'Go!' + OnClick = btnGoClick + TabOrder = 0 + end + inline eDebug: TSynEdit + Left = 2 + Height = 150 + Top = 40 + Width = 706 + Align = alCustom + Anchors = [akTop, akLeft, akRight, akBottom] + Font.Height = -13 + Font.Name = 'Courier New' + Font.Pitch = fpFixed + Font.Quality = fqNonAntialiased + ParentColor = False + ParentFont = False + TabOrder = 1 + Gutter.Width = 57 + Gutter.MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 13 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end> + RightGutter.Width = 0 + RightGutter.MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 13 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end> + Keystrokes = < + item + Command = ecUp + ShortCut = 38 + end + item + Command = ecSelUp + ShortCut = 8230 + end + item + Command = ecScrollUp + ShortCut = 16422 + end + item + Command = ecDown + ShortCut = 40 + end + item + Command = ecSelDown + ShortCut = 8232 + end + item + Command = ecScrollDown + ShortCut = 16424 + end + item + Command = ecLeft + ShortCut = 37 + end + item + Command = ecSelLeft + ShortCut = 8229 + end + item + Command = ecWordLeft + ShortCut = 16421 + end + item + Command = ecSelWordLeft + ShortCut = 24613 + end + item + Command = ecRight + ShortCut = 39 + end + item + Command = ecSelRight + ShortCut = 8231 + end + item + Command = ecWordRight + ShortCut = 16423 + end + item + Command = ecSelWordRight + ShortCut = 24615 + end + item + Command = ecPageDown + ShortCut = 34 + end + item + Command = ecSelPageDown + ShortCut = 8226 + end + item + Command = ecPageBottom + ShortCut = 16418 + end + item + Command = ecSelPageBottom + ShortCut = 24610 + end + item + Command = ecPageUp + ShortCut = 33 + end + item + Command = ecSelPageUp + ShortCut = 8225 + end + item + Command = ecPageTop + ShortCut = 16417 + end + item + Command = ecSelPageTop + ShortCut = 24609 + end + item + Command = ecLineStart + ShortCut = 36 + end + item + Command = ecSelLineStart + ShortCut = 8228 + end + item + Command = ecEditorTop + ShortCut = 16420 + end + item + Command = ecSelEditorTop + ShortCut = 24612 + end + item + Command = ecLineEnd + ShortCut = 35 + end + item + Command = ecSelLineEnd + ShortCut = 8227 + end + item + Command = ecEditorBottom + ShortCut = 16419 + end + item + Command = ecSelEditorBottom + ShortCut = 24611 + end + item + Command = ecToggleMode + ShortCut = 45 + end + item + Command = ecCopy + ShortCut = 16429 + end + item + Command = ecPaste + ShortCut = 8237 + end + item + Command = ecDeleteChar + ShortCut = 46 + end + item + Command = ecCut + ShortCut = 8238 + end + item + Command = ecDeleteLastChar + ShortCut = 8 + end + item + Command = ecDeleteLastChar + ShortCut = 8200 + end + item + Command = ecDeleteLastWord + ShortCut = 16392 + end + item + Command = ecUndo + ShortCut = 32776 + end + item + Command = ecRedo + ShortCut = 40968 + end + item + Command = ecLineBreak + ShortCut = 13 + end + item + Command = ecSelectAll + ShortCut = 16449 + end + item + Command = ecCopy + ShortCut = 16451 + end + item + Command = ecBlockIndent + ShortCut = 24649 + end + item + Command = ecLineBreak + ShortCut = 16461 + end + item + Command = ecInsertLine + ShortCut = 16462 + end + item + Command = ecDeleteWord + ShortCut = 16468 + end + item + Command = ecBlockUnindent + ShortCut = 24661 + end + item + Command = ecPaste + ShortCut = 16470 + end + item + Command = ecCut + ShortCut = 16472 + end + item + Command = ecDeleteLine + ShortCut = 16473 + end + item + Command = ecDeleteEOL + ShortCut = 24665 + end + item + Command = ecUndo + ShortCut = 16474 + end + item + Command = ecRedo + ShortCut = 24666 + end + item + Command = ecGotoMarker0 + ShortCut = 16432 + end + item + Command = ecGotoMarker1 + ShortCut = 16433 + end + item + Command = ecGotoMarker2 + ShortCut = 16434 + end + item + Command = ecGotoMarker3 + ShortCut = 16435 + end + item + Command = ecGotoMarker4 + ShortCut = 16436 + end + item + Command = ecGotoMarker5 + ShortCut = 16437 + end + item + Command = ecGotoMarker6 + ShortCut = 16438 + end + item + Command = ecGotoMarker7 + ShortCut = 16439 + end + item + Command = ecGotoMarker8 + ShortCut = 16440 + end + item + Command = ecGotoMarker9 + ShortCut = 16441 + end + item + Command = ecSetMarker0 + ShortCut = 24624 + end + item + Command = ecSetMarker1 + ShortCut = 24625 + end + item + Command = ecSetMarker2 + ShortCut = 24626 + end + item + Command = ecSetMarker3 + ShortCut = 24627 + end + item + Command = ecSetMarker4 + ShortCut = 24628 + end + item + Command = ecSetMarker5 + ShortCut = 24629 + end + item + Command = ecSetMarker6 + ShortCut = 24630 + end + item + Command = ecSetMarker7 + ShortCut = 24631 + end + item + Command = ecSetMarker8 + ShortCut = 24632 + end + item + Command = ecSetMarker9 + ShortCut = 24633 + end + item + Command = EcFoldLevel1 + ShortCut = 41009 + end + item + Command = EcFoldLevel2 + ShortCut = 41010 + end + item + Command = EcFoldLevel1 + ShortCut = 41011 + end + item + Command = EcFoldLevel1 + ShortCut = 41012 + end + item + Command = EcFoldLevel1 + ShortCut = 41013 + end + item + Command = EcFoldLevel6 + ShortCut = 41014 + end + item + Command = EcFoldLevel7 + ShortCut = 41015 + end + item + Command = EcFoldLevel8 + ShortCut = 41016 + end + item + Command = EcFoldLevel9 + ShortCut = 41017 + end + item + Command = EcFoldLevel0 + ShortCut = 41008 + end + item + Command = EcFoldCurrent + ShortCut = 41005 + end + item + Command = EcUnFoldCurrent + ShortCut = 41003 + end + item + Command = EcToggleMarkupWord + ShortCut = 32845 + end + item + Command = ecNormalSelect + ShortCut = 24654 + end + item + Command = ecColumnSelect + ShortCut = 24643 + end + item + Command = ecLineSelect + ShortCut = 24652 + end + item + Command = ecTab + ShortCut = 9 + end + item + Command = ecShiftTab + ShortCut = 8201 + end + item + Command = ecMatchBracket + ShortCut = 24642 + end + item + Command = ecColSelUp + ShortCut = 40998 + end + item + Command = ecColSelDown + ShortCut = 41000 + end + item + Command = ecColSelLeft + ShortCut = 40997 + end + item + Command = ecColSelRight + ShortCut = 40999 + end + item + Command = ecColSelPageDown + ShortCut = 40994 + end + item + Command = ecColSelPageBottom + ShortCut = 57378 + end + item + Command = ecColSelPageUp + ShortCut = 40993 + end + item + Command = ecColSelPageTop + ShortCut = 57377 + end + item + Command = ecColSelLineStart + ShortCut = 40996 + end + item + Command = ecColSelLineEnd + ShortCut = 40995 + end + item + Command = ecColSelEditorTop + ShortCut = 57380 + end + item + Command = ecColSelEditorBottom + ShortCut = 57379 + end> + MouseActions = < + item + Shift = [] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 1 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssShift] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 1 + MoveCaret = True + Option = 1 + Priority = 0 + end + item + Shift = [ssAlt] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 3 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssShift, ssAlt] + ShiftMask = [ssShift, ssAlt] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 3 + MoveCaret = True + Option = 1 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 12 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccDouble + ClickDir = cdDown + Command = 6 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccTriple + ClickDir = cdDown + Command = 7 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccQuad + ClickDir = cdDown + Command = 8 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbMiddle + ClickCount = ccSingle + ClickDir = cdDown + Command = 10 + MoveCaret = True + Option = 0 + Priority = 0 + end + item + Shift = [ssCtrl] + ShiftMask = [ssShift, ssAlt, ssCtrl] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdUp + Command = 11 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MouseSelActions = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccSingle + ClickDir = cdDown + Command = 9 + MoveCaret = False + Option = 0 + Priority = 0 + end> + Lines.Strings = ( + 'Debug' + ) + BracketHighlightStyle = sbhsBoth + inline SynLeftGutterPartList1: TSynGutterPartList + object SynGutterMarks1: TSynGutterMarks + Width = 24 + end + object SynGutterLineNumber1: TSynGutterLineNumber + Width = 17 + MouseActions = <> + MarkupInfo.Background = clBtnFace + MarkupInfo.Foreground = clNone + DigitCount = 2 + ShowOnlyLineNumbersMultiplesOf = 1 + ZeroStart = False + LeadingZeros = False + end + object SynGutterChanges1: TSynGutterChanges + Width = 4 + ModifiedColor = 59900 + SavedColor = clGreen + end + object SynGutterSeparator1: TSynGutterSeparator + Width = 2 + end + object SynGutterCodeFolding1: TSynGutterCodeFolding + MouseActions = < + item + Shift = [] + ShiftMask = [] + Button = mbRight + ClickCount = ccSingle + ClickDir = cdUp + Command = 16 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [ssShift] + Button = mbMiddle + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [ssShift] + ShiftMask = [ssShift] + Button = mbMiddle + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 1 + Priority = 0 + end + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 0 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MarkupInfo.Background = clNone + MarkupInfo.Foreground = clGray + MouseActionsExpanded = < + item + Shift = [] + ShiftMask = [] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 14 + MoveCaret = False + Option = 0 + Priority = 0 + end> + MouseActionsCollapsed = < + item + Shift = [ssCtrl] + ShiftMask = [ssCtrl] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 15 + MoveCaret = False + Option = 0 + Priority = 0 + end + item + Shift = [] + ShiftMask = [ssCtrl] + Button = mbLeft + ClickCount = ccAny + ClickDir = cdDown + Command = 15 + MoveCaret = False + Option = 1 + Priority = 0 + end> + end + end + inline SynRightGutterPartList1: TSynRightGutterPartList + end + end + object btnAdvanced: TButton + Left = 544 + Height = 25 + Top = 5 + Width = 80 + Caption = 'Advanced' + OnClick = btnAdvancedClick + TabOrder = 2 + end + end + object Splitter1: TSplitter + Left = 335 + Height = 224 + Top = 0 + Width = 5 + Align = alRight + ResizeAnchor = akRight + end + object Splitter2: TSplitter + Cursor = crVSplit + Left = 0 + Height = 5 + Top = 224 + Width = 708 + Align = alBottom + ResizeAnchor = akBottom + end + object PasHL: TSynPasSyn + Enabled = False + CommentAttri.Foreground = clGreen + NumberAttri.Foreground = clNavy + StringAttri.Foreground = clPurple + SymbolAttri.Foreground = clMaroon + CaseLabelAttri.Style = [fsItalic] + DirectiveAttri.Foreground = clOlive + CompilerMode = pcmDelphi + NestedComments = False + end +end diff --git a/Projects/lape-wrappers/main.pas b/Projects/lape-wrappers/main.pas new file mode 100644 index 0000000..317582a --- /dev/null +++ b/Projects/lape-wrappers/main.pas @@ -0,0 +1,204 @@ +unit main; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, + StdCtrls, SynEdit, SynHighlighterPas,wrapfiles; + +type + + { TfrmMain } + + TfrmMain = class(TForm) + btnGo: TButton; + btnAdvanced: TButton; + pnlMain: TPanel; + Splitter1: TSplitter; + Splitter2: TSplitter; + eIn: TSynEdit; + eOut: TSynEdit; + eDebug: TSynEdit; + PasHL: TSynPasSyn; + procedure btnAdvancedClick(Sender: TObject); + procedure btnGoClick(Sender: TObject); + private + { private declarations } + public + { public declarations } + end; +procedure ConvertRT(Input, Dbg, Output : TStrings; procnames : TStrings = nil); +var + frmMain: TfrmMain; + +implementation + +uses + v_ideCodeParser; + +{$R *.lfm} + +{ TfrmMain } + +procedure ConvertRT(Input, Dbg, Output : TStrings; procnames : TStrings = nil); + procedure Debug(s: string); overload; + begin + if (Trim(Output.Text) <> '') then + Dbg.Append(s) + else + Dbg.Text := s; + end; + + procedure Debug(v: Variant); overload; + begin + Debug(string(v)); + end; + + procedure Write(s: string); overload; + begin + if (Trim(Output.Text) <> '') then + Output.Text := Output.Text + s + else + Output.Text := s; + end; + + procedure Write(v: Variant); overload; + begin + Write(string(v)); + end; + + function FixName( str : string) : string; + begin + if (length(str) > 3) and (str[1] = 'p') and (str[2] = 's') and (str[3] = '_') then + result := Copy(str,4,length(str)-3) + else + result := str; + end; + + function PtrName ( str : string) : String; + begin + debug(str); + if (length(str) > 1) and (str[1] in ['T','t']) then + result := 'P' + copy(str,2,length(str)-1) + else + result := 'P' + str; + debug(result); + end; + +var + p: TCodeParser; + m: TMemoryStream; + a, b, c: TDeclarationArray; + i, ii, iii, pc: Integer; + s: string; + d: TDeclaration; + Fail: Boolean; +begin + p := TCodeParser.Create; + m := TMemoryStream.Create; + + try + Output.BeginUpdate; + Output.Clear; + Dbg.BeginUpdate; + Dbg.Clear; + + Input.SaveToStream(m); + + try + p.Run(m); + except on E : Exception do + Debug(e.Message); + end; + + a := p.Items.GetItemsOfClass(TciProcedureDeclaration); + Debug('Start converting '+IntToStr(Length(a))+' methods!'); + for i := 0 to High(a) do + with TciProcedureDeclaration(a[i]) do + begin + if (Name = nil) then + begin + Debug('No name found, skipping..'); + Continue; + end; + + d := Items.GetFirstItemOfClass(TciReturnType); + if (d <> nil) then + begin + s := 'procedure Lape_'+FixName(Name.ShortText)+ + '(const Params: PParamArray; const Result: Pointer);'+LineEnding+ + 'begin'+LineEnding+ + ' '+PtrName(d.ShortText)+'(Result)^ := '; + end else + begin + s := 'procedure Lape_'+FixName(Name.ShortText)+'(const Params: PParamArray);'+LineEnding+ + 'begin'+LineEnding+' '; + end; + s := s+Name.ShortText+'('; + + Fail := False; + pc := 0; + b := GetParamDeclarations(); + for ii := 0 to High(b) do + begin + d := b[ii].Items.GetFirstItemOfClass(TciParameterType); + if (d = nil) then + begin + Debug('No parameter type found in '+Name.ShortText+', skipping..'); + Fail := True; + Break; + end; + c := b[ii].Items.GetItemsOfClass(TciParameterName); + if (Length(c) < 1) then + begin + Debug('No parameter names found in '+Name.ShortText+', skipping..'); + Fail := True; + Break; + end; + + for iii := 0 to High(c) do + begin + if (pc > 0) then + s := s+', '; + s := s+PtrName(d.ShortText)+'(Params^['+IntToStr(pc)+'])^'; + Inc(pc); + end; + end; + + if Fail then + Continue; + + s := s+');'+LineEnding+'end;'; + if (i > 0) then + s := LineEnding+s; + Write(s); + if procnames <> nil then + procnames.Add('AddGlobalFunc('#39 + CleanDeclaration + #39', @Lape_'+FixName(name.ShortText)+');') + else + Debug('Prog-name "AddGlobalFunc('#39 + CleanDeclaration + #39', @Lape_'+FixName(name.ShortText)+');"'); + Debug('Done "'+Name.ShortText+'"!'); + end; + finally + m.Free; + p.Free; + + Output.EndUpdate; + Dbg.EndUpdate; + end; + Debug('Done :)'); +end; + +procedure TfrmMain.btnGoClick(Sender: TObject); +begin + ConvertRT(eIn.Lines,eDebug.Lines,eOut.Lines); +end; + +procedure TfrmMain.btnAdvancedClick(Sender: TObject); +begin + WrapFilesForm.ShowModal; +end; + +end. + diff --git a/Projects/lape-wrappers/ruwa.ico b/Projects/lape-wrappers/ruwa.ico new file mode 100644 index 0000000000000000000000000000000000000000..0341321b5d952e1662a3d9444a73cf9f42a7db37 GIT binary patch literal 137040 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 G`+orYGy**U literal 0 HcmV?d00001 diff --git a/Projects/lape-wrappers/ruwa.lpi b/Projects/lape-wrappers/ruwa.lpi new file mode 100644 index 0000000..b30a17f --- /dev/null +++ b/Projects/lape-wrappers/ruwa.lpi @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/lape-wrappers/ruwa.lpr b/Projects/lape-wrappers/ruwa.lpr new file mode 100644 index 0000000..049bd79 --- /dev/null +++ b/Projects/lape-wrappers/ruwa.lpr @@ -0,0 +1,22 @@ +program ruwa; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, main, v_MiscFunctions, CastaliaPasLex, CastaliaPasLexTypes, + CastaliaSimplePasPar, CastaliaSimplePasParTypes, + v_Constants, v_ideCodeParser, wrapfiles; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.CreateForm(TWrapFilesForm, WrapFilesForm); + Application.Run; +end. + diff --git a/Projects/lape-wrappers/wrapfiles.lfm b/Projects/lape-wrappers/wrapfiles.lfm new file mode 100644 index 0000000..9762268 --- /dev/null +++ b/Projects/lape-wrappers/wrapfiles.lfm @@ -0,0 +1,94 @@ +object WrapFilesForm: TWrapFilesForm + Left = 429 + Height = 398 + Top = 234 + Width = 652 + Caption = 'WrapFilesForm' + ClientHeight = 398 + ClientWidth = 652 + Constraints.MinHeight = 398 + Constraints.MinWidth = 652 + OnCreate = FormCreate + LCLVersion = '0.9.29' + object FileButton: TButton + Left = 16 + Height = 25 + Top = 16 + Width = 75 + Caption = 'Select files' + OnClick = FileButtonClick + TabOrder = 0 + end + object FileBox: TListBox + Left = 16 + Height = 220 + Top = 56 + Width = 616 + Anchors = [akTop, akLeft, akRight, akBottom] + ItemHeight = 0 + TabOrder = 1 + end + object SaveDirEdit: TDirectoryEdit + Left = 192 + Height = 21 + Top = 20 + Width = 152 + ShowHidden = False + ButtonWidth = 23 + NumGlyphs = 0 + MaxLength = 0 + TabOrder = 2 + end + object SaveDirLabel: TLabel + Left = 104 + Height = 14 + Top = 20 + Width = 78 + Caption = 'Save directory: ' + ParentColor = False + end + object wrpBtn: TButton + Left = 568 + Height = 25 + Top = 16 + Width = 75 + Caption = 'Convert' + OnClick = wrpBtnClick + TabOrder = 3 + end + object dbgMemo: TMemo + Left = 16 + Height = 100 + Top = 287 + Width = 616 + Anchors = [akRight, akBottom] + TabOrder = 4 + end + object FileNameEdit1: TFileNameEdit + Left = 448 + Height = 21 + Top = 20 + Width = 80 + DialogOptions = [] + FilterIndex = 0 + HideDirectories = False + ButtonWidth = 23 + NumGlyphs = 0 + MaxLength = 0 + TabOrder = 5 + end + object Label1: TLabel + Left = 383 + Height = 14 + Top = 25 + Width = 57 + Caption = 'MethodFile:' + ParentColor = False + end + object FileDialog: TOpenDialog + Filter = 'Include files (*.inc)|*.inc|All files (*.*)|*.*' + Options = [ofAllowMultiSelect, ofFileMustExist, ofEnableSizing, ofViewDetail] + left = 32 + top = 56 + end +end diff --git a/Projects/lape-wrappers/wrapfiles.pas b/Projects/lape-wrappers/wrapfiles.pas new file mode 100644 index 0000000..59d8553 --- /dev/null +++ b/Projects/lape-wrappers/wrapfiles.pas @@ -0,0 +1,127 @@ +unit wrapfiles; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, + EditBtn; + +type + + { TWrapFilesForm } + + TWrapFilesForm = class(TForm) + dbgMemo: TMemo; + FileNameEdit1: TFileNameEdit; + Label1: TLabel; + wrpBtn: TButton; + SaveDirEdit: TDirectoryEdit; + FileButton: TButton; + FileBox: TListBox; + FileDialog: TOpenDialog; + SaveDirLabel: TLabel; + procedure FileButtonClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure wrpBtnClick(Sender: TObject); + private + { private declarations } + public + { public declarations } + end; + +var + WrapFilesForm: TWrapFilesForm; + +implementation + +uses + Main; + +{$R *.lfm} + +{ TWrapFilesForm } + +procedure TWrapFilesForm.FileButtonClick(Sender: TObject); +begin + if FileDialog.Execute then + begin + SaveDirEdit.Directory := ExtractFileDir(FileDialog.FileName); + FileBox.Items.AddStrings(FileDialog.Files); + end; +end; + +procedure TWrapFilesForm.FormCreate(Sender: TObject); +begin +end; + +procedure TWrapFilesForm.wrpBtnClick(Sender: TObject); + procedure dbg(s : string); + begin + dbgMemo.Lines.Add(s); + end; + +var + i : integer; + Input, Output,Procnames : TStringList; + NewFile : string; + YesToAll, NoToAll : boolean; +begin + YesToAll:= false; + NoToAll:= false; + if not DirectoryExists(SaveDirEdit.Directory) then + begin + dbg(format('Dir %s does not exist',[SaveDirEdit.Directory])); + exit; + end; + if FileBox.Items.Count < 1 then + begin + dbg('No files loaded'); + exit; + end; + Procnames := TStringList.Create; + for i := 0 to FileBox.Items.Count - 1 do + begin + if not FileExists(filebox.items[i]) then + begin + dbg(format('File[%s] does not exist',[FileBox.items[i]])); + continue; + end; + NewFile := SaveDirEdit.Directory + DirectorySeparator + ExtractFileName(FileBox.Items[i]); + if not YesToAll and FileExists(NewFile) then + begin + if NoToAll then + Continue; + case MessageDlg('File already exists',Format('Do you want to overwrite the file %s',[NewFile]), + mtConfirmation,[mbYes,mbYesToAll,mbNo,mbNoToAll],0) of + mrNo : Continue; + mrNoToAll : begin + NoToAll:= True; + Continue; + end; + mrYesToAll : YesToAll:= true; + end; + dbg(BoolToStr(YesToAll,true)); + end; + dbg(NewFile); + try + Input := TStringList.Create; + Input.LoadFromFile(filebox.items[i]); + Output := TStringList.Create; + ConvertRT(Input,dbgMemo.Lines,Output,Procnames); + Output.SaveToFile(NewFile); + Input.free; + Output.free; + except + dbg('Something went wrong'); + end; + end; + dbg(Procnames.Text); + if FileNameEdit1.Text <> '' then + Procnames.SaveToFile(FileNameEdit1.text); + Procnames.Free; +end; + +end. + diff --git a/Units/MMLAddon/LPInc/Wrappers/GENERATE THESE! b/Units/MMLAddon/LPInc/Wrappers/GENERATE THESE! new file mode 100644 index 0000000..e69de29 diff --git a/Units/MMLAddon/LPInc/Wrappers/bitmap.inc b/Units/MMLAddon/LPInc/Wrappers/bitmap.inc new file mode 100644 index 0000000..717b71b --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/bitmap.inc @@ -0,0 +1,259 @@ +procedure Lape_CreateBitmapString(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_CreateBitmapString(Pinteger(Params^[0])^); +end; + +procedure Lape_GetMufasaBitmap(const Params: PParamArray; const Result: Pointer); +begin + PMufasaBitmap(Result)^ := ps_GetMufasaBitmap(Pinteger(Params^[0])^); +end; + +procedure Lape_CreateBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_CreateBitmap(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_FreeBitmap(const Params: PParamArray); +begin + ps_FreeBitmap(Pinteger(Params^[0])^); +end; + +procedure Lape_SaveBitmap(const Params: PParamArray); +begin + ps_SaveBitmap(Pinteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_BitmapFromString(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_BitmapFromString(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pstring(Params^[2])^); +end; + +procedure Lape_LoadBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_LoadBitmap(PString(Params^[0])^); +end; + +procedure Lape_SetBitmapSize(const Params: PParamArray); +begin + ps_SetBitmapSize(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_StretchBitmapResize(const Params: PParamArray); +begin + ps_StretchBitmapResize(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_GetBitmapSize(const Params: PParamArray); +begin + ps_GetBitmapSize(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_SetBitmapName(const Params: PParamArray); +begin + ps_SetBitmapName(Pinteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_CreateMirroredBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_CreateMirroredBitmap(Pinteger(Params^[0])^); +end; + +procedure Lape_CreateMirroredBitmapEx(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_CreateMirroredBitmapEx(Pinteger(Params^[0])^, PBmpMirrorStyle(Params^[1])^); +end; + +procedure Lape_FastGetPixel(const Params: PParamArray; const Result: Pointer); +begin + PLongWord(Result)^ := ps_FastGetPixel(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_FastGetPixels(const Params: PParamArray; const Result: Pointer); +begin + PIntegerArray(Result)^ := ps_FastGetPixels(Pinteger(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_GetBitmapAreaColors(const Params: PParamArray; const Result: Pointer); +begin + P2DIntArray(Result)^ := ps_GetBitmapAreaColors(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^); +end; + +procedure Lape_FastSetPixel(const Params: PParamArray); +begin + ps_FastSetPixel(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, PColor(Params^[3])^); +end; + +procedure Lape_FastSetPixels(const Params: PParamArray); +begin + ps_FastSetPixels(Pinteger(Params^[0])^, PPointArray(Params^[1])^, PIntegerArray(Params^[2])^); +end; + +procedure Lape_DrawTPABitmap(const Params: PParamArray); +begin + ps_DrawTPABitmap(Pinteger(Params^[0])^, PPointArray(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_DrawATPABitmap(const Params: PParamArray); +begin + ps_DrawATPABitmap(Pinteger(Params^[0])^, P2DPointArray(Params^[1])^); +end; + +procedure Lape_DrawATPABitmapEx(const Params: PParamArray); +begin + ps_DrawATPABitmapEx(Pinteger(Params^[0])^, P2DPointArray(Params^[1])^, PIntegerArray(Params^[2])^); +end; + +procedure Lape_FastDrawClear(const Params: PParamArray); +begin + ps_FastDrawClear(Pinteger(Params^[0])^, PColor(Params^[1])^); +end; + +procedure Lape_DrawBitmap(const Params: PParamArray); +begin + ps_DrawBitmap(PInteger(Params^[0])^, PCanvas(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^); +end; + +procedure Lape_FastDrawTransparent(const Params: PParamArray); +begin + ps_FastDrawTransparent(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^); +end; + +procedure Lape_SetTransparentColor(const Params: PParamArray); +begin + ps_SetTransparentColor(Pinteger(Params^[0])^, PColor(Params^[1])^); +end; + +procedure Lape_GetTransparentColor(const Params: PParamArray; const Result: Pointer); +begin + PColor(Result)^ := ps_GetTransparentColor(Pinteger(Params^[0])^); +end; + +procedure Lape_FastReplaceColor(const Params: PParamArray); +begin + ps_FastReplaceColor(PInteger(Params^[0])^, PColor(Params^[1])^, PColor(Params^[2])^); +end; + +procedure Lape_CopyClientToBitmap(const Params: PParamArray); +begin + ps_CopyClientToBitmap(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^); +end; + +procedure Lape_BitmapFromClient(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_BitmapFromClient(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^); +end; + +procedure Lape_FindBitmap(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindBitmap(Pinteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_FindBitmapIn(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindBitmapIn(Pinteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^); +end; + +procedure Lape_FindBitmapToleranceIn(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindBitmapToleranceIn(Pinteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^); +end; + +procedure Lape_FindBitmapSpiral(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindBitmapSpiral(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^); +end; + +procedure Lape_FindBitmapsSpiralTolerance(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindBitmapsSpiralTolerance(Pinteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PPointArray(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^, PInteger(Params^[8])^); +end; + +procedure Lape_FindBitmapSpiralTolerance(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindBitmapSpiralTolerance(Pinteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, Pinteger(Params^[3])^, Pinteger(Params^[4])^, Pinteger(Params^[5])^, Pinteger(Params^[6])^, Pinteger(Params^[7])^); +end; + +procedure Lape_RotateBitmap(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_RotateBitmap(PInteger(Params^[0])^, PExtended(Params^[1])^); +end; + +procedure Lape_Desaturate(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_Desaturate(Pinteger(Params^[0])^); +end; + +procedure Lape_InvertBitmap(const Params: PParamArray); +begin + ps_InvertBitmap(Pinteger(Params^[0])^); +end; + +procedure Lape_CopyBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_CopyBitmap(Pinteger(Params^[0])^); +end; + +procedure Lape_GreyScaleBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_GreyScaleBitmap(Pinteger(Params^[0])^); +end; + +procedure Lape_BrightnessBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_BrightnessBitmap(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_ContrastBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_ContrastBitmap(Pinteger(Params^[0])^, Pextended(Params^[1])^); +end; + +procedure Lape_PosterizeBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_PosterizeBitmap(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_CreateMaskFromBitmap(const Params: PParamArray; const Result: Pointer); +begin + PMask(Result)^ := ps_CreateMaskFromBitmap(Pinteger(Params^[0])^); +end; + +procedure Lape_FindMaskTolerance(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindMaskTolerance(PMask(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^, PInteger(Params^[8])^); +end; + +procedure Lape_FindBitmapMaskTolerance(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindBitmapMaskTolerance(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^, PInteger(Params^[8])^); +end; + +procedure Lape_FindDeformedBitmapToleranceIn(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindDeformedBitmapToleranceIn(Pinteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^, PInteger(Params^[8])^, PBoolean(Params^[9])^, PExtended(Params^[10])^); +end; + +procedure Lape_RectangleBitmap(const Params: PParamArray); +begin + ps_RectangleBitmap(Pinteger(Params^[0])^, PBox(Params^[1])^, PColor(Params^[2])^); +end; + +procedure Lape_FloodFillBitmap(const Params: PParamArray); +begin + ps_FloodFillBitmap(Pinteger(Params^[0])^, PPoint(Params^[1])^, PColor(Params^[2])^, PColor(Params^[3])^); +end; + +procedure Lape_ConvoluteBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_ConvoluteBitmap(Pinteger(Params^[0])^, P2DExtendedArray(Params^[1])^); +end; + +procedure Lape_CalculatePixelShift(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_CalculatePixelShift(PInteger(Params^[0])^, PInteger(Params^[1])^, PBox(Params^[2])^); +end; + +procedure Lape_CalculatePixelTolerance(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_CalculatePixelTolerance(PInteger(Params^[0])^, PInteger(Params^[1])^, PBox(Params^[2])^, Pinteger(Params^[3])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/colour.inc b/Units/MMLAddon/LPInc/Wrappers/colour.inc new file mode 100644 index 0000000..db8d257 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/colour.inc @@ -0,0 +1,104 @@ +procedure Lape_GetColor(const Params: PParamArray; const Result: Pointer); +begin + PColor(Result)^ := ps_GetColor(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_GetColorsWrap(const Params: PParamArray); +begin + ps_GetColorsWrap(PPointArray(Params^[0])^, PIntegerArray(Params^[1])^); +end; + +procedure Lape_GetColors(const Params: PParamArray; const Result: Pointer); +begin + PIntegerArray(Result)^ := ps_GetColors(PPointArray(Params^[0])^); +end; + +procedure Lape_findcolor(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_findcolor(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, Pinteger(Params^[3])^, Pinteger(Params^[4])^, Pinteger(Params^[5])^, Pinteger(Params^[6])^); +end; + +procedure Lape_findcolortoleranceOptimised(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_findcolortoleranceOptimised(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, Pinteger(Params^[3])^, Pinteger(Params^[4])^, Pinteger(Params^[5])^, Pinteger(Params^[6])^, Pinteger(Params^[7])^); +end; + +procedure Lape_findcolortolerance(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_findcolortolerance(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, Pinteger(Params^[3])^, Pinteger(Params^[4])^, Pinteger(Params^[5])^, Pinteger(Params^[6])^, Pinteger(Params^[7])^); +end; + +procedure Lape_FindColors(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindColors(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^); +end; + +procedure Lape_SetColorToleranceSpeed(const Params: PParamArray); +begin + ps_SetColorToleranceSpeed(PInteger(Params^[0])^); +end; + +procedure Lape_GetToleranceSpeed(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_GetToleranceSpeed(); +end; + +procedure Lape_SetToleranceSpeed2Modifiers(const Params: PParamArray); +begin + ps_SetToleranceSpeed2Modifiers(PExtended(Params^[0])^, PExtended(Params^[1])^); +end; + +procedure Lape_GetToleranceSpeed2Modifiers(const Params: PParamArray); +begin + ps_GetToleranceSpeed2Modifiers(PExtended(Params^[0])^, PExtended(Params^[1])^); +end; + +procedure Lape_SimilarColors(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_SimilarColors(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_CountColor(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_CountColor(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^); +end; + +procedure Lape_CountColorTolerance(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_CountColorTolerance(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^); +end; + +procedure Lape_FindColorsToleranceOptimised(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindColorsToleranceOptimised(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^); +end; + +procedure Lape_FindColorsTolerance(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindColorsTolerance(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^); +end; + +procedure Lape_FindColorSpiral(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindColorSpiral(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^); +end; + +procedure Lape_FindColorSpiralTolerance(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindColorSpiralTolerance(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^); +end; + +procedure Lape_FindColorsSpiralTolerance(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_FindColorsSpiralTolerance(PInteger(Params^[0])^, PInteger(Params^[1])^, PPointArray(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^, PInteger(Params^[8])^); +end; + +procedure Lape_FindColoredArea(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindColoredArea(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^); +end; + +procedure Lape_FindColoredAreaTolerance(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindColoredAreaTolerance(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PInteger(Params^[7])^, PInteger(Params^[8])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/colourconv.inc b/Units/MMLAddon/LPInc/Wrappers/colourconv.inc new file mode 100644 index 0000000..07910d9 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/colourconv.inc @@ -0,0 +1,4 @@ +procedure Lape_ColorToRGB(const Params: PParamArray); +begin + ps_ColorToRGB(Pinteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/crypto.inc b/Units/MMLAddon/LPInc/Wrappers/crypto.inc new file mode 100644 index 0000000..63e2a8b --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/crypto.inc @@ -0,0 +1,4 @@ +procedure Lape_haval(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_haval(Pstring(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/dtm.inc b/Units/MMLAddon/LPInc/Wrappers/dtm.inc new file mode 100644 index 0000000..d65b0af --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/dtm.inc @@ -0,0 +1,79 @@ +procedure Lape_FindDTM(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindDTM(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^); +end; + +procedure Lape_FindDTMs(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindDTMs(PInteger(Params^[0])^, PPointArray(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^); +end; + +procedure Lape_FindDTMRotatedAlternating(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindDTMRotatedAlternating(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PExtended(Params^[7])^, PExtended(Params^[8])^, PExtended(Params^[9])^, PExtended(Params^[10])^); +end; + +procedure Lape_FindDTMRotatedSE(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindDTMRotatedSE(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^, PExtended(Params^[7])^, PExtended(Params^[8])^, PExtended(Params^[9])^, PExtended(Params^[10])^); +end; + +procedure Lape_FindDTMsRotatedAlternating(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindDTMsRotatedAlternating(PInteger(Params^[0])^, PPointArray(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PExtended(Params^[6])^, PExtended(Params^[7])^, PExtended(Params^[8])^, P2DExtendedArray(Params^[9])^); +end; + +procedure Lape_FindDTMsRotatedSE(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindDTMsRotatedSE(PInteger(Params^[0])^, PPointArray(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^, PInteger(Params^[5])^, PExtended(Params^[6])^, PExtended(Params^[7])^, PExtended(Params^[8])^, P2DExtendedArray(Params^[9])^); +end; + +procedure Lape_SetDTMName(const Params: PParamArray); +begin + ps_SetDTMName(Pinteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_DTMFromString(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_DTMFromString(PString(Params^[0])^); +end; + +procedure Lape_FreeDTM(const Params: PParamArray); +begin + ps_FreeDTM(PInteger(Params^[0])^); +end; + +procedure Lape_GetDTM(const Params: PParamArray; const Result: Pointer); +begin + PMDTM(Result)^ := ps_GetDTM(PInteger(Params^[0])^); +end; + +procedure Lape_AddTSDTM(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_AddTSDTM(PSDTM(Params^[0])^); +end; + +procedure Lape_AddDTM(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_AddDTM(PMDTM(Params^[0])^); +end; + +procedure Lape_PrintDTM(const Params: PParamArray); +begin + ps_PrintDTM(PMDTM(Params^[0])^); +end; + +procedure Lape_MDTMToSDTM(const Params: PParamArray; const Result: Pointer); +begin + PSDTM(Result)^ := ps_MDTMToSDTM(PMDTM(Params^[0])^); +end; + +procedure Lape_SDTMToMDTM(const Params: PParamArray; const Result: Pointer); +begin + PMDTM(Result)^ := ps_SDTMToMDTM(PSDTM(Params^[0])^); +end; + +procedure Lape_CreateDTMPoint(const Params: PParamArray; const Result: Pointer); +begin + PMDTMPoint(Result)^ := ps_CreateDTMPoint(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, Pinteger(Params^[3])^, Pinteger(Params^[4])^, Pboolean(Params^[5])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/extensions.inc b/Units/MMLAddon/LPInc/Wrappers/extensions.inc new file mode 100644 index 0000000..68d3628 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/extensions.inc @@ -0,0 +1,64 @@ +procedure Lape_ext_UnTar(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ext_UnTar(Pstring(Params^[0])^, PStringArray(Params^[1])^); +end; + +procedure Lape_ext_UnTarEx(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ext_UnTarEx(Pstring(Params^[0])^, Pstring(Params^[1])^, Pboolean(Params^[2])^); +end; + +procedure Lape_ext_DecompressBZip2(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ext_DecompressBZip2(Pstring(Params^[0])^, Pstring(Params^[1])^, PCardinal(Params^[2])^); +end; + +procedure Lape_ext_GetPage(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ext_GetPage(Pstring(Params^[0])^); +end; + +procedure Lape_ext_MessageDlg(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ext_MessageDlg(Pstring(Params^[0])^, Pstring(Params^[1])^, PMsgDlgType(Params^[2])^, PMsgDlgButtons(Params^[3])^, PLongint(Params^[4])^); +end; + +procedure Lape_ext_SDTMToMDTM(const Params: PParamArray; const Result: Pointer); +begin + PMDTM(Result)^ := ext_SDTMToMDTM(PSDTM(Params^[0])^); +end; + +procedure Lape_ext_InputQuery(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ext_InputQuery(PString(Params^[0])^, PString(Params^[1])^, PString(Params^[2])^); +end; + +procedure Lape_ext_ScriptText(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ext_ScriptText(); +end; + +procedure Lape_ext_GetSelectedText(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ext_GetSelectedText(); +end; + +procedure Lape_ext_OpenScript(const Params: PParamArray); +begin + ext_OpenScript(Pstring(Params^[0])^, Pstring(Params^[1])^, Pboolean(Params^[2])^); +end; + +procedure Lape_ext_OpenScriptEx(const Params: PParamArray); +begin + ext_OpenScriptEx(Pstring(Params^[0])^, Pboolean(Params^[1])^); +end; + +procedure Lape_ext_GetPageEx(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ext_GetPageEx(Pstring(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^); +end; + +procedure Lape_ext_GetJSONValue(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ext_GetJSONValue(Pstring(Params^[0])^, Pstring(Params^[1])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/file.inc b/Units/MMLAddon/LPInc/Wrappers/file.inc new file mode 100644 index 0000000..2fd6685 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/file.inc @@ -0,0 +1,89 @@ +procedure Lape_CreateFile(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_CreateFile(Pstring(Params^[0])^); +end; + +procedure Lape_OpenFile(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_OpenFile(Pstring(Params^[0])^, PBoolean(Params^[1])^); +end; + +procedure Lape_RewriteFile(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_RewriteFile(Pstring(Params^[0])^, PBoolean(Params^[1])^); +end; + +procedure Lape_AppendFile(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_AppendFile(Pstring(Params^[0])^); +end; + +procedure Lape_CloseFile(const Params: PParamArray); +begin + ps_CloseFile(PInteger(Params^[0])^); +end; + +procedure Lape_EndOfFile(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_EndOfFile(PInteger(Params^[0])^); +end; + +procedure Lape_FileSize(const Params: PParamArray; const Result: Pointer); +begin + PLongInt(Result)^ := ps_FileSize(PInteger(Params^[0])^); +end; + +procedure Lape_ReadFileString(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_ReadFileString(PInteger(Params^[0])^, Pstring(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_WriteFileString(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_WriteFileString(PInteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_SetFileCharPointer(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_SetFileCharPointer(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_FilePointerPos(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_FilePointerPos(PInteger(Params^[0])^); +end; + +procedure Lape_FileExists(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FileExists(Pstring(Params^[0])^); +end; + +procedure Lape_DirectoryExists(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_DirectoryExists(Pstring(Params^[0])^); +end; + +procedure Lape_CreateDirectory(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_CreateDirectory(Pstring(Params^[0])^); +end; + +procedure Lape_ForceDirectores(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_ForceDirectores(Pstring(Params^[0])^); +end; + +procedure Lape_GetFiles(const Params: PParamArray; const Result: Pointer); +begin + PStringArray(Result)^ := ps_GetFiles(Pstring(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_GetDirectories(const Params: PParamArray; const Result: Pointer); +begin + PStringArray(Result)^ := ps_GetDirectories(Pstring(Params^[0])^); +end; + +procedure Lape_WriteINI(const Params: PParamArray); +begin + ps_WriteINI(Pstring(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^, Pstring(Params^[3])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/internets.inc b/Units/MMLAddon/LPInc/Wrappers/internets.inc new file mode 100644 index 0000000..e4651c3 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/internets.inc @@ -0,0 +1,124 @@ +procedure Lape_OpenWebPage(const Params: PParamArray); +begin + ps_OpenWebPage(Pstring(Params^[0])^); +end; + +procedure Lape_GetPage(const Params: PParamArray; const Result: Pointer); +begin + PString(Result)^ := ps_GetPage(PString(Params^[0])^); +end; + +procedure Lape_InitializeHTTPClient(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_InitializeHTTPClient(PBoolean(Params^[0])^); +end; + +procedure Lape_FreeHTTPClient(const Params: PParamArray); +begin + ps_FreeHTTPClient(PInteger(Params^[0])^); +end; + +procedure Lape_GetHTTPPage(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_GetHTTPPage(PInteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_SetHTTPUserAgent(const Params: PParamArray); +begin + ps_SetHTTPUserAgent(PInteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_PostHTTPPage(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_PostHTTPPage(PInteger(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^); +end; + +procedure Lape_PostHTTPPageEx(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_PostHTTPPageEx(PInteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_ClearPostData(const Params: PParamArray); +begin + ps_ClearPostData(PInteger(Params^[0])^); +end; + +procedure Lape_AddPostVariable(const Params: PParamArray); +begin + ps_AddPostVariable(PInteger(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^); +end; + +procedure Lape_GetRawHeaders(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_GetRawHeaders(PInteger(Params^[0])^); +end; + +procedure Lape_SetProxy(const Params: PParamArray); +begin + ps_SetProxy(PInteger(Params^[0])^, PString(Params^[1])^, PString(Params^[2])^); +end; + +procedure Lape_RecvSocketStr(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_RecvSocketStr(Pinteger(Params^[0])^); +end; + +procedure Lape_RecvSocket(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_RecvSocket(Pinteger(Params^[0])^); +end; + +procedure Lape_RecvSocketEx(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_RecvSocketEx(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_SendSocket(const Params: PParamArray); +begin + ps_SendSocket(Pinteger(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_ConnectSocket(const Params: PParamArray); +begin + ps_ConnectSocket(Pinteger(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^); +end; + +procedure Lape_CloseSocket(const Params: PParamArray); +begin + ps_CloseSocket(Pinteger(Params^[0])^); +end; + +procedure Lape_SetSocketTimeout(const Params: PParamArray); +begin + ps_SetSocketTimeout(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_BindSocket(const Params: PParamArray); +begin + ps_BindSocket(Pinteger(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^); +end; + +procedure Lape_ListenSocket(const Params: PParamArray); +begin + ps_ListenSocket(Pinteger(Params^[0])^); +end; + +procedure Lape_AcceptSocket(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_AcceptSocket(Pinteger(Params^[0])^); +end; + +procedure Lape_SocketInfo(const Params: PParamArray); +begin + ps_SocketInfo(Pinteger(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^); +end; + +procedure Lape_CreateSocket(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_CreateSocket(); +end; + +procedure Lape_FreeSocket(const Params: PParamArray); +begin + ps_FreeSocket(Pinteger(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/keyboard.inc b/Units/MMLAddon/LPInc/Wrappers/keyboard.inc new file mode 100644 index 0000000..9ff164e --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/keyboard.inc @@ -0,0 +1,29 @@ +procedure Lape_KeyDown(const Params: PParamArray); +begin + ps_KeyDown(PWord(Params^[0])^); +end; + +procedure Lape_KeyUp(const Params: PParamArray); +begin + ps_KeyUp(PWord(Params^[0])^); +end; + +procedure Lape_SendKeys(const Params: PParamArray); +begin + ps_SendKeys(Pstring(Params^[0])^); +end; + +procedure Lape_PressKey(const Params: PParamArray); +begin + ps_PressKey(PWord(Params^[0])^); +end; + +procedure Lape_isKeyDown(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_isKeyDown(PWord(Params^[0])^); +end; + +procedure Lape_GetKeyCode(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_GetKeyCode(Pchar(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/math.inc b/Units/MMLAddon/LPInc/Wrappers/math.inc new file mode 100644 index 0000000..cba1832 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/math.inc @@ -0,0 +1,114 @@ +procedure Lape_round(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_round(Pextended(Params^[0])^); +end; + +procedure Lape_iAbs(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_iAbs(Pinteger(Params^[0])^); +end; + +procedure Lape_ceil(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_ceil(Pextended(Params^[0])^); +end; + +procedure Lape_pow(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_pow(Pextended(Params^[0])^, Pextended(Params^[1])^); +end; + +procedure Lape_RiemannGauss(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_RiemannGauss(Pextended(Params^[0])^, Pextended(Params^[1])^, Pextended(Params^[2])^, Pinteger(Params^[3])^); +end; + +procedure Lape_DiscreteGauss(const Params: PParamArray; const Result: Pointer); +begin + PExtendedArray(Result)^ := ps_DiscreteGauss(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pextended(Params^[2])^); +end; + +procedure Lape_GaussMatrix(const Params: PParamArray; const Result: Pointer); +begin + P2DExtendedArray(Result)^ := ps_GaussMatrix(Pinteger(Params^[0])^, Pextended(Params^[1])^); +end; + +procedure Lape_exp(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_exp(Pextended(Params^[0])^); +end; + +procedure Lape_Max(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_Max(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_Min(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_Min(PInteger(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_MinE(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_MinE(Pextended(Params^[0])^, Pextended(Params^[1])^); +end; + +procedure Lape_MaxE(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_MaxE(Pextended(Params^[0])^, Pextended(Params^[1])^); +end; + +procedure Lape_Sqr(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_Sqr(Pextended(Params^[0])^); +end; + +procedure Lape_Point(const Params: PParamArray; const Result: Pointer); +begin + PPoint(Result)^ := ps_Point(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_Distance(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_Distance(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, Pinteger(Params^[3])^); +end; + +procedure Lape_Hypot(const Params: PParamArray; const Result: Pointer); +begin + PExtended(Result)^ := ps_Hypot(PExtended(Params^[0])^, PExtended(Params^[1])^); +end; + +procedure Lape_RandomRange(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_RandomRange(PInteger(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_Random(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_Random(Pinteger(Params^[0])^); +end; + +procedure Lape_RandomE(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_RandomE(); +end; + +procedure Lape_ArcTan2(const Params: PParamArray; const Result: Pointer); +begin + Pextended(Result)^ := ps_ArcTan2(Pextended(Params^[0])^, Pextended(Params^[1])^); +end; + +procedure Lape_IncEx(const Params: PParamArray); +begin + ps_IncEx(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_DecEx(const Params: PParamArray); +begin + ps_DecEx(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_Factorial(const Params: PParamArray; const Result: Pointer); +begin + PInt64(Result)^ := ps_Factorial(Plongword(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/mouse.inc b/Units/MMLAddon/LPInc/Wrappers/mouse.inc new file mode 100644 index 0000000..951a34b --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/mouse.inc @@ -0,0 +1,39 @@ +procedure Lape_MoveMouse(const Params: PParamArray); +begin + ps_MoveMouse(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_ScrollMouse(const Params: PParamArray); +begin + ps_ScrollMouse(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_GetMousePos(const Params: PParamArray); +begin + ps_GetMousePos(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_ConvIntClickType(const Params: PParamArray; const Result: Pointer); +begin + PClickType(Result)^ := ConvIntClickType(PInteger(Params^[0])^); +end; + +procedure Lape_HoldMouse(const Params: PParamArray); +begin + ps_HoldMouse(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_ReleaseMouse(const Params: PParamArray); +begin + ps_ReleaseMouse(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_ClickMouse(const Params: PParamArray); +begin + ps_ClickMouse(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_IsMouseButtonDown(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_IsMouseButtonDown(Pinteger(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/ocr.inc b/Units/MMLAddon/LPInc/Wrappers/ocr.inc new file mode 100644 index 0000000..c1bf07e --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/ocr.inc @@ -0,0 +1,19 @@ +procedure Lape_rs_GetUpText(const Params: PParamArray; const Result: Pointer); +begin + PString(Result)^ := ps_rs_GetUpText(); +end; + +procedure Lape_rs_GetUpTextAtEx(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_rs_GetUpTextAtEx(Pinteger(Params^[0])^, Pinteger(Params^[1])^, Pboolean(Params^[2])^); +end; + +procedure Lape_rs_GetUpTextAt(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_rs_GetUpTextAt(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_BitmapFromText(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_BitmapFromText(PString(Params^[0])^, PString(Params^[1])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/other.inc b/Units/MMLAddon/LPInc/Wrappers/other.inc new file mode 100644 index 0000000..4a7969c --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/other.inc @@ -0,0 +1,19 @@ +procedure Lape_Writeln(const Params: PParamArray); +begin + ps_Writeln(Pstring(Params^[0])^); +end; + +procedure Lape_SetScriptProp(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_SetScriptProp(PSP_Property(Params^[0])^, PVariantArray(Params^[1])^); +end; + +procedure Lape_GetScriptProp(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_GetScriptProp(PSP_Property(Params^[0])^, PVariantArray(Params^[1])^); +end; + +procedure Lape_Wait(const Params: PParamArray); +begin + ps_Wait(PDWord(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/settings.inc b/Units/MMLAddon/LPInc/Wrappers/settings.inc new file mode 100644 index 0000000..f865eb6 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/settings.inc @@ -0,0 +1,39 @@ +procedure Lape_SetSettingValue(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_SetSettingValue(Pstring(Params^[0])^, Pstring(Params^[1])^); +end; + +procedure Lape_KeyIsSetting(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_KeyIsSetting(PString(Params^[0])^); +end; + +procedure Lape_KeyIsDirectory(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_KeyIsDirectory(PString(Params^[0])^); +end; + +procedure Lape_GetSettingValue(const Params: PParamArray; const Result: Pointer); +begin + PString(Result)^ := ps_GetSettingValue(PString(Params^[0])^); +end; + +procedure Lape_GetSettingValueDef(const Params: PParamArray; const Result: Pointer); +begin + PString(Result)^ := ps_GetSettingValueDef(PString(Params^[0])^, PString(Params^[1])^); +end; + +procedure Lape_ListSettings(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_ListSettings(PString(Params^[0])^, PStringArray(Params^[1])^); +end; + +procedure Lape_DeleteSetting(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_DeleteSetting(PString(Params^[0])^); +end; + +procedure Lape_DeleteSubSettings(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_DeleteSubSettings(PString(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/strings.inc b/Units/MMLAddon/LPInc/Wrappers/strings.inc new file mode 100644 index 0000000..155830c --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/strings.inc @@ -0,0 +1,84 @@ +procedure Lape_Capitalize(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_Capitalize(Pstring(Params^[0])^); +end; + +procedure Lape_CompressString(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_CompressString(Pstring(Params^[0])^); +end; + +procedure Lape_DecompressString(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_DecompressString(Pstring(Params^[0])^); +end; + +procedure Lape_Base64Encode(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_Base64Encode(Pstring(Params^[0])^); +end; + +procedure Lape_Base64Decode(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_Base64Decode(Pstring(Params^[0])^); +end; + +procedure Lape_ExtractFromStr(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_ExtractFromStr(Pstring(Params^[0])^, PStrExtr(Params^[1])^); +end; + +procedure Lape_BoolToStr(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_BoolToStr(Pboolean(Params^[0])^); +end; + +procedure Lape_Replace(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_Replace(Pstring(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^, PReplaceFlags(Params^[3])^); +end; + +procedure Lape_IntToStr(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_IntToStr(Pinteger(Params^[0])^); +end; + +procedure Lape_FloatToStr(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_FloatToStr(Pextended(Params^[0])^); +end; + +procedure Lape_StrToInt(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_StrToInt(PString(Params^[0])^); +end; + +procedure Lape_StrToIntDef(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_StrToIntDef(PString(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_StrToFloat(const Params: PParamArray; const Result: Pointer); +begin + PExtended(Result)^ := ps_StrToFloat(PString(Params^[0])^); +end; + +procedure Lape_StrToFloatDef(const Params: PParamArray; const Result: Pointer); +begin + PExtended(Result)^ := ps_StrToFloatDef(PString(Params^[0])^, PExtended(Params^[1])^); +end; + +procedure Lape_StrToBool(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_StrToBool(PString(Params^[0])^); +end; + +procedure Lape_StrToBoolDef(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_StrToBoolDef(PString(Params^[0])^, PBoolean(Params^[1])^); +end; + +procedure Lape_Between(const Params: PParamArray; const Result: Pointer); +begin + Pstring(Result)^ := ps_Between(Pstring(Params^[0])^, Pstring(Params^[1])^, Pstring(Params^[2])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/tpa.inc b/Units/MMLAddon/LPInc/Wrappers/tpa.inc new file mode 100644 index 0000000..32a5535 --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/tpa.inc @@ -0,0 +1,424 @@ +procedure Lape_Quicksort(const Params: PParamArray); +begin + ps_Quicksort(PIntegerArray(Params^[0])^); +end; + +procedure Lape_tSwap(const Params: PParamArray); +begin + ps_tSwap(PPoint(Params^[0])^, PPoint(Params^[1])^); +end; + +procedure Lape_tpaSwap(const Params: PParamArray); +begin + ps_tpaSwap(PPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_SwapE(const Params: PParamArray); +begin + ps_SwapE(PExtended(Params^[0])^, PExtended(Params^[1])^); +end; + +procedure Lape_RAaSTPAEx(const Params: PParamArray); +begin + ps_RAaSTPAEx(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_RAaSTPA(const Params: PParamArray); +begin + ps_RAaSTPA(PPointArray(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_NearbyPointInArrayEx(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_NearbyPointInArrayEx(PPoint(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PPointArray(Params^[3])^); +end; + +procedure Lape_NearbyPointInArray(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_NearbyPointInArray(PPoint(Params^[0])^, PInteger(Params^[1])^, PPointArray(Params^[2])^); +end; + +procedure Lape_QuickTPASort(const Params: PParamArray); +begin + ps_QuickTPASort(PIntegerArray(Params^[0])^, PPointArray(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PBoolean(Params^[4])^); +end; + +procedure Lape_QuickATPASort(const Params: PParamArray); +begin + ps_QuickATPASort(PIntegerArray(Params^[0])^, P2DPointArray(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PBoolean(Params^[4])^); +end; + +procedure Lape_SortTPAFrom(const Params: PParamArray); +begin + ps_SortTPAFrom(PPointArray(Params^[0])^, PPoint(Params^[1])^); +end; + +procedure Lape_SortATPAFrom(const Params: PParamArray); +begin + ps_SortATPAFrom(P2DPointArray(Params^[0])^, PPoint(Params^[1])^); +end; + +procedure Lape_SortATPAFromFirstPoint(const Params: PParamArray); +begin + ps_SortATPAFromFirstPoint(P2DPointArray(Params^[0])^, PPoint(Params^[1])^); +end; + +procedure Lape_InvertTPA(const Params: PParamArray); +begin + ps_InvertTPA(PPointArray(Params^[0])^); +end; + +procedure Lape_InvertATPA(const Params: PParamArray); +begin + ps_InvertATPA(P2DPointArray(Params^[0])^); +end; + +procedure Lape_MiddleTPAEx(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_MiddleTPAEx(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_MiddleTPA(const Params: PParamArray; const Result: Pointer); +begin + PPoint(Result)^ := ps_MiddleTPA(PPointArray(Params^[0])^); +end; + +procedure Lape_SortATPASize(const Params: PParamArray); +begin + ps_SortATPASize(P2DPointArray(Params^[0])^, PBoolean(Params^[1])^); +end; + +procedure Lape_SortATPAFromSize(const Params: PParamArray); +begin + ps_SortATPAFromSize(P2DPointArray(Params^[0])^, PInteger(Params^[1])^, PBoolean(Params^[2])^); +end; + +procedure Lape_InIntArrayEx(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_InIntArrayEx(PIntegerArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_InIntArray(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_InIntArray(PIntegerArray(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_ClearSameIntegers(const Params: PParamArray); +begin + ps_ClearSameIntegers(PIntegerArray(Params^[0])^); +end; + +procedure Lape_ClearSameIntegersAndTPA(const Params: PParamArray); +begin + ps_ClearSameIntegersAndTPA(PIntegerArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_SplitTPAEx(const Params: PParamArray; const Result: Pointer); +begin + P2DPointArray(Result)^ := ps_SplitTPAEx(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_SplitTPA(const Params: PParamArray; const Result: Pointer); +begin + P2DPointArray(Result)^ := ps_SplitTPA(PPointArray(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_FloodFillTPA(const Params: PParamArray; const Result: Pointer); +begin + P2DPointArray(Result)^ := ps_FloodFillTPA(PPointArray(Params^[0])^); +end; + +procedure Lape_FilterPointsPie(const Params: PParamArray); +begin + ps_FilterPointsPie(PPointArray(Params^[0])^, PExtended(Params^[1])^, PExtended(Params^[2])^, PExtended(Params^[3])^, PExtended(Params^[4])^, PInteger(Params^[5])^, PInteger(Params^[6])^); +end; + +procedure Lape_FilterPointsDist(const Params: PParamArray); +begin + ps_FilterPointsDist(PPointArray(Params^[0])^, PExtended(Params^[1])^, PExtended(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^); +end; + +procedure Lape_FilterPointsLine(const Params: PParamArray); +begin + ps_FilterPointsLine(PPointArray(Params^[0])^, PExtended(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PInteger(Params^[4])^); +end; + +procedure Lape_FilterTPADist(const Params: PParamArray); +begin + ps_FilterTPADist(PPointArray(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_GetATPABounds(const Params: PParamArray; const Result: Pointer); +begin + PBox(Result)^ := ps_GetATPABounds(P2DPointArray(Params^[0])^); +end; + +procedure Lape_GetTPABounds(const Params: PParamArray; const Result: Pointer); +begin + PBox(Result)^ := ps_GetTPABounds(PPointArray(Params^[0])^); +end; + +procedure Lape_FindTPAinTPA(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindTPAinTPA(PPointArray(Params^[0])^, PPointArray(Params^[1])^, PPointArray(Params^[2])^); +end; + +procedure Lape_GetSamePointsATPA(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_GetSamePointsATPA(P2DPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_FindTextTPAinTPA(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_FindTextTPAinTPA(Pinteger(Params^[0])^, PPointArray(Params^[1])^, PPointArray(Params^[2])^, PPointArray(Params^[3])^); +end; + +procedure Lape_SortCircleWise(const Params: PParamArray); +begin + ps_SortCircleWise(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PBoolean(Params^[4])^, PBoolean(Params^[5])^); +end; + +procedure Lape_LinearSort(const Params: PParamArray); +begin + ps_LinearSort(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PInteger(Params^[3])^, PBoolean(Params^[4])^); +end; + +procedure Lape_RotatePoint(const Params: PParamArray; const Result: Pointer); +begin + PPoint(Result)^ := ps_RotatePoint(PPoint(Params^[0])^, PExtended(Params^[1])^, PExtended(Params^[2])^, PExtended(Params^[3])^); +end; + +procedure Lape_ChangeDistPT(const Params: PParamArray; const Result: Pointer); +begin + PPoint(Result)^ := ps_ChangeDistPT(PPoint(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, Pextended(Params^[3])^); +end; + +procedure Lape_ChangeDistTPA(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_ChangeDistTPA(PPointArray(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^, Pextended(Params^[3])^); +end; + +procedure Lape_FindGapsTPA(const Params: PParamArray; const Result: Pointer); +begin + P2DPointArray(Result)^ := ps_FindGapsTPA(PPointArray(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_RemoveDistTPointArray(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_RemoveDistTPointArray(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PPointArray(Params^[3])^, PBoolean(Params^[4])^); +end; + +procedure Lape_CombineTPA(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_CombineTPA(PPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_ReArrangeandShortenArrayEx(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_ReArrangeandShortenArrayEx(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_ReArrangeandShortenArray(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_ReArrangeandShortenArray(PPointArray(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_TPAtoATPAEx(const Params: PParamArray; const Result: Pointer); +begin + P2DPointArray(Result)^ := ps_TPAtoATPAEx(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^); +end; + +procedure Lape_TPAtoATPA(const Params: PParamArray; const Result: Pointer); +begin + P2DPointArray(Result)^ := ps_TPAtoATPA(PPointArray(Params^[0])^, PInteger(Params^[1])^); +end; + +procedure Lape_CombineIntArray(const Params: PParamArray; const Result: Pointer); +begin + PIntegerArray(Result)^ := ps_CombineIntArray(PIntegerArray(Params^[0])^, PIntegerArray(Params^[1])^); +end; + +procedure Lape_MergeATPA(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_MergeATPA(P2DPointArray(Params^[0])^); +end; + +procedure Lape_AppendTPA(const Params: PParamArray); +begin + ps_AppendTPA(PPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_TPAFromBox(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_TPAFromBox(PBox(Params^[0])^); +end; + +procedure Lape_RotatePoints(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_RotatePoints(PPointArray(Params^[0])^, PExtended(Params^[1])^, PExtended(Params^[2])^, PExtended(Params^[3])^); +end; + +procedure Lape_FindTPAEdges(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_FindTPAEdges(PPointArray(Params^[0])^); +end; + +procedure Lape_ClearTPAFromTPA(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_ClearTPAFromTPA(PPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_ReturnPointsNotInTPA(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_ReturnPointsNotInTPA(PPointArray(Params^[0])^, PBox(Params^[1])^); +end; + +procedure Lape_PointInTPA(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_PointInTPA(PPoint(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_ClearDoubleTPA(const Params: PParamArray); +begin + ps_ClearDoubleTPA(PPointArray(Params^[0])^); +end; + +procedure Lape_TPACountSort(const Params: PParamArray); +begin + ps_TPACountSort(PPointArray(Params^[0])^, PPoint(Params^[1])^, PBoolean(Params^[2])^); +end; + +procedure Lape_TPACountSortBase(const Params: PParamArray); +begin + ps_TPACountSortBase(PPointArray(Params^[0])^, PPoint(Params^[1])^, PPoint(Params^[2])^, PBoolean(Params^[3])^); +end; + +procedure Lape_InvertTIA(const Params: PParamArray); +begin + ps_InvertTIA(PIntegerArray(Params^[0])^); +end; + +procedure Lape_SumIntegerArray(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_SumIntegerArray(PIntegerArray(Params^[0])^); +end; + +procedure Lape_AverageTIA(const Params: PParamArray; const Result: Pointer); +begin + PInteger(Result)^ := ps_AverageTIA(PIntegerArray(Params^[0])^); +end; + +procedure Lape_AverageExtended(const Params: PParamArray; const Result: Pointer); +begin + PExtended(Result)^ := ps_AverageExtended(PExtendedArray(Params^[0])^); +end; + +procedure Lape_SplitTPAExWrap(const Params: PParamArray); +begin + ps_SplitTPAExWrap(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, P2DPointArray(Params^[3])^); +end; + +procedure Lape_SplitTPAWrap(const Params: PParamArray); +begin + ps_SplitTPAWrap(PPointArray(Params^[0])^, PInteger(Params^[1])^, P2DPointArray(Params^[2])^); +end; + +procedure Lape_FindGapsTPAWrap(const Params: PParamArray); +begin + ps_FindGapsTPAWrap(PPointArray(Params^[0])^, PInteger(Params^[1])^, P2DPointArray(Params^[2])^); +end; + +procedure Lape_RemoveDistTPointArrayWrap(const Params: PParamArray); +begin + ps_RemoveDistTPointArrayWrap(PInteger(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PPointArray(Params^[3])^, PBoolean(Params^[4])^, PPointArray(Params^[5])^); +end; + +procedure Lape_CombineTPAWrap(const Params: PParamArray); +begin + ps_CombineTPAWrap(PPointArray(Params^[0])^, PPointArray(Params^[1])^, PPointArray(Params^[2])^); +end; + +procedure Lape_ReArrangeandShortenArrayExWrap(const Params: PParamArray); +begin + ps_ReArrangeandShortenArrayExWrap(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, PPointArray(Params^[3])^); +end; + +procedure Lape_ReArrangeandShortenArrayWrap(const Params: PParamArray); +begin + ps_ReArrangeandShortenArrayWrap(PPointArray(Params^[0])^, PInteger(Params^[1])^, PPointArray(Params^[2])^); +end; + +procedure Lape_TPAtoATPAExWrap(const Params: PParamArray); +begin + ps_TPAtoATPAExWrap(PPointArray(Params^[0])^, PInteger(Params^[1])^, PInteger(Params^[2])^, P2DPointArray(Params^[3])^); +end; + +procedure Lape_TPAtoATPAWrap(const Params: PParamArray); +begin + ps_TPAtoATPAWrap(PPointArray(Params^[0])^, PInteger(Params^[1])^, P2DPointArray(Params^[2])^); +end; + +procedure Lape_CombineIntArrayWrap(const Params: PParamArray); +begin + ps_CombineIntArrayWrap(PIntegerArray(Params^[0])^, PIntegerArray(Params^[1])^, PIntegerArray(Params^[2])^); +end; + +procedure Lape_MergeATPAWrap(const Params: PParamArray); +begin + ps_MergeATPAWrap(P2DPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_TPAFromBoxWrap(const Params: PParamArray); +begin + ps_TPAFromBoxWrap(PBox(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_RotatePointsWrap(const Params: PParamArray); +begin + ps_RotatePointsWrap(PPointArray(Params^[0])^, PExtended(Params^[1])^, PExtended(Params^[2])^, PExtended(Params^[3])^, PPointArray(Params^[4])^); +end; + +procedure Lape_FindTPAEdgesWrap(const Params: PParamArray); +begin + ps_FindTPAEdgesWrap(PPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_ClearTPAFromTPAWrap(const Params: PParamArray); +begin + ps_ClearTPAFromTPAWrap(PPointArray(Params^[0])^, PPointArray(Params^[1])^, PPointArray(Params^[2])^); +end; + +procedure Lape_ReturnPointsNotInTPAWrap(const Params: PParamArray); +begin + ps_ReturnPointsNotInTPAWrap(PPointArray(Params^[0])^, PBox(Params^[1])^, PPointArray(Params^[2])^); +end; + +procedure Lape_SameTPA(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_SameTPA(PPointArray(Params^[0])^, PPointArray(Params^[1])^); +end; + +procedure Lape_TPAInATPA(const Params: PParamArray; const Result: Pointer); +begin + PBoolean(Result)^ := ps_TPAInATPA(PPointArray(Params^[0])^, P2DPointArray(Params^[1])^, PLongInt(Params^[2])^); +end; + +procedure Lape_OffsetTPA(const Params: PParamArray); +begin + ps_OffsetTPA(PPointArray(Params^[0])^, PPoint(Params^[1])^); +end; + +procedure Lape_OffsetATPA(const Params: PParamArray); +begin + ps_OffsetATPA(P2DPointArray(Params^[0])^, PPoint(Params^[1])^); +end; + +procedure Lape_CopyTPA(const Params: PParamArray; const Result: Pointer); +begin + PPointArray(Result)^ := ps_CopyTPA(PPointArray(Params^[0])^); +end; + +procedure Lape_CopyATPA(const Params: PParamArray; const Result: Pointer); +begin + P2DPointArray(Result)^ := ps_CopyATPA(P2DPointArray(Params^[0])^); +end; diff --git a/Units/MMLAddon/LPInc/Wrappers/window.inc b/Units/MMLAddon/LPInc/Wrappers/window.inc new file mode 100644 index 0000000..7d70e4b --- /dev/null +++ b/Units/MMLAddon/LPInc/Wrappers/window.inc @@ -0,0 +1,84 @@ +procedure Lape_SetDesktopAsClient(const Params: PParamArray); +begin + ps_SetDesktopAsClient(); +end; + +procedure Lape_SetTargetArray(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_SetTargetArray(PInteger(Params^[0])^, Pinteger(Params^[1])^, Pinteger(Params^[2])^); +end; + +procedure Lape_SetTargetBitmap(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_SetTargetBitmap(PInteger(Params^[0])^); +end; + +procedure Lape_SetEIOSTarget(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_SetEIOSTarget(Pstring(Params^[0])^, PVariant(Params^[1])^); +end; + +procedure Lape_SetImageTarget(const Params: PParamArray); +begin + ps_SetImageTarget(Pinteger(Params^[0])^); +end; + +procedure Lape_SetKeyMouseTarget(const Params: PParamArray); +begin + ps_SetKeyMouseTarget(Pinteger(Params^[0])^); +end; + +procedure Lape_GetImageTarget(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_GetImageTarget(); +end; + +procedure Lape_GetKeyMouseTarget(const Params: PParamArray; const Result: Pointer); +begin + Pinteger(Result)^ := ps_GetKeyMouseTarget(); +end; + +procedure Lape_ExportImageTarget(const Params: PParamArray; const Result: Pointer); +begin + PTarget_Exported(Result)^ := ps_ExportImageTarget(); +end; + +procedure Lape_ExportKeyMouseTarget(const Params: PParamArray; const Result: Pointer); +begin + PTarget_Exported(Result)^ := ps_ExportKeyMouseTarget(); +end; + +procedure Lape_FreeTarget(const Params: PParamArray); +begin + ps_FreeTarget(Pinteger(Params^[0])^); +end; + +procedure Lape_GetClientDimensions(const Params: PParamArray); +begin + ps_GetClientDimensions(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_GetClientPosition(const Params: PParamArray); +begin + ps_GetClientPosition(Pinteger(Params^[0])^, Pinteger(Params^[1])^); +end; + +procedure Lape_Freeze(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_Freeze(); +end; + +procedure Lape_Unfreeze(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_Unfreeze(); +end; + +procedure Lape_ActivateClient(const Params: PParamArray); +begin + ps_ActivateClient(); +end; + +procedure Lape_IsTargetValid(const Params: PParamArray; const Result: Pointer); +begin + Pboolean(Result)^ := ps_IsTargetValid(); +end; diff --git a/Units/MMLAddon/LPInc/lpcompile.inc b/Units/MMLAddon/LPInc/lpcompile.inc new file mode 100644 index 0000000..a67c950 --- /dev/null +++ b/Units/MMLAddon/LPInc/lpcompile.inc @@ -0,0 +1,96 @@ +{ + This file is part of the Mufasa Macro Library (MML) + Copyright (c) 2009 by Raymond van Venetië and Merlijn Wajer + + MML is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + MML is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with MML. If not, see . + + See the file COPYING, included in this distribution, + for details about the copyright. + + lpcompile.inc for the Mufasa Macro Library +} + +addGlobalVar(AppPath, 'AppPath'); +addGlobalVar(ScriptPath, 'ScriptPath'); +addGlobalVar(IncludePath, 'IncludePath'); +addGlobalVar(PluginPath, 'PluginPath'); +addGlobalVar(FontPath, 'FontPath'); +addGlobalVar(maxLongint, 'MaxLongInt'); +addGlobalVar(maxLongint, 'MaxInt'); + +addGlobalVar(ps_mouse_right, 'mouse_Right');//0 +addGlobalVar(ps_mouse_left, 'mouse_Left');//1 +addGlobalVar(ps_mouse_middle, 'mouse_Middle');//2 + +addGlobalType('UInt32', 'TClickType'); + +addGlobalType('UInt8', 'Byte'); +addGlobalType('Int8', 'ShortInt'); +addGlobalType('UInt16', 'Word'); +addGlobalType('Int16', 'SmallInt'); +addGlobalType('UInt32', 'LongWord'); +addGlobalType('UInt32', 'DWord'); +addGlobalType('UInt32', 'Cardinal'); + +addGlobalType('Int32', 'LongInt'); +addGlobalType('UInt64', 'QWord'); +addGlobalType('LongInt', 'Integer'); + +addGlobalType('Integer', 'TColor'); +addGlobalType('Double', 'TDateTime'); + +addGlobalType('(rfReplaceAll, rfIgnoreCase)', 'TReplaceFlag'); +addGlobalType('set of TReplaceFlag', 'TReplaceFlags'); + +addGlobalType('(Numbers, Letters, Others)', 'StrExtr'); +addGlobalType('(MirrorWidth, MirrorHeight, MirrorLine)', 'TBmpMirrorStyle'); +addGlobalType('(mouse_Down, mouse_Up)', 'TMousePress'); +addGlobalType('(SP_WriteTimeStamp, SP_OnTerminate)', 'TSP_Property'); + +addGlobalType('array of string', 'TStringArray'); +addGlobalType('array of Integer', 'TIntegerArray'); +addGlobalType('array of TIntegerArray', 'T2DIntegerArray'); +addGlobalType('array of TIntegerArray', 'T2DIntArray'); +addGlobalType('array of T2DIntegerArray', 'T3DIntegerArray'); +addGlobalType('array of byte', 'TByteArray'); +addGlobalType('array of extended', 'TExtendedArray'); +addGlobalType('array of TExtendedArray', 'T2DExtendedArray'); +addGlobalType('array of T2DExtendedArray', 'T3DExtendedArray'); +addGlobalType('array of boolean', 'TBoolArray'); +addGlobalType('array of variant', 'TVariantArray'); + +addGlobalType('record X1, Y1, X2, Y2: integer; end', 'TBox'); +addGlobalType('array of TBox', 'TBoxArray'); + +addGlobalType('record X, Y: integer; end', 'TPoint'); +addGlobalType('array of TPoint', 'TPointArray'); +addGlobalType('array of TPointArray', 'T2DPointArray'); +addGlobalType('T2DPointArray', 'TPointArrayArray'); + +addGlobalType('record White, Black: TPointarray; WhiteHi, BlackHi: integer; W, H: integer; end', 'TMask'); + +addGlobalType('record R, T: extended; end', 'PPoint'); + +addGlobalType('record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16: integer; end', 'TTarget_Exported'); + +addGlobalType('record x, y, Color, Tolerance, AreaSize, AreaShape: integer; end', 'TSDTMPointDef'); +addGlobalType('array of TSDTMPointDef', 'TSDTMPointDefArray'); +addGlobalType('record MainPoint: TSDTMPointDef; SubPoints: TSDTMPointDefarray; end', 'TSDTM'); + +addGlobalType('record x, y, c, t, asz: integer; bp: boolean; end', 'TMDTMPoint'); +addGlobalType('array of TMDTMPoint', 'TMDTMPointArray'); + +addGlobalType('record Title: string; Handle: integer; Pid: integer; Width, Height: integer; end', 'TSysProc'); +addGlobalType('array of TSysProc', 'TSysProcArr'); + diff --git a/Units/MMLAddon/LPInc/lpdefines.inc b/Units/MMLAddon/LPInc/lpdefines.inc new file mode 100644 index 0000000..67b5f24 --- /dev/null +++ b/Units/MMLAddon/LPInc/lpdefines.inc @@ -0,0 +1,39 @@ +{ + This file is part of the Mufasa Macro Library (MML) + Copyright (c) 2009 by Raymond van Venetië and Merlijn Wajer + + MML is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + MML is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with MML. If not, see . + + See the file COPYING, included in this distribution, + for details about the copyright. + + lpdefines.inc for the Mufasa Macro Library +} + +BaseDefines.Add('LAPE'); +{$IFDEF CPU386 } +BaseDefines.Add('CPU386'); +{$ENDIF } +BaseDefines.Add('MUFASA'); +BaseDefines.Add('COGAT'); +BaseDefines.Add('SIMBA'); +BaseDefines.Add('DGROCKS'); +{$IFDEF MSWINDOWS } +BaseDefines.Add('MSWINDOWS'); +BaseDefines.Add('WIN32'); +BaseDefines.Add('WINDOWS'); +{$ENDIF } +{$IFDEF LINUX } +BaseDefines.Add('LINUX'); +{$ENDIF } \ No newline at end of file diff --git a/Units/MMLAddon/LPInc/lpexportedmethods.inc b/Units/MMLAddon/LPInc/lpexportedmethods.inc new file mode 100644 index 0000000..6c57193 --- /dev/null +++ b/Units/MMLAddon/LPInc/lpexportedmethods.inc @@ -0,0 +1,25 @@ +{ + This file is part of the Mufasa Macro Library (MML) + Copyright (c) 2009 by Raymond van Venetië and Merlijn Wajer + + MML is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + MML is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with MML. If not, see . + + See the file COPYING, included in this distribution, + for details about the copyright. + + lpexportedmethods.inc for the Mufasa Macro Library +} + +{$I lpexportedmethodsinc.inc} +//These will be added from Generator... diff --git a/Units/MMLAddon/LPInc/lpexportedmethodsinc.inc b/Units/MMLAddon/LPInc/lpexportedmethodsinc.inc new file mode 100644 index 0000000..fe38e06 --- /dev/null +++ b/Units/MMLAddon/LPInc/lpexportedmethodsinc.inc @@ -0,0 +1,323 @@ +AddGlobalFunc('function CreateBitmapString(bmp: integer): string', @Lape_CreateBitmapString); +//AddGlobalFunc('function GetMufasaBitmap(bmp: integer): TMufasaBitmap', @Lape_GetMufasaBitmap); +AddGlobalFunc('function CreateBitmap(w,h: integer): integer', @Lape_CreateBitmap); +AddGlobalFunc('procedure FreeBitmap(Number: integer);', @Lape_FreeBitmap); +AddGlobalFunc('procedure SaveBitmap(Bmp: integer; path: string);', @Lape_SaveBitmap); +AddGlobalFunc('function BitmapFromString(Width,height: integer; Data: string): integer', @Lape_BitmapFromString); +AddGlobalFunc('function LoadBitmap(Path: String): integer', @Lape_LoadBitmap); +AddGlobalFunc('procedure SetBitmapSize(Bmp,NewW,NewH: integer);', @Lape_SetBitmapSize); +AddGlobalFunc('procedure StretchBitmapResize(Bmp,NewW,NewH: integer);', @Lape_StretchBitmapResize); +AddGlobalFunc('procedure GetBitmapSize(Bmp: integer; var BmpW,BmpH: integer);', @Lape_GetBitmapSize); +AddGlobalFunc('procedure SetBitmapName(Bmp: integer; name: string);', @Lape_SetBitmapName); +AddGlobalFunc('function CreateMirroredBitmap(Bmp: integer): integer', @Lape_CreateMirroredBitmap); +AddGlobalFunc('function CreateMirroredBitmapEx(Bmp: integer; MirrorStyle: TBmpMirrorStyle): integer', @Lape_CreateMirroredBitmapEx); +AddGlobalFunc('function FastGetPixel(bmp,x,y: integer): LongWord', @Lape_FastGetPixel); +AddGlobalFunc('function FastGetPixels(bmp: integer; TPA: TPointArray): TIntegerArray', @Lape_FastGetPixels); +AddGlobalFunc('function GetBitmapAreaColors(bmp,xs, ys, xe, ye: Integer): T2DIntArray', @Lape_GetBitmapAreaColors); +AddGlobalFunc('procedure FastSetPixel(Bmp,x,y: integer; Color: TColor);', @Lape_FastSetPixel); +AddGlobalFunc('procedure FastSetPixels(Bmp: integer; TPA: TPointArray; Colors: TIntegerArray);', @Lape_FastSetPixels); +AddGlobalFunc('procedure DrawTPABitmap(bitmap: integer; TPA: TPointArray; Color: integer);', @Lape_DrawTPABitmap); +AddGlobalFunc('procedure DrawATPABitmap(bitmap: integer; ATPA: T2DPointArray);', @Lape_DrawATPABitmap); +AddGlobalFunc('procedure DrawATPABitmapEx(bitmap: integer; ATPA: T2DPointArray; Colors: TIntegerArray);', @Lape_DrawATPABitmapEx); +AddGlobalFunc('procedure FastDrawClear(bmp: integer; Color: TColor);', @Lape_FastDrawClear); +//AddGlobalFunc('procedure DrawBitmap(Bmp: Integer; Dest: TCanvas; x, y: Integer);', @Lape_DrawBitmap); +AddGlobalFunc('procedure FastDrawTransparent(x, y: Integer; SourceBitmap, TargetBitmap: Integer);', @Lape_FastDrawTransparent); +AddGlobalFunc('procedure SetTransparentColor(Bmp: integer; Color: TColor);', @Lape_SetTransparentColor); +AddGlobalFunc('function GetTransparentColor(Bmp: integer): TColor', @Lape_GetTransparentColor); +AddGlobalFunc('procedure FastReplaceColor(bmp: Integer; OldColor, NewColor: TColor);', @Lape_FastReplaceColor); +AddGlobalFunc('procedure CopyClientToBitmap(bmp, xs, ys, xe, ye: Integer);', @Lape_CopyClientToBitmap); +AddGlobalFunc('function BitmapFromClient(const xs, ys, xe, ye: Integer): Integer', @Lape_BitmapFromClient); +AddGlobalFunc('function FindBitmap(Bitmap: integer; var x, y: Integer): Boolean', @Lape_FindBitmap); +AddGlobalFunc('function FindBitmapIn(bitmap: integer; var x, y: Integer; xs, ys, xe, ye: Integer): Boolean', @Lape_FindBitmapIn); +AddGlobalFunc('function FindBitmapToleranceIn(bitmap: integer; var x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer): Boolean', @Lape_FindBitmapToleranceIn); +AddGlobalFunc('function FindBitmapSpiral(bitmap: Integer; var x, y: Integer; xs, ys, xe, ye: Integer): Boolean', @Lape_FindBitmapSpiral); +AddGlobalFunc('function FindBitmapsSpiralTolerance(bitmap: integer; x, y: Integer; var Points: TPointArray; xs, ys, xe, ye,tolerance: Integer): Boolean', @Lape_FindBitmapsSpiralTolerance); +AddGlobalFunc('function FindBitmapSpiralTolerance(bitmap: integer; var x, y: Integer; xs, ys, xe, ye,tolerance: integer): Boolean', @Lape_FindBitmapSpiralTolerance); +AddGlobalFunc('function RotateBitmap(bitmap: Integer; angle: Extended): Integer', @Lape_RotateBitmap); +AddGlobalFunc('function Desaturate(Bitmap: integer): integer', @Lape_Desaturate); +AddGlobalFunc('procedure InvertBitmap(Bitmap: integer);', @Lape_InvertBitmap); +AddGlobalFunc('function CopyBitmap(Bitmap: integer): integer', @Lape_CopyBitmap); +AddGlobalFunc('function GreyScaleBitmap(Bitmap: integer): integer', @Lape_GreyScaleBitmap); +AddGlobalFunc('function BrightnessBitmap(Bitmap,br: integer): integer', @Lape_BrightnessBitmap); +AddGlobalFunc('function ContrastBitmap(bitmap: integer; co: extended): integer', @Lape_ContrastBitmap); +AddGlobalFunc('function PosterizeBitmap(Bitmap: integer; po: integer): integer', @Lape_PosterizeBitmap); +AddGlobalFunc('function CreateMaskFromBitmap(Bitmap: integer): TMask', @Lape_CreateMaskFromBitmap); +AddGlobalFunc('function FindMaskTolerance(const mask: TMask; var x, y: Integer; xs,ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean', @Lape_FindMaskTolerance); +AddGlobalFunc('function FindBitmapMaskTolerance(mask: Integer; var x, y: Integer; xs, ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean', @Lape_FindBitmapMaskTolerance); +AddGlobalFunc('function FindDeformedBitmapToleranceIn(bitmap: integer; var x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; var accuracy: Extended): Boolean', @Lape_FindDeformedBitmapToleranceIn); +AddGlobalFunc('procedure RectangleBitmap(bitmap: integer; const box: TBox; Color: TColor);', @Lape_RectangleBitmap); +AddGlobalFunc('procedure FloodFillBitmap(bitmap: integer; const StartPoint: TPoint; const SearchCol,ReplaceCol: TColor);', @Lape_FloodFillBitmap); +AddGlobalFunc('function ConvoluteBitmap(bitmap: integer; matrix: T2DExtendedArray): integer', @Lape_ConvoluteBitmap); +AddGlobalFunc('function CalculatePixelShift(Bmp1,Bmp2: Integer; CompareBox: TBox): integer', @Lape_CalculatePixelShift); +AddGlobalFunc('function CalculatePixelTolerance(Bmp1,Bmp2: Integer; CompareBox: TBox; CTS: integer): extended', @Lape_CalculatePixelTolerance); +AddGlobalFunc('function GetColor(x,y: integer): TColor', @Lape_GetColor); +AddGlobalFunc('procedure GetColorsWrap(Coords: TPointArray; var Colors: TIntegerArray);', @Lape_GetColorsWrap); +AddGlobalFunc('function GetColors(const Coords: TPointArray): TIntegerArray', @Lape_GetColors); +AddGlobalFunc('function findcolor(var x, y: integer; color, x1, y1, x2, y2: integer): boolean', @Lape_findcolor); +AddGlobalFunc('function findcolortoleranceOptimised(var x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean', @Lape_findcolortoleranceOptimised); +AddGlobalFunc('function findcolortolerance(var x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean', @Lape_findcolortolerance); +AddGlobalFunc('function FindColors(var TPA: TPointArray; Color, x1, y1, x2, y2: Integer): Boolean', @Lape_FindColors); +AddGlobalFunc('procedure SetColorToleranceSpeed(cts: Integer);', @Lape_SetColorToleranceSpeed); +AddGlobalFunc('function GetToleranceSpeed: Integer', @Lape_GetToleranceSpeed); +AddGlobalFunc('procedure SetToleranceSpeed2Modifiers(nHue, nSat: Extended);', @Lape_SetToleranceSpeed2Modifiers); +AddGlobalFunc('procedure GetToleranceSpeed2Modifiers(var hMod, sMod: Extended);', @Lape_GetToleranceSpeed2Modifiers); +AddGlobalFunc('function SimilarColors(Col1,Col2,Tol: integer): boolean', @Lape_SimilarColors); +AddGlobalFunc('function CountColor(Color, xs, ys, xe, ye: Integer): Integer', @Lape_CountColor); +AddGlobalFunc('function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer', @Lape_CountColorTolerance); +AddGlobalFunc('function FindColorsToleranceOptimised(var Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean', @Lape_FindColorsToleranceOptimised); +AddGlobalFunc('function FindColorsTolerance(var Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean', @Lape_FindColorsTolerance); +AddGlobalFunc('function FindColorSpiral(var x, y: Integer; color, xs, ys, xe, ye: Integer): Boolean', @Lape_FindColorSpiral); +AddGlobalFunc('function FindColorSpiralTolerance(var x, y: Integer; color, xs, ys, xe, ye,Tol: Integer): Boolean', @Lape_FindColorSpiralTolerance); +AddGlobalFunc('function FindColorsSpiralTolerance(x, y: Integer; var Points: TPointArray; color, xs, ys, xe, ye: Integer; Tolerance: Integer): boolean', @Lape_FindColorsSpiralTolerance); +AddGlobalFunc('function FindColoredArea(var x, y: Integer; color, xs, ys, xe, ye: Integer; MinArea: Integer): Boolean', @Lape_FindColoredArea); +AddGlobalFunc('function FindColoredAreaTolerance(var x, y: Integer; Color, xs, ys, xe, ye, MinArea, tol: Integer): Boolean', @Lape_FindColoredAreaTolerance); +AddGlobalFunc('procedure ColorToRGB(Color: integer; var r, g, b: Integer);', @Lape_ColorToRGB); +AddGlobalFunc('function haval(Data: string): string', @Lape_haval); +AddGlobalFunc('function FindDTM(DTM: Integer; var x, y: Integer; xs, ys, xe, ye: Integer): Boolean', @Lape_FindDTM); +AddGlobalFunc('function FindDTMs(DTM: Integer; var p: TPointArray; xs, ys, xe, ye: Integer): Boolean', @Lape_FindDTMs); +AddGlobalFunc('function FindDTMRotatedAlternating(DTM: Integer; var x, y: Integer; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; var aFound: Extended): Boolean', @Lape_FindDTMRotatedAlternating); +AddGlobalFunc('function FindDTMRotatedSE(DTM: Integer; var x, y: Integer; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; var aFound: Extended): Boolean', @Lape_FindDTMRotatedSE); +AddGlobalFunc('function FindDTMsRotatedAlternating(DTM: Integer; var Points: TPointArray; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; var aFound: T2DExtendedArray): Boolean', @Lape_FindDTMsRotatedAlternating); +AddGlobalFunc('function FindDTMsRotatedSE(DTM: Integer; var Points: TPointArray; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; var aFound: T2DExtendedArray): Boolean', @Lape_FindDTMsRotatedSE); +AddGlobalFunc('procedure SetDTMName(DTM: integer; const name: string);', @Lape_SetDTMName); +AddGlobalFunc('function DTMFromString(const DTMString: String): Integer', @Lape_DTMFromString); +AddGlobalFunc('procedure FreeDTM(DTM: Integer);', @Lape_FreeDTM); +//AddGlobalFunc('function GetDTM(index: Integer): TMDTM', @Lape_GetDTM); +AddGlobalFunc('function AddTSDTM(const d: TSDTM): Integer', @Lape_AddTSDTM); +//AddGlobalFunc('function AddDTM(const d: TMDTM): Integer', @Lape_AddDTM); +//AddGlobalFunc('procedure PrintDTM(const aDTM: TMDTM);', @Lape_PrintDTM); +//AddGlobalFunc('function MDTMToSDTM(Const DTM: TMDTM): TSDTM', @Lape_MDTMToSDTM); +//AddGlobalFunc('function SDTMToMDTM(Const DTM: TSDTM): TMDTM', @Lape_SDTMToMDTM); +AddGlobalFunc('function CreateDTMPoint(x,y,c,t,asz: integer; bp: boolean): TMDTMPoint', @Lape_CreateDTMPoint); + +(* File isn't included! +AddGlobalFunc('function ext_UnTar(const Input: string; var Content: TStringArray): boolean', @Lape_ext_UnTar); +AddGlobalFunc('function ext_UnTarEx(const Input: string; const outputdir: string; overwrite: boolean): boolean', @Lape_ext_UnTarEx); +AddGlobalFunc('function ext_DecompressBZip2(const input: string; var output: string; const BlockSize: Cardinal): boolean', @Lape_ext_DecompressBZip2); +AddGlobalFunc('function ext_GetPage(const url: string): string', @Lape_ext_GetPage); +//AddGlobalFunc('function ext_MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer', @Lape_ext_MessageDlg); +//AddGlobalFunc('function ext_SDTMToMDTM(Const DTM: TSDTM): TMDTM', @Lape_ext_SDTMToMDTM); +AddGlobalFunc('function ext_InputQuery(const ACaption, APrompt: String; var Value: String): Boolean', @Lape_ext_InputQuery); +AddGlobalFunc('function ext_ScriptText: string', @Lape_ext_ScriptText); +AddGlobalFunc('function ext_GetSelectedText: string', @Lape_ext_GetSelectedText); +AddGlobalFunc('procedure ext_OpenScript(vName, Data: string; Run: boolean);', @Lape_ext_OpenScript); +AddGlobalFunc('procedure ext_OpenScriptEx(FileName: string; Run: boolean);', @Lape_ext_OpenScriptEx); +AddGlobalFunc('function ext_GetPageEx(const URL, PostData, MimeType: string): string', @Lape_ext_GetPageEx); +AddGlobalFunc('function ext_GetJSONValue(const Data, Value: string): string', @Lape_ext_GetJSONValue); +*) + +AddGlobalFunc('function CreateFile(const Path: string): Integer', @Lape_CreateFile); +AddGlobalFunc('function OpenFile(const Path: string; Shared: Boolean): Integer', @Lape_OpenFile); +AddGlobalFunc('function RewriteFile(const Path: string; Shared: Boolean): Integer', @Lape_RewriteFile); +AddGlobalFunc('function AppendFile(const Path: string): Integer', @Lape_AppendFile); +AddGlobalFunc('procedure CloseFile(FileNum: Integer);', @Lape_CloseFile); +AddGlobalFunc('function EndOfFile(FileNum: Integer): Boolean', @Lape_EndOfFile); +AddGlobalFunc('function FileSize(FileNum: Integer): LongInt', @Lape_FileSize); +AddGlobalFunc('function ReadFileString(FileNum: Integer; var s: string; x: Integer): Boolean', @Lape_ReadFileString); +AddGlobalFunc('function WriteFileString(FileNum: Integer; s: string): Boolean', @Lape_WriteFileString); +AddGlobalFunc('function SetFileCharPointer(FileNum, cChars, Origin: Integer): Integer', @Lape_SetFileCharPointer); +AddGlobalFunc('function FilePointerPos(FileNum: Integer): Integer', @Lape_FilePointerPos); +AddGlobalFunc('function FileExists(const FileName: string): Boolean', @Lape_FileExists); +AddGlobalFunc('function DirectoryExists(const DirectoryName: string): Boolean', @Lape_DirectoryExists); +AddGlobalFunc('function CreateDirectory(const DirectoryName: string): boolean', @Lape_CreateDirectory); +AddGlobalFunc('function ForceDirectores(const dir: string): boolean', @Lape_ForceDirectores); +AddGlobalFunc('function GetFiles(const Path, Ext: string): TStringArray', @Lape_GetFiles); +AddGlobalFunc('function GetDirectories(const path: string): TStringArray', @Lape_GetDirectories); +AddGlobalFunc('procedure WriteINI(const Section, KeyName, NewString, FileName: string);', @Lape_WriteINI); +AddGlobalFunc('procedure OpenWebPage(const url: string);', @Lape_OpenWebPage); +AddGlobalFunc('function GetPage(const S: String): String', @Lape_GetPage); +AddGlobalFunc('function InitializeHTTPClient(HandleCookies: Boolean): Integer', @Lape_InitializeHTTPClient); +AddGlobalFunc('procedure FreeHTTPClient(Client: Integer);', @Lape_FreeHTTPClient); +AddGlobalFunc('function GetHTTPPage(Client: Integer; const URL: string): string', @Lape_GetHTTPPage); +AddGlobalFunc('procedure SetHTTPUserAgent(Client: Integer; const Agent: string);', @Lape_SetHTTPUserAgent); +AddGlobalFunc('function PostHTTPPage(Client: Integer; const Url,PostData: string): string', @Lape_PostHTTPPage); +AddGlobalFunc('function PostHTTPPageEx(Client: Integer; const Url: string): string', @Lape_PostHTTPPageEx); +AddGlobalFunc('procedure ClearPostData(Client: Integer);', @Lape_ClearPostData); +AddGlobalFunc('procedure AddPostVariable(Client: Integer; const VarName, VarValue: string);', @Lape_AddPostVariable); +AddGlobalFunc('function GetRawHeaders(Client: Integer): string', @Lape_GetRawHeaders); +AddGlobalFunc('procedure SetProxy(Client: Integer; pHost, pPort: String);', @Lape_SetProxy); +AddGlobalFunc('function RecvSocketStr(Client: integer): string', @Lape_RecvSocketStr); +AddGlobalFunc('function RecvSocket(Client: integer): string', @Lape_RecvSocket); +AddGlobalFunc('function RecvSocketEx(Client, Length: integer): string', @Lape_RecvSocketEx); +AddGlobalFunc('procedure SendSocket(Client: integer; Data: string);', @Lape_SendSocket); +AddGlobalFunc('procedure ConnectSocket(Client: integer; IP, Port: string);', @Lape_ConnectSocket); +AddGlobalFunc('procedure CloseSocket(Client: integer);', @Lape_CloseSocket); +AddGlobalFunc('procedure SetSocketTimeout(Client, Time: integer);', @Lape_SetSocketTimeout); +AddGlobalFunc('procedure BindSocket(Client: integer; IP, Port: string);', @Lape_BindSocket); +AddGlobalFunc('procedure ListenSocket(Client: integer);', @Lape_ListenSocket); +AddGlobalFunc('function AcceptSocket(Client: integer): integer', @Lape_AcceptSocket); +AddGlobalFunc('procedure SocketInfo(Client: integer; out IP, Port: string);', @Lape_SocketInfo); +AddGlobalFunc('function CreateSocket: integer', @Lape_CreateSocket); +AddGlobalFunc('procedure FreeSocket(Client: integer);', @Lape_FreeSocket); +AddGlobalFunc('procedure KeyDown(key: Word);', @Lape_KeyDown); +AddGlobalFunc('procedure KeyUp(key: Word);', @Lape_KeyUp); +AddGlobalFunc('procedure SendKeys(const s: string);', @Lape_SendKeys); +AddGlobalFunc('procedure PressKey(key: Word);', @Lape_PressKey); +AddGlobalFunc('function isKeyDown(key: Word): boolean', @Lape_isKeyDown); +AddGlobalFunc('function GetKeyCode(c: char): integer', @Lape_GetKeyCode); +AddGlobalFunc('function round(e: extended): integer', @Lape_round); +AddGlobalFunc('function iAbs(a: integer): integer', @Lape_iAbs); +AddGlobalFunc('function ceil(e: extended): integer', @Lape_ceil); +AddGlobalFunc('function pow(base,exponent: extended): extended', @Lape_pow); +AddGlobalFunc('function RiemannGauss(Xstart,StepSize,Sigma: extended; AmountSteps: integer): extended', @Lape_RiemannGauss); +AddGlobalFunc('function DiscreteGauss(Xstart,Xend: integer; sigma: extended): TExtendedArray', @Lape_DiscreteGauss); +AddGlobalFunc('function GaussMatrix(N: integer; sigma: extended): T2DExtendedArray', @Lape_GaussMatrix); +AddGlobalFunc('function exp(exponent: extended): extended', @Lape_exp); +AddGlobalFunc('function Max(a,b: integer): integer', @Lape_Max); +AddGlobalFunc('function Min(a, b: Integer): Integer', @Lape_Min); +AddGlobalFunc('function MinE(a, b: extended): extended', @Lape_MinE); +AddGlobalFunc('function MaxE(a,b: extended): extended', @Lape_MaxE); +AddGlobalFunc('function Sqr(e: extended): extended', @Lape_Sqr); +AddGlobalFunc('function Point(x,y: integer): TPoint', @Lape_Point); +AddGlobalFunc('function Distance(x1,y1,x2,y2: integer): integer', @Lape_Distance); +AddGlobalFunc('function Hypot(X, Y: Extended): Extended', @Lape_Hypot); +AddGlobalFunc('function RandomRange(const aFrom, aTo: Integer): Integer', @Lape_RandomRange); +AddGlobalFunc('function Random(Int: integer): integer', @Lape_Random); +AddGlobalFunc('function RandomE: extended', @Lape_RandomE); +AddGlobalFunc('function ArcTan2(y,x: extended): extended', @Lape_ArcTan2); +AddGlobalFunc('procedure IncEx(var x: integer; increase: integer);', @Lape_IncEx); +AddGlobalFunc('procedure DecEx(var x: integer; Decrease: integer);', @Lape_DecEx); +AddGlobalFunc('function Factorial(number: longword): Int64', @Lape_Factorial); +AddGlobalFunc('procedure MoveMouse(x, y: integer);', @Lape_MoveMouse); +AddGlobalFunc('procedure ScrollMouse(x,y: integer; Clicks: integer);', @Lape_ScrollMouse); +AddGlobalFunc('procedure GetMousePos(var x, y: integer);', @Lape_GetMousePos); +AddGlobalFunc('function ConvIntClickType(Int: Integer): TClickType', @Lape_ConvIntClickType); +AddGlobalFunc('procedure HoldMouse(x, y: integer; clickType: integer);', @Lape_HoldMouse); +AddGlobalFunc('procedure ReleaseMouse(x, y: integer; clickType: integer);', @Lape_ReleaseMouse); +AddGlobalFunc('procedure ClickMouse(x, y: integer; clickType: integer);', @Lape_ClickMouse); +AddGlobalFunc('function IsMouseButtonDown(button: integer): boolean', @Lape_IsMouseButtonDown); +AddGlobalFunc('function rs_GetUpText: String', @Lape_rs_GetUpText); +AddGlobalFunc('function rs_GetUpTextAtEx(x, y: integer; shadow: boolean): string', @Lape_rs_GetUpTextAtEx); +AddGlobalFunc('function rs_GetUpTextAt(x, y: integer): string', @Lape_rs_GetUpTextAt); +AddGlobalFunc('function BitmapFromText(const text, font: String): integer', @Lape_BitmapFromText); +AddGlobalFunc('procedure Writeln(const str: string);', @Lape_Writeln); +AddGlobalFunc('function SetScriptProp(prop: TSP_Property; Value: TVariantArray): boolean', @Lape_SetScriptProp); +AddGlobalFunc('function GetScriptProp(prop: TSP_Property; var Value: TVariantArray): boolean', @Lape_GetScriptProp); +AddGlobalFunc('procedure Wait(t: DWord);', @Lape_Wait); +AddGlobalFunc('function SetSettingValue(const KeyName,value: string): boolean', @Lape_SetSettingValue); +AddGlobalFunc('function KeyIsSetting(const KeyName: String): Boolean', @Lape_KeyIsSetting); +AddGlobalFunc('function KeyIsDirectory(const KeyName: String): Boolean', @Lape_KeyIsDirectory); +AddGlobalFunc('function GetSettingValue(const KeyName: String): String', @Lape_GetSettingValue); +AddGlobalFunc('function GetSettingValueDef(const KeyName, defVal: String): String', @Lape_GetSettingValueDef); +AddGlobalFunc('function ListSettings(const KeyName: String; var KeyReturn: TStringArray): boolean', @Lape_ListSettings); +AddGlobalFunc('function DeleteSetting(const KeyName: String): Boolean', @Lape_DeleteSetting); +AddGlobalFunc('function DeleteSubSettings(const KeyName: String): Boolean', @Lape_DeleteSubSettings); +AddGlobalFunc('function Capitalize(str: string): string', @Lape_Capitalize); +AddGlobalFunc('function CompressString(const Str: string): string', @Lape_CompressString); +AddGlobalFunc('function DecompressString(const Compressed: string): string', @Lape_DecompressString); +AddGlobalFunc('function Base64Encode(const str: string): string', @Lape_Base64Encode); +AddGlobalFunc('function Base64Decode(const str: string): string', @Lape_Base64Decode); +AddGlobalFunc('function ExtractFromStr(Str: string; Extract: StrExtr): string', @Lape_ExtractFromStr); +AddGlobalFunc('function BoolToStr(bool: boolean): string', @Lape_BoolToStr); +AddGlobalFunc('function Replace(Text, FindStr, ReplaceStr: string; Flags: TReplaceFlags): string', @Lape_Replace); +AddGlobalFunc('function IntToStr(int: integer): string', @Lape_IntToStr); +AddGlobalFunc('function FloatToStr(flt: extended): string', @Lape_FloatToStr); +AddGlobalFunc('function StrToInt(value: String): Integer', @Lape_StrToInt); +AddGlobalFunc('function StrToIntDef(value: String; default: Integer): Integer', @Lape_StrToIntDef); +AddGlobalFunc('function StrToFloat(value: String): Extended', @Lape_StrToFloat); +AddGlobalFunc('function StrToFloatDef(value: String; default: Extended): Extended', @Lape_StrToFloatDef); +AddGlobalFunc('function StrToBool(value: String): Boolean', @Lape_StrToBool); +AddGlobalFunc('function StrToBoolDef(value: String; default: Boolean): Boolean', @Lape_StrToBoolDef); +AddGlobalFunc('function Between(s1, s2, str: string): string', @Lape_Between); +AddGlobalFunc('procedure Quicksort(var Arr: TIntegerArray);', @Lape_Quicksort); +AddGlobalFunc('procedure tSwap(var a, b: TPoint);', @Lape_tSwap); +AddGlobalFunc('procedure tpaSwap(var a, b: TPointArray);', @Lape_tpaSwap); +AddGlobalFunc('procedure SwapE(var a, b: Extended);', @Lape_SwapE); +AddGlobalFunc('procedure RAaSTPAEx(var a: TPointArray; const w, h: Integer);', @Lape_RAaSTPAEx); +AddGlobalFunc('procedure RAaSTPA(var a: TPointArray; const Dist: Integer);', @Lape_RAaSTPA); +AddGlobalFunc('function NearbyPointInArrayEx(const P: TPoint; w, h: Integer; const a: TPointArray): Boolean', @Lape_NearbyPointInArrayEx); +AddGlobalFunc('function NearbyPointInArray(const P: TPoint; Dist: Integer; const a: TPointArray): Boolean', @Lape_NearbyPointInArray); +AddGlobalFunc('procedure QuickTPASort(var A: TIntegerArray; var B: TPointArray; iLo, iHi: Integer; SortUp: Boolean);', @Lape_QuickTPASort); +AddGlobalFunc('procedure QuickATPASort(var A: TIntegerArray; var B: T2DPointArray; iLo, iHi: Integer; SortUp: Boolean);', @Lape_QuickATPASort); +AddGlobalFunc('procedure SortTPAFrom(var a: TPointArray; const From: TPoint);', @Lape_SortTPAFrom); +AddGlobalFunc('procedure SortATPAFrom(var a: T2DPointArray; const From: TPoint);', @Lape_SortATPAFrom); +AddGlobalFunc('procedure SortATPAFromFirstPoint(var a: T2DPointArray; const From: TPoint);', @Lape_SortATPAFromFirstPoint); +AddGlobalFunc('procedure InvertTPA(var a: TPointArray);', @Lape_InvertTPA); +AddGlobalFunc('procedure InvertATPA(var a: T2DPointArray);', @Lape_InvertATPA); +AddGlobalFunc('function MiddleTPAEx(const TPA: TPointArray; var x, y: Integer): Boolean', @Lape_MiddleTPAEx); +AddGlobalFunc('function MiddleTPA(const tpa: TPointArray): TPoint', @Lape_MiddleTPA); +AddGlobalFunc('procedure SortATPASize(var a: T2DPointArray; const BigFirst: Boolean);', @Lape_SortATPASize); +AddGlobalFunc('procedure SortATPAFromSize(var a: T2DPointArray; const Size: Integer; CloseFirst: Boolean);', @Lape_SortATPAFromSize); +AddGlobalFunc('function InIntArrayEx(const a: TIntegerArray; var Where: Integer; const Number: Integer): Boolean', @Lape_InIntArrayEx); +AddGlobalFunc('function InIntArray(const a: TIntegerArray; Number: Integer): Boolean', @Lape_InIntArray); +AddGlobalFunc('procedure ClearSameIntegers(var a: TIntegerArray);', @Lape_ClearSameIntegers); +AddGlobalFunc('procedure ClearSameIntegersAndTPA(var a: TIntegerArray; var p: TPointArray);', @Lape_ClearSameIntegersAndTPA); +AddGlobalFunc('function SplitTPAEx(const arr: TPointArray; w, h: Integer): T2DPointArray', @Lape_SplitTPAEx); +AddGlobalFunc('function SplitTPA(const arr: TPointArray; Dist: Integer): T2DPointArray', @Lape_SplitTPA); +AddGlobalFunc('function FloodFillTPA(const TPA: TPointArray): T2DPointArray', @Lape_FloodFillTPA); +AddGlobalFunc('procedure FilterPointsPie(var Points: TPointArray; const SD, ED, MinR, MaxR: Extended; Mx, My: Integer);', @Lape_FilterPointsPie); +AddGlobalFunc('procedure FilterPointsDist(var Points: TPointArray; const MinDist, MaxDist: Extended; Mx, My: Integer);', @Lape_FilterPointsDist); +AddGlobalFunc('procedure FilterPointsLine(var Points: TPointArray; Radial: Extended; Radius, MX, MY: Integer);', @Lape_FilterPointsLine); +AddGlobalFunc('procedure FilterTPADist(var TPA: TPointArray; maxDist: integer);', @Lape_FilterTPADist); +AddGlobalFunc('function GetATPABounds(const ATPA: T2DPointArray): TBox', @Lape_GetATPABounds); +AddGlobalFunc('function GetTPABounds(const TPA: TPointArray): TBox', @Lape_GetTPABounds); +AddGlobalFunc('function FindTPAinTPA(const SearchTPA, TotalTPA: TPointArray; var Matches: TPointArray): Boolean', @Lape_FindTPAinTPA); +AddGlobalFunc('function GetSamePointsATPA(const ATPA: T2DPointArray; var Matches: TPointArray): boolean', @Lape_GetSamePointsATPA); +AddGlobalFunc('function FindTextTPAinTPA(Height: integer; const SearchTPA, TotalTPA: TPointArray; var Matches: TPointArray): Boolean', @Lape_FindTextTPAinTPA); +AddGlobalFunc('procedure SortCircleWise(var tpa: TPointArray; const cx, cy, StartDegree: Integer; SortUp, ClockWise: Boolean);', @Lape_SortCircleWise); +AddGlobalFunc('procedure LinearSort(var tpa: TPointArray; cx, cy, sd: Integer; SortUp: Boolean);', @Lape_LinearSort); +AddGlobalFunc('function RotatePoint(Const p: TPoint; angle, mx, my: Extended): TPoint', @Lape_RotatePoint); +AddGlobalFunc('function ChangeDistPT(const PT: TPoint; mx,my: integer; newdist: extended): TPoint', @Lape_ChangeDistPT); +AddGlobalFunc('function ChangeDistTPA(var TPA: TPointArray; mx,my: integer; newdist: extended): boolean', @Lape_ChangeDistTPA); +AddGlobalFunc('function FindGapsTPA(const TPA: TPointArray; MinPixels: Integer): T2DPointArray', @Lape_FindGapsTPA); +AddGlobalFunc('function RemoveDistTPointArray(x, y, dist: Integer; const ThePoints: TPointArray; RemoveHigher: Boolean): TPointArray', @Lape_RemoveDistTPointArray); +AddGlobalFunc('function CombineTPA(const Ar1, Ar2: TPointArray): TPointArray', @Lape_CombineTPA); +AddGlobalFunc('function ReArrangeandShortenArrayEx(const a: TPointArray; w, h: Integer): TPointArray', @Lape_ReArrangeandShortenArrayEx); +AddGlobalFunc('function ReArrangeandShortenArray(const a: TPointArray; Dist: Integer): TPointArray', @Lape_ReArrangeandShortenArray); +AddGlobalFunc('function TPAtoATPAEx(const TPA: TPointArray; w, h: Integer): T2DPointArray', @Lape_TPAtoATPAEx); +AddGlobalFunc('function TPAtoATPA(const TPA: TPointArray; Dist: Integer): T2DPointArray', @Lape_TPAtoATPA); +AddGlobalFunc('function CombineIntArray(const Ar1, Ar2: TIntegerArray): TIntegerArray', @Lape_CombineIntArray); +AddGlobalFunc('function MergeATPA(const ATPA: T2DPointArray): TPointArray', @Lape_MergeATPA); +AddGlobalFunc('procedure AppendTPA(var TPA: TPointArray; const ToAppend: TPointArray);', @Lape_AppendTPA); +AddGlobalFunc('function TPAFromBox(const Box: TBox): TPointArray', @Lape_TPAFromBox); +AddGlobalFunc('function RotatePoints(Const P: TPointArray; A, cx, cy: Extended): TPointArray', @Lape_RotatePoints); +AddGlobalFunc('function FindTPAEdges(const p: TPointArray): TPointArray', @Lape_FindTPAEdges); +AddGlobalFunc('function ClearTPAFromTPA(const arP, ClearPoints: TPointArray): TPointArray', @Lape_ClearTPAFromTPA); +AddGlobalFunc('function ReturnPointsNotInTPA(Const TotalTPA: TPointArray; const Box: TBox): TPointArray', @Lape_ReturnPointsNotInTPA); +AddGlobalFunc('function PointInTPA(p: TPoint; const arP: TPointArray): Boolean', @Lape_PointInTPA); +AddGlobalFunc('procedure ClearDoubleTPA(var TPA: TPointArray);', @Lape_ClearDoubleTPA); +AddGlobalFunc('procedure TPACountSort(Var TPA: TPointArray; const max: TPoint; Const SortOnX: Boolean);', @Lape_TPACountSort); +AddGlobalFunc('procedure TPACountSortBase(Var TPA: TPointArray; const maxx, base: TPoint; const SortOnX: Boolean);', @Lape_TPACountSortBase); +AddGlobalFunc('procedure InvertTIA(var tI: TIntegerArray);', @Lape_InvertTIA); +AddGlobalFunc('function SumIntegerArray(const Ints: TIntegerArray): Integer', @Lape_SumIntegerArray); +AddGlobalFunc('function AverageTIA(const tI: TIntegerArray): Integer', @Lape_AverageTIA); +AddGlobalFunc('function AverageExtended(const tE: TExtendedArray): Extended', @Lape_AverageExtended); +AddGlobalFunc('procedure SplitTPAExWrap(const arr: TPointArray; w, h: Integer; var res: T2DPointArray);', @Lape_SplitTPAExWrap); +AddGlobalFunc('procedure SplitTPAWrap(const arr: TPointArray; Dist: Integer; var res: T2DPointArray);', @Lape_SplitTPAWrap); +AddGlobalFunc('procedure FindGapsTPAWrap(const TPA: TPointArray; MinPixels: Integer; var Res: T2DPointArray);', @Lape_FindGapsTPAWrap); +AddGlobalFunc('procedure RemoveDistTPointArrayWrap(x, y, dist: Integer; const ThePoints: TPointArray; RemoveHigher: Boolean; var Res: TPointArray);', @Lape_RemoveDistTPointArrayWrap); +AddGlobalFunc('procedure CombineTPAWrap(const Ar1, Ar2: TPointArray; var Res: TPointArray);', @Lape_CombineTPAWrap); +AddGlobalFunc('procedure ReArrangeandShortenArrayExWrap(const a: TPointArray; w, h: Integer; var Res: TPointArray);', @Lape_ReArrangeandShortenArrayExWrap); +AddGlobalFunc('procedure ReArrangeandShortenArrayWrap(const a: TPointArray; Dist: Integer; var Res: TPointArray);', @Lape_ReArrangeandShortenArrayWrap); +AddGlobalFunc('procedure TPAtoATPAExWrap(const TPA: TPointArray; w, h: Integer; var Res: T2DPointArray);', @Lape_TPAtoATPAExWrap); +AddGlobalFunc('procedure TPAtoATPAWrap(const TPA: TPointArray; Dist: Integer; var Res: T2DPointArray);', @Lape_TPAtoATPAWrap); +AddGlobalFunc('procedure CombineIntArrayWrap(const Ar1, Ar2: TIntegerArray; var Res: TIntegerArray);', @Lape_CombineIntArrayWrap); +AddGlobalFunc('procedure MergeATPAWrap(const ATPA: T2DPointArray; var Res: TPointArray);', @Lape_MergeATPAWrap); +AddGlobalFunc('procedure TPAFromBoxWrap(const Box: TBox; var Res: TPointArray);', @Lape_TPAFromBoxWrap); +AddGlobalFunc('procedure RotatePointsWrap(Const P: TPointArray; A, cx, cy: Extended; var Res: TPointArray);', @Lape_RotatePointsWrap); +AddGlobalFunc('procedure FindTPAEdgesWrap(const p: TPointArray; var Res: TPointArray);', @Lape_FindTPAEdgesWrap); +AddGlobalFunc('procedure ClearTPAFromTPAWrap(const arP, ClearPoints: TPointArray; var Res: TPointArray);', @Lape_ClearTPAFromTPAWrap); +AddGlobalFunc('procedure ReturnPointsNotInTPAWrap(Const TotalTPA: TPointArray; const Box: TBox; var Res: TPointArray);', @Lape_ReturnPointsNotInTPAWrap); +AddGlobalFunc('function SameTPA(const aTPA, bTPA: TPointArray): Boolean', @Lape_SameTPA); +AddGlobalFunc('function TPAInATPA(const TPA: TPointArray; const InATPA: T2DPointArray; var Index: LongInt): Boolean', @Lape_TPAInATPA); +AddGlobalFunc('procedure OffsetTPA(var TPA: TPointArray; const Offset: TPoint);', @Lape_OffsetTPA); +AddGlobalFunc('procedure OffsetATPA(var ATPA: T2DPointArray; const Offset: TPoint);', @Lape_OffsetATPA); +AddGlobalFunc('function CopyTPA(const TPA: TPointArray): TPointArray', @Lape_CopyTPA); +AddGlobalFunc('function CopyATPA(const ATPA: T2DPointArray): T2DPointArray', @Lape_CopyATPA); +AddGlobalFunc('procedure SetDesktopAsClient;', @Lape_SetDesktopAsClient); +AddGlobalFunc('function SetTargetArray(P: Integer; w, h: integer): integer', @Lape_SetTargetArray); +AddGlobalFunc('function SetTargetBitmap(bitmap: Integer): integer', @Lape_SetTargetBitmap); +AddGlobalFunc('function SetEIOSTarget(name: string; args: Variant): integer', @Lape_SetEIOSTarget); +AddGlobalFunc('procedure SetImageTarget(idx: integer);', @Lape_SetImageTarget); +AddGlobalFunc('procedure SetKeyMouseTarget(idx: integer);', @Lape_SetKeyMouseTarget); +AddGlobalFunc('function GetImageTarget: integer', @Lape_GetImageTarget); +AddGlobalFunc('function GetKeyMouseTarget: integer', @Lape_GetKeyMouseTarget); +AddGlobalFunc('function ExportImageTarget: TTarget_Exported', @Lape_ExportImageTarget); +AddGlobalFunc('function ExportKeyMouseTarget: TTarget_Exported', @Lape_ExportKeyMouseTarget); +AddGlobalFunc('procedure FreeTarget(idx: integer);', @Lape_FreeTarget); +AddGlobalFunc('procedure GetClientDimensions(var w, h: integer);', @Lape_GetClientDimensions); +AddGlobalFunc('procedure GetClientPosition(var left, top: integer);', @Lape_GetClientPosition); +AddGlobalFunc('function Freeze: boolean', @Lape_Freeze); +AddGlobalFunc('function Unfreeze: boolean', @Lape_Unfreeze); +AddGlobalFunc('procedure ActivateClient;', @Lape_ActivateClient); +AddGlobalFunc('function IsTargetValid: boolean', @Lape_IsTargetValid); diff --git a/Units/MMLAddon/mmlpsthread.pas b/Units/MMLAddon/mmlpsthread.pas index 6f194f7..9d43942 100644 --- a/Units/MMLAddon/mmlpsthread.pas +++ b/Units/MMLAddon/mmlpsthread.pas @@ -23,8 +23,9 @@ unit mmlpsthread; -{$Define PS_USESSUPPORT} +{$define PS_USESSUPPORT} //{$define USE_RUTIS} +{$define USE_LAPE} {$mode objfpc}{$H+} interface @@ -35,9 +36,12 @@ uses bitmaps, plugins, dynlibs,internets,scriptproperties, settings,settingssandbox, lcltype, dialogs {$IFDEF USE_RUTIS} - ,Rutis_Engine,Rutis_Defs + , Rutis_Engine, Rutis_Defs {$ENDIF} - ; + {$IFDEF USE_LAPE} + , lpparser, lpcompiler, lptypes, lpvartypes, + lpeval, lpinterpreter, lpdisassembler + {$ENDIF}; const m_Status = 0; //Data = PChar to new status @@ -233,6 +237,24 @@ type end; {$ENDIF} + {$IFDEF USE_LAPE} + { TLPThread } + TLPThread = class(TMThread) + protected + procedure LoadPlugin(plugidx: integer); override; + public + Parser: TLapeTokenizerString; + Compiler: TLapeCompiler; + constructor Create(CreateSuspended: Boolean; TheSyncInfo : PSyncInfo; plugin_dir: string); + destructor Destroy; override; + procedure SetScript(Script: string); override; + procedure Execute; override; + procedure Terminate; override; + function OnFindFile(Sender: TLapeCompiler; var FileName: lpString): TLapeTokenizerBase; + function OnHandleDirective(Sender: TLapeCompiler; Directive, Argument: lpString; InPeek: Boolean): Boolean; + end; + {$ENDIF} + threadvar CurrThread : TMThread; @@ -685,7 +707,6 @@ begin end; end; - procedure TPSThread.LoadPlugin(plugidx: integer); var i: integer; @@ -1229,6 +1250,183 @@ begin end; {$ENDIF} +{$IFDEF USE_LAPE} +{ TLPThread } + +type + PBoolean = ^Boolean; + PStringArray = ^TStringArray; + PBmpMirrorStyle = ^TBmpMirrorStyle; + PPointArray = ^TPointArray; + P2DIntArray = ^T2DIntArray; + PCanvas = ^TCanvas; + P2DPointArray = ^T2DPointArray; + PMask = ^TMask; + PBox = ^TBox; + PTarget_Exported = ^TTarget_Exported; + PIntegerArray = ^TIntegerArray; + PExtendedArray = ^TExtendedArray; + PFont = ^TFont; +// PStrExtr = ^TStrExtr; + PReplaceFlags = ^TReplaceFlags; + PClickType = ^TClickType; + P2DExtendedArray = ^T2DExtendedArray; + PMDTM = ^TMDTM; + PMDTMPoint = ^TMDTMPoint; + PSDTM = ^TSDTM; + + procedure lp_WriteLn(Params: PParamArray); + begin + psWriteLn(PlpString(Params^[0])^); + end; + + +{$I LPInc/Wrappers/other.inc} +{$I LPInc/Wrappers/settings.inc} +{$I LPInc/Wrappers/bitmap.inc} +{$I LPInc/Wrappers/window.inc} +{$I LPInc/Wrappers/tpa.inc} +{$I LPInc/Wrappers/strings.inc} +{$I LPInc/Wrappers/colour.inc} +{$I LPInc/Wrappers/colourconv.inc} +{$I LPInc/Wrappers/crypto.inc} +{$I LPInc/Wrappers/math.inc} +{$I LPInc/Wrappers/mouse.inc} +{$I LPInc/Wrappers/file.inc} +{$I LPInc/Wrappers/keyboard.inc} +{$I LPInc/Wrappers/dtm.inc} +{.$I LPInc/Wrappers/extensions.inc} //Doesn't work for me! +{$I LPInc/Wrappers/ocr.inc} +{$I LPInc/Wrappers/internets.inc} + +constructor TLPThread.Create(CreateSuspended: Boolean; TheSyncInfo: PSyncInfo; plugin_dir: string); +var + I: integer; + Fonts: TMFonts; +begin + inherited Create(CreateSuspended, TheSyncInfo, plugin_dir); + + Parser := TLapeTokenizerString.Create(''); + Compiler := TLapeCompiler.Create(Parser); + Compiler.OnFindFile := @OnFindFile; + Compiler.OnHandleDirective := @OnHandleDirective; + Fonts := Client.MOCR.Fonts; + with Compiler do + begin + addGlobalFunc('procedure _writeln; override;', @lp_WriteLn); + + for I := Fonts.Count - 1 downto 0 do + addGlobalVar(Fonts[I].Name, Fonts[I].Name); + + for I := 0 to High(VirtualKeys) do + addGlobalVar(VirtualKeys[I].Key, Format('VK_%S', [VirtualKeys[i].Str])); + + {$I LPInc/lpdefines.inc} + {$I LPInc/lpcompile.inc} + + {$I LPInc/lpexportedmethods.inc} + end; +end; + +destructor TLPThread.Destroy; +begin + try + {if (Compiler <> nil) then + Compiler.Free;} + + if (Parser <> nil) then + Parser.Free; + except + on E: Exception do + psWriteln('Exception TLPThread.Destroy: ' + e.message); + end; + + inherited Destroy; +end; + +procedure TLPThread.SetScript(Script: string); +begin + Parser.Doc := Script; +end; + +function TLPThread.OnFindFile(Sender: TLapeCompiler; var FileName: lpString): TLapeTokenizerBase; +begin + Result := nil; + FileName := IncludePath + FileName; +end; + +function TLPThread.OnHandleDirective(Sender: TLapeCompiler; Directive, Argument: lpString; InPeek: Boolean): Boolean; +var + plugin_idx: integer; +begin + Result := False; + if (Directive = 'loadlib') then + begin + if (Argument <> '') then + begin + plugin_idx := PluginsGlob.LoadPlugin(Argument); + if (plugin_idx >= 0) then + begin + LoadPlugin(plugin_idx); + Result := True; + end else + psWriteln(Format('Your DLL %s has not been found', [Argument])) + end else + psWriteln('Your LoadLib directive has no params, thus cannot find the plugin'); + end; +end; + +procedure TLPThread.LoadPlugin(plugidx: integer); +var + I: integer; +begin + with PluginsGlob.MPlugins[plugidx] do + begin + for i := 0 to TypesLen -1 do + with Types[I] do + Compiler.addGlobalType(TypeDef, TypeName); + + for i := 0 to MethodLen - 1 do + with Methods[i] do + Compiler.addGlobalFunc(FuncStr, FuncPtr); + end; +end; + +procedure TLPThread.Execute; + function CombineDeclArray(a, b: TLapeDeclArray): TLapeDeclArray; + var + i, l: Integer; + begin + Result := a; + l := Length(a); + SetLength(Result, l + Length(b)); + for i := High(b) downto 0 do + Result[l + i] := b[i]; + end; +begin + CurrThread := self; + try + Starttime := lclintf.GetTickCount; + if Compiler.Compile() then + begin + psWriteln('Compiled succesfully in ' + IntToStr(GetTickCount - Starttime) + ' ms.'); + if CompileOnly then + Exit; + RunCode(Compiler.Emitter.Code); + psWriteln('Successfully executed.'); + end else + psWriteln('Compiling failed.'); + except + on E : Exception do + psWriteln('Exception in Script: ' + e.message); + end; +end; + +procedure TLPThread.Terminate; +begin +end; +{$ENDIF} + initialization PluginsGlob := TMPlugins.Create; libcpascal:= 0; diff --git a/Units/lape b/Units/lape index b24c52b..91f6956 160000 --- a/Units/lape +++ b/Units/lape @@ -1 +1 @@ -Subproject commit b24c52b9748c6f9f3e91a7a86f727022bf2fd6ce +Subproject commit 91f6956ba801992efc5894e77888b84a987edadd