with Ada.Unchecked_Deallocation; package body Packrat.Lexer is procedure Free_Array is new Ada.Unchecked_Deallocation (Object => Element_Array, Name => Element_Array_Access); procedure Initialize (This : in out Combinator_Result) is begin null; end Initialize; procedure Adjust (This : in out Combinator_Result) is begin if This.Value /= null then declare New_Array : Element_Array_Access := new Element_Array (1 .. This.Value.all'Length); begin New_Array.all := This.Value.all; This.Value := New_Array; end; end if; end Adjust; procedure Finalize (This : in out Combinator_Result) is begin if This.Value /= null then Free_Array (This.Value); end if; end Finalize; function Create_Result (Length : in Natural; Status : in Result_Status; Value : in Element_Array) return Combinator_Result is This : Combinator_Result; begin This.Length := Length; This.Status := Status; This.Value := new Element_Array (1 .. Value'Length); This.Value.all := Value; return This; end Create_Result; function Join (Left, Right : in Combinator_Result) return Combinator_Result is Merge : Combinator_Result; Left_Valsize, Right_Valsize, Total_Valsize : Natural; begin if Left.Value /= null then Left_Valsize := Left.Value.all'Length; else Left_Valsize := 0; end if; if Right.Value /= null then Right_Valsize := Right.Value.all'Length; else Right_Valsize := 0; end if; Total_Valsize := Left_Valsize + Right_Valsize; if Left.Status = Success or Left.Status = Optional_More then Merge.Length := Left.Length + Right.Length; Merge.Status := Right.Status; if Total_Valsize > 0 then Merge.Value := new Element_Array (1 .. Total_Valsize); if Left.Value /= null then Merge.Value.all (1 .. Left_Valsize) := Left.Value.all; end if; if Right.Value /= null then Merge.Value.all (Left_Valsize + 1 .. Total_Valsize) := Right.Value.all; end if; end if; return Merge; elsif Left.Status = Needs_More then Merge := Left; Merge.Status := Failure; return Merge; else return Left; end if; end Join; function "=" (Left, Right : in Combinator_Result) return Boolean is Left_Valsize, Right_Valsize : Natural; begin if Left.Value = null then Left_Valsize := 0; else Left_Valsize := Left.Value.all'Length; end if; if Right.Value = null then Right_Valsize := 0; else Right_Valsize := Right.Value.all'Length; end if; return Left.Length = Right.Length and Left.Status = Right.Status and Left_Valsize = Right_Valsize and (Left_Valsize = 0 or else Left.Value.all = Right.Value.all); end "="; function Status (This : in Combinator_Result) return Result_Status is begin return This.Status; end Status; function Debug_String (This : in Combinator_Result) return String is Value_Length : Natural; begin if This.Value = null then Value_Length := 0; else Value_Length := This.Value.all'Length; end if; return Integer'Image (This.Length) & " " & Result_Status'Image (This.Status) & " " & Integer'Image (Value_Length); end Debug_String; end Packrat.Lexer;