doublecmd/src/ucmdlineparams.pas
2021-08-27 22:04:48 +03:00

150 lines
3.8 KiB
ObjectPascal

unit uCmdLineParams;
{$mode objfpc}{$H+}
interface
type
TCommandLineParams = packed record
NewTab: Boolean;
NoSplash: Boolean;
ActivePanelSpecified: Boolean;
ActiveRight: Boolean;
LeftPath: array[0..1023] of AnsiChar;
RightPath: array[0..1023] of AnsiChar;
ActivePanelPath: array[0..1023] of AnsiChar;
Client: Boolean;
Servername: array[0..1023] of AnsiChar;
end;
procedure ProcessCommandLineParams;
var
CommandLineParams: TCommandLineParams;
implementation
uses
Forms, Dialogs, SysUtils, uOSUtils, uDCUtils, uGlobsPaths, getopts, uDebug,
uLng, uClipboard, DCStrUtils;
function DecodePath(const Path: String): String;
begin
Result := TrimQuotes(Path);
if Pos(fileScheme, Result) = 1 then
begin
Result:= URIDecode(Copy(Result, 8, MaxInt));
end;
Result:= GetAbsoluteFileName(IncludeTrailingBackslash(GetCurrentDir), Result);
end;
procedure ProcessCommandLineParams;
var
Option: AnsiChar = #0;
OptionIndex: LongInt = 0;
Options: array[1..5] of TOption;
OptionUnknown: String;
begin
FillChar(Options, SizeOf(Options), #0);
with Options[1] do
begin
Name:= 'debug-log';
Has_arg:= 1;
end;
with Options[2] do
begin
Name:= 'config-dir';
Has_arg:= 1;
end;
with Options[3] do
begin
Name:= 'client';
end;
with Options[4] do
begin
Name:= 'servername';
Has_arg:= 1;
end;
with Options[5] do
begin
Name:= 'no-splash';
end;
FillChar(CommandLineParams, SizeOf(TCommandLineParams), #0);
repeat
try
Option:= GetLongOpts('L:l:R:r:P:p:TtCc', @Options[1], OptionIndex);
except
MessageDlg(Application.Title, rsMsgInvalidCommandLine, mtError, [mbOK], 0, mbOK);
Exit;
end;
case Option of
#0:
begin
case OptionIndex of
1:
begin
// Used by LazLogger
end;
2:
begin
gpCmdLineCfgDir:= ParamStrU(TrimQuotes(OptArg));
end;
3:
begin
CommandLineParams.Client:= True;
CommandLineParams.NoSplash:= True;
end;
4:
begin
CommandLineParams.Servername:= ParamStrU(TrimQuotes(OptArg));
end;
5:
begin
CommandLineParams.NoSplash:= True;
end;
end;
end;
'L', 'l': CommandLineParams.LeftPath:= DecodePath(ParamStrU(OptArg));
'R', 'r': CommandLineParams.RightPath:= DecodePath(ParamStrU(OptArg));
'P', 'p': begin
CommandLineParams.ActivePanelSpecified:= True;
CommandLineParams.ActiveRight:= (UpperCase(OptArg) = 'R');
end;
'T', 't': CommandLineParams.NewTab:= True;
'C', 'c': begin
CommandLineParams.Client:= True;
CommandLineParams.NoSplash:= True;
end;
'?', ':': DCDebug ('Error with opt : ', OptOpt);
end; { case }
until Option = EndOfOptions;
if OptInd <= ParamCount then
begin
// If also found one parameter then use it as path of active panel
if ParamCount - OptInd = 0 then
begin
CommandLineParams.ActivePanelPath:= DecodePath(ParamStrU(OptInd));
Inc(OptInd, 1);
end
// If also found two parameters then use it as paths in panels
else if ParamCount - OptInd = 1 then
begin
CommandLineParams.LeftPath:= DecodePath(ParamStrU(OptInd));
CommandLineParams.RightPath:= DecodePath(ParamStrU(OptInd + 1));
Inc(OptInd, 2);
end;
// Unknown options, print to console
if OptInd <= ParamCount then
begin
while OptInd <= ParamCount do
begin
OptionUnknown:= ParamStrU(OptInd) + ' ';
Inc(OptInd)
end;
DCDebug ('Non options : ', OptionUnknown);
end;
end;
end;
end.