<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: fast code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 09:06:32 GMT</pubDate>
    <description>DZone Snippets: fast code</description>
    <item>
      <title>Fast selection</title>
      <link>http://snippets.dzone.com/posts/show/4622</link>
      <description>Selectv returns the position of the nth smallest number in the list.&lt;br /&gt;&lt;br /&gt;Selectv modifies the list.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;typedef struct {&lt;br /&gt;	int len;&lt;br /&gt;	int e[102];&lt;br /&gt;} List;&lt;br /&gt;&lt;br /&gt;void printv(char *msg, List l) {&lt;br /&gt;	printf("%s", msg);&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 0; i &lt; l.len; ++i)&lt;br /&gt;		printf("%d ", l.e[i]);&lt;br /&gt;	printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int pivot(List *l, int p, int r) {&lt;br /&gt;	int x = l-&gt;e[r];&lt;br /&gt;	int i = p - 1;&lt;br /&gt;	int j = r + 1;&lt;br /&gt;	&lt;br /&gt;	while (1) {&lt;br /&gt;		do {&lt;br /&gt;			++i;&lt;br /&gt;		} while (l-&gt;e[i] &lt; x);&lt;br /&gt;		do {&lt;br /&gt;			--j;&lt;br /&gt;		} while (l-&gt;e[j] &gt; x);&lt;br /&gt;	&lt;br /&gt;		//printf("%d %d\n", i, j);&lt;br /&gt;		&lt;br /&gt;		if (i &lt; j) {&lt;br /&gt;			int aux = l-&gt;e[i];&lt;br /&gt;			l-&gt;e[i] = l-&gt;e[j];&lt;br /&gt;			l-&gt;e[j] = aux;&lt;br /&gt;		} else&lt;br /&gt;			return i - 1;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int selectv(List *l, int nrp, int p, int r) {&lt;br /&gt;	//printf("p, r: %d, %d\n", p, r);&lt;br /&gt;	//printf("nrp: %d\n", nrp);&lt;br /&gt;	//printv("l: ", *l);&lt;br /&gt;	&lt;br /&gt;	if (p == r)&lt;br /&gt;		return l-&gt;e[p];&lt;br /&gt;	&lt;br /&gt;	if (p &lt; r) {&lt;br /&gt;		int q = pivot(l, p, r);&lt;br /&gt;		&lt;br /&gt;		//getchar();&lt;br /&gt;		&lt;br /&gt;		if (q - p + 1&lt; nrp)&lt;br /&gt;			return selectv(l, nrp - (q - p) - 1, q + 1, r);&lt;br /&gt;		return selectv(l, nrp, p, q);&lt;br /&gt;	}&lt;br /&gt;	return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	List l;&lt;br /&gt;	l.len = 100;&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 0; i &lt; l.len; ++i)&lt;br /&gt;		l.e[i] = l.len - i;&lt;br /&gt;	&lt;br /&gt;	int nth = 56;&lt;br /&gt;	printf("%d: %d\n", nth, selectv(&amp;l, nth, 0, l.len - 1));&lt;br /&gt;	&lt;br /&gt;	//printv("L: ", l);&lt;br /&gt;	&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 08 Oct 2007 10:48:19 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4622</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Another Pyrex Permutation Generator</title>
      <link>http://snippets.dzone.com/posts/show/2353</link>
      <description>// description of your code here&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cdef class PermuteJ:&lt;br /&gt;&lt;br /&gt;   cdef int n, first&lt;br /&gt;   cdef int lst3[32]&lt;br /&gt;   cdef object lst, lst2&lt;br /&gt;&lt;br /&gt;   def __init__(self, lst):&lt;br /&gt;       cdef int i&lt;br /&gt;       self.lst = lst&lt;br /&gt;       self.lst2 = lst[:]&lt;br /&gt;       self.first = 0&lt;br /&gt;       self.n = len(lst) - 1&lt;br /&gt;       if self.n &gt;= 31:&lt;br /&gt;           raise Exception, "Are you kidding?"&lt;br /&gt;       for i from 0 &lt;= i &lt; len(lst):&lt;br /&gt;           self.lst3[i] = i&lt;br /&gt;&lt;br /&gt;   def __iter__(self):&lt;br /&gt;       return self&lt;br /&gt;&lt;br /&gt;   def __next__(self):&lt;br /&gt;       cdef int j, l, k, x, y, z, sn, length, neg1, neg2, neg3&lt;br /&gt;       cdef int* sl&lt;br /&gt;       cdef object output&lt;br /&gt;&lt;br /&gt;       if self.first == 0:&lt;br /&gt;           self.first = 1&lt;br /&gt;           return self.lst2&lt;br /&gt;       if self.n == 1:&lt;br /&gt;           return [self.lst[1], self.lst[0]]&lt;br /&gt;&lt;br /&gt;       sn = self.n&lt;br /&gt;       length = sn + 1&lt;br /&gt;       sl = self.lst3&lt;br /&gt;       neg1 = sn&lt;br /&gt;       neg2 = length - 2&lt;br /&gt;       neg3 = length - 3&lt;br /&gt;       while 1:&lt;br /&gt;           if sl[neg2] &lt; sl[neg1]:&lt;br /&gt;               sl[neg2], sl[neg1] = sl[neg1], sl[neg2]&lt;br /&gt;           elif sl[neg3] &lt; sl[neg2]:&lt;br /&gt;               if sl[neg3] &lt; sl[neg1]:&lt;br /&gt;                   sl[neg3], sl[neg2], sl[neg1] = sl[neg1], sl[neg3], sl[neg2]&lt;br /&gt;               else:&lt;br /&gt;                   sl[neg3], sl[neg2], sl[neg1] = sl[neg2], sl[neg1], sl[neg3]&lt;br /&gt;           else:&lt;br /&gt;               j = sn - 3&lt;br /&gt;               if j &lt; 0: raise StopIteration&lt;br /&gt;               y = sl[j]&lt;br /&gt;               x = sl[neg3]&lt;br /&gt;               z = sl[neg1]&lt;br /&gt;               while y &gt;= x:&lt;br /&gt;                   j = j - 1&lt;br /&gt;                   if j &lt; 0: raise StopIteration&lt;br /&gt;                   x = y&lt;br /&gt;                   y = sl[j]&lt;br /&gt;               if y &lt; z:&lt;br /&gt;                   sl[j] = z&lt;br /&gt;                   sl[j+1] = y&lt;br /&gt;                   sl[sn] = x&lt;br /&gt;               else:&lt;br /&gt;                   l = neg2&lt;br /&gt;                   while y &gt;= sl[l]:&lt;br /&gt;                       l = l - 1&lt;br /&gt;                   sl[j], sl[l] = sl[l], y&lt;br /&gt;                   sl[sn], sl[j+1] = sl[j+1], sl[sn]&lt;br /&gt;               k = j + 2&lt;br /&gt;               l = neg2&lt;br /&gt;               while k &lt; l:&lt;br /&gt;                   sl[k], sl[l] = sl[l], sl[k]&lt;br /&gt;                   k = k + 1&lt;br /&gt;                   l = l - 1&lt;br /&gt;&lt;br /&gt;           lst = self.lst&lt;br /&gt;           lst2 = self.lst2&lt;br /&gt;           for j from 0 &lt;= j &lt; length:&lt;br /&gt;               lst2[j] = sl[j]&lt;br /&gt;&lt;br /&gt;           return lst2&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 02 Aug 2006 23:59:41 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2353</guid>
      <author>llimllib (Bill Mill)</author>
    </item>
    <item>
      <title>Fast Sequential Search/Replace Engine supporting wildcards, backward search, whole words, etc... //Pascal Class</title>
      <link>http://snippets.dzone.com/posts/show/2196</link>
      <description>A quite fast unit to search/replace strings sequentially (while Seeker.Search() do...) in files/strings done mostly with pointers to improve speed. It's able to search backward, count end of lines, check case-sensitiveness, match whole words and handle wildcards (* and ?), &lt;br /&gt;&lt;br /&gt;The search method was divided into 4 specialized methods, again to improve speed. The right method is choosed according to the options that were setted (wildcard, search backward, etc...)&lt;br /&gt;&lt;br /&gt;This is an old code that doesn't match my current skills, anyway it has some cool techniques that I really enjoyed :)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//&lt;br /&gt;//    TNotesSeeker - classe de buscas do Notes.&lt;br /&gt;//&lt;br /&gt;//    Notes, http://notes.codigolivre.org.br&lt;br /&gt;//    Copyright (C) 2003-2004, Equipe do Notes.&lt;br /&gt;//&lt;br /&gt;//    This program is free software; you can redistribute it and/or modify&lt;br /&gt;//    it under the terms of the GNU General Public License as published by&lt;br /&gt;//    the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;//    (at your option) any later version.&lt;br /&gt;//&lt;br /&gt;//    This program is distributed in the hope that it will be useful,&lt;br /&gt;//    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;//    GNU General Public License for more details.&lt;br /&gt;//&lt;br /&gt;//    You should have received a copy of the GNU General Public License&lt;br /&gt;//    along with this program; if not, write to the Free Software&lt;br /&gt;//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt;//&lt;br /&gt;//    **************************************************************&lt;br /&gt;//    Revision #0&lt;br /&gt;//      Version  : 1.0.0&lt;br /&gt;//      Date     : 2003-11-30 22:00:00 GMT -3:00&lt;br /&gt;//      Reviewer : Jonas Raoni Soares Silva&lt;br /&gt;//      Changes  : Criada a classe.&lt;br /&gt;//    **************************************************************&lt;br /&gt;//    Revision #1&lt;br /&gt;//      Version  : 1.0.1&lt;br /&gt;//      Date     : 2004-09-09 03:30:00 GMT -3:00&lt;br /&gt;//      Reviewer : Jonas Raoni Soares Silva&lt;br /&gt;//      Changes  : Acho q acabaram-se os bugs... Ser&#225;??? :]&lt;br /&gt;//    **************************************************************&lt;br /&gt;&lt;br /&gt;(*&lt;br /&gt;@abstract(NotesSeeker - classe de buscas do Notes.)&lt;br /&gt;@author(Jonas Raoni Soares Silva &lt;jonblackjack@bol.com.br&gt;)&lt;br /&gt;@created(30 Nov 2003)&lt;br /&gt;*)&lt;br /&gt;&lt;br /&gt;unit NotesSeeker;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  SysUtils, Classes;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;  @code(ENotesSeekerException) -&lt;br /&gt;    Notificar erros na classe TNotesSeeker de forma&lt;br /&gt;    profissional, facilitando a intercepta&#231;&#227;o e/ou log de&lt;br /&gt;    erros&lt;br /&gt;}&lt;br /&gt;  ENotesSeekerException = class ( Exception )&lt;br /&gt;  public&lt;br /&gt;    constructor Create(const Msg: string);&lt;br /&gt;    constructor CreateFmt(const Msg: string; const Args: array of const);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  {Op&#245;es de pesquisa: &lt;BR&gt;&lt;br /&gt;   @code(nsHandleEOL) - se voc&#234; precisar buscar por quebras de linhas, voc&#234; precisa setar esta op&#231;&#227;o.&lt;BR&gt;&lt;br /&gt;   @code(nsCaseSensitive) - diferenciar mai&#250;sculas de min&#250;sculas.&lt;BR&gt;&lt;br /&gt;   @code(nsWholeWords) - retorna apenas palavras inteiras.&lt;BR&gt;&lt;br /&gt;   @code(nsBackward) - busca de traz para frente. &lt;BR&gt;&lt;br /&gt;   @code(nsHandleWildCard) - usa coringas * e ? na pesquisa.}&lt;br /&gt;  TNotesSeekerOption = ( nsHandleEOL, nsCaseSensitive, nsWholeWords, nsBackward, nsHandleWildCard );&lt;br /&gt;  { Set de @link(TNotesSeekerOption).}&lt;br /&gt;  TNotesSeekerOptions = set of TNotesSeekerOption;&lt;br /&gt;&lt;br /&gt;  TSearchFunction = function: Boolean of object;&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;  @code(TNotesSeeker) -&lt;br /&gt;    Permite fazer buscas em strings com v&#225;rias op&#231;&#245;es&lt;br /&gt;}&lt;br /&gt;  TNotesSeeker = class(TObject)&lt;br /&gt;  private&lt;br /&gt;    Jump, LineJump: Cardinal;&lt;br /&gt;    FList: TList;&lt;br /&gt;  protected&lt;br /&gt;    FMatches, FStartAt, FEOLLen, FSearchLen, FCurCol,&lt;br /&gt;    FCurLine, FMatchLen, FMatchLine, FMatchCol: Cardinal;&lt;br /&gt;&lt;br /&gt;    FBufferEnd, FBuffer, FBufferBegin, FBufferBackup,&lt;br /&gt;    FEOL, FSearchBegin, FSearch, FSearchEnd: PChar;&lt;br /&gt;&lt;br /&gt;    FOptions: TNotesSeekerOptions;&lt;br /&gt;&lt;br /&gt;    FContextRightLenght, FContextLeftLenght: Cardinal;&lt;br /&gt;&lt;br /&gt;    FKeepText: Boolean;&lt;br /&gt;&lt;br /&gt;    function GetText: string;&lt;br /&gt;    function GetReplacedText: string;&lt;br /&gt;    function GetContext: string;&lt;br /&gt;    function GetSearchStr: string;&lt;br /&gt;    function GetRemainingText: string;&lt;br /&gt;    function GetCurByte: Cardinal;&lt;br /&gt;    function GetEOL: string;&lt;br /&gt;&lt;br /&gt;    procedure SetOptions(const Value: TNotesSeekerOptions);&lt;br /&gt;    procedure SetText( const Value: string);&lt;br /&gt;    procedure SetSearchStr(const Value: string);&lt;br /&gt;    procedure SetEOL(const Value: string);&lt;br /&gt;&lt;br /&gt;    procedure FreeBuffer;&lt;br /&gt;    procedure FreeEOL;&lt;br /&gt;    procedure FreeSearchStr;&lt;br /&gt;&lt;br /&gt;    {Search Engines}&lt;br /&gt;    function SearchForward: Boolean;&lt;br /&gt;    function SearchForwardWithWildCard: Boolean;&lt;br /&gt;    function SearchBackward: Boolean;&lt;br /&gt;    function SearchBackwardWithWildCard: Boolean;&lt;br /&gt;&lt;br /&gt;  public&lt;br /&gt;    { Efetua a busca: se o termo procurado for encontrado, retorna true, caso contr&#225;rio retorna false }&lt;br /&gt;    Search: TSearchFunction;&lt;br /&gt;&lt;br /&gt;    { M&#233;todo construtor }&lt;br /&gt;    constructor Create; virtual;&lt;br /&gt;    { M&#233;todo destruidor }&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    { Armazena o tamanho do "match", quando a op&#231;&#227;o wildcard estiver desligada esta ser&#225; igual ao tamanho da pr&#243;pria string procurada }&lt;br /&gt;    property MatchLength: Cardinal read FMatchLen;&lt;br /&gt;    { Quando HandleEOL fizer parte das op&#231;&#245;es, armazenar&#225; a linha onde a string procurada foi encontrada }&lt;br /&gt;    property CurLine: Cardinal read FMatchLine;&lt;br /&gt;    { Armazenar&#225; a coluna onde a string procurada foi encontrada, se HandleEOL n&#227;o estiver nas op&#231;&#245;es, armazenar&#225; a mesma coisa que a propriedade CurByte }&lt;br /&gt;    property CurCol: Cardinal read FMatchCol;&lt;br /&gt;    { Armazena a posi&#231;&#227;o ou byte "absoluto" onde a string foi encontrada }&lt;br /&gt;    property CurByte: Cardinal read GetCurByte;&lt;br /&gt;    { Especifica a posi&#231;&#227;o/byte inicial onde a busca dever&#225; come&#231;ar }&lt;br /&gt;    property StartAt: Cardinal read FStartAt write FStartAt;&lt;br /&gt;    { Retorna o contexto onde a string procurada foi encontrada }&lt;br /&gt;    property Context: string read GetContext;&lt;br /&gt;    { Especifica a quantidade de caracteres que dever&#227;o fazer parte do contexto encontrado ao lado esquerdo da string procurada }&lt;br /&gt;    property ContextLeftLenght: Cardinal read FContextLeftLenght write FContextLeftLenght;&lt;br /&gt;    { Especifica a quantidade de caracteres que dever&#227;o fazer parte do contexto encontrado ao lado direito da string procurada }&lt;br /&gt;    property ContextRightLenght: Cardinal read FContextRightLenght write FContextRightLenght;&lt;br /&gt;    { Armazena o n&#250;mero de strings que coincidiram com a busca at&#233; o presente momento }&lt;br /&gt;    property Matches: Cardinal read FMatches;&lt;br /&gt;    { Permite alterar a sequ&#234;ncia de caracteres que demarcam o fim de uma linha }&lt;br /&gt;    property EOL: string read GetEOL write SetEOL;&lt;br /&gt;    { Armazena as op&#231;&#245;es atualmente habilitadas para a busca, podendo ser alterada a qualquer momento }&lt;br /&gt;    property Options: TNotesSeekerOptions read FOptions write SetOptions;&lt;br /&gt;    { Termo a ser procurado no texto }&lt;br /&gt;    property SearchStr: string read GetSearchStr write SetSearchStr;&lt;br /&gt;    { Texto onde a busca ser&#225; efetuada }&lt;br /&gt;    property Text: string read GetText write SetText;&lt;br /&gt;    { Texto restante ao t&#233;rmino da busca }&lt;br /&gt;    property RemainingText: string read GetRemainingText;&lt;br /&gt;    { Especifica se a classe dever&#225; manter uma c&#243;pia do texto setado inicialmente }&lt;br /&gt;    property KeepText: Boolean read FKeepText write FKeepText;&lt;br /&gt;    { Retorna o texto com os replaces, caso KeepText seja falso, essa propriedade se torna sin&#244;nimo da propriedade Text }&lt;br /&gt;    property ReplacedText: string read GetReplacedText;&lt;br /&gt;&lt;br /&gt;    { Prepara tudo para uma nova busca }&lt;br /&gt;    procedure StartSearch;&lt;br /&gt;    { Carrega o texto da busca a partir de um arquivo }&lt;br /&gt;    procedure LoadFromFile( const AFilename: string );&lt;br /&gt;    { Carrega o texto da busca a partir de um stream }&lt;br /&gt;    procedure LoadFromStream( const AStream: TStream );&lt;br /&gt;    { Carrega o texto da busca a partir de um buffer }&lt;br /&gt;    procedure LoadFromBuffer( const ABuffer: PChar );&lt;br /&gt;    { Efetua a substitui&#231;&#227;o da string encontrada pela string contida em "S" }&lt;br /&gt;    procedure Replace( const S: String );&lt;br /&gt;    { Modo pr&#225;tico para setar as op&#231;&#245;es }&lt;br /&gt;    procedure EnableOptions( const CaseSensitive: Boolean = true; const WholeWords: Boolean = false; const HandleEOL: Boolean = true; const HandleWildCard: Boolean = false; const Backward: Boolean = false );&lt;br /&gt;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  { Compara Str1 e Str2 de tr&#225;s pra frente, se as duas forem iguais retorna true, caso contr&#225;rio false }&lt;br /&gt;  function StrLRComp( S1, S2: PChar; const S2Begin: PChar ): Boolean;&lt;br /&gt;  { Converte para mai&#250;sculo (ANSI) -&gt; VALEUUUUU TIO RUSS&#195;O hahaha, o que tem no delphi "aplica a altera&#231;&#227;o"&lt;br /&gt;    Id&#233;ia de manter tabela com tudo mai&#250;sculo arrancada de "QStrings 6.07.424 Copyright (C) 2000, 2003 Andrew Dryazgov [ andrewdr@newmail.ru ]" }&lt;br /&gt;  function AnsiUpCase(Ch: Char): Char;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  { Caracteres que definem delimitadores de palavra, usada quando a op&#231;&#227;o WholeWords est&#225; ativa }&lt;br /&gt;  WhiteSpaces: set of Char = [' ',#9,#13,#10,'!','"','#','$','%','&amp;','''','(',')','*','+','-','/',':',';','&lt;','=','&gt;','?','@','[','\',']','^','`','{','|','}','~'];&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  //fiz algumas altera&#231;&#245;es hehe, o tiozaum russo devia t&#225; come&#231;ano a ficar cego enqto fazia isso :)&lt;br /&gt;  ToUpperChars: array[0..255] of Char =&lt;br /&gt;    (#$00,#$01,#$02,#$03,#$04,#$05,#$06,#$07,#$08,#$09,#$0A,#$0B,#$0C,#$0D,#$0E,#$0F,&lt;br /&gt;     #$10,#$11,#$12,#$13,#$14,#$15,#$16,#$17,#$18,#$19,#$1A,#$1B,#$1C,#$1D,#$1E,#$1F,&lt;br /&gt;     #$20,#$21,#$22,#$23,#$24,#$25,#$26,#$27,#$28,#$29,#$2A,#$2B,#$2C,#$2D,#$2E,#$2F,&lt;br /&gt;     #$30,#$31,#$32,#$33,#$34,#$35,#$36,#$37,#$38,#$39,#$3A,#$3B,#$3C,#$3D,#$3E,#$3F,&lt;br /&gt;     #$40,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,&lt;br /&gt;     #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$5B,#$5C,#$5D,#$5E,#$5F,&lt;br /&gt;     #$60,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,&lt;br /&gt;     #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$7B,#$7C,#$7D,#$7E,#$7F,&lt;br /&gt;     #$80,#$81,#$82,#$81,#$84,#$85,#$86,#$87,#$88,#$89,#$8A,#$8B,#$8C,#$8D,#$8E,#$8F,&lt;br /&gt;     #$90,#$91,#$92,#$93,#$94,#$95,#$96,#$97,#$98,#$99,#$8A,#$9B,#$8C,#$9D,#$9E,#$9F,&lt;br /&gt;     #$A0,#$A1,#$A1,#$A3,#$A4,#$A5,#$A6,#$A7,#$A8,#$A9,#$AA,#$AB,#$AC,#$AD,#$AE,#$AF,&lt;br /&gt;     #$B0,#$B1,#$B2,#$B2,#$A5,#$B5,#$B6,#$B7,#$A8,#$B9,#$BA,#$BB,#$BC,#$BD,#$BE,#$BF,&lt;br /&gt;     #$C0,#$C1,#$C2,#$C3,#$C4,#$C5,#$C6,#$C7,#$C8,#$C9,#$CA,#$CB,#$CC,#$CD,#$CE,#$CF,&lt;br /&gt;     #$D0,#$D1,#$D2,#$D3,#$D4,#$D5,#$D6,#$D7,#$D8,#$D9,#$DA,#$DB,#$DC,#$DD,#$DE,#$DF,&lt;br /&gt;     #$C0,#$C1,#$C2,#$C3,#$C4,#$C5,#$C6,#$C7,#$C8,#$C9,#$CA,#$CB,#$CC,#$CD,#$CE,#$CF,&lt;br /&gt;     #$D0,#$D1,#$D2,#$D3,#$D4,#$D5,#$D6,#$F7,#$D8,#$D9,#$DA,#$DB,#$DC,#$DD,#$DE,#$9F);&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;function StrLRComp( S1, S2: PChar; const S2Begin: PChar ): Boolean;&lt;br /&gt;begin&lt;br /&gt;  while ( S2 &lt;&gt; S2Begin ) and ( S1^ = S2^ ) do begin&lt;br /&gt;    dec( S1 );&lt;br /&gt;    dec( S2 );&lt;br /&gt;  end;&lt;br /&gt;  Result := ( S1^ = S2^ ) and ( S2 = S2Begin );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function AnsiUpCase(Ch: Char): Char;&lt;br /&gt;begin&lt;br /&gt;  Result := ToUpperChars[ ord( ch ) ];&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ class : TNotesSeeker }&lt;br /&gt;&lt;br /&gt;{ TNotesSeeker : protected }&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.GetText: string;&lt;br /&gt;begin&lt;br /&gt;  if Assigned( FBufferBackup ) then&lt;br /&gt;    Result := StrPas( FBufferBackup )&lt;br /&gt;  else&lt;br /&gt;    Result := ReplacedText;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.GetReplacedText: string;&lt;br /&gt;begin&lt;br /&gt;  Result := StrPas( FBufferBegin );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.GetContext: string;&lt;br /&gt;var&lt;br /&gt;  BeginAt, EndAt: PChar;&lt;br /&gt;begin&lt;br /&gt;  if not ( nsBackward in FOptions ) then begin&lt;br /&gt;    BeginAt := FBuffer - FMatchLen - FContextLeftLenght;&lt;br /&gt;    EndAt := FBuffer+FContextRightLenght;&lt;br /&gt;  end&lt;br /&gt;  else begin&lt;br /&gt;    BeginAt := FBuffer+1-FContextLeftLenght;&lt;br /&gt;    EndAt := FBuffer+1+FMatchLen+FContextRightLenght;&lt;br /&gt;  end;&lt;br /&gt;  if BeginAt &gt; EndAt then&lt;br /&gt;    raise ENotesSeekerException.CreateFmt('GetContext::Range Error "BeginAt(%d) &gt; EndAt(%d)"', [Integer(BeginAt), Integer(EndAt)]);&lt;br /&gt;  if BeginAt &lt; FBufferBegin then&lt;br /&gt;    BeginAt := FBufferBegin;&lt;br /&gt;  if EndAt &gt; FBufferEnd then&lt;br /&gt;    EndAt := FBufferEnd;&lt;br /&gt;&lt;br /&gt;  SetString( Result, BeginAt, EndAt-BeginAt );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.GetSearchStr: string;&lt;br /&gt;begin&lt;br /&gt;  Result := StrPas( FSearchBegin );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.GetRemainingText: string;&lt;br /&gt;begin&lt;br /&gt;  Result := '';&lt;br /&gt;  if not ( nsBackward in FOptions ) then&lt;br /&gt;    Result := StrPas( FBuffer )&lt;br /&gt;  else if FBuffer-FBufferBegin &gt; -1 then&lt;br /&gt;    SetString( Result, FBufferBegin, FBuffer-FBufferBegin+1 );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.GetCurByte: Cardinal;&lt;br /&gt;begin&lt;br /&gt;  if nsBackward in FOptions then&lt;br /&gt;    Result := FBufferEnd-1 - FBuffer - FMatchLen&lt;br /&gt;  else&lt;br /&gt;    Result := FBuffer - FMatchLen - FBufferBegin;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.GetEOL: string;&lt;br /&gt;begin&lt;br /&gt;  Result := StrPas( FEOL );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.SetOptions(const Value: TNotesSeekerOptions);&lt;br /&gt;begin&lt;br /&gt;  FOptions := Value;&lt;br /&gt;  if nsBackward in Value then&lt;br /&gt;    if nsHandleWildCard in Value then&lt;br /&gt;      Search := SearchBackwardWithWildCard&lt;br /&gt;    else&lt;br /&gt;      Search := SearchBackward&lt;br /&gt;  else if nsHandleWildCard in Value then&lt;br /&gt;    Search := SearchForwardWithWildCard&lt;br /&gt;  else&lt;br /&gt;    Search := SearchForward;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.SetText( const Value: string );&lt;br /&gt;begin&lt;br /&gt;  LoadFromBuffer( PChar( Value ) );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.SetSearchStr(const Value: string);&lt;br /&gt;begin&lt;br /&gt;  FreeSearchStr;&lt;br /&gt;  FSearchLen := Length( Value );&lt;br /&gt;  GetMem( FSearchBegin, FSearchLen+1 );&lt;br /&gt;  StrCopy( FSearchBegin, PChar( Value ) );&lt;br /&gt;  FSearch := FSearchBegin;&lt;br /&gt;  FSearchEnd := StrEnd( FSearchBegin );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.SetEOL(const Value: string);&lt;br /&gt;begin&lt;br /&gt;  FreeEOL;&lt;br /&gt;  FEOLLen := Length( Value );&lt;br /&gt;  GetMem( FEOL, FEOLLen+1 );&lt;br /&gt;  StrCopy( FEOL, PChar( Value ) );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.FreeBuffer;&lt;br /&gt;begin&lt;br /&gt;  if Assigned( FBufferBegin ) then begin&lt;br /&gt;    FBufferEnd := nil;&lt;br /&gt;    FBuffer := nil;&lt;br /&gt;    FreeMem( FBufferBegin );&lt;br /&gt;  end;&lt;br /&gt;  if Assigned( FBufferBackup ) then begin&lt;br /&gt;    FreeMem( FBufferBackup );&lt;br /&gt;    FBufferBackup := nil;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.FreeEOL;&lt;br /&gt;begin&lt;br /&gt;  if Assigned( FEOL ) then begin&lt;br /&gt;    FreeMem( FEOL );&lt;br /&gt;    FEOL := nil;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.FreeSearchStr;&lt;br /&gt;begin&lt;br /&gt;  if Assigned( FSearchBegin ) then begin&lt;br /&gt;    FreeMem( FSearchBegin );&lt;br /&gt;    FSearchBegin := nil;&lt;br /&gt;    FSearch := nil;&lt;br /&gt;    FSearchEnd := nil;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TNotesSeeker : public }&lt;br /&gt;&lt;br /&gt;constructor TNotesSeeker.Create;&lt;br /&gt;begin&lt;br /&gt;  EOL := #13#10;&lt;br /&gt;  FContextLeftLenght := 10;&lt;br /&gt;  FContextRightLenght := 20;&lt;br /&gt;  Search := SearchForward;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TNotesSeeker.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FreeBuffer;&lt;br /&gt;  FreeSearchStr;&lt;br /&gt;  FreeEOL;&lt;br /&gt;  inherited Destroy;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.LoadFromBuffer( const ABuffer: PChar );&lt;br /&gt;begin&lt;br /&gt;  FreeBuffer;&lt;br /&gt;  GetMem( FBufferBegin, StrLen( ABuffer )+1 );&lt;br /&gt;  FBuffer := StrCopy( FBufferBegin, ABuffer );&lt;br /&gt;  FBufferEnd :=  StrEnd( FBufferBegin );&lt;br /&gt;  if FKeepText then begin&lt;br /&gt;    GetMem( FBufferBackup, StrLen( FBufferBegin )+1 );&lt;br /&gt;    StrCopy( FBufferBackup, FBufferBegin );&lt;br /&gt;  end;  &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.LoadFromFile(const AFilename: string);&lt;br /&gt;var&lt;br /&gt;  FS: TFileStream;&lt;br /&gt;begin&lt;br /&gt;  if not FileExists( AFilename ) then&lt;br /&gt;    raise ENotesSeekerException.CreateFmt( 'LoadFromFile::Arquivo "%s" n&#227;o encontrado', [AFilename] );&lt;br /&gt;  FS := TFileStream.Create( AFilename, fmOpenRead );&lt;br /&gt;  try&lt;br /&gt;    LoadFromStream( FS );&lt;br /&gt;  finally&lt;br /&gt;    FS.Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.LoadFromStream(const AStream: TStream);&lt;br /&gt;var&lt;br /&gt;  Size: Int64;&lt;br /&gt;begin&lt;br /&gt;  FreeBuffer;&lt;br /&gt;  Size := AStream.Size;&lt;br /&gt;  GetMem( FBuffer, Size+1 );&lt;br /&gt;  Size := AStream.Read( FBuffer^, Size );&lt;br /&gt;  ( FBuffer+Size )^ := #0;&lt;br /&gt;  FBufferEnd := (FBuffer+Size);&lt;br /&gt;  FBufferBegin := FBuffer;&lt;br /&gt;  if FKeepText then begin&lt;br /&gt;    GetMem( FBufferBackup, StrLen( FBufferBegin )+1 );&lt;br /&gt;    StrCopy( FBufferBackup, FBufferBegin );&lt;br /&gt;  end;  &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.StartSearch;&lt;br /&gt;begin&lt;br /&gt;  FMatches := 0;&lt;br /&gt;  FCurLine := 0;&lt;br /&gt;  FCurCol := 0;&lt;br /&gt;&lt;br /&gt;  if FSearchLen = 0 then&lt;br /&gt;    raise ENotesSeekerException.Create( 'StartSearch::Propriedade SearchStr est&#225; vazia.' );&lt;br /&gt;&lt;br /&gt;  if ( FBufferBackup &lt;&gt; FBufferBegin ) and Assigned( FBufferBackup ) then begin&lt;br /&gt;    FreeMem( FBufferBegin );&lt;br /&gt;    GetMem( FBufferBegin, StrLen( FBufferBackup )+1 );&lt;br /&gt;    FBuffer := StrCopy( FBufferBegin, FBufferBackup );&lt;br /&gt;    FBufferEnd := FBuffer + StrLen( FBufferBackup );&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  if nsBackward in FOptions then&lt;br /&gt;    FBuffer := FBufferEnd-1&lt;br /&gt;  else&lt;br /&gt;    FBuffer := FBufferBegin;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.Replace(const S: String);&lt;br /&gt;var&lt;br /&gt;  TempBuff: PChar;&lt;br /&gt;  BufferOffset: Integer;&lt;br /&gt;begin&lt;br /&gt;  TempBuff := nil;&lt;br /&gt;  if not ( nsBackward in FOptions ) then begin&lt;br /&gt;    BufferOffset := FBuffer-FMatchLen - FBufferBegin + Length( S );&lt;br /&gt;    GetMem( TempBuff, ( FBuffer-FMatchLen - FBufferBegin) + Length(S) + ( FBufferEnd - FBuffer ) + 1 );&lt;br /&gt;    FBufferEnd := StrLCopy( StrLCopy( StrLCopy( TempBuff, FBufferBegin, FBuffer-FMatchLen - FBufferBegin )+(FBuffer-FMatchLen - FBufferBegin), PChar( S ), Length( S ) )+Length( S ), FBuffer, FBufferEnd - FBuffer )+(FBufferEnd - FBuffer);&lt;br /&gt;    FreeMem( FBufferBegin );&lt;br /&gt;    FBufferBegin := TempBuff;&lt;br /&gt;    FBuffer := FBufferBegin + BufferOffset;&lt;br /&gt;  end&lt;br /&gt;  else begin&lt;br /&gt;    BufferOffset := FBufferEnd - (FBuffer + FMatchLen) + Length( S );&lt;br /&gt;    if FBuffer &lt; FBufferBegin then&lt;br /&gt;      GetMem( TempBuff, FBufferEnd - (FBuffer+FMatchLen) + Length( S ) + ( FBuffer - FBufferBegin ) + 1 )&lt;br /&gt;    else&lt;br /&gt;      GetMem( TempBuff, FBufferEnd - (FBuffer+FMatchLen) + Length( S ) + ( FBuffer - FBufferBegin ) + 1 );&lt;br /&gt;    FBufferEnd := StrLCopy( StrLCopy( StrLCopy( TempBuff, FBufferBegin, FBuffer-FBufferBegin+1 )+(FBuffer-FBufferBegin+1), PChar( S ), Length( S ) )+Length( S ), FBuffer+FMatchLen+1, FBufferEnd-1 - (FBuffer+FMatchLen) )+ ( FBufferEnd-1 - (FBuffer+FMatchLen) );&lt;br /&gt;    FreeMem( FBufferBegin );&lt;br /&gt;    FBufferBegin := TempBuff;&lt;br /&gt;    FBuffer := FBufferEnd - BufferOffset;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ ENotesSeekerException }&lt;br /&gt;{ ENotesSeekerException : public }&lt;br /&gt;&lt;br /&gt;constructor ENotesSeekerException.Create(const Msg: string);&lt;br /&gt;begin&lt;br /&gt;  inherited Create( 'TNotesSeeker.'+Msg );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor ENotesSeekerException.CreateFmt(const Msg: string; const Args: array of const);&lt;br /&gt;begin&lt;br /&gt;  inherited CreateFmt( 'TNotesSeeker.'+Msg, Args );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TNotesSeeker.EnableOptions(const CaseSensitive, WholeWords, HandleEOL, HandleWildCard, Backward: Boolean);&lt;br /&gt;  var Opcoes: TNotesSeekerOptions;&lt;br /&gt;begin&lt;br /&gt;  if CaseSensitive then Include( Opcoes, nsCaseSensitive ) else Exclude( Opcoes, nsCaseSensitive );&lt;br /&gt;  if HandleEOL then Include( Opcoes, nsHandleEOL ) else Exclude( Opcoes, nsHandleEOL );&lt;br /&gt;  if Backward then Include( Opcoes, nsBackward ) else Exclude( Opcoes, nsBackward );&lt;br /&gt;  if HandleWildCard then Include( Opcoes, nsHandleWildCard ) else Exclude( Opcoes, nsHandleWildCard );&lt;br /&gt;  if WholeWords then Include( Opcoes, nsWholeWords ) else Exclude( Opcoes, nsWholeWords );&lt;br /&gt;  SetOptions( Opcoes );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.SearchForward: Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result := True;&lt;br /&gt;  LineJump := 0;&lt;br /&gt;  FMatchLine := 0;&lt;br /&gt;  FMatchCol := 0;&lt;br /&gt;  FMatchLen := 0;&lt;br /&gt;  FSearch := FSearchBegin;&lt;br /&gt;&lt;br /&gt;  if FBufferBegin + FStartAt &gt; FBufferEnd then&lt;br /&gt;    FStartAt := FBufferEnd - FBufferBegin;&lt;br /&gt;  while FStartAt &gt; FBuffer-FBufferBegin do begin&lt;br /&gt;    if ( nsHandleEOL in FOptions ) and ( FBuffer^ = FEOL^ ) and ( StrLComp( FBuffer, FEOL, FEOLLen ) = 0 ) then begin&lt;br /&gt;      Inc( FBuffer, FEOLLen );&lt;br /&gt;      Inc( FCurLine );&lt;br /&gt;      FCurCol := 0;&lt;br /&gt;      Continue;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      Inc( FCurCol );&lt;br /&gt;    Inc( FBuffer );&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  while FBuffer &lt;&gt; FBufferEnd do begin&lt;br /&gt;    if ( (nsCaseSensitive in FOptions ) and ( FBuffer^ = FSearch^ ) ) or ( not(nsCaseSensitive in FOptions ) and ( AnsiUpCase( FBuffer^ ) = AnsiUpCase( FSearch^ ) ) ) then begin&lt;br /&gt;      Inc( FMatchLen );&lt;br /&gt;      Inc( FSearch );&lt;br /&gt;      if Result then begin&lt;br /&gt;        Result := False;&lt;br /&gt;        FMatchCol := FCurCol;&lt;br /&gt;        FMatchLine := FCurLine;&lt;br /&gt;        if ( nsWholeWords in FOptions ) and ( FBuffer &gt; FBufferBegin ) and not ( (FBuffer-1)^ in WhiteSpaces ) then begin&lt;br /&gt;          FSearch := FSearchBegin;&lt;br /&gt;          FMatchLen := 0;&lt;br /&gt;          FMatchLine := 0;&lt;br /&gt;          FMatchCol := 0;&lt;br /&gt;        end;&lt;br /&gt;      end;&lt;br /&gt;      if ( nsWholeWords in FOptions ) and ( FMatchLen = FSearchLen ) and ( FBuffer &lt; FBufferEnd-1 ) and not ( (FBuffer+1)^ in WhiteSpaces ) then begin&lt;br /&gt;        FSearch := FSearchBegin;&lt;br /&gt;        FMatchLen := 0;&lt;br /&gt;        FMatchLine := 0;&lt;br /&gt;        FMatchCol := 0;&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      if ( nsHandleEOL in FOptions ) and ( FBuffer^ = FEOL^ ) and ( StrLComp( FBuffer, FEOL, FEOLLen ) = 0 ) then begin&lt;br /&gt;        Inc( FCurLine );&lt;br /&gt;        FCurCol := 0;&lt;br /&gt;        LineJump := FEOLLen-1;&lt;br /&gt;      end&lt;br /&gt;      else if LineJump = 0 then&lt;br /&gt;        Inc( FCurCol )&lt;br /&gt;      else&lt;br /&gt;        Dec( LineJump );&lt;br /&gt;&lt;br /&gt;      Inc( FBuffer );&lt;br /&gt;      if FSearch^ = #0 then begin&lt;br /&gt;        Result := True;&lt;br /&gt;        Inc( FMatches );&lt;br /&gt;        Exit;&lt;br /&gt;      end;&lt;br /&gt;    end&lt;br /&gt;    else begin&lt;br /&gt;      Result := True;&lt;br /&gt;      FMatchLen := 0;&lt;br /&gt;      FMatchLine := 0;&lt;br /&gt;      FMatchCol := 0;&lt;br /&gt;      &lt;br /&gt;      if FSearch &lt;&gt; FSearchBegin then begin&lt;br /&gt;        FSearch := FSearchBegin;&lt;br /&gt;        Continue;&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      if ( nsHandleEOL in FOptions ) and ( FBuffer^ = FEOL^ ) and ( StrLComp( FBuffer, FEOL, FEOLLen ) = 0 ) then begin&lt;br /&gt;        Inc( FCurLine );&lt;br /&gt;        FCurCol := 0;&lt;br /&gt;        LineJump := FEOLLen-1;&lt;br /&gt;      end&lt;br /&gt;      else if LineJump = 0 then&lt;br /&gt;        Inc( FCurCol )&lt;br /&gt;      else&lt;br /&gt;        Dec( LineJump );&lt;br /&gt;&lt;br /&gt;      Inc( FBuffer )        &lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;  Result := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.SearchForwardWithWildCard: Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result := True;&lt;br /&gt;  Jump := 1;&lt;br /&gt;  LineJump := 0;&lt;br /&gt;  FMatchLine := 0;&lt;br /&gt;  FMatchCol := 0;&lt;br /&gt;  FMatchLen := 0;&lt;br /&gt;  FSearch := FSearchBegin;&lt;br /&gt;&lt;br /&gt;  if FBufferBegin + FStartAt &gt; FBufferEnd then&lt;br /&gt;    FStartAt := FBufferEnd - FBufferBegin;&lt;br /&gt;  while FStartAt &gt; FBuffer-FBufferBegin do begin&lt;br /&gt;    if ( nsHandleEOL in FOptions ) and ( FBuffer^ = FEOL^ ) and ( StrLComp( FBuffer, FEOL, FEOLLen ) = 0 ) then begin&lt;br /&gt;      Inc( FBuffer, FEOLLen );&lt;br /&gt;      Inc( FCurLine );&lt;br /&gt;      FCurCol := 0;&lt;br /&gt;      Continue;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      Inc( FCurCol );&lt;br /&gt;    Inc( FBuffer );&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  while FBuffer &lt;&gt; FBufferEnd do begin&lt;br /&gt;    if FSearch^ = '?' then begin&lt;br /&gt;      Inc( FMatchLen );&lt;br /&gt;      Inc( FSearch );&lt;br /&gt;    end&lt;br /&gt;    else if FSearch^ = '*' then begin&lt;br /&gt;      if (FSearch+Jump)^ = '?' then begin&lt;br /&gt;        Inc( FMatchLen );&lt;br /&gt;        Inc( Jump );&lt;br /&gt;      end&lt;br /&gt;      else if (FSearch+Jump)^ = '*' then begin&lt;br /&gt;        Inc( FSearch, Jump );&lt;br /&gt;        Jump := 1;&lt;br /&gt;        continue;&lt;br /&gt;      end&lt;br /&gt;      else if ( ( nsCaseSensitive in FOptions ) and ( FBuffer^ = (FSearch+Jump)^ ) ) or ( not( nsCaseSensitive in FOptions ) and ( AnsiUpCase( FBuffer^ ) = AnsiUpCase( (FSearch+Jump)^ ) )  ) then begin&lt;br /&gt;        Inc( FMatchLen );&lt;br /&gt;        Inc( Jump );&lt;br /&gt;      end&lt;br /&gt;      else&lt;br /&gt;        Inc( FMatchLen );&lt;br /&gt;      if (FSearch+Jump)^ = #0 then begin&lt;br /&gt;        if (FSearch+Jump-1)^ = '*' then begin&lt;br /&gt;          Inc( FMatchLen, FBufferEnd-FBuffer - 1 );&lt;br /&gt;          FBuffer := FBufferEnd - 1;&lt;br /&gt;        end;&lt;br /&gt;        FSearch := FSearchEnd;&lt;br /&gt;      end;&lt;br /&gt;    end&lt;br /&gt;    else if ( ( nsCaseSensitive in FOptions ) and ( FBuffer^ = FSearch^ ) ) or ( not ( nsCaseSensitive in FOptions ) and ( AnsiUpCase( FBuffer^ ) = AnsiUpCase( FSearch^ ) ) ) then begin&lt;br /&gt;      Inc( FMatchLen );&lt;br /&gt;      Inc( FSearch );&lt;br /&gt;    end&lt;br /&gt;    else begin&lt;br /&gt;      Result := True;&lt;br /&gt;      FMatchLen := 0;&lt;br /&gt;      FMatchLine := 0;&lt;br /&gt;      FMatchCol := 0;&lt;br /&gt;      Jump := 1;&lt;br /&gt;      if FSearch &lt;&gt; FSearchBegin then begin&lt;br /&gt;        FSearch := FSearchBegin;&lt;br /&gt;        Continue;&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      if ( nsHandleEOL in FOptions ) and ( FBuffer^ = FEOL^ ) and ( StrLComp( FBuffer, FEOL, FEOLLen ) = 0 ) then begin&lt;br /&gt;        Inc( FCurLine );&lt;br /&gt;        FCurCol := 0;&lt;br /&gt;        LineJump := FEOLLen-1;&lt;br /&gt;      end&lt;br /&gt;      else if LineJump = 0 then&lt;br /&gt;        Inc( FCurCol )&lt;br /&gt;      else&lt;br /&gt;        Dec( LineJump );&lt;br /&gt;&lt;br /&gt;      Inc( FBuffer );&lt;br /&gt;      continue;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    if Result then begin&lt;br /&gt;      Result := False;&lt;br /&gt;      FMatchCol := FCurCol;&lt;br /&gt;      FMatchLine := FCurLine;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    if ( nsHandleEOL in FOptions ) and ( FBuffer^ = FEOL^ ) and ( StrLComp( FBuffer, FEOL, FEOLLen ) = 0 ) then begin&lt;br /&gt;      Inc( FCurLine );&lt;br /&gt;      FCurCol := 0;&lt;br /&gt;      LineJump := FEOLLen-1;&lt;br /&gt;    end&lt;br /&gt;    else if LineJump = 0 then&lt;br /&gt;      Inc( FCurCol )&lt;br /&gt;    else&lt;br /&gt;      Dec( LineJump );&lt;br /&gt;&lt;br /&gt;    Inc( FBuffer );&lt;br /&gt;&lt;br /&gt;    if FSearch^ = #0 then begin&lt;br /&gt;      Result := True;&lt;br /&gt;      Inc( FMatches );&lt;br /&gt;      Exit;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;  Result := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.SearchBackward: Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result := True;&lt;br /&gt;  LineJump := 0;&lt;br /&gt;  FMatchLine := 0;&lt;br /&gt;  FMatchCol := 0;&lt;br /&gt;  FMatchLen := 0;&lt;br /&gt;  FSearch := FSearchEnd-1;&lt;br /&gt;&lt;br /&gt;  if FBufferEnd - FStartAt &lt; FBufferBegin then&lt;br /&gt;    FStartAt := FBufferEnd - FBufferBegin;&lt;br /&gt;  while FStartAt &gt; FBufferEnd-1 - FBuffer do begin&lt;br /&gt;    if ( nsHandleEOL in FOptions ) and ( FBuffer-FBufferBegin &gt;= FEOLLen ) and StrLRComp( FBuffer, FEOL+FEOLLen-1, FEOL ) then begin&lt;br /&gt;      Dec( FBuffer, FEOLLen );&lt;br /&gt;      Inc( FCurLine );&lt;br /&gt;      FCurCol := 0;&lt;br /&gt;      Continue;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      Inc( FCurCol );&lt;br /&gt;    Dec( FBuffer );&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  while FBuffer &lt;&gt; FBufferBegin-1 do begin&lt;br /&gt;    if ( (nsCaseSensitive in FOptions ) and ( FBuffer^ = FSearch^ ) ) or ( not(nsCaseSensitive in FOptions ) and ( AnsiUpCase( FBuffer^ ) = AnsiUpCase( FSearch^ ) ) ) then begin&lt;br /&gt;      Inc( FMatchLen );&lt;br /&gt;      Dec( FSearch );&lt;br /&gt;      if Result then begin&lt;br /&gt;        Result := False;&lt;br /&gt;        FMatchCol := FCurCol;&lt;br /&gt;        FMatchLine := FCurLine;&lt;br /&gt;&lt;br /&gt;        if ( nsWholeWords in FOptions ) and ( FBuffer &lt; FBufferEnd-1 ) and not ( (FBuffer+1)^ in WhiteSpaces ) then begin&lt;br /&gt;          FSearch := FSearchEnd-1;&lt;br /&gt;          FMatchLen := 0;&lt;br /&gt;          FMatchLine := 0;&lt;br /&gt;          FMatchCol := 0;&lt;br /&gt;        end;&lt;br /&gt;      end;&lt;br /&gt;      if ( nsWholeWords in FOptions ) and ( FMatchLen = FSearchLen ) and ( FBuffer &gt; FBufferBegin ) and not ( (FBuffer-1)^ in WhiteSpaces ) then begin&lt;br /&gt;        FSearch := FSearchEnd-1;&lt;br /&gt;        FMatchLen := 0;&lt;br /&gt;        FMatchLine := 0;&lt;br /&gt;        FMatchCol := 0;&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      if ( nsHandleEOL in FOptions ) and ( FBuffer-FBufferBegin &gt;= FEOLLen ) and StrLRComp( FBuffer, FEOL+FEOLLen-1, FEOL ) then begin&lt;br /&gt;        Inc( FCurLine );&lt;br /&gt;        FCurCol := 0;&lt;br /&gt;        LineJump := FEOLLen-1;&lt;br /&gt;      end&lt;br /&gt;      else if LineJump = 0 then&lt;br /&gt;        Inc( FCurCol )&lt;br /&gt;      else&lt;br /&gt;        Dec( LineJump );&lt;br /&gt;&lt;br /&gt;      Dec( FBuffer );&lt;br /&gt;      if FSearch = FSearchBegin-1 then begin&lt;br /&gt;        Result := True;&lt;br /&gt;        Inc( FMatches );&lt;br /&gt;        Exit;&lt;br /&gt;      end;&lt;br /&gt;    end&lt;br /&gt;    else begin&lt;br /&gt;      Result := True;&lt;br /&gt;      FMatchLen := 0;&lt;br /&gt;      FMatchLine := 0;&lt;br /&gt;      FMatchCol := 0;&lt;br /&gt;&lt;br /&gt;      if FSearch &lt;&gt; FSearchEnd-1 then begin&lt;br /&gt;        FSearch := FSearchEnd-1;&lt;br /&gt;        Continue;&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      if ( nsHandleEOL in FOptions ) and ( FBuffer-FBufferBegin &gt;= FEOLLen ) and StrLRComp( FBuffer, FEOL+FEOLLen-1, FEOL ) then begin&lt;br /&gt;        Inc( FCurLine );&lt;br /&gt;        FCurCol := 0;&lt;br /&gt;        LineJump := FEOLLen-1;&lt;br /&gt;      end&lt;br /&gt;      else if LineJump = 0 then&lt;br /&gt;        Inc( FCurCol )&lt;br /&gt;      else&lt;br /&gt;        Dec( LineJump );&lt;br /&gt;&lt;br /&gt;      Dec( FBuffer );&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;  Result := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TNotesSeeker.SearchBackwardWithWildCard: Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result := True;&lt;br /&gt;  Jump := 1;&lt;br /&gt;  LineJump := 0;&lt;br /&gt;  FMatchLine := 0;&lt;br /&gt;  FMatchCol := 0;&lt;br /&gt;  FMatchLen := 0;&lt;br /&gt;  FSearch := FSearchEnd-1;&lt;br /&gt;&lt;br /&gt;  if FBufferEnd - FStartAt &lt; FBufferBegin then&lt;br /&gt;    FStartAt := FBufferEnd - FBufferBegin;&lt;br /&gt;  while FStartAt &gt; FBufferEnd-1 - FBuffer do begin&lt;br /&gt;    if ( nsHandleEOL in FOptions ) and ( FBuffer^ = FEOL^ ) and ( StrLComp( FBuffer, FEOL, FEOLLen ) = 0 ) then begin&lt;br /&gt;      Dec( FBuffer, FEOLLen );&lt;br /&gt;      Inc( FCurLine );&lt;br /&gt;      FCurCol := 0;&lt;br /&gt;      Continue;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      Inc( FCurCol );&lt;br /&gt;    Dec( FBuffer );&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  while FBuffer &lt;&gt; FBufferBegin-1 do begin&lt;br /&gt;    if FSearch^ = '?' then begin&lt;br /&gt;      Inc( FMatchLen );&lt;br /&gt;      Dec( FSearch );&lt;br /&gt;    end&lt;br /&gt;    else if FSearch^ = '*' then begin&lt;br /&gt;      if (FSearch-Jump)^ = '?' then begin&lt;br /&gt;        Inc( FMatchLen );&lt;br /&gt;        Inc( Jump );&lt;br /&gt;      end&lt;br /&gt;      else if (FSearch-Jump)^ = '*' then begin&lt;br /&gt;        Dec( FSearch, Jump );&lt;br /&gt;        Jump := 1;&lt;br /&gt;        continue;&lt;br /&gt;      end&lt;br /&gt;      else if ( ( nsCaseSensitive in FOptions ) and ( FBuffer^ = (FSearch-Jump)^ ) ) or ( not( nsCaseSensitive in FOptions ) and ( AnsiUpCase( FBuffer^ ) = AnsiUpCase( (FSearch-Jump)^ ) )  ) then begin&lt;br /&gt;        Inc( FMatchLen );&lt;br /&gt;        Inc( Jump );&lt;br /&gt;      end&lt;br /&gt;      else&lt;br /&gt;        Inc( FMatchLen );&lt;br /&gt;      if (FSearch-Jump) = FSearchBegin-1 then begin&lt;br /&gt;        if (FSearch-Jump+1)^ = '*' then begin&lt;br /&gt;          Inc( FMatchLen, FBuffer-FBufferBegin );&lt;br /&gt;          FBuffer := FBufferBegin;&lt;br /&gt;        end;&lt;br /&gt;        FSearch := FSearchBegin-1;&lt;br /&gt;      end;&lt;br /&gt;    end&lt;br /&gt;    else if ( ( nsCaseSensitive in FOptions ) and ( FBuffer^ = FSearch^ ) ) or ( not ( nsCaseSensitive in FOptions ) and ( AnsiUpCase( FBuffer^ ) = AnsiUpCase( FSearch^ ) ) ) then begin&lt;br /&gt;      Inc( FMatchLen );&lt;br /&gt;      Dec( FSearch );&lt;br /&gt;    end&lt;br /&gt;    else begin&lt;br /&gt;      Result := True;&lt;br /&gt;      FMatchLen := 0;&lt;br /&gt;      FMatchLine := 0;&lt;br /&gt;      FMatchCol := 0;&lt;br /&gt;      Jump := 1;&lt;br /&gt;&lt;br /&gt;      if FSearch &lt;&gt; FSearchEnd-1 then begin&lt;br /&gt;        FSearch := FSearchEnd-1;&lt;br /&gt;        Continue;&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      if ( nsHandleEOL in FOptions ) and ( FBuffer-FBufferBegin &gt;= FEOLLen ) and StrLRComp( FBuffer, FEOL+FEOLLen-1, FEOL ) then begin&lt;br /&gt;        Inc( FCurLine );&lt;br /&gt;        FCurCol := 0;&lt;br /&gt;        LineJump := FEOLLen-1;&lt;br /&gt;      end&lt;br /&gt;      else if LineJump = 0 then&lt;br /&gt;        Inc( FCurCol )&lt;br /&gt;      else&lt;br /&gt;        Dec( LineJump );&lt;br /&gt;&lt;br /&gt;      Dec( FBuffer );&lt;br /&gt;      Continue;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    if Result then begin&lt;br /&gt;      Result := False;&lt;br /&gt;      FMatchCol := FCurCol;&lt;br /&gt;      FMatchLine := FCurLine;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    if ( nsHandleEOL in FOptions ) and ( FBuffer-FBufferBegin &gt;= FEOLLen ) and StrLRComp( FBuffer, FEOL+FEOLLen-1, FEOL ) then begin&lt;br /&gt;      Inc( FCurLine );&lt;br /&gt;      FCurCol := 0;&lt;br /&gt;      LineJump := FEOLLen-1;&lt;br /&gt;    end&lt;br /&gt;    else if LineJump = 0 then&lt;br /&gt;      Inc( FCurCol )&lt;br /&gt;    else&lt;br /&gt;      Dec( LineJump );&lt;br /&gt;&lt;br /&gt;    Dec( FBuffer );&lt;br /&gt;    if FSearch = FSearchBegin-1 then begin&lt;br /&gt;      Result := True;&lt;br /&gt;      Inc( FMatches );&lt;br /&gt;      Exit;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;  Result := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 15 Jun 2006 18:55:44 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2196</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
