Index: tools/smaz.adb ================================================================== --- tools/smaz.adb +++ tools/smaz.adb @@ -23,24 +23,27 @@ with Ada.Strings.Unbounded; with Ada.Text_IO.Text_Streams; with Natools.Getopt_Long; with Natools.S_Expressions.Parsers; with Natools.Smaz.Tools; +with Natools.Smaz.Tools.GNAT; procedure Smaz is package Options is type Id is (Help, - Output_Ada_Dictionary); + Output_Ada_Dictionary, + Output_Hash); end Options; package Getopt is new Natools.Getopt_Long (Options.Id); type Callback is new Getopt.Handlers.Callback with record Display_Help : Boolean := False; Need_Dictionary : Boolean := False; Ada_Dictionary : Ada.Strings.Unbounded.Unbounded_String; + Hash_Package : Ada.Strings.Unbounded.Unbounded_String; end record; overriding procedure Option (Handler : in out Callback; Id : in Options.Id; @@ -88,10 +91,15 @@ := Ada.Strings.Unbounded.To_Unbounded_String (Argument); else Handler.Ada_Dictionary := Ada.Strings.Unbounded.To_Unbounded_String ("-"); end if; + + when Options.Output_Hash => + Handler.Need_Dictionary := True; + Handler.Hash_Package + := Ada.Strings.Unbounded.To_Unbounded_String (Argument); end case; end Option; function Getopt_Config return Getopt.Configuration is @@ -98,10 +106,11 @@ use Getopt; use Options; R : Getopt.Configuration; begin R.Add_Option ("ada-dict", 'A', Optional_Argument, Output_Ada_Dictionary); + R.Add_Option ("hash-pkg", 'H', Required_Argument, Output_Hash); R.Add_Option ("help", 'h', No_Argument, Help); return R; end Getopt_Config; @@ -173,10 +182,17 @@ 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 ""-"""); + + when Options.Output_Hash => + Put_Line (Output, " "); + Put_Line (Output, Indent & Indent + & "Build a package with a perfect hash function for the"); + Put_Line (Output, Indent & Indent + & "current dictionary."); end case; end loop; end Print_Help; @@ -217,11 +233,17 @@ declare Dictionary : constant Natools.Smaz.Dictionary := Natools.Smaz.Tools.To_Dictionary (Input_List, True); Ada_Dictionary : constant String := Ada.Strings.Unbounded.To_String (Handler.Ada_Dictionary); + Hash_Package : constant String + := Ada.Strings.Unbounded.To_String (Handler.Hash_Package); begin if Ada_Dictionary'Length > 0 then - Print_Dictionary (Ada_Dictionary, Dictionary); + Print_Dictionary (Ada_Dictionary, Dictionary, Hash_Package); + end if; + + if Hash_Package'Length > 0 then + Natools.Smaz.Tools.GNAT.Build_Perfect_Hash (Input_List, Hash_Package); end if; end Build_Dictionary; end Smaz;