hedgewars/uCommands.pas
changeset 6898 344b0dbd9690
parent 6700 e04da46ee43c
child 6919 bf7433e62b9c
equal deleted inserted replaced
6897:a9126661f613 6898:344b0dbd9690
    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;