Index: tools/smaz.adb ================================================================== --- tools/smaz.adb +++ tools/smaz.adb @@ -69,10 +69,11 @@ package Options is type Id is (Base_256, Output_Ada_Dict, + Check_Roundtrip, Dictionary_Input, Decode, Encode, Evaluate, Filter_Threshold, @@ -118,10 +119,11 @@ Score_Method : Methods.Enum := Methods.Encoded; Action : Actions.Enum := Actions.Nothing; Ada_Dictionary : Ada.Strings.Unbounded.Unbounded_String; Hash_Package : Ada.Strings.Unbounded.Unbounded_String; Dict_Source : Dict_Sources.Enum := Dict_Sources.S_Expression; + Check_Roundtrip : Boolean := False; end record; overriding procedure Option (Handler : in out Callback; Id : in Options.Id; @@ -643,10 +645,34 @@ for S of Data_List loop Sx_Output.Append_String (Decompress (Dict, To_SEA (S))); end loop; Sx_Output.Close_List; end if; + + if Handler.Check_Roundtrip then + for S of Data_List loop + declare + use type Ada.Streams.Stream_Element_Array; + Input : constant Ada.Streams.Stream_Element_Array + := To_SEA (S); + Processed : constant String + := Decompress (Dict, Input); + Roundtrip : constant Ada.Streams.Stream_Element_Array + := Compress (Dict, Processed); + begin + if Input /= Roundtrip then + Sx_Output.Open_List; + Sx_Output.Append_String + ("decompress-roundtrip-failed"); + Sx_Output.Append_Atom (Input); + Sx_Output.Append_String (Processed); + Sx_Output.Append_Atom (Roundtrip); + Sx_Output.Close_List; + end if; + end; + end loop; + end if; if Handler.Stat_Output then declare procedure Print_Line (Original, Output : Natural); @@ -684,10 +710,31 @@ for S of Data_List loop Sx_Output.Append_Atom (Compress (Dict, S)); end loop; Sx_Output.Close_List; end if; + + if Handler.Check_Roundtrip then + for S of Data_List loop + declare + Processed : constant Ada.Streams.Stream_Element_Array + := Compress (Dict, S); + Roundtrip : constant String + := Decompress (Dict, Processed); + begin + if S /= Roundtrip then + Sx_Output.Open_List; + Sx_Output.Append_String + ("compress-roundtrip-failed"); + Sx_Output.Append_String (S); + Sx_Output.Append_Atom (Processed); + Sx_Output.Append_String (Roundtrip); + Sx_Output.Close_List; + end if; + end; + end loop; + end if; if Handler.Stat_Output then declare procedure Print_Line (Original, Output, Base64 : Natural); @@ -1095,10 +1142,13 @@ when Options.Base_256 => Handler.Algorithm := Algorithms.Base_256; when Options.Base_256_Retired => Handler.Algorithm := Algorithms.Base_256_Retired; + + when Options.Check_Roundtrip => + Handler.Check_Roundtrip := True; end case; end Option; function Activate_Dictionary (Dict : in Natools.Smaz_256.Dictionary) @@ -1174,10 +1224,11 @@ use Options; R : Getopt.Configuration; begin R.Add_Option ("base-256", '2', No_Argument, Base_256); 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); R.Add_Option ("evaluate", 'E', No_Argument, Evaluate); R.Add_Option ("filter", 'F', Required_Argument, Filter_Threshold); @@ -1405,10 +1456,15 @@ when Options.Base_256_Retired => New_Line (Output); Put_Line (Output, Indent & Indent & "Use retired base-256 implementation"); + + when Options.Check_Roundtrip => + New_Line (Output); + Put_Line (Output, Indent & Indent + & "Check roundtrip of compression or decompression"); end case; end loop; end Print_Help; @@ -1432,11 +1488,12 @@ if not Handler.Need_Dictionary then return; end if; - if not (Handler.Stat_Output or Handler.Sx_Output) then + if not (Handler.Stat_Output or Handler.Sx_Output or Handler.Check_Roundtrip) + then Handler.Sx_Output := True; end if; Read_Input_List : declare