21 unit uCommands; |
21 unit uCommands; |
22 |
22 |
23 interface |
23 interface |
24 |
24 |
25 var isDeveloperMode: boolean; |
25 var isDeveloperMode: boolean; |
26 type TVariableType = (vtCommand, vtLongInt, vtBoolean); |
26 type TCommandHandler = procedure (var params: shortstring); |
27 TCommandHandler = procedure (var params: shortstring); |
|
28 |
27 |
29 procedure initModule; |
28 procedure initModule; |
30 procedure freeModule; |
29 procedure freeModule; |
31 procedure RegisterVariable(Name: shortstring; VType: TVariableType; p: pointer; Trusted: boolean); |
30 procedure RegisterVariable(Name: shortstring; p: TCommandHandler; Trusted: boolean); |
32 procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); |
31 procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); |
33 procedure StopMessages(Message: Longword); |
32 procedure StopMessages(Message: Longword); |
34 |
33 |
35 implementation |
34 implementation |
36 uses Types, uConsts, uVariables, uConsole, uUtils, uDebug; |
35 uses Types, uConsts, uVariables, uConsole, uUtils, uDebug; |
37 |
36 |
38 type PVariable = ^TVariable; |
37 type PVariable = ^TVariable; |
39 TVariable = record |
38 TVariable = record |
40 Next: PVariable; |
39 Next: PVariable; |
41 Name: string[15]; |
40 Name: string[15]; |
42 VType: TVariableType; |
41 Handler: TCommandHandler; |
43 Handler: pointer; |
|
44 Trusted: boolean; |
42 Trusted: boolean; |
45 end; |
43 end; |
46 |
44 |
47 var |
45 var |
48 Variables: PVariable; |
46 Variables: PVariable; |
49 |
47 |
50 procedure RegisterVariable(Name: shortstring; VType: TVariableType; p: pointer; Trusted: boolean); |
48 procedure RegisterVariable(Name: shortstring; p: TCommandHandler; Trusted: boolean); |
51 var |
49 var |
52 value: PVariable; |
50 value: PVariable; |
53 begin |
51 begin |
54 New(value); |
52 New(value); |
55 TryDo(value <> nil, 'RegisterVariable: value = nil', true); |
53 TryDo(value <> nil, 'RegisterVariable: value = nil', true); |
56 FillChar(value^, sizeof(TVariable), 0); |
54 FillChar(value^, sizeof(TVariable), 0); |
57 value^.Name:= Name; |
55 value^.Name:= Name; |
58 value^.VType:= VType; |
|
59 value^.Handler:= p; |
56 value^.Handler:= p; |
60 value^.Trusted:= Trusted; |
57 value^.Trusted:= Trusted; |
61 |
58 |
62 if Variables = nil then |
59 if Variables = nil then |
63 Variables:= value |
60 Variables:= value |
78 //WriteLnToConsole(CmdStr); |
75 //WriteLnToConsole(CmdStr); |
79 if CmdStr[0]=#0 then |
76 if CmdStr[0]=#0 then |
80 exit; |
77 exit; |
81 c:= CmdStr[1]; |
78 c:= CmdStr[1]; |
82 if (c = '/') or (c = '$') then |
79 if (c = '/') or (c = '$') then |
83 Delete(CmdStr, 1, 1) |
80 Delete(CmdStr, 1, 1); |
84 else |
|
85 c:= '/'; |
|
86 s:= ''; |
81 s:= ''; |
87 SplitBySpace(CmdStr, s); |
82 SplitBySpace(CmdStr, s); |
88 AddFileLog('[Cmd] ' + c + CmdStr + ' (' + inttostr(length(s)) + ')'); |
83 AddFileLog('[Cmd] ' + CmdStr + ' (' + inttostr(length(s)) + ')'); |
89 t:= Variables; |
84 t:= Variables; |
90 while t <> nil do |
85 while t <> nil do |
91 begin |
86 begin |
92 if t^.Name = CmdStr then |
87 if t^.Name = CmdStr then |
93 begin |
88 begin |
94 if TrustedSource or t^.Trusted then |
89 if TrustedSource or t^.Trusted then |
95 case t^.VType of |
90 t^.Handler(s); |
96 vtCommand: if c='/' then |
91 exit |
97 begin |
92 end |
98 TCommandHandler(t^.Handler)(s); |
93 else |
99 end; |
94 t:= t^.Next |
100 vtLongInt: if c='$' then |
95 end; |
101 if s[0]=#0 then |
|
102 begin |
|
103 str(PLongInt(t^.Handler)^, s); |
|
104 WriteLnToConsole('$' + CmdStr + ' is "' + s + '"'); |
|
105 end |
|
106 else |
|
107 val(s, PLongInt(t^.Handler)^); |
|
108 vtBoolean: if c='$' then |
|
109 if s[0]=#0 then |
|
110 begin |
|
111 str(ord(boolean(t^.Handler^)), s); |
|
112 WriteLnToConsole('$' + CmdStr + ' is "' + s + '"'); |
|
113 end |
|
114 else |
|
115 begin |
|
116 val(s, ii); |
|
117 boolean(t^.Handler^):= not (ii = 0) |
|
118 end; |
|
119 end; |
|
120 exit |
|
121 end |
|
122 else |
|
123 t:= t^.Next |
|
124 end; |
|
125 case c of |
96 case c of |
126 '$': WriteLnToConsole(errmsgUnknownVariable + ': "$' + CmdStr + '"') |
97 '$': WriteLnToConsole(errmsgUnknownVariable + ': "$' + CmdStr + '"') |
127 else |
98 else |
128 WriteLnToConsole(errmsgUnknownCommand + ': "/' + CmdStr + '"') end |
99 WriteLnToConsole(errmsgUnknownCommand + ': "/' + CmdStr + '"') end |
129 end; |
100 end; |