Skip to content

Commit 6237f31

Browse files
authored
Merge pull request #52 from Embarcadero/readln
Including ReadLine support
2 parents a69bcfd + 0ddf830 commit 6237f31

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/Tools/ExecCmd/PyTools.ExecCmd.pas

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ interface
7676

7777
function ReadNext(const AEncoding: TEncoding): string; overload;
7878
function ReadNext: string; overload;
79+
function ReadNextLine(const AEncoding: TEncoding): string; overload;
80+
function ReadNextLine(): string; overload;
7981
function ReadAll(const AEncoding: TEncoding): string; overload;
8082
function ReadAll(): string; overload;
8183
function ReadAll(out AValue: string; const ATimeout: cardinal; const AEncoding: TEncoding): boolean; overload;

src/Tools/ExecCmd/StdIO/PyTools.ExecCmd.StdIO.pas

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ TStdBase = class(TInterfacedObject)
4040
TStdReader = class(TStdBase, IStdReader)
4141
protected
4242
InternalBuffer: TBytes;
43+
FLinesBuffer: string;
4344
protected
4445
function PullMessage(out AByteCount: integer): PBytes; virtual;
4546
function IsAlive: boolean; virtual; abstract;
@@ -52,6 +53,8 @@ TStdReader = class(TStdBase, IStdReader)
5253

5354
function ReadNext(const AEncoding: TEncoding): string; overload;
5455
function ReadNext(): string; overload;
56+
function ReadNextLine(const AEncoding: TEncoding): string; overload;
57+
function ReadNextLine(): string; overload;
5558
function ReadAll(const AEncoding: TEncoding): string; overload;
5659
function ReadAll(): string; overload;
5760
function ReadAll(out AValue: string; const ATimeout: cardinal; const AEncoding: TEncoding): boolean; overload;
@@ -207,6 +210,28 @@ function TStdReader.ReadNext: string;
207210
Result := ReadNext(GetEncoding());
208211
end;
209212

213+
function TStdReader.ReadNextLine(const AEncoding: TEncoding): string;
214+
begin
215+
FLinesBuffer := FLinesBuffer + ReadNext(AEncoding);
216+
217+
if FLinesBuffer.IsEmpty() then
218+
Exit(String.Empty);
219+
220+
var LLineEnd := FLinesBuffer.IndexOf(sLineBreak);
221+
if LLineEnd > -1 then begin
222+
LLineEnd := LLineEnd + Length(sLineBreak);
223+
224+
Result := FLinesBuffer.Substring(0, LLineEnd);
225+
FLinesBuffer := FLinesBuffer.Remove(0, LLineEnd);
226+
end else
227+
Result := String.Empty;
228+
end;
229+
230+
function TStdReader.ReadNextLine: string;
231+
begin
232+
Result := ReadNextLine(GetEncoding());
233+
end;
234+
210235
function TStdReader.ReadAll(out AValue: string;
211236
const ATimeout: cardinal; const AEncoding: TEncoding): boolean;
212237
var

0 commit comments

Comments
 (0)