mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-09 14:08:05 +02:00
* Add SplitCommandLine
git-svn-id: trunk@42269 -
This commit is contained in:
parent
fb387da807
commit
bf54543518
@ -266,6 +266,15 @@ Function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceF
|
||||
Function StringReplace(const S, OldPattern, NewPattern: unicodestring; Flags: TReplaceFlags): unicodestring; overload;
|
||||
Function StringReplace(const S, OldPattern, NewPattern: widestring; Flags: TReplaceFlags): widestring; overload;
|
||||
|
||||
|
||||
Type
|
||||
TRawByteStringArray = Array of RawByteString;
|
||||
TUnicodeStringArray = Array of UnicodeString;
|
||||
|
||||
Function SplitCommandLine(S : RawByteString) : TRawByteStringArray;
|
||||
Function SplitCommandLine(S : UnicodeString) : TUnicodeStringArray;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
(*
|
||||
@ -3271,4 +3280,148 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Function SplitCommandLine(S : RawByteString) : TRawByteStringArray;
|
||||
|
||||
Function GetNextWord : RawByteString;
|
||||
|
||||
Const
|
||||
WhiteSpace = [' ',#9,#10,#13];
|
||||
Literals = ['"',''''];
|
||||
|
||||
Var
|
||||
Wstart,wend : Integer;
|
||||
InLiteral : Boolean;
|
||||
LastLiteral : AnsiChar;
|
||||
|
||||
Procedure AppendToResult;
|
||||
|
||||
begin
|
||||
Result:=Result+Copy(S,WStart,WEnd-WStart);
|
||||
WStart:=Wend+1;
|
||||
end;
|
||||
|
||||
begin
|
||||
Result:='';
|
||||
WStart:=1;
|
||||
While (WStart<=Length(S)) and charinset(S[WStart],WhiteSpace) do
|
||||
Inc(WStart);
|
||||
WEnd:=WStart;
|
||||
InLiteral:=False;
|
||||
LastLiteral:=#0;
|
||||
While (Wend<=Length(S)) and (Not charinset(S[Wend],WhiteSpace) or InLiteral) do
|
||||
begin
|
||||
if charinset(S[Wend],Literals) then
|
||||
If InLiteral then
|
||||
begin
|
||||
InLiteral:=Not (S[Wend]=LastLiteral);
|
||||
if not InLiteral then
|
||||
AppendToResult;
|
||||
end
|
||||
else
|
||||
begin
|
||||
InLiteral:=True;
|
||||
LastLiteral:=S[Wend];
|
||||
AppendToResult;
|
||||
end;
|
||||
inc(wend);
|
||||
end;
|
||||
AppendToResult;
|
||||
While (WEnd<=Length(S)) and (S[Wend] in WhiteSpace) do
|
||||
inc(Wend);
|
||||
Delete(S,1,WEnd-1);
|
||||
end;
|
||||
|
||||
Var
|
||||
W : RawByteString;
|
||||
len : Integer;
|
||||
|
||||
begin
|
||||
Len:=0;
|
||||
Result:=Default(TRawByteStringArray);
|
||||
SetLength(Result,(Length(S) div 2)+1);
|
||||
While Length(S)>0 do
|
||||
begin
|
||||
W:=GetNextWord;
|
||||
If (W<>'') then
|
||||
begin
|
||||
Result[Len]:=W;
|
||||
Inc(Len);
|
||||
end;
|
||||
end;
|
||||
SetLength(Result,Len);
|
||||
end;
|
||||
|
||||
|
||||
Function SplitCommandLine(S : UnicodeString) : TUnicodeStringArray;
|
||||
|
||||
Function GetNextWord : UnicodeString;
|
||||
|
||||
Const
|
||||
WhiteSpace = [' ',#9,#10,#13];
|
||||
Literals = ['"',''''];
|
||||
|
||||
Var
|
||||
Wstart,wend : Integer;
|
||||
InLiteral : Boolean;
|
||||
LastLiteral : AnsiChar;
|
||||
|
||||
Procedure AppendToResult;
|
||||
|
||||
begin
|
||||
Result:=Result+Copy(S,WStart,WEnd-WStart);
|
||||
WStart:=Wend+1;
|
||||
end;
|
||||
|
||||
begin
|
||||
Result:='';
|
||||
WStart:=1;
|
||||
While (WStart<=Length(S)) and charinset(S[WStart],WhiteSpace) do
|
||||
Inc(WStart);
|
||||
WEnd:=WStart;
|
||||
InLiteral:=False;
|
||||
LastLiteral:=#0;
|
||||
While (Wend<=Length(S)) and (Not charinset(S[Wend],WhiteSpace) or InLiteral) do
|
||||
begin
|
||||
if charinset(S[Wend],Literals) then
|
||||
If InLiteral then
|
||||
begin
|
||||
InLiteral:=Not (S[Wend]=LastLiteral);
|
||||
if not InLiteral then
|
||||
AppendToResult;
|
||||
end
|
||||
else
|
||||
begin
|
||||
InLiteral:=True;
|
||||
LastLiteral:=S[Wend];
|
||||
AppendToResult;
|
||||
end;
|
||||
inc(wend);
|
||||
end;
|
||||
AppendToResult;
|
||||
While (WEnd<=Length(S)) and (S[Wend] in WhiteSpace) do
|
||||
inc(Wend);
|
||||
Delete(S,1,WEnd-1);
|
||||
end;
|
||||
|
||||
Var
|
||||
W : UnicodeString;
|
||||
len : Integer;
|
||||
|
||||
begin
|
||||
Len:=0;
|
||||
Result:=Default(TUnicodeStringArray);
|
||||
SetLength(Result,(Length(S) div 2)+1);
|
||||
While Length(S)>0 do
|
||||
begin
|
||||
W:=GetNextWord;
|
||||
If (W<>'') then
|
||||
begin
|
||||
Result[Len]:=W;
|
||||
Inc(Len);
|
||||
end;
|
||||
end;
|
||||
SetLength(Result,Len);
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user