unit Parser; interface uses SysUtils, Classes; type PProc = Procedure(Execute: Boolean; Params: Array of string) of object; TSwitchType = (SWITCH_VALUE, SWITCH_VALPROC, SWITCH_PROCEDURE); TSwitch = packed record Counter: Byte; Pos: Word; Proc: PProc; SType: TSwitchType; end; TSwitchArray = array of ^TSwitch; PSwitch = ^TSwitch; TParser = Class(TObject) { TParser 1.1 Guide lines: + Allow checking of an eariler switch + Only Parsering Switch string + No case sensetive + Must be fast } private Data: Array['A'..'z'] of ^TSwitch; public constructor Initialize; destructor Destroy;override; function Work(Buffer: Array of string): Boolean; function Add(Switch: Char; Count: Byte; Callback: PProc; &Type: TSwitchType) : Boolean; end; implementation constructor TParser.Initialize; var I: Word; begin inherited Create; for I := Ord('A') to Ord('z') do Data[Chr(I)] := nil; end; destructor TParser.Destroy; var I: Word; begin for I := Ord('A') to Ord('z') do if Data[Chr(I)] <> nil then Dispose(Data[Chr(I)]); inherited Destroy; end; function TParser.Work; type TData = packed record Paramters: Array of string; P: TSwitch; end; var Temp: String; I, X, Y, Calc, Sum: Word; &Type: TSwitchType; Buf: array [TSwitchType] of array of TData; Test: ^TData; begin Result := True; if (Length(Buffer) = 0) or (Length(Buffer[0]) = 0) then Exit; { If there are no paramters then Quit } for I := 0 to Length(Buffer) - 1 do begin Temp := Buffer[I]; if Temp[1] = '-' then begin Calc := 0; Sum := Calc; Temp := Copy(Temp, 2, Length(Temp)); for X := 1 to Length(Temp) do begin if Data[Temp[X]] <> nil then begin // Now calc and set paramters if (Length(Buffer) - I - 1 - Sum) >= Data[Temp[X]].Counter then begin &Type := Data[Temp[X]].SType; case Data[Temp[X]].SType of SWITCH_VALUE, SWITCH_VALPROC: begin SetLength(Buf[&Type], Length(Buf[&Type])+1); Buf[&Type, Length(Buf[&Type])-1].P := Data[Temp[X]]^; Test := Addr(Buf[&Type, Length(Buf[&TYpe])-1].Paramters); SetLength(Test^.Paramters, Data[Temp[X]].Counter); for Y := 0 to Length(Test^.Paramters) - 1 do begin Test^.Paramters[Y] := Buffer[I + Sum + 1]; end; Inc(Sum, Data[Temp[X]].Counter); end; SWITCH_PROCEDURE: begin SetLength(Buf[&Type], Length(Buf[&Type])+1); Buf[&Type, Length(Buf[&Type])-1].P := Data[Temp[X]]^; end; end; end else begin Result := False; Break; Break; end; end; end; end; end; if Result then for X := 0 to 2 do for I := 0 to Length(Buf[TSwitchType(X)]) - 1 do if Length(Buf[TSwitchType(X)]) > 0 then case X of 0: Buf[SWITCH_VALUE, I].P.Proc(False, Buf[SWITCH_VALUE, I].Paramters); 1: begin if I = (Length(Buf[SWITCH_VALPROC])-1) then Buf[SWITCH_VALPROC, I].P.Proc(True, Buf[SWITCH_VALPROC, I].Paramters) else Buf[SWITCH_VALPROC, I].P.Proc(FALSE, Buf[SWITCH_VALPROC, I].Paramters); end; 2: if I = Length(Buf[SWITCH_PROCEDURE])-1 then Buf[SWITCH_PROCEDURE, I].P.Proc(True, []) else Buf[SWITCH_PROCEDURE, I].P.Proc(False, []); end; end; function TParser.Add(Switch: Char; Count: Byte; Callback: PProc; &Type: TSwitchType): Boolean; begin if Data[Switch] <> Nil then Result := False Else begin New(Data[Switch]); with Data[Switch]^ do begin Counter := Count; Proc := CallBack; SType := &Type; end; Result := True; end; end; end.