123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2021 by Michael Van Canneyt,
- member of the Free Pascal development team
- Demo program for Base16,Base32,Base32-hex,Base32-crockford, Base64,Base64url encoding/decoding
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- program demobasenenc;
- {$mode objfpc}
- {$h+}
- uses sysutils, basenenc, typinfo, custapp, Classes;
- Type
- { TDemoApp }
- TDemoApp = Class(TCustomApplication)
- private
- FEncoder : TStandardEncoder;
- FPadding,
- FDoDecode : Boolean;
- procedure ParseOptions;
- procedure Usage(aError: String);
- Protected
- Procedure DoRun; override;
- end;
- { TDemoApp }
- procedure TDemoApp.Usage(aError : String);
- Var
- Enc : TStandardEncoder;
- begin
- if (aError<>'') then
- Writeln('Error : ',aError);
- Writeln('Usage ', ExtractFileName(Self.ExeName),' [options]');
- Writeln('Where options is one or more of');
- Writeln('-h --help This message');
- Writeln('-e --encode=ENC Encode input to output using algorithm ENC, one of');
- For Enc in TStandardEncoder do
- Writeln(' ',Copy(GetEnumName(TypeInfo(TStandardEncoder),Ord(Enc)),3,MaxInt));
- Writeln('-d --decode=ENC Encode input to output using algorithm ENC, one of the above');
- Writeln('-i --input=FileName Set input filename. Required.');
- Writeln('-o --output=FileName Set input filename. Required.');
- Writeln('-p --pad Use Padding when encoding.');
- ExitCode:=Ord(aError<>'');
- end;
- procedure TDemoApp.ParseOptions;
- Var
- S : String;
- I : Integer;
- begin
- FDoDecode:=False;
- S:=CheckOptions('hi:o:e:p',['help','input:','output:','encode:','decode:','pad']);
- if Not (HasOption('i','input') and HasOption('o','output')) then
- S:='Input and output filename are required';
- if (S<>'') or HasOption('h','help') then
- begin
- Usage(S);
- Exit;
- end;
- FPadding:=HasOption('p','pad');
- S:=GetOptionValue('e','encode');
- if S='' then
- begin
- S:=GetOptionValue('d','decode');
- if S<>'' then
- FDoDecode:=True;
- end;
- if (S='') then
- S:='base64';
- i:=GetEnumValue(TypeInfo(TStandardEncoder),S);
- if I=-1 then
- i:=GetEnumValue(TypeInfo(TStandardEncoder),'se'+S);
- if I=-1 then
- begin
- Usage('Not a valid algorithm: '+s);
- Exit;
- end;
- FEncoder:=TStandardEncoder(I);
- end;
- procedure TDemoApp.DoRun;
- Var
- B,Res : TBytes;
- F : TFileStream;
- Coder : TAlphabetEncoder;
- begin
- B:=[];
- Terminate;
- Parseoptions;
- if ExitCode<>0 then
- exit;
- F:=TFileStream.Create(GetOptionValue('i','input'),fmOpenRead or fmShareDenyWrite);
- try
- SetLength(B,F.Size);
- F.ReadBuffer(B,F.Size);
- finally
- F.Free;
- end;
- Coder:=GetStandardEncoder(FEncoder);
- if FDoDecode then
- Res:=Coder.Decode(PByte(B),Length(B))
- else
- Res:=TEncoding.UTF8.GetAnsiBytes(Coder.Encode(PByte(B),Length(B),FPadding));
- F:=TFileStream.Create(GetOptionValue('o','output'),fmCreate);
- try
- F.WriteBuffer(Res,Length(Res))
- finally
- F.Free;
- end;
- end;
- begin
- CustomApplication:=TDemoApp.Create(Nil);
- CustomApplication.Initialize;
- CustomApplication.Run;
- CustomApplication.Free;
- end.
|