-- This source is licensed under the Sunset License v1.0 with Ada.Characters.Latin_1, Ada.Strings.Fixed, Ada.Strings.Maps, Ada.Text_IO, Datatypes; use Ada.Text_IO; package body FMD is package Latin renames Ada.Characters.Latin_1; package Strfix renames Ada.Strings.Fixed; package Strmap renames Ada.Strings.Maps; function "*" (Left : in Natural; Right : in Character) return String renames Ada.Strings.Fixed."*"; procedure Put_Header (File_Handle : in Ada.Text_IO.File_Type; Version : in String := "1.4") is begin Put_Line (File_Handle, ""); Put_Line (File_Handle, ""); Put_Line (File_Handle, ""); end Put_Header; procedure Put_Fields (File_Handle : in Ada.Text_IO.File_Type; Field_IDs : in Datatypes.Field_ID_Vector) is Text : SU.Unbounded_String; begin Put_Line (File_Handle, (4 * ' ') & ""); for FID of Field_IDs loop Text := Prep (SU.Unbounded_String (FID)); Put_Line (File_Handle, (8 * ' ') & "" & (-Text) & ""); end loop; Put_Line (File_Handle, (4 * ' ') & ""); end Put_Fields; procedure Start_Pack_Section (File_Handle : in Ada.Text_IO.File_Type) is begin Put_Line (File_Handle, (4 * ' ') & ""); end Start_Pack_Section; procedure Put_Pack (File_Handle : in Ada.Text_IO.File_Type; Q_Data : in Datatypes.Field_ID_Vector; A_Data : in Datatypes.Field_ID_Vector) is Text : SU.Unbounded_String; begin Put_Line (File_Handle, (8 * ' ') & ""); Text := Prep (SU.Unbounded_String (Q_Data.First_Element)); Put_Line (File_Handle, (12 * ' ') & "" & (-Text) & ""); for I in Datatypes.Field_Ordinal range Datatypes.Field_Ordinal'Succ (Q_Data.First_Index) .. Q_Data.Last_Index loop Text := Prep (SU.Unbounded_String (Q_Data.Element (I))); -- Fresh Memory unfortunately cannot cope with multiple question fields Put_Line (File_Handle, (12 * ' ') & ""); end loop; for FID of A_Data loop Text := Prep (SU.Unbounded_String (FID)); Put_Line (File_Handle, (12 * ' ') & "" & (-Text) & ""); end loop; Put_Line (File_Handle, (8 * ' ') & ""); end Put_Pack; procedure End_Pack_Section (File_Handle : in Ada.Text_IO.File_Type) is begin Put_Line (File_Handle, (4 * ' ') & ""); end End_Pack_Section; procedure Start_Entry_Section (File_Handle : in Ada.Text_IO.File_Type) is begin Put_Line (File_Handle, (4 * ' ') & ""); end Start_Entry_Section; procedure Put_Entry (File_Handle : in Ada.Text_IO.File_Type; Data : in Datatypes.Field_Vector; Quantity : in Positive) is use type Datatypes.Field_Ordinal; Counter : Positive := 1; Position : Datatypes.Field_Ordinal := Data.First_Index; Text : SU.Unbounded_String; begin Put_Line (File_Handle, (8 * ' ') & ""); while Counter <= Quantity loop if Position <= Data.Last_Index then Text := Prep (SU.Unbounded_String (Data.Element (Position))); Put_Line (File_Handle, (12 * ' ') & "" & (-Text) & ""); else Put_Line (File_Handle, (12 * ' ') & ""); end if; Position := Datatypes.Field_Ordinal'Succ (Position); Counter := Counter + 1; end loop; Put_Line (File_Handle, (8 * ' ') & ""); end Put_Entry; procedure End_Entry_Section (File_Handle : in Ada.Text_IO.File_Type) is begin Put_Line (File_Handle, (4 * ' ') & ""); end End_Entry_Section; procedure Put_Footer (File_Handle : in Ada.Text_IO.File_Type) is begin Put_Line (File_Handle, ""); end Put_Footer; procedure Replace_All (Text : in out SU.Unbounded_String; Char : in Character; Sub : in String) is Position : Natural; begin loop Position := SU.Index (Text, Strmap.To_Set (Char)); exit when Position = 0; SU.Replace_Slice (Text, Position, Position, Sub); end loop; end Replace_All; procedure Replace_All (Text : in out SU.Unbounded_String; Item : in String; Sub : in String) is Position : Natural; begin loop Position := SU.Index (Text, Item); exit when Position = 0; SU.Replace_Slice (Text, Position, Position + Item'Length - 1, Sub); end loop; end Replace_All; function Prep (Text : in SU.Unbounded_String) return SU.Unbounded_String is Result : SU.Unbounded_String := Text; begin -- Fresh Memory needs these character codes Replace_All (Result, '<', "<"); Replace_All (Result, '>', ">"); Replace_All (Result, '"', """); -- Not sure why these cause Fresh Memory to not load the dict -- Replace_All (Result, Latin.CR & Latin.LF, "
"); -- Replace_All (Result, Latin.LF, "
"); -- Fresh memory doesn't recognise these character codes so get rid of them -- Note that this list may not be complete Replace_All (Result, "–", "–"); Replace_All (Result, "’", "’"); Replace_All (Result, "‘", "‘"); Replace_All (Result, "”", "”"); Replace_All (Result, "“", "“"); return Result; end Prep; end FMD;