diff options
Diffstat (limited to 'src/deck_io.adb')
-rw-r--r-- | src/deck_io.adb | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/src/deck_io.adb b/src/deck_io.adb index c0dd38c..9e5b4b7 100644 --- a/src/deck_io.adb +++ b/src/deck_io.adb @@ -4,8 +4,10 @@ with Ada.Characters.Latin_1, Ada.Directories, + Ada.Strings.Fixed, Ada.Strings.Maps, Ada.Text_IO, + CSV, GNAT.Regpat, GNATCOLL.JSON, UnZip; @@ -20,6 +22,7 @@ package body Deck_IO is package Latin renames Ada.Characters.Latin_1; package FD renames Ada.Directories; + package Strfix renames Ada.Strings.Fixed; package Strmap renames Ada.Strings.Maps; package Pat renames GNAT.Regpat; package JS renames GNATCOLL.JSON; @@ -36,6 +39,21 @@ package body Deck_IO is renames SU.To_String; + function To_Unbounded_String + (Item : in Field_ID) + return SU.Unbounded_String is + begin + return SU.Unbounded_String (Item); + end To_Unbounded_String; + + function To_Unbounded_String + (Item : in Field) + return SU.Unbounded_String is + begin + return SU.Unbounded_String (Item); + end To_Unbounded_String; + + procedure Finalize @@ -299,29 +317,79 @@ package body Deck_IO is Current_Note.Model := Model_ID (Raw_Model); Tokenize_Fields (Statement.Column (1), Current_Note.Fields); Notes.Append (Current_Note); + Current_Note.Fields.Clear; end loop; end Query_Notes; + function Compose_Name + (Directory : in String; + Basename : in String; + Extension : in String; + Model_Num : in Positive) + return SU.Unbounded_String + is + Result : SU.Unbounded_String := +FD.Compose (Directory, Basename); + begin + if Model_Num > 1 then + SU.Append (Result, "-" & Strfix.Trim (Integer'Image (Model_Num), Ada.Strings.Left)); + end if; + SU.Append (Result, "." & Extension); + return Result; + end Compose_Name; + + + + procedure Write_CSV (Directory : in String; Basename : in String; Models : in Model_Maps.Map; - Notes : in Note_Vectors.Vector) + Notes : in Note_Vectors.Vector; + Overwrite : in Boolean := False) is + package My_CSV is new CSV; + procedure Put_Header is new My_CSV.Put_Row (Field_Ordinal, Field_ID, Field_ID_Vectors); + procedure Put_Row is new My_CSV.Put_Row (Field_Ordinal, Field, Field_Vectors); + + Counter : Positive := 1; + Outname : SU.Unbounded_String; + File_Handle : File_Type; + Row_Size : Positive; begin - null; + for C in Models.Iterate loop + Outname := Compose_Name (Directory, Basename, "csv", Counter); + if FD.Exists (-Outname) then + if not Overwrite then + raise FD.Name_Error; + else + FD.Delete_File (-Outname); + end if; + end if; + Create (File_Handle, Out_File, -Outname); + Row_Size := Positive (Model_Maps.Element (C).Fields.Length); + Put_Header (File_Handle, Model_Maps.Element (C).Fields, Row_Size); + for N of Notes loop + if N.Model = Model_Maps.Key (C) then + Put_Row (File_Handle, N.Fields, Row_Size); + end if; + end loop; + Close (File_Handle); + end loop; end Write_CSV; + + procedure Write_FMD (Directory : in String; Basename : in String; Models : in Model_Maps.Map; Notes : in Note_Vectors.Vector; - Media : in Media_Maps.Map) + Media : in Media_Maps.Map; + Overwrite : in Boolean := False) is begin null; |