mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
150 lines
3.8 KiB
ObjectPascal
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.
|