Index: tools/smaz.adb ================================================================== --- tools/smaz.adb +++ tools/smaz.adb @@ -37,20 +37,28 @@ type Enum is (Nothing, Decode, Encode); end Actions; + + package Dict_Sources is + type Enum is + (S_Expression, + Word_List); + end Dict_Sources; package Options is type Id is - (Output_Ada_Dictionary, + (Output_Ada_Dict, + Dictionary_Input, Decode, Encode, Output_Hash, Help, Stat_Output, No_Stat_Output, + Word_List_Input, Sx_Output, No_Sx_Output); end Options; package Getopt is new Natools.Getopt_Long (Options.Id); @@ -61,10 +69,11 @@ Stat_Output : Boolean := False; Sx_Output : Boolean := False; 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; end record; overriding procedure Option (Handler : in out Callback; Id : in Options.Id; @@ -92,10 +101,16 @@ procedure Print_Help (Opt : in Getopt.Configuration; Output : in Ada.Text_IO.File_Type); -- Print the help text to the given file + function To_Dictionary + (Handler : in Callback'Class; + Input : in Natools.Smaz.Tools.String_Lists.List) + return Natools.Smaz.Dictionary; + -- Convert the input into a dictionary given the option in Handler + overriding procedure Option (Handler : in out Callback; Id : in Options.Id; Argument : in String) is @@ -116,11 +131,11 @@ Handler.Stat_Output := False; when Options.No_Sx_Output => Handler.Sx_Output := False; - when Options.Output_Ada_Dictionary => + when Options.Output_Ada_Dict => Handler.Need_Dictionary := True; if Argument'Length > 0 then Handler.Ada_Dictionary := Ada.Strings.Unbounded.To_Unbounded_String (Argument); @@ -137,27 +152,35 @@ when Options.Stat_Output => Handler.Stat_Output := True; when Options.Sx_Output => Handler.Sx_Output := True; + + when Options.Dictionary_Input => + Handler.Dict_Source := Dict_Sources.S_Expression; + + when Options.Word_List_Input => + Handler.Dict_Source := Dict_Sources.Word_List; end case; end Option; function Getopt_Config return Getopt.Configuration is use Getopt; use Options; R : Getopt.Configuration; begin - R.Add_Option ("ada-dict", 'A', Optional_Argument, Output_Ada_Dictionary); - R.Add_Option ("decode", 'd', No_Argument, Decode); - R.Add_Option ("encode", 'e', No_Argument, Encode); - R.Add_Option ("help", 'h', No_Argument, Help); - R.Add_Option ("hash-pkg", 'H', Required_Argument, Output_Hash); - R.Add_Option ("stats", 's', No_Argument, Stat_Output); - R.Add_Option ("no-stats", 'S', No_Argument, No_Stat_Output); - R.Add_Option ("s-expr", 'x', No_Argument, Sx_Output); + R.Add_Option ("ada-dict", 'A', Optional_Argument, Output_Ada_Dict); + 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 ("help", 'h', No_Argument, Help); + R.Add_Option ("hash-pkg", 'H', Required_Argument, Output_Hash); + R.Add_Option ("stats", 's', No_Argument, Stat_Output); + R.Add_Option ("no-stats", 'S', No_Argument, No_Stat_Output); + R.Add_Option ("word-list", 'w', No_Argument, Word_List_Input); + R.Add_Option ("s-expr", 'x', No_Argument, Sx_Output); R.Add_Option ("no-s-expr", 'X', No_Argument, No_Sx_Output); return R; end Getopt_Config; @@ -243,11 +266,11 @@ when Options.No_Sx_Output => New_Line (Output); Put_Line (Output, Indent & Indent & "Do not output filtered results in a S-expression"); - when Options.Output_Ada_Dictionary => + when Options.Output_Ada_Dict => Put_Line (Output, "=[filename]"); Put_Line (Output, Indent & Indent & "Output the current dictionary as Ada code in the given"); Put_Line (Output, Indent & Indent & "file, or standard output if filename is ""-"""); @@ -266,13 +289,47 @@ when Options.Sx_Output => New_Line (Output); Put_Line (Output, Indent & Indent & "Output filtered results in a S-expression"); + + when Options.Dictionary_Input => + New_Line (Output); + Put_Line (Output, Indent & Indent + & "Read dictionary directly in input S-expression (default)"); + + when Options.Word_List_Input => + New_Line (Output); + Put_Line (Output, Indent & Indent + & "Compute dictionary from word list in input S-expression"); end case; end loop; end Print_Help; + + function To_Dictionary + (Handler : in Callback'Class; + Input : in Natools.Smaz.Tools.String_Lists.List) + return Natools.Smaz.Dictionary is + begin + case Handler.Dict_Source is + when Dict_Sources.S_Expression => + return Natools.Smaz.Tools.To_Dictionary (Input, True); + + when Dict_Sources.Word_List => + declare + Counter : Natools.Smaz.Tools.Word_Counter; + begin + for S of Input loop + Natools.Smaz.Tools.Add_Substrings (Counter, S, 1, 3); + end loop; + + return Natools.Smaz.Tools.To_Dictionary + (Natools.Smaz.Tools.Most_Common_Words (Counter, 254), + True); + end; + end case; + end To_Dictionary; Opt_Config : constant Getopt.Configuration := Getopt_Config; Handler : Callback; Input_List, Input_Data : Natools.Smaz.Tools.String_Lists.List; begin @@ -317,11 +374,11 @@ Build_Dictionary : declare Dictionary : Natools.Smaz.Dictionary - := Natools.Smaz.Tools.To_Dictionary (Input_List, True); + := To_Dictionary (Handler, Input_List); Sx_Output : Natools.S_Expressions.Printers.Canonical (Ada.Text_IO.Text_Streams.Stream (Ada.Text_IO.Current_Output)); Ada_Dictionary : constant String := Ada.Strings.Unbounded.To_String (Handler.Ada_Dictionary); Hash_Package : constant String