Overview
Comment: | s_expressions-file_readers: new package to encapsulate file reading as a S-expression or as an atom |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
68274aec88661bbd96fb9ca06c09933c |
User & Date: | nat on 2014-04-09 19:34:26 |
Other Links: | manifest | tags |
Context
2014-04-10
| ||
21:48 | hmac-main: new option to provide the key through a file or standard input check-in: 7527f90336 user: nat tags: trunk | |
2014-04-09
| ||
19:34 | s_expressions-file_readers: new package to encapsulate file reading as a S-expression or as an atom check-in: 68274aec88 user: nat tags: trunk | |
2014-04-08
| ||
19:05 | hmac-main: add command-line options to control output format check-in: 3c8ac9180a user: nat tags: trunk | |
Changes
Added src/natools-s_expressions-file_readers.adb version [3cf81ddf53].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | ------------------------------------------------------------------------------ -- Copyright (c) 2014, Natacha Porté -- -- -- -- Permission to use, copy, modify, and distribute this software for any -- -- purpose with or without fee is hereby granted, provided that the above -- -- copyright notice and this permission notice appear in all copies. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -- -- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -- -- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -- -- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -- -- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -- -- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -- -- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- ------------------------------------------------------------------------------ package body Natools.S_Expressions.File_Readers is package Stream_IO renames Ada.Streams.Stream_IO; overriding procedure Finalize (Object : in out Autoclose) is begin if Stream_IO.Is_Open (Object.File) then Stream_IO.Close (Object.File); end if; end Finalize; ------------------------- -- S-Expression Reader -- ------------------------- function Reader (Name : String) return S_Reader is begin return Object : S_Reader do Stream_IO.Open (Object.Holder.File, Stream_IO.In_File, Name); Object.Next; end return; end Reader; procedure Set_Filename (Object : in out S_Reader; Name : in String) is begin if Stream_IO.Is_Open (Object.Holder.File) then Stream_IO.Close (Object.Holder.File); end if; Stream_IO.Open (Object.Holder.File, Stream_IO.In_File, Name); Object.Rewind; end Set_Filename; procedure Rewind (Object : in out S_Reader) is begin Stream_IO.Set_Index (Object.Holder.File, 1); Object.Next; end Rewind; overriding procedure Read_More (Object : in out S_Reader; Buffer : out Atom_Buffers.Atom_Buffer) is Data : Ada.Streams.Stream_Element_Array (0 .. 127); Last : Ada.Streams.Stream_Element_Offset; begin Stream_IO.Read (Object.Holder.File, Data, Last); if Last in Data'Range then Buffer.Append (Data (Data'First .. Last)); end if; end Read_More; ----------------- -- Atom Reader -- ----------------- function Reader (Name : String) return Atom_Reader is begin return Object : Atom_Reader do Stream_IO.Open (Object.File, Stream_IO.In_File, Name); end return; end Reader; procedure Set_Filename (Object : in out Atom_Reader; Name : in String) is begin if Stream_IO.Is_Open (Object.File) then Stream_IO.Close (Object.File); end if; Stream_IO.Open (Object.File, Stream_IO.In_File, Name); end Set_Filename; function Length (Object : Atom_Reader) return Count is begin return Count (Stream_IO.Size (Object.File)); end Length; function Read (Object : Atom_Reader) return Atom is Result : Atom (1 .. Object.Length); Last : Count; begin Stream_IO.Set_Index (Object.File, 1); Stream_IO.Read (Object.File, Result, Last); pragma Assert (Last = Result'Last); return Result; end Read; procedure Read (Object : in Atom_Reader; Data : out Atom; Length : out Count) is begin Stream_IO.Set_Index (Object.File, 1); Stream_IO.Read (Object.File, Data, Length); Length := Object.Length; end Read; procedure Read (Object : in Atom_Reader; Buffer : out Atom_Buffers.Atom_Buffer; Block_Size : in Count := 1024) is Block : Atom (1 .. Block_Size); Last : Count; begin Buffer.Soft_Reset; Stream_IO.Set_Index (Object.File, 1); loop Stream_IO.Read (Object.File, Block, Last); exit when Last not in Block'Range; Buffer.Append (Block (Block'First .. Last)); end loop; end Read; procedure Query (Object : in Atom_Reader; Process : not null access procedure (Data : in Atom)) is Buffer : Atom_Access := null; Last : Count; begin Buffer := new Atom (1 .. Object.Length); Stream_IO.Set_Index (Object.File, 1); Stream_IO.Read (Object.File, Buffer.all, Last); pragma Assert (Last = Buffer'Last); Process (Buffer.all); Unchecked_Deallocation (Buffer); exception when others => Unchecked_Deallocation (Buffer); raise; end Query; procedure Block_Query (Object : in Atom_Reader; Block_Size : in Count; Process : not null access procedure (Block : in Atom)) is Block : Atom (1 .. Block_Size); Last : Count; begin Stream_IO.Set_Index (Object.File, 1); loop Stream_IO.Read (Object.File, Block, Last); exit when Last not in Block'Range; Process.all (Block (Block'First .. Last)); end loop; end Block_Query; overriding procedure Finalize (Object : in out Atom_Reader) is begin if Stream_IO.Is_Open (Object.File) then Stream_IO.Close (Object.File); end if; end Finalize; end Natools.S_Expressions.File_Readers; |
Added src/natools-s_expressions-file_readers.ads version [412fa61073].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | ------------------------------------------------------------------------------ -- Copyright (c) 2014, Natacha Porté -- -- -- -- Permission to use, copy, modify, and distribute this software for any -- -- purpose with or without fee is hereby granted, provided that the above -- -- copyright notice and this permission notice appear in all copies. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -- -- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -- -- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -- -- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -- -- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -- -- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -- -- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Natools.S_Expressions.File_Readers provides types that read into files -- -- on disk (using Stream_IO) and expose their data as S-expressions or as -- -- atoms. -- ------------------------------------------------------------------------------ with Natools.S_Expressions.Atom_Buffers; with Natools.S_Expressions.Lockable; private with Ada.Finalization; private with Ada.Streams.Stream_IO; private with Natools.S_Expressions.Parsers; package Natools.S_Expressions.File_Readers is type S_Reader is limited new Lockable.Descriptor with private; -- Make a disk file available as a S-expression function Reader (Name : String) return S_Reader; -- Create a S_Reader associated with file Name procedure Set_Filename (Object : in out S_Reader; Name : in String); -- Reset Object with the new file Name procedure Rewind (Object : in out S_Reader); -- Return to the beginning of the file type Atom_Reader is tagged limited private; -- Make a disk file available as a single atom function Reader (Name : String) return Atom_Reader; -- Create an Atom_Reader associated with file Name; procedure Set_Filename (Object : in out Atom_Reader; Name : in String); -- Reset Object with the new file Name function Length (Object : Atom_Reader) return Count; -- Return the file length function Read (Object : Atom_Reader) return Atom; -- Read the whole file and return it as a single atom procedure Read (Object : in Atom_Reader; Data : out Atom; Length : out Count); -- Read the whole file and store it in Data, along with its Length. -- If Data is too small, only the file prefix is read. procedure Read (Object : in Atom_Reader; Buffer : out Atom_Buffers.Atom_Buffer; Block_Size : in Count := 1024); -- Read the whole file into Buffer generic type Atom_Access is access Atom; with procedure Unchecked_Deallocation (X : in out Atom_Access); procedure Query (Object : in Atom_Reader; Process : not null access procedure (Data : in Atom)); -- Read the whole file into a memory zone allocated through Atom_Access, -- and call Process on it. procedure Block_Query (Object : in Atom_Reader; Block_Size : in Count; Process : not null access procedure (Block : in Atom)); -- Read file block by block, and call Process on each of them private type Autoclose is new Ada.Finalization.Limited_Controlled with record File : Ada.Streams.Stream_IO.File_Type; end record; overriding procedure Finalize (Object : in out Autoclose); -- Close the underlying file if it was opened. -- Used because a compiler bug in GNAT prevents adding -- Ada.Finalization.Limited_Controlled as an ancestor of Parser, -- so close-on-finalization has to be provided through composition. type S_Reader is limited new Parsers.Parser with record Holder : Autoclose; end record; overriding procedure Read_More (Object : in out S_Reader; Buffer : out Atom_Buffers.Atom_Buffer); type Atom_Reader is new Ada.Finalization.Limited_Controlled with record File : Ada.Streams.Stream_IO.File_Type; end record; overriding procedure Finalize (Object : in out Atom_Reader); end Natools.S_Expressions.File_Readers; |