亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? searchfile.pas

?? Delphi編寫的一個(gè)支持語法高亮顯示和很多語言的文本編輯器
?? PAS
?? 第 1 頁 / 共 2 頁
字號(hào):
{***************************************************************
 *
 * Unit Name   : GrepResultsDlg
 * Purpose     : Grep Search Result Dialog
 * Copyright   : This Source Code is taken from GExperts, the excellent
 * 			     Delphi/C++Builder add-on available from GExperts.org.
 *				 Please see the file gexpertslicense.html for the license.
 *				 Any modifications from the original are copyright Echo
 *				 Software.
 ****************************************************************}

unit SearchFile;

//! StH: This unit has been completely prepared for localization
//! StH: This unit is fully compatible with C++Builder

interface

{$IFDEF VER125}
  {$D-}  //! StH: This works around a bug in C++Builder 4.0
{$ENDIF VER125}

{$IFDEF VER110}
  {$D-} //! StH: Work around a compiler bug in C++Builder 3.0
{$ENDIF VER110}

uses
  Windows, SysUtils, Classes, Dialogs;

type

  TSearchOption = (soCaseSensitive, soWholeWord, soRegEx);

  TSearchOptions = set of TSearchOption;

  TFoundEvent = procedure(Sender: TObject; LineNo: Integer; Line: string; SPos, FEditReaderPos: Integer) of object;

  TSearcher = class(TObject)
  private
    FSearchStream: TStream;
    FEof: Boolean;
    FSearchBuffer: PChar;
    BLine: PChar; //? What is that
    FBufferSearchPos: Integer;
    FBufferDataCount: Integer;
    FLineNo: Integer;
    FBufSize: Integer;
    FFileName: string;
    FNoComments: Boolean;
    FCurlyCommentActive: Boolean;
    FStarCommentActive: Boolean;
    FOnFound: TFoundEvent;
    FOnStartSearch: TNotifyEvent;
    FPattern: PChar;
    FSearchOptions: TSearchOptions;
    LoCase: function(const Ch: Char): Char;
    procedure Reset;
    procedure FillBuffer;
    //function GetLineCount: Integer;
    procedure SetBufSize(New: Integer);
    procedure PatternMatch;
    function GetANSICompatible: Boolean;
    procedure SetANSICompatible(const Value: Boolean);
  protected
    procedure SetFileName(const Value: string);
    procedure SearchForm;
    procedure FreeObjects;
    procedure DoSearch;
  public
    constructor Create(const SearchFileName: string);
    destructor Destroy; override;
    procedure Execute;
    procedure SetPattern(const Source: string);
    property Pattern: PChar read FPattern;
  published
    property BufSize: Integer read FBufSize write SetBufSize;
    property SearchOptions: TSearchOptions read FSearchOptions write FSearchOptions;
    property FileName: string read FFileName write SetFileName;
    property NoComments: Boolean read FNoComments write FNoComments;
    property ANSICompatible: Boolean read GetANSICompatible write SetANSICompatible;
    property OnFound: TFoundEvent read FOnFound write FOnFound;
    property OnStartSearch: TNotifyEvent read FOnStartSearch write FOnStartSearch;
  end;

const
  opCHAR = 1;
  opBOL = 2;
  opEOL = 3;
  opANY = 4;
  opCLASS = 5;
  opNCLASS = 6;
  opSTAR = 7;
  opPLUS = 8;
  opMINUS = 9;
  opALPHA = 10;
  opDIGIT = 11;
  opNALPHA = 12;
  opPUNCT = 13;
  opRANGE = 14;
  opENDPAT = 15;

  LastPatternChar = Char(opENDPAT);

implementation


const
  GrepPatternSize = 512;

//! StH: Optimize this, perhaps some BASM
(*
function ANSILoCase(const Ch: Char): Char;
var
  ConversionChar: PChar;
begin
  ConversionChar := PChar(MakeLong(Ord(Ch), 0));
  CharLower(ConversionChar);
  Result := Chr(LoWord(ConversionChar));
end;
*)

function ANSILoCase(const Ch: Char): Char;
var
  w: Word;
begin
  w := MakeWord(Ord(Ch), 0);
  CharLower(PChar(@w));
  Result := Char(Lo(w));
end;

function ASCIILoCase(const Ch: Char): Char;
begin
  if Ch in ['A'..'Z'] then
    Result := Char(Ord(Ch) + 32)
  else
    Result := Ch;
end;

constructor TSearcher.Create(const SearchFileName: string);
begin
  inherited Create;

  FBufSize := 2048;
  FSearchStream := TMemoryStream.Create;
{
  // everything is automatically initialized to
  // these values
  FEof := False;
  FLineNo := 0;
  FNoComments := False;
  FCurlyCommentActive := False;
  FStarCommentActive := False;
  FBufferSearchPos := 0;
  FBufferDataCount := 0;
  FSearchBuffer := nil;
  FName := '';
}
  BLine := StrAlloc(1024);
  FPattern := StrAlloc(GrepPatternSize);
  if SearchFileName <> '' then
    SetFileName(SearchFileName);
  LoCase := ASCIILoCase;
end;

destructor TSearcher.Destroy;
begin
  FSearchStream.Free;
  FSearchStream := nil;

  StrDispose(FSearchBuffer);
  FSearchBuffer := nil;

  StrDispose(BLine);
  BLine := nil;

  StrDispose(FPattern);
  FPattern := nil;

  inherited Destroy;
end;

procedure TSearcher.SearchForm;
var
  FormStream: TStream;
  origFormat: TStreamOriginalFormat;
begin
    FreeObjects;
    if FileExists(FFileName) then
    begin
      FormStream := TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite);
      try
        FSearchStream := TMemoryStream.Create;
        ObjectResourceToText(FormStream, FSearchStream, origFormat);
      finally
        FormStream.Free;
      end;
    end;

    if FSearchStream <> nil then
    begin
      Reset;
      DoSearch;
    end;
end;

procedure TSearcher.FreeObjects;
begin
  if FFileName <> '' then
  begin
    FSearchStream.Free;
    FSearchStream := nil;
  end;
end;

procedure TSearcher.SetFileName(const Value: string);
begin
//  FreeObjects;
  FFileName := Value;
  if FFileName <> '' then
    Reset;
  TMemoryStream(FSearchStream).LoadFromFile(FFileName);
end;

function TSearcher.GetANSICompatible: Boolean;
begin
  if @LoCase = @ANSILoCase then
    Result := True
  else
    Result := False;
end;

procedure TSearcher.SetANSICompatible(const Value: Boolean);
begin
  if Value then
    LoCase := ANSILoCase
  else
    LoCase := ASCIILoCase;
end;

procedure TSearcher.Reset;
resourcestring
  SSearcherReset = 'Reset exception:'#13#10;
begin
    if FFileName = '' then
      Exit;

    FBufferSearchPos := 0;
    FBufferDataCount := 0;
    FLineNo := 0;
    FEof := False;
    FCurlyCommentActive := False;
    FStarCommentActive := False;
    FSearchStream.Position := 0;
end;

procedure TSearcher.FillBuffer;
var
  AmountOfBytesToRead: Integer;
  SkippedCharactersCount: Integer;
  LineEndScanner: PChar;
begin
  if FSearchBuffer = nil then
    FSearchBuffer := StrAlloc(FBufSize);
  FSearchBuffer[0] := #0;

  // Read at most (FBufSize - 1) bytes
  AmountOfBytesToRead := FBufSize - 1;

  FBufferDataCount := FSearchStream.Read(FSearchBuffer^, AmountOfBytesToRead);

  FEof := (FBufferDataCount = 0);

  // Reset buffer position to zero
  FBufferSearchPos := 0;

  // If we filled our buffer completely, there is a chance that
  // the last line was read only partially.
  // Since our search algorithm is line-based,
  // skip back to the end of the last completely read line.
  if FBufferDataCount = AmountOfBytesToRead then
  begin
    // Get pointer on last character of read data
    LineEndScanner := FSearchBuffer + FBufferDataCount - 1;
    // We have not skipped any characters yet
    SkippedCharactersCount := 0;
    // While we still have data in the buffer,
    // do scan for a line break as characterised
    // by a #13#10 or #10#13 or a single #10.
    // Which sequence exactly we hit is not important,
    // we just need to find and line terminating
    // sequence.
    while FBufferDataCount > 0 do
    begin
      if LineEndScanner^ = #10 then
      begin
        FSearchStream.Seek(-SkippedCharactersCount, soFromCurrent);

        // Done with finding last complete line
        Break;
      end;

      Inc(SkippedCharactersCount);
      Dec(FBufferDataCount);
      Dec(LineEndScanner);
    end;

    // With FBufferPos = 0 we have scanned back in our
    // buffer and not found any line break; this means
    // that we cannot employ our pattern matcher on a
    // complete line -> Internal Error.
    if FBufferDataCount = 0 then
    begin
      { TODO -oStefan -cIssue: Complete error handling for the case where
                               a single line exceeds FBufSize-1 characters }
      raise Exception.Create('Grep: Internal line length error.  Binary file?'); //! FIXME
    end;
  end;


  // Cut off everything beyond the line break
  // Assert(FBufferDataCount >= 0);
  FSearchBuffer[FBufferDataCount] := #0;
end;

procedure TSearcher.Execute;
var
  UpperFileExt: string;
begin
  UpperFileExt := UpperCase(ExtractFileExt(FFileName));

  if UpperFileExt = '.DFM' then
  begin
    SearchForm;
  end
  else DoSearch;
end;

procedure TSearcher.DoSearch;
var
  i: Integer;
  t: Integer;
  LPos: Integer;
  UseChar: Boolean;
begin
  if FFileName = '' then
    Exit;
  if Assigned(FOnStartSearch) then
    FOnStartSearch(Self);
  LPos := 0;
  while not FEof do
  begin
    { read new data in }
    if (FBufferSearchPos >= FBufferDataCount) or (FBufferDataCount = 0) then
      FillBuffer;
    if FEof then Exit;
    for i := FBufferSearchPos to FBufferDataCount - 1 do
    begin
      UseChar := False;
      case FSearchBuffer[i] of
        #0:
          begin
            FBufferSearchPos := FBufferDataCount + 1;
            Break;
          end;
        #10:
          begin
            FBufferSearchPos := i + 1;
            Break;
          end;
        #13:
          begin
            FBufferSearchPos := i + 1;
            if FSearchBuffer[FBufferSearchPos] = #10 then Inc(FBufferSearchPos);
            Break;
          end;
        // TODO -oStefan -cC++Builder: C(++) comments are a major problem here;
        '(':
          if FNoComments and not FCurlyCommentActive and (FSearchBuffer[i + 1] = '*') then
            FStarCommentActive := True
          else
            if not (FCurlyCommentActive or FStarCommentActive) then
              UseChar := True;
        ')':
          if (i > 1) and (FNoComments) and not FCurlyCommentActive and (FSearchBuffer[i - 1] = '*') then
            FStarCommentActive := False
          else
            if not (FCurlyCommentActive or FStarCommentActive) then
              UseChar := True;
        '/':
          if FNoComments then
          begin
            if not (FCurlyCommentActive or FStarCommentActive) then
              if FSearchBuffer[i + 1] = '/' then
              begin
                t := i;
                while (t <= FBufferDataCount - 1) and not (FSearchBuffer[t] in [#0, #13]) do
                  Inc(t);
                FBufferSearchPos := t + 1;
                if (t < FBufferDataCount - 1) and (FSearchBuffer[FBufferSearchPos] = #10) then

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费看欧美美女黄的网站| 国产精品911| 久久久不卡网国产精品一区| 99国产精品久| 久久成人免费电影| 夜夜嗨av一区二区三区| 国产夜色精品一区二区av| 91亚洲国产成人精品一区二区三| 久久99精品国产| 午夜国产精品影院在线观看| 中文字幕在线观看不卡| 精品免费国产二区三区| 欧美偷拍一区二区| 色综合中文综合网| 精品99久久久久久| 欧美日韩色综合| 色综合久久久久网| 国产91精品在线观看| 精品一区二区在线视频| 手机精品视频在线观看| 亚洲欧美日韩国产综合在线 | 国产日产亚洲精品系列| 日韩一区二区三区视频在线观看| 色综合激情久久| 成人av影院在线| 国产成人av一区二区三区在线 | 91网站黄www| 成人一级黄色片| 韩国精品一区二区| 国产综合色视频| 国产综合成人久久大片91| 成人av网站免费观看| 国产一区二区三区四区五区入口| 男人的天堂亚洲一区| 日韩精品高清不卡| 日本vs亚洲vs韩国一区三区二区 | 亚洲永久精品大片| 一区二区三区日韩欧美精品| 亚洲美女屁股眼交| 亚洲三级理论片| 一区二区欧美精品| 亚洲国产毛片aaaaa无费看| 一区二区三区在线观看欧美| 亚洲视频你懂的| 一区二区三区.www| 亚洲综合激情另类小说区| 亚洲自拍偷拍av| 日韩国产精品久久| 精品一区中文字幕| 成人性生交大片免费看视频在线 | 日韩一区中文字幕| 亚洲欧洲无码一区二区三区| 一区二区三区免费网站| 亚洲影院在线观看| 日本成人在线网站| 激情小说欧美图片| 国产+成+人+亚洲欧洲自线| 成人一二三区视频| 日本二三区不卡| 制服视频三区第一页精品| 精品免费国产二区三区| 欧美激情一区二区三区全黄| 成人免费小视频| 亚洲成人黄色影院| 美女爽到高潮91| 成人午夜视频免费看| 色婷婷av一区| 日韩欧美在线网站| 中文字幕精品—区二区四季| 亚洲午夜激情av| 国产一区日韩二区欧美三区| 成人精品视频一区| 欧美精品aⅴ在线视频| 久久久国产精品麻豆| 一区二区三区中文字幕电影| 捆绑变态av一区二区三区| 成人黄色片在线观看| 欧美日韩国产一级| 国产人成一区二区三区影院| 艳妇臀荡乳欲伦亚洲一区| 久久精品国产亚洲一区二区三区| 99精品视频在线观看| 欧美一级高清大全免费观看| 国产精品三级电影| 日本三级韩国三级欧美三级| 成人av在线资源网站| 91精品一区二区三区久久久久久 | 精品一二三四区| 国产亚洲污的网站| 亚洲一区二区三区四区五区中文| 麻豆视频观看网址久久| av动漫一区二区| 欧美精品一区二区在线观看| 亚洲一区二区三区免费视频| 国产成人欧美日韩在线电影| 99久久国产免费看| 精品国产免费一区二区三区四区| 亚洲日本va午夜在线影院| 天堂精品中文字幕在线| 91猫先生在线| 精品成人免费观看| 亚洲国产精品嫩草影院| 国产一区二区免费视频| 欧美性猛片xxxx免费看久爱| 国产欧美日韩视频一区二区| 全国精品久久少妇| 91成人免费在线| 国产精品乱人伦中文| 久久国产精品72免费观看| 欧美日韩国产不卡| 亚洲黄色在线视频| 成人免费av网站| 久久综合国产精品| 日本亚洲欧美天堂免费| 欧美亚洲国产一区二区三区va| 国产精品美女一区二区| 国产酒店精品激情| 精品国产第一区二区三区观看体验| 亚洲午夜久久久| 色欧美日韩亚洲| 亚洲色图欧洲色图婷婷| 成人午夜精品在线| 久久精品免视看| 国产美女在线观看一区| 欧美α欧美αv大片| 免费三级欧美电影| 777a∨成人精品桃花网| 午夜精品久久久久久久99樱桃| 色噜噜狠狠成人中文综合| 成人免费在线视频| 成人福利在线看| 中国色在线观看另类| 成人高清免费观看| 中文字幕一区二区三区不卡在线| 成人免费视频caoporn| 中文字幕不卡三区| 成人网男人的天堂| 国产精品国产三级国产专播品爱网 | 亚洲男人的天堂在线观看| 99这里只有精品| 亚洲免费av网站| 欧洲精品视频在线观看| 午夜在线成人av| 日韩一区二区精品葵司在线| 日本美女一区二区三区视频| 日韩欧美色电影| 久久99精品国产| 国产色综合久久| 成人精品免费网站| 亚洲色图清纯唯美| 欧美日韩成人激情| 理论片日本一区| 国产欧美日韩精品a在线观看| 成人一区二区三区在线观看 | 久久久www免费人成精品| 国产成人av一区二区| 亚洲免费av高清| 亚洲天堂久久久久久久| 在线免费观看日本欧美| 午夜久久久久久久久| 久久网站最新地址| av在线一区二区三区| 亚洲精品国产精品乱码不99| 在线播放国产精品二区一二区四区 | 婷婷综合五月天| 精品久久久久久久久久久久久久久 | 最新国产成人在线观看| 91行情网站电视在线观看高清版| 亚洲成人一区二区在线观看| 精品国产一区二区三区av性色 | 欧美一区二区福利视频| 国产美女精品在线| 亚洲综合在线观看视频| 欧美变态tickling挠脚心| av一二三不卡影片| 日本午夜一区二区| 久久精品男人的天堂| 欧美午夜电影网| 国产精品一二一区| 亚洲免费看黄网站| 欧美大胆一级视频| 色综合久久中文综合久久97| 久久精品国产精品亚洲综合| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 欧美撒尿777hd撒尿| 国产麻豆9l精品三级站| 夜夜精品浪潮av一区二区三区| 亚洲精品一区二区三区香蕉| 欧美无砖专区一中文字| 成人涩涩免费视频| 麻豆freexxxx性91精品| 亚洲精品国产精华液| 国产人妖乱国产精品人妖| 欧美高清视频一二三区| k8久久久一区二区三区| 国内不卡的二区三区中文字幕 | 国产精品久久二区二区| 91精品国产综合久久福利软件 | 麻豆精品视频在线| 亚洲人成网站在线|