mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-16 03:10:42 +01:00
* patch by Sergei Gorelkin improving win32 command line handling, resolves #10175
git-svn-id: trunk@11640 -
This commit is contained in:
parent
77f5cefb71
commit
93d86a60e4
@ -140,24 +140,15 @@ function SysReAllocStringLen(var bstr:pointer;psz: pointer;
|
||||
Parameter Handling
|
||||
*****************************************************************************}
|
||||
|
||||
var
|
||||
ModuleName : array[0..255] of char;
|
||||
|
||||
function GetCommandFile:pchar;
|
||||
begin
|
||||
GetModuleFileName(0,@ModuleName,255);
|
||||
GetCommandFile:=@ModuleName;
|
||||
end;
|
||||
|
||||
|
||||
procedure setup_arguments;
|
||||
var
|
||||
arglen,
|
||||
count : longint;
|
||||
argstart,
|
||||
pc,arg : pchar;
|
||||
quote : char;
|
||||
quote : Boolean;
|
||||
argvlen : longint;
|
||||
buf: array[0..259] of char; // need MAX_PATH bytes, not 256!
|
||||
|
||||
procedure allocarg(idx,len:longint);
|
||||
var
|
||||
@ -183,13 +174,10 @@ begin
|
||||
count:=0;
|
||||
argv:=nil;
|
||||
argvlen:=0;
|
||||
pc:=getcommandfile;
|
||||
Arglen:=0;
|
||||
repeat
|
||||
Inc(Arglen);
|
||||
until (pc[Arglen]=#0);
|
||||
allocarg(count,arglen);
|
||||
move(pc^,argv[count]^,arglen+1);
|
||||
ArgLen := GetModuleFileName(0, @buf[0], sizeof(buf));
|
||||
buf[ArgLen] := #0; // be safe
|
||||
allocarg(0,arglen);
|
||||
move(buf,argv[0]^,arglen+1);
|
||||
{ Setup cmdline variable }
|
||||
cmdline:=GetCommandLine;
|
||||
{ process arguments }
|
||||
@ -205,7 +193,7 @@ begin
|
||||
if pc^=#0 then
|
||||
break;
|
||||
{ calc argument length }
|
||||
quote:=' ';
|
||||
quote:=False;
|
||||
argstart:=pc;
|
||||
arglen:=0;
|
||||
while (pc^<>#0) do
|
||||
@ -213,20 +201,15 @@ begin
|
||||
case pc^ of
|
||||
#1..#32 :
|
||||
begin
|
||||
if quote<>' ' then
|
||||
if quote then
|
||||
inc(arglen)
|
||||
else
|
||||
break;
|
||||
end;
|
||||
'"' :
|
||||
if pchar(pc+1)^<>'"' then
|
||||
begin
|
||||
if quote='"' then
|
||||
quote:=' '
|
||||
if pc[1]<>'"' then
|
||||
quote := not quote
|
||||
else
|
||||
quote:='"';
|
||||
end
|
||||
else
|
||||
inc(pc);
|
||||
else
|
||||
inc(arglen);
|
||||
@ -238,7 +221,7 @@ begin
|
||||
If Count<>0 then
|
||||
begin
|
||||
allocarg(count,arglen);
|
||||
quote:=' ';
|
||||
quote:=False;
|
||||
pc:=argstart;
|
||||
arg:=argv[count];
|
||||
while (pc^<>#0) do
|
||||
@ -246,7 +229,7 @@ begin
|
||||
case pc^ of
|
||||
#1..#32 :
|
||||
begin
|
||||
if quote<>' ' then
|
||||
if quote then
|
||||
begin
|
||||
arg^:=pc^;
|
||||
inc(arg);
|
||||
@ -255,14 +238,9 @@ begin
|
||||
break;
|
||||
end;
|
||||
'"' :
|
||||
if pchar(pc+1)^<>'"' then
|
||||
begin
|
||||
if quote='"' then
|
||||
quote:=' '
|
||||
if pc[1]<>'"' then
|
||||
quote := not quote
|
||||
else
|
||||
quote:='"';
|
||||
end
|
||||
else
|
||||
inc(pc);
|
||||
else
|
||||
begin
|
||||
@ -279,11 +257,11 @@ begin
|
||||
{$EndIf SYSTEM_DEBUG_STARTUP}
|
||||
inc(count);
|
||||
end;
|
||||
{ get argc and create an nil entry }
|
||||
{ get argc }
|
||||
argc:=count;
|
||||
allocarg(argc,0);
|
||||
{ free unused memory }
|
||||
sysreallocmem(argv,(argc+1)*sizeof(pointer));
|
||||
{ free unused memory, leaving a nil entry at the end }
|
||||
sysreallocmem(argv,(count+1)*sizeof(pointer));
|
||||
argv[count] := nil;
|
||||
end;
|
||||
|
||||
|
||||
@ -1188,7 +1166,7 @@ begin
|
||||
{ some misc Win32 stuff }
|
||||
hprevinst:=0;
|
||||
if not IsLibrary then
|
||||
SysInstance:=getmodulehandle(GetCommandFile);
|
||||
SysInstance:=getmodulehandle(nil);
|
||||
|
||||
MainInstance:=SysInstance;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user