Index: tools/smaz.adb ================================================================== --- tools/smaz.adb +++ tools/smaz.adb @@ -31,20 +31,23 @@ with Natools.S_Expressions.Parsers; with Natools.S_Expressions.Printers; with Natools.Smaz; with Natools.Smaz.Tools; with Natools.Smaz_256; +with Natools.Smaz_64; with Natools.Smaz_Generic.Tools; +with Natools.Smaz_Implementations.Base_64_Tools; with Natools.Smaz_Tools; with Natools.Smaz_Tools.GNAT; with Natools.String_Escapes; procedure Smaz is function To_SEA (S : String) return Ada.Streams.Stream_Element_Array renames Natools.S_Expressions.To_Atom; package Tools_256 is new Natools.Smaz_256.Tools; + package Tools_64 is new Natools.Smaz_64.Tools; package Methods renames Natools.Smaz_Tools.Methods; package Actions is type Enum is @@ -55,10 +58,11 @@ end Actions; package Algorithms is type Enum is (Base_256, + Base_64, Base_256_Retired); end Algorithms; package Dict_Sources is type Enum is @@ -68,10 +72,11 @@ end Dict_Sources; package Options is type Id is (Base_256, + Base_64, Output_Ada_Dict, Check_Roundtrip, Dictionary_Input, Decode, Encode, @@ -135,10 +140,12 @@ is null; function Activate_Dictionary (Dict : in Natools.Smaz_256.Dictionary) return Natools.Smaz_256.Dictionary; + function Activate_Dictionary (Dict : in Natools.Smaz_64.Dictionary) + return Natools.Smaz_64.Dictionary; function Activate_Dictionary (Dict : in Natools.Smaz.Dictionary) return Natools.Smaz.Dictionary; -- Update Dictionary.Hash so that it can be actually used procedure Build_Perfect_Hash @@ -155,10 +162,13 @@ -- Build the configuration object function Last_Code (Dict : in Natools.Smaz_256.Dictionary) return Ada.Streams.Stream_Element is (Dict.Last_Code); + function Last_Code (Dict : in Natools.Smaz_64.Dictionary) + return Natools.Smaz_Implementations.Base_64_Tools.Base_64_Digit + is (Dict.Last_Code); function Last_Code (Dict : in Natools.Smaz.Dictionary) return Ada.Streams.Stream_Element is (Dict.Dict_Last); -- Return the last valid entry @@ -165,10 +175,14 @@ procedure Print_Dictionary (Output : in Ada.Text_IO.File_Type; Dictionary : in Natools.Smaz_256.Dictionary; Hash_Package_Name : in String := ""); procedure Print_Dictionary + (Output : in Ada.Text_IO.File_Type; + Dictionary : in Natools.Smaz_64.Dictionary; + Hash_Package_Name : in String := ""); + procedure Print_Dictionary (Output : in Ada.Text_IO.File_Type; Dictionary : in Natools.Smaz.Dictionary; Hash_Package_Name : in String := ""); -- print the given dictionary in the given file @@ -1010,10 +1024,41 @@ Simple_Dictionary => Natools.Smaz_Tools.Simple_Dictionary, Simple_Dictionary_And_Pending => Natools.Smaz_Tools.Simple_Dictionary_And_Pending, To_Dictionary => Tools_256.To_Dictionary, Worst_Element => Tools_256.Worst_Index); + + package Dict_64 is new Dictionary_Subprograms + (Dictionary => Natools.Smaz_64.Dictionary, + Dictionary_Entry + => Natools.Smaz_Implementations.Base_64_Tools.Base_64_Digit, + Methods => Natools.Smaz_Tools.Methods.Enum, + Score_Value => Natools.Smaz_Tools.Score_Value, + String_Count => Natools.Smaz_Tools.String_Count, + Word_Counter => Natools.Smaz_Tools.Word_Counter, + Dictionary_Counts => Tools_64.Dictionary_Counts, + String_Lists => Natools.Smaz_Tools.String_Lists, + Add_Substrings => Natools.Smaz_Tools.Add_Substrings, + Add_Words => Natools.Smaz_Tools.Add_Words, + Append_String => Tools_64.Append_String, + Build_Perfect_Hash => Natools.Smaz_Tools.GNAT.Build_Perfect_Hash, + Compress => Natools.Smaz_64.Compress, + Decompress => Natools.Smaz_64.Decompress, + Dict_Entry => Natools.Smaz_64.Dict_Entry, + Evaluate_Dictionary => Tools_64.Evaluate_Dictionary, + Evaluate_Dictionary_Partial => Tools_64.Evaluate_Dictionary_Partial, + Filter_By_Count => Natools.Smaz_Tools.Filter_By_Count, + Last_Code => Last_Code, + Remove_Element => Tools_64.Remove_Element, + Score_Encoded => Tools_64.Score_Encoded'Access, + Score_Frequency => Tools_64.Score_Frequency'Access, + Score_Gain => Tools_64.Score_Gain'Access, + Simple_Dictionary => Natools.Smaz_Tools.Simple_Dictionary, + Simple_Dictionary_And_Pending + => Natools.Smaz_Tools.Simple_Dictionary_And_Pending, + To_Dictionary => Tools_64.To_Dictionary, + Worst_Element => Tools_64.Worst_Index); package Dict_Retired is new Dictionary_Subprograms (Dictionary => Natools.Smaz.Dictionary, Dictionary_Entry => Ada.Streams.Stream_Element, Methods => Natools.Smaz.Tools.Methods.Enum, @@ -1143,10 +1188,13 @@ Handler.Algorithm := Algorithms.Base_256; when Options.Base_256_Retired => Handler.Algorithm := Algorithms.Base_256_Retired; + when Options.Base_64 => + Handler.Algorithm := Algorithms.Base_64; + when Options.Check_Roundtrip => Handler.Check_Roundtrip := True; end case; end Option; @@ -1160,10 +1208,25 @@ (Tools_256.To_String_List (Result)); Result.Hash := Natools.Smaz_Tools.Trie_Search'Access; pragma Assert (Natools.Smaz_256.Is_Valid (Result)); + return Result; + end Activate_Dictionary; + + + function Activate_Dictionary (Dict : in Natools.Smaz_64.Dictionary) + return Natools.Smaz_64.Dictionary + is + Result : Natools.Smaz_64.Dictionary := Dict; + begin + Natools.Smaz_Tools.Set_Dictionary_For_Trie_Search + (Tools_64.To_String_List (Result)); + Result.Hash := Natools.Smaz_Tools.Trie_Search'Access; + + pragma Assert (Natools.Smaz_64.Is_Valid (Result)); + return Result; end Activate_Dictionary; function Activate_Dictionary (Dict : in Natools.Smaz.Dictionary) @@ -1223,10 +1286,11 @@ use Getopt; use Options; R : Getopt.Configuration; begin R.Add_Option ("base-256", '2', No_Argument, Base_256); + R.Add_Option ("base-64", '6', No_Argument, Base_64); R.Add_Option ("ada-dict", 'A', Optional_Argument, Output_Ada_Dict); R.Add_Option ("check", 'C', No_Argument, Check_Roundtrip); R.Add_Option ("decode", 'd', No_Argument, Decode); R.Add_Option ("dict", 'D', No_Argument, Dictionary_Input); R.Add_Option ("encode", 'e', No_Argument, Encode); @@ -1269,10 +1333,35 @@ end Put_Line; procedure Print_Dictionary_In_Ada is new Tools_256.Print_Dictionary_In_Ada (Put_Line); begin + if Hash_Package_Name'Length > 0 then + Print_Dictionary_In_Ada + (Dictionary, + Hash_Image => Hash_Package_Name & ".Hash'Access"); + else + Print_Dictionary_In_Ada (Dictionary); + end if; + end Print_Dictionary; + + + procedure Print_Dictionary + (Output : in Ada.Text_IO.File_Type; + Dictionary : in Natools.Smaz_64.Dictionary; + Hash_Package_Name : in String := "") + is + procedure Put_Line (Line : in String); + + procedure Put_Line (Line : in String) is + begin + Ada.Text_IO.Put_Line (Output, Line); + end Put_Line; + + procedure Print_Dictionary_In_Ada is + new Tools_64.Print_Dictionary_In_Ada (Put_Line); + begin if Hash_Package_Name'Length > 0 then Print_Dictionary_In_Ada (Dictionary, Hash_Image => Hash_Package_Name & ".Hash'Access"); else @@ -1457,10 +1546,15 @@ when Options.Base_256_Retired => New_Line (Output); Put_Line (Output, Indent & Indent & "Use retired base-256 implementation"); + when Options.Base_64 => + New_Line (Output); + Put_Line (Output, Indent & Indent + & "Use base-64 implementation"); + when Options.Check_Roundtrip => New_Line (Output); Put_Line (Output, Indent & Indent & "Check roundtrip of compression or decompression"); end case; @@ -1513,10 +1607,13 @@ end Read_Input_List; case Handler.Algorithm is when Algorithms.Base_256 => Dict_256.Process + (Handler, Input_List, Input_Data, Handler.Score_Method); + when Algorithms.Base_64 => + Dict_64.Process (Handler, Input_List, Input_Data, Handler.Score_Method); when Algorithms.Base_256_Retired => declare Converted_Input_List : Natools.Smaz.Tools.String_Lists.List; Converted_Input_Data : Natools.Smaz.Tools.String_Lists.List;