Index: src/natools-smaz-tools.adb ================================================================== --- src/natools-smaz-tools.adb +++ src/natools-smaz-tools.adb @@ -16,10 +16,26 @@ package body Natools.Smaz.Tools is package Sx renames Natools.S_Expressions; + function Dummy_Hash (Value : String) return Natural; + -- Placeholder for Hash member, always raises Program_Error + + + ------------------------------ + -- Local Helper Subprograms -- + ------------------------------ + + function Dummy_Hash (Value : String) return Natural is + pragma Unreferenced (Value); + begin + raise Program_Error with "Dummy_Hash called"; + return 0; + end Dummy_Hash; + + ---------------------- -- Public Interface -- ---------------------- @@ -51,6 +67,54 @@ Descriptor.Next (Event); end loop Read_Loop; end Read_List; + + function To_Dictionary + (List : in String_Lists.List; + Variable_Length_Verbatim : in Boolean) + return Dictionary + is + Dict_Last : constant Ada.Streams.Stream_Element + := Ada.Streams.Stream_Element (String_Lists.Length (List)) - 1; + String_Size : Natural := 0; + Max_Word_Length : Positive := 1; + begin + for S of List loop + String_Size := String_Size + S'Length; + + if S'Length > Max_Word_Length then + Max_Word_Length := S'Length; + end if; + end loop; + + declare + Offsets : Offset_Array (0 .. Dict_Last); + Values : String (1 .. String_Size); + Current_Offset : Positive := 1; + Current_Index : Ada.Streams.Stream_Element := 0; + Next_Offset : Positive; + begin + for S of List loop + Offsets (Current_Index) := Current_Offset; + Next_Offset := Current_Offset + S'Length; + Values (Current_Offset .. Next_Offset - 1) := S; + Current_Offset := Next_Offset; + Current_Index := Current_Index + 1; + end loop; + + pragma Assert (Current_Index = Dict_Last + 1); + pragma Assert (Current_Offset = String_Size + 1); + + return + (Dict_Last => Dict_Last, + String_Size => String_Size, + Variable_Length_Verbatim => Variable_Length_Verbatim, + Max_Word_Length => Max_Word_Length, + Offsets => Offsets, + Values => Values, + Hash => Dummy_Hash'Access); + end; + end To_Dictionary; + end Natools.Smaz.Tools; Index: src/natools-smaz-tools.ads ================================================================== --- src/natools-smaz-tools.ads +++ src/natools-smaz-tools.ads @@ -33,6 +33,16 @@ procedure Read_List (List : out String_Lists.List; Descriptor : in out S_Expressions.Descriptor'Class); -- Read atoms from Descriptor to fill List + function To_Dictionary + (List : in String_Lists.List; + Variable_Length_Verbatim : in Boolean) + return Dictionary + with Pre => String_Lists.Length (List) in 1 .. + Ada.Containers.Count_Type (Ada.Streams.Stream_Element'Last); + -- Build a Dictionary object from a string list + -- Note that Hash is set to a placeholder which uncinditionnally + -- raises Program_Error when called. + end Natools.Smaz.Tools;