anchor.diff:    function listAsteriskPath(const aPath: string; aList: TStrings; someExts: TStrings = nil): boolean;
   
     (**
  -   * Lets the shell open a file
  +   * Lets the shell open a file.
      *)
     function shellOpen(const aFilename: string): boolean;
   
  
positive.code:   end;
  end;
  
  procedure processOutputToStrings(aProcess: TProcess; var aList: TStringList);
  var
    str: TMemoryStream;
    sum: Integer;
    cnt: Integer;
    buffSz: Integer;
  begin
    if not (poUsePipes in aProcess.Options) then
      exit;
    //
    // note: aList.LoadFromStream() does not work, lines can be split, which breaks message parsing (e.g filename detector).
    //
    sum := 0;
    str := TMemoryStream.Create;
    try
      buffSz := aProcess.PipeBufferSize;
      // temp fix: messages are cut if the TAsyncProcess version is used on simple TProcess.
      if aProcess is TAsyncProcess then begin
        while aProcess.Output.NumBytesAvailable <> 0 do begin
          str.SetSize(sum + buffSz);
          cnt := aProcess.Output.Read((str.Memory + sum)^, buffSz);
          sum += cnt;
        end;
      end else begin
        repeat
          str.SetSize(sum + buffSz);
          cnt := aProcess.Output.Read((str.Memory + sum)^, buffSz);
          sum += cnt;
        until
          cnt = 0;
      end;
      str.Size := sum;
      aList.LoadFromStream(str);
    finally
      str.Free;
    end;
  end;
  
  procedure processOutputToStream(aProcess: TProcess; output: TMemoryStream);
  var
    sum, cnt: Integer;
  const
    buffSz = 2048;
  begin
    if not (poUsePipes in aProcess.Options) then
      exit;
    //
    sum := output.Size;
    while aProcess.Output.NumBytesAvailable <> 0 do begin
      output.SetSize(sum + buffSz);
      cnt := aProcess.Output.Read((output.Memory + sum)^, buffSz);
      sum += cnt;
    end;
    output.SetSize(sum);
    output.Position := sum;
  end;
  
  procedure killProcess(var aProcess: TAsyncProcess);
  
negative.code:   function exeInSysPath(anExeName: string): boolean;
  
    (**
     * Returns the full path to anExeName. Works if exeInSysPath() returns true.
     *)
    function exeFullName(anExeName: string): string;
  
    (**
     * Clears then fills aList with aProcess output stream.
     *)
    procedure processOutputToStrings(proc: TProcess; strings: TStrings);
  
    (**
     * Copies process output to stream. Existing stream content is not cleared.
     *)
    procedure processOutputToStream(proc: TProcess; stream: TMemoryStream);
  
    (**
     * Terminates and frees aProcess.
  