Files
gnatcoll-core/examples/coders/base64_coder.adb
Vasiliy Fofanov 4debbaadb6 Clean up examples directory and relocate coders example.
Change-Id: Icbe23591d0364681549b8594ec456c0148be24e1
2019-11-21 00:11:59 +01:00

134 lines
5.1 KiB
Ada

------------------------------------------------------------------------------
-- --
-- G N A T C O L L E X A M P L E S --
-- --
-- Copyright (C) 2019, AdaCore --
-- --
-- This is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 3, or (at your option) any later --
-- version. This library is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
------------------------------------------------------------------------------
-- This example encodes/decodes to/from base64 from standard input to
-- standard output.
with Ada.Streams; use Ada.Streams;
with Ada.Command_Line; use Ada.Command_Line;
with Ada.Text_IO.Text_Streams; use Ada.Text_IO;
with GNATCOLL.Coders.Streams; use GNATCOLL.Coders;
with GNATCOLL.Coders.Base64;
procedure Base64_Coder is
Stream : aliased Streams.Stream_Type;
Encoder : aliased Base64.Encoder_Type;
Decoder : aliased Base64.Decoder_Type;
Buffer : Stream_Element_Array (1 .. 1024);
Last : Stream_Element_Offset;
Action : constant String := (if Argument_Count = 0 then ""
else Argument (1));
Back_Input : access Root_Stream_Type'Class;
Back_Output : access Root_Stream_Type'Class;
Input : access Root_Stream_Type'Class;
Output : access Root_Stream_Type'Class;
Read_Coder : access Coder_Interface'Class;
Write_Coder : access Coder_Interface'Class;
Input_File : File_Type;
Input_Stream : access Root_Stream_Type'Class;
begin
Encoder.Initialize (Wrap => 76);
Decoder.Initialize;
if Argument_Count > 1 then
Open (Input_File, In_File, Argument (2));
Input_Stream := Text_Streams.Stream (Input_File);
else
Input_Stream := Text_Streams.Stream (Current_Input);
end if;
if Action = "" then
-- Encode, decode back, and print to output
Back_Input := Input_Stream;
Back_Output := Text_Streams.Stream (Current_Output);
Input := Stream'Access;
Output := Stream'Access;
Read_Coder := Encoder'Unchecked_Access;
Write_Coder := Decoder'Unchecked_Access;
elsif Action = "-" then
-- Decode, encode, and print to output
Back_Input := Input_Stream;
Back_Output := Text_Streams.Stream (Current_Output);
Input := Stream'Access;
Output := Stream'Access;
Read_Coder := Decoder'Unchecked_Access;
Write_Coder := Encoder'Unchecked_Access;
elsif Action = "er" then
-- Encode over read from stream
Back_Input := Input_Stream;
Input := Stream'Access;
Output := Text_Streams.Stream (Current_Output);
Read_Coder := Encoder'Unchecked_Access;
elsif Action = "dr" then
-- Decode over read from stream
Back_Input := Input_Stream;
Input := Stream'Access;
Output := Text_Streams.Stream (Current_Output);
Read_Coder := Decoder'Unchecked_Access;
elsif Action = "ew" then
-- Encode over write to stream
Back_Output := Text_Streams.Stream (Current_Output);
Output := Stream'Access;
Input := Input_Stream;
Write_Coder := Encoder'Unchecked_Access;
elsif Action = "dw" then
-- Decode over write to stream
Back_Output := Text_Streams.Stream (Current_Output);
Output := Stream'Access;
Input := Input_Stream;
Write_Coder := Decoder'Unchecked_Access;
end if;
Stream.Initialize
(Read_Coder => Read_Coder,
Read_From => Back_Input,
Write_Coder => Write_Coder,
Write_To => Back_Output,
Read_Ends_By => Streams.Partial_Read);
loop
Input.Read (Buffer, Last);
Output.Write (Buffer (1 .. Last));
exit when Last < Buffer'Last;
end loop;
if Output = Stream'Access then
Stream.Flush (Finish);
end if;
end Base64_Coder;